手仕舞いの仕方
今回は
手仕舞いの仕方です。
今回は比較的簡単だと思いますので、頑張ってください。
サンプルプログラムはこちらです。
http://jidoubaibai.com/Sample%20iMA2.mq4
サンプルプログラムの使い方は、
こちらで説明しています。
では、
MetaEditorを起動して下さい。
Nameは
iMA2にして置いて下さい。
int
start()の中のreturn(0);の上辺りに次のコードを書いてください。
まとめて書きますね。
途中までは、前回のiMAと同じ内容なので、前回のプログラムに後半を付け足してもらっても大丈夫です。
//変数の宣言
int
cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double kakob,gennzaib;
//
オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt < OrderSelect(cnt,SELECT_BY_POS);
if(OrderSymbol() == Symbol())
CurrentPosition=cnt;
}
//一時間前の21日線
kakoa =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一時間前の90日線
kakob =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);
//現在の21日線
gennzaia =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
gennzaib =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);
//
ポジションチェック ポジション無し
if(CurrentPosition == -1)
{
//もし21日線が90日線を下から上にクロスしたら
if( kakoa < kakob && gennzaia
>= gennzaib)
{
//買いポジションを取る
Ticket =
OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Blue);
}
}
// ポジション有り
else
{
//ポジションの選択
OrderSelect(Ticket,SELECT_BY_POS);
//ポジションの確認
if(OrderSymbol()
== Symbol())
{
//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//もし21日線が90日線を上から下にクロスしたら
if( kakoa > kakob
&& gennzaia <=
gennzaib)
{
//手仕舞い
OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
}
}
}
}
書けましたか?
オーダー関数までは前回に説明しましたので、説明は飛ばします。
ただ、今回は損切りと利食いの設定を無しにしていますので、そこだけ変更して置いてください。
分からない場合は、オーダー関数のところだけコードを書き換えてください。
では、説明して行きます。
elseは以前
if文の説明でやりましたね。
先に使ったif以外という意味なので、今回は先のifがポジションを持っていない場合でしたので、elseはポジションを持っている場合になります。
//ポジションの選択
OrderSelect(Ticket,SELECT_BY_POS);
これはポジションを選択する関数です。
オーダー関数でチケット番号を入れた変数を使って、どのポジションを決済するか選択しています。
//ポジションの確認
if(OrderSymbol()
==
Symbol())
これは、決済する通貨ペアが売買した通貨ペアと同じかどうかを調べています。
念のためみたいなものなので、実際にはこのコードを書かなくてもほとんど問題ないです。
//もし買いポジションだったら
if(OrderType()==OP_BUY)
ポジションが買いか売りかを調べています。
売りを調べたいときは、
OP_BUYを
OP_SELLに変えます。
//もし21日線が90日線を上から下にクロスしたら
if( kakoa >
kakob && gennzaia <=
gennzaib)
今回のシステムの
決済のルールです。
移動平均線の
ゴールデンクロスで買って、
デッドクロスで決済します。
//手仕舞い
OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
今回のメインの
手仕舞いの関数です。
日本語にすると次のようになります。
手仕舞いの関数(ポジション番号、ロット数、レート、スリップページ、色)
オーダー関数と似たような部分が多いので、簡単に説明して行きます。
ポジション番号と、
ロット数ですが、先程
OrderSelectを使ったことによって、
OrderTicket()と
OrderLots()にポジションのデータが入っていますので、このまま書いてもらえれば問題ないです。
レートは、買いのときが
Askでしたので、決済時は売りになりますから
Bidにします。
決済時に買いになる時は、
Askと入力して下さい。
スリップページは注文した時と同じ数字を入れてください。
色は、注文した時と違う色にした方が分かりやすいです。
これで、今回のプログラムは終了です。
OrderClose()関数は
OrderSelect()関数に次いで良く使いますので、頑張って使い方を習得して下さい。
では、もう一度まとめてプログラムを書きます。
int
start()
{
//変数の宣言
int cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double kakob,gennzaib;
//
オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt < OrderSelect(cnt,SELECT_BY_POS);
if(OrderSymbol() == Symbol())
CurrentPosition=cnt;
}
//一時間前の21日線
kakoa =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一時間前の90日線
kakob =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);
//現在の21日線
gennzaia =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
gennzaib =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);
//
ポジションチェック ポジション無し
if(CurrentPosition == -1)
{
//もし21日線が90日線を下から上にクロスしたら
if( kakoa < kakob && gennzaia
>= gennzaib)
{
//買いポジションを取る
Ticket =
OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Blue);
}
}
// ポジション有り
else
{
//ポジションの選択
OrderSelect(Ticket,SELECT_BY_POS);
//ポジションの確認
if(OrderSymbol()
== Symbol())
{
//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//もし21日線が90日線を上から下にクロスしたら
if( kakoa > kakob
&& gennzaia <=
gennzaib)
{
//手仕舞い
OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
}
}
}
}
return(0);
}
今回のプログラムは、移動平均線のゴールデンクロスで買い、デッドクロスで手仕舞いするというものです。
では、
コンパイルをするために
compileのボタンを押してください。
エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。
どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。
エラーが出なかったら、
MetaTrader4の
バックテストで
iMA2を選んで、スタートして下さい。
終わったら、結果、Graph、レポートを見てください。
今回はこれで終了です。
後は応用だけで
オリジナルのシステムを作ることが出来ると思いますので、オリジナルのシステムにチャレンジしてみるのも良いと思います。
次回は、
ドテン売買の仕方を説明して行きます。
----------------------注意----------------------
コードを見易くするために全角で書いている場合があります。
実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。