今回は、
ドテン売買のシステムの説明です。
サンプルプログラムはこちらです。
http://jidoubaibai.com/Sample%20iMA3.mq4
サンプルプログラムの使い方は、
こちらで説明しています。
では、
MetaEditorを起動して下さい。
Nameは
iMA3にして置いて下さい。
内容はほとんど前回と同じです。
仕掛けと手仕舞い後の処理が少し違っています。
では、まとめて書きますね。
int
start()
{
//変数の宣言
int cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double kakob,gennzaib;
//
オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt <
OrdersTotal();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, Red);
}
//もし21日線が90日線を上から下にクロスしたら
if( kakoa > kakob &&
gennzaia <= gennzaib)
{
//売りポジションを取る
Ticket =
OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "Sell", 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);
//ドテンで売りポジションを取る
Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "Sell", 0, 0,
Blue);
}
}
//もし売りポジションだったら
else
if(OrderType()==OP_SELL)
{
//もし21日線が90日線を下から上にクロスしたら
if(
kakoa < kakob && gennzaia >= gennzaib)
{
//手仕舞い
OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
//ドテンで買いポジションを取る
Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0,
Red);
}
}
}
}
return(0);
}
書けましたか?
今回は、前回の応用みたいな感じなので、細かい説明は省きますね。
変更点は、まず仕掛けに売りを追加しました。
売りにする場合は、
OP_BUYを
OP_SELLにして、
Askを
Bidにして下さい。
そして売りの手仕舞いを追加して、手仕舞いの後に、手仕舞いが
売りなら買い、手仕舞いが
買いなら売りのオーダーを追加しました。
こうすることによってドテン売買をすることが出来ます。
仕掛けに買いと売りの両方のオーダーが書いてあるから、いちいち手仕舞いの後に書かなくてもよいのでは?という疑問が浮かぶ人もいるかもしれませんが、手仕舞いのところに書かないとドテン売買出来ません。
それは何故かというと、
プログラムは基本的に上から下に命令を実行して行きますので、手仕舞いのところを通過すると、仕掛けのコードの方が上にありますので、仕掛けの命令は実行しません。
仕掛けの命令を実行するのは、次の時間足になります。
そして、次の時間足になった場合は、売買ルールの条件を満たしていませんので、オーダーは実行されません。
例えば、買いの条件は移動平均の21日線が一つ前の足では90日線の下で、現在では90日線の上になっていることですが、次の時間足になった場合は、前回も現在も21日線のほうが上にありますので、オーダーが実行されません。
プログラムはこういう細かいところを間違えるとシステムの内容が異なってきますので気をつけて下さい。
これで、今回のプログラムは終了です。
今回のシステムは移動平均の21日線と90日線のゴールデンクロスで買い、デッドクロスで売り、手仕舞いは仕掛けの逆のルールで行い、手仕舞いの後にドテン売買するというものです。
では、
コンパイルをするために
compileのボタンを押してください。
エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。
どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。
エラーが出なかったら、
MetaTrader4の
バックテストで
iMA3を選んで、スタートして下さい。
終わったら、結果、Graph、レポートを見てください。
今回はこれで終了です。
次回は
MACD関数の説明です。
----------------------注意----------------------
半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。