MetaTrader 4のバージョンアップにより仕様が変わってきた部分がありますので、 記事を新しい仕様で書き直しております。この注意書きが書かれていないページは 旧仕様の記事になります。旧仕様の記事でも一部を除き基本的にはシステムの制作に問題はありません。
今回は手仕舞いの仕方です。
今回は比較的簡単だと思いますので、頑張ってください。
サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。
サンプルプログラムの使い方は、以下の記事で説明しています。
手仕舞いの仕方
では、MetaEditorを起動して下さい。
NameはiMA2にして置いて下さい。
void OnTick()の中に次のコードを書いてください。
自動売買システムの作り方 前編と 自動売買システムの作り方 後編のiMAと 似た内容なので、前回のプログラムに付け足してもらっても大丈夫です。
void OnTick()
{
//---
//変数の宣言
int cnt;
int CurrentPosition = -1;
double old_fast_ma,old_slow_ma;
double now_fast_ma,now_slow_ma;
int ticket;
int order_select;
bool order_close;
// オーダーチェック(ポジションなどのデータ)
for(cnt=0;cnt= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
}
// ポジション有り
else
{
//ポジションの選択
order_select = OrderSelect(CurrentPosition,SELECT_BY_POS);
//ポジションの確認
if(OrderSymbol() == Symbol())
{
//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//もし21日線が90日線を上から下にクロスしたら
if( old_fast_ma > old_slow_ma && now_fast_ma <= now_slow_ma)
{
//手仕舞い
order_close = OrderClose(OrderTicket(),OrderLots(),Bid,30,Green);
}
}
}
}
}
書けましたか?
前回制作したiMAと同じところの説明は飛ばします。
手仕舞いするプログラム
今回追加したのは、bool型の変数のorder_close;
bool order_close;
変数のbool型はtureとfalse、要は1と0だけ入れれる変数になります。
tureとfalseだけ判定したい場合bool型を使います。
int型でも代用可能ですので、ややこしい場合はint型でも問題ありません。
あとは下記の部分になります。
// ポジション有り
else
{
//ポジションの選択
order_select = OrderSelect(CurrentPosition,SELECT_BY_POS);
//ポジションの確認
if(OrderSymbol() == Symbol())
{
//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//もし21日線が90日線を下から上にクロスしたら
if( old_fast_ma > old_slow_ma && now_fast_ma <= now_slow_ma)
{
//手仕舞い
order_close = OrderClose(OrderTicket(),OrderLots(),Bid,30,Green);
}
}
}
}
}
では、説明して行きます。
elseは以前if文の説明でやりましたね。
先に使ったif以外という意味なので、今回は先のifがポジションを持っていない場合でしたので、elseはポジションを持っている場合になります。
//ポジションの選択
order_select = OrderSelect(CurrentPosition,SELECT_BY_POS);
これはポジションを選択する関数です。
オーダー関数でチケット番号を入れた変数を使って、どのポジションを決済するか選択しています。
order_select =をつけているのは、OrderSelectは戻り値を使用しない場合警告が出る関数なのでとりあえず入れているだけで、今回は戻り値は使用していません。
//ポジションの確認
if(OrderSymbol() == Symbol())
これは、決済する通貨ペアが売買した通貨ペアと同じかどうかを調べています。
//もし買いポジションだったら
if(OrderType()==OP_BUY)
ポジションが買いか売りかを調べています。
売りを調べたいときは、 OP_BUYをOP_SELLに変えます。
//もし21日線が90日線を下から上にクロスしたら
if( old_fast_ma > old_slow_ma && now_fast_ma <= now_slow_ma)
今回のシステムの決済のルールです。
移動平均線のデッドクロスで決済します。
//手仕舞い
order_close = OrderClose(OrderTicket(),OrderLots(),Bid,30,Green);
今回のメインの手仕舞いの関数です。
日本語にすると次のようになります。
手仕舞いの関数(ポジション番号、ロット数、レート、スリッページ、色)
オーダー関数と似たような部分が多いので、簡単に説明して行きます。
ポジション番号と、ロット数ですが、先程OrderSelectを使ったことによって、OrderTicket()とOrderLots()にポジションのデータが入っていますので、このまま書いてもらえれば問題ないです。
レートは、買いのときがAskでしたので、決済時は売りになりますからBidにします。
決済時に買いになる時は、Askと入力して下さい。
スリッページはPipsで設定します。証券会社によって異なりますが大体の場合1と入力した場合は0.1Pipsになります。3Pipsにしたい場合は30と入力します。
色は、注文した時と違う色にした方が分かりやすいです。
あと、OrderCloseも戻り値を使用しないと警告が出ますので、order_closeに戻り値を入れています。
これで、今回のプログラムは終了です。
OrderClose()関数はOrderSelect()関数に次いで良く使いますので、頑張って使い方を習得して下さい。
では、コードを全て書けたらコンパイルボタンを押してください。
エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。
どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。
エラーが出なかったら、MetaTrader 4のバックテストでiMA2を選んで、スタートして下さい。
終わったら、結果、グラフ、レポートを見てください。
エントリーが正しく行われていれば大丈夫です。
今回はこれで終了です。
後は応用だけでオリジナルのシステムを作ることが出来ると思いますので、オリジナルのシステムにチャレンジしてみるのも良いと思います。
次回は、ドテン売買の仕方を説明して行きます。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。