買いポジションについての決済の条件は以下の通りです。
<買いポジション>
・エントリーした足の安値を終値ベースで下抜ける時は【成行で決済】
・終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時は【成行で決済】
それをプログラムしたものが以下です。
//手仕舞い判断
if(entrybar!=Bars && buypos!=0
&& (entrylow>Close[1] || (Close[1]<Close[2] && macd1<macd2)))
{
for(i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=magic01 || OrderSymbol()!=Symbol()) continue;
if(OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
}
}
}
エントリーした足の安値を終値ベースで下抜ける時
ということなので、エントリーした足の安値を覚えておく必要があります。
これは、決済処理の手前の
if(entrybar==Bars) entrylow=Low[0];
で行っています。
仕掛を行った際に、entrybar に Bars でローソク足の数を覚えました。
足が新しく出来て Bars の数が変わるまでは、エントリーした足ということです。
entrybar と Bars の数が同じであれば、
entrylow に Low[0] (安値)の値を覚えさせます。
次の足に変わった時には、この処理は行われないので、
エントリーした足の安値は entrylow に覚えられたままです。
そして、決済処理の entrylow>Close[1] の部分で、
エントリーした足の安値を終値で割り込んだかどうか判断します。
終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時
というのは、前回の買いの仕掛の条件で大きくなる時を説明しましたが、
その反対に小さくなる時です。
使う指標は同じで、不等号が反対になりますので、
(Close[1]<Close[2] && macd1<macd2)
このように書き表わせます。
為替レートとMACDのラインの条件が同時に起こった時なので、
この二つは( )をつけてひとくくりにしておきます。
・エントリーした足の安値を終値ベースで下抜ける時
・終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時
の二つの条件は、どちらか片方が条件を満たせば決済するので、
|| を使ってどちらかが満たす時、とします。
他の条件として、
entrybar!=Bars
は、エントリーしたローソク足かどうかを確認し、
ローソク足の数が entrybar 以外の時、
つまりエントリーしたローソク足以外で判断するという設定です。
また、
buypos!=0
は、買いのポジションの数をチェックして、
0以外の時、つまりポジションがある時だけ処理するという設定です。
このようにして、条件を組み合わせて判断していきます。
そして、全ての条件を満たしていれば決済を行います。
って感じで今回はここまでです。