On2TradeTransaction(...)
{
if флаг установлен goto label
/*вычисления1*/
запомнить результаты вычислений
установить флаг
return;
label: извлечь результаты вычислений
/*вычисления2*/
}
void OnMain()
{
OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).// Следующий OrderSend должен быть незамедлительно вызван.if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.OrderSend(OP_BUYLIMIT)
elseOrderSend(OP_SELLLIMIT)
}
void OnMain()
{
if (first)
{
OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).return;
}
//...
}
void OnMain()
{
if (first)
{
OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).return;
}
if ( OnTrade событие последнее )
return; //может еще есть
if ( OnTimer событие последнее )
{ // все торговые события в лукошкеif (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.OrderSend(OP_BUYLIMIT)
elseOrderSend(OP_SELLLIMIT)
}
}
Combat Advisorsでは、_B(FuncName(...), AlertTime) まで怪しいところで関数をラップしてしまっています。
非常に高価であることを忘れていた。
HistorySelectのせいで、せいぜい1tickに数十ミリ秒を費やしている程度です。
コンバットアドバイザーのプロファイリング
ロボット起動時以外、高価なHSを全く使わないのはなぜか?
スレッドの冒頭に書きました。
OrderSendを行う。もし、OrderSendの終了直後に、あるポジションが同時に決済されなかった場合、再度OrderSendを行う。プログラミングに必要なロジックはこれだけです。Asyncは使用しない。
さて、私たちのロボットに起こった状況です。OrderSendを送信し、それが実行されている間にLimiterが作動し、そして先ほど申し上げたように我々のポジションのTPが実行されたのです。
本当に何も分からないのですが、もし可能であれば、もう少し詳しく手順を説明してください。OnTradeTransaction イベントハンドラのみが使用されていることから、イベント処理の優先順位管理は必要ないと判断し、提案された
bool HandleNextEvent(ENUM_EVENT_TYPE);
になる
bool HandleNextEvent();
ここが本当に分からないのですが、もし可能なら、もっと詳しくステップバイステップで説明してください。
なぜOrderSendを 呼び出した後に戻る ことができないのでしょうか?
次回、新しいイベントがすでにキューに追加されているときにOnMainに戻る(またはタイマーで戻る)
A100:
なぜOrderSendの 呼び出しの後にreturnが ないのですか?
制限はありません。
次回、新しいイベントがキューに追加されたとき(またはタイマーで)OnMainに戻ります。
次のイベントは、保留中の注文の実行であり、テイクポジションではありません。
次のイベントは、保留中の注文の実行であり、ポジションの引継ぎではありません。
現在のキュー全体を読み込むか、指定された数のイベントを読み込むまで、繰り返しリターンすることが推奨されます。トレードイベントが終了すると、タイマーが戻り、すべてのイベントに一度にアクセスできるようになります。