まずは、仕掛の方です。
<売りエントリー>
・終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時は【成行で売りエントリー】
<どちらにも該当>
・既にポジションを持っているときはポジション維持
また、ポジション維持も少し考えます。
エントリーの条件は、買いと比べると使う指標は同じで大小の符号が逆になります。
買いポジションの決済の時に出てきたもので、
Close[1]<Close[2] && macd1<macd2
のようになります。
次に、ポジションの維持について少し考えます。
買いの条件の時に、buypos を使用して、buypos が0の時、
すなわち買いポジションがない時にだけ仕掛の条件を考えるとしました。
売りも同様に、sellpos を使用して売りのポジションの数を数えて、
sellpos が0のとき、すなわち売りポジションがない時だけ仕掛けるようにすればいいのですが、
買いのポジションを保有中に売りの条件に適合した場合、
売りのポジションを建てる可能性があります。
なので、買いも売りも仕掛けの判断をする時に、
買いと売りのどちらのポジションも持っていないことを確認する必要があります。
ポジション計算の部分を、
//ポジション計算
int buypos=0;
int sellpos=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic01)
{
if(OrderType()==OP_BUY) buypos++;
if(OrderType()==OP_SELL) sellpos++;
}
}
int totalpos=buypos+sellpos;
このように修正して、売りのポジションを数えた後に、買いと売りのポジションを足して、
トータルのポジションを計算するようにしておきます。
次に、仕掛の判断の部分で、買いの部分を修正し、売りを作成します。
//仕掛判断
//買い判断
if(entrybar!=Bars && totalpos==0 && Close[1]>Close[2] && macd1>macd2)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",magic01,0,Blue);
entrybar=Bars;
}
//売り判断
if(entrybar!=Bars && totalpos==0 && Close[1]<Close[2] && macd1<macd2)
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",magic01,0,Red);
entrybar=Bars;
}
このように、ポジション数の判断に totalpos を使用し、
買い判断と売り判断共に、どちらのポジションもない時にしか、仕掛ないようにします。
と、こんな感じで決済は次回にまわします。