for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS)==true) { if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; if (OrderType()==OP_BUY) b++; if (OrderType()==OP_SELL) s++; if (OrderType()==OP_BUYSTOP) b_STOP++; if (OrderType()==OP_SELLSTOP) s_STOP++; } if (OrderType()==OP_BUY) { if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция { OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE); CLOSEORDER(OP_SELL); } } } }
for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS)==true) { if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; if (OrderType()==OP_BUY) b++; if (OrderType()==OP_SELL) s++; if (OrderType()==OP_BUYSTOP) b_STOP++; if (OrderType()==OP_SELLSTOP) s_STOP++; } if (OrderType()==OP_BUY) { if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция { OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE); CLOSEORDER(OP_SELL); } } } }
最後の負け惜しみは、自分でどうするか、どんなパラメータを調整するか、考えればわかると思います
ありがとうございます。
テイクプロフィット 後、ロットを元の値に戻すにはどうすればよいですか?
{
lot=0.1
}
ありがとうございます。
テイクプロフィット 後、ロットを元の値に戻すにはどうしたらよいですか?
{
lot=0.1
}
私は次のようなスキームを持っています。
if (注文合計()==0)
{
初期ロットで開く
}
さもなくば
...
つまり、注文がない場合は、古いロットで開くことはありません。
もちろん、各オーダーを暗記することは可能ですが、その方法は教えてくれません。カウンターは、ある閾値に達すると開始され、初期値にリセットされる必要があります。
{
//---
int b_STOP,s_STOP,b=0,s=0;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY) b++;
if (OrderType()==OP_SELL) s++;
if (OrderType()==OP_BUYSTOP) b_STOP++;
if (OrderType()==OP_SELLSTOP) s_STOP++;
}
if (OrderType()==OP_BUY)
{
if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
CLOSEORDER(OP_SELL);
}
}
}
}
OrderProfit()<0関数が機能しない理由を説明してください。
{
if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderType()<2 && OrderMagicNumber()==magic)
{
if (OrderProfit()<0)
{
if (DayOfWeek()==1)
{
day1++;
Print ("Понедельник SL=",day1);
}
if (DayOfWeek()==2)
{
day2++;
Print ("Вторник SL=",day2);
}
}
}
}
}
曜日 ごとのストップロスの数を確認したい。
{
if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()<0 && OrderType()<2)
{
oldticket=OrderTicket();
}
if (oldticket>=ticket)
{
ticket=oldticket;
lot=OrderLots()*4;
}
if (OrderProfit()>0 && OrderType()<2)
{
lot=0.01;
}
}
}
と、ここでも同じ理由でうまくいかないと思います。
OrderProfit()<0関数が機能しない理由を説明してください。
{
if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderType()<2 && OrderMagicNumber()==magic)
{
if (OrderProfit()<0)
{
if (DayOfWeek()==1)
{
day1++;
Print ("Понедельник SL=",day1);
}
if (DayOfWeek()==2)
{
day2++;
Print ("Вторник SL=",day2);
}
}
}
}
}
曜日 ごとのストップロスの数を確認したい。
{
if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()<0 && OrderType()<2)
{
oldticket=OrderTicket();
}
if (oldticket>=ticket)
{
ticket=oldticket;
lot=OrderLots()*4;
}
if (OrderProfit()<0 && OrderType()<2)
{
lot=0.01;
}
}
}
とありますが、これも同じ理由でうまくいかないのでしょう。
なぜなら、DayOfWeek()は、最後に判明したサーバー 時刻の曜日のオーダー番号を返すからです。
そして、注文終了時刻の曜日が必要です:TimeDayOfWeek(OrderCloseTime());
なぜなら、DayOfWeek()は、最後に判明したサーバー 時刻の曜日のオーダー番号を返すからです。
そして、注文終了時刻の曜日が必要です:TimeDayOfWeek(OrderCloseTime());
しかし、結果は同じで、if(OrderProfit()<0)を無視してループがあると、変数が大きな 値を取得するようです。
2017.01.19 00:42:47.883 2014.02.20 23:59:48 EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48 EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48 EURUSD,H1: Понедельник SL=963665
また、ロットでのループはどうでしょうか? ここに間違ってコピーしてしまい、符号を修正しましたif(OrderProfit()>0&&OrderType()<2)、しかし本質は変わらず、この条件がなくてもループは正しく動 きます。
しかし、結果は同じで、if(OrderProfit()<0)を無視してループがあると、変数が大きな値を持って しまうのです。
2017.01.19 00:42:47.883 2014.02.20 23:59:48 EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48 EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48 EURUSD,H1: Понедельник SL=963665
そして、ロットでのループについて? ここに間違ってコピーしてしまい、符号を修正しましたif(OrderProfit()>0&&OrderType()<2)) しかし、本質は変わらず、この条件なしでループは正しく 機能します。
day1 と day2 はどこで宣言されていますか?
day1 と day2 はどこで宣言されていますか?
注文の選択が間違って いるのか、うまくいきません(OrderProfit()<0)。最後の注文がTake-Pointで終了し、他に注文がないのに、なぜスキップするのかわかりません。 もしかして、履歴を検索したい場合は、ループの作り方が違うのでしょうか?
{
if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))
理由は、Expert Advisorは同様の条件でループを構築し、必要な動作をしますが、OrdersTotal() を使用して動作するためです。
{
if(OrderSelect(n,SELECT_BY_POS))
{
if(OrderMagicNumber()==magic)
{
if(OrderType()>OP_SELL)
{
//---
int b_STOP,s_STOP,b=0,s=0;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY) b++;
if (OrderType()==OP_SELL) s++;
if (OrderType()==OP_BUYSTOP) b_STOP++;
if (OrderType()==OP_SELLSTOP) s_STOP++;
}
if (OrderType()==OP_BUY)
{
if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
CLOSEORDER(OP_SELL);
}
}
}
}
これは1サイクルで解決できるものではありません。このループでは,削除するオーダーのティッカーを配列に記憶させ,次のループでティッカー単位で削除するようにします。
さらに、中括弧がめちゃくちゃです。OrderSelect{} ブロックの外側で注文を扱っていますが、これは間違っています。