for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++; // если мы сюда попадаем при проверке состояния, не запускать стратегию вообще, т.к. это промежуточное состояние.
簡単な例で見る正しい選択
注文がまだポジションに計上されていない場合は、計上されるのを待つだけの方が良いと思います。
その発想はない。
この図は、MetaQuotes-DemoでOrderSendAsyncを使って 成行注文を出すと、注文が約定するか拒否されるまで、対応する注文を確実にキャッチすることができないことを示しています。つまり、MT5には、そのOrderSendAsyncの中間結果を評価する簡単なメカニズムがない。
がテーマになっているようです。
ここで、このコード:
は、DEMO(result=request)で完璧に動作します。
しかし、REALでは、結果を得ることができません(result=0.0).数秒待たない限りは。
主題にあるようだ。
このようなコードがあることを指摘したい。
DEMOでは、完璧に動作します(result=request)。
しかし、REALでは結果(result=0.0)を得ることができません。数秒待たない限りは。
ログ、OrderSend 後の構造体フィールドの値、取引サーバー名などのデータが不足しています。
一言で言えば、「成行注文があれば、それも『ポジション』だと思え」ということです。ラップポジションなので倒置カンマで。ハイライトされたコードは通常、どこにも表示されません。しかし、ポジションの再オープンを 回避することができます。ここで最も興味深いのは、赤で示した部分です。このチップの必要性はすぐにわかるものではありません。
次のティックではトレードシグナルが出ないかもしれません。私自身はMT4スタイルを使っているので、どうしてもそういう「ポジション」を面倒くさがらずに見てしまうんです。
ログ、OrderSend後の構造体フィールドの値、取引サーバー名などのデータが不足しています。
2018.02.20 15:20:35.845 取引注文 #66745055 買い 0.01 / 0.01 EURUSDeur at market done in 610.625 ms
2018.02.20 15:20:35.935 トレード案件 #5461453 買い 0.01 EURUSDeur at 1.23403 完了(注文#66745055に基づく)
2018.02.20 15:20:35.845 TestBUY (EURUSDeur,M15)retcode=10009 deal=0 order=66745055
要求が満たされた場合(10009)、なぜdeal=0なのか?
リクエストが完了した場合(10009)、なぜdeal=0なのか?
ほぼそこから議論が 始まりましたね。リンク先に詳細があります。
OrderSendが完全に動作するソリューションもありますが、それは宣伝になります。
簡単な例で見る正しい選択
一言で言えば、「成行注文があれば、それも『ポジション』と考えよ」ということです。包み込むようなポジションなので、引用符で囲んでいます。ハイライトされたコードは通常、どこにも表示されません。しかし、ポジションの再オープンを 回避することができます。ここで最も興味深いのは、赤で示した部分です。このチップの必要性はすぐにわかるものではありません。
いわゆる寄り付き成行注文があることです。同じSL/TPです。もちろん、このような成行注文を「ポジション」と見なすのは好ましくありません。そして、せっかく出した注文も閉まってしまうのは避けたい。つまり、ハイライトされた状態が適切なフィルターということになる。
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;
SZYここに このコードを挿入して、デモサーバーで 結果を確認してください。
興味のある方はぜひ、この問題について議論してください。この件に関する私の考えは以下の通りです。
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;
このループは、ポジションIDを持たない(IDが0である)オーダーが見つかった場合、1つのポジションを追加します。
ポジションを1つ増やしました。
サーバーで注文がキャンセルされた場合はどうなりますか?
...
成行注文を計算するときに、例えば、1つ見つけた場合、WRONG_VALUEを返すべきだと思います - ポジションは0より小さくできません。これは、未記録の成行注文があることを示すシグナルとなる。しかし、ポジションの数を増やすことはしない。