MT5とスピードの関係 - ページ 5

 
fxsaber:

Combat Advisorsでは、_B(FuncName(...), AlertTime) まで怪しいところで関数をラップしてしまっています。

非常に高価であることを忘れていた。

        Alert: Time[SyncEA.mqh 309: ::TerminalInfoInteger(TERMINAL_MEMORY_USED)] = 21 ms.
 
fxsaber:

HistorySelectのせいで、せいぜい1tickに数十ミリ秒を費やしている程度です。

コンバットアドバイザーのプロファイリング


 
それか、それ以外か。注文に成功した場合、そのチケットは返却されるのですか?HistoryOrderSelect(ticket)関数の 戻り値で何かわかるのでしょうか?なぜわざわざ高価なHSを、ロボットの起動時以外に使うのか?
 
Vladimir Simakov:
ロボット起動時以外、高価なHSを全く使わないのはなぜか?

スレッドの冒頭に書きました。

 
fxsaber:

OrderSendを行う。もし、OrderSendの終了直後に、あるポジションが同時に決済されなかった場合、再度OrderSendを行う。プログラミングに必要なロジックはこれだけです。Asyncは使用しない。

さて、私たちのロボットに起こった状況です。OrderSendを送信し、それが実行されている間にLimiterが作動し、そして先ほど申し上げたように我々のポジションのTPが実行されたのです。

本当に何も分からないのですが、もし可能であれば、もう少し詳しく手順を説明してください。OnTradeTransaction イベントハンドラのみが使用されていることから、イベント処理の優先順位管理は必要ないと判断し、提案された

bool HandleNextEvent(ENUM_EVENT_TYPE);

になる

bool HandleNextEvent();
リクエストは 何だったのですか?HandleNextEvent()を教えてください。
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
さて、この方式での セカンダリーイベントハンドラは、次のような実装が提案されています。
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

ここが本当に分からないのですが、もし可能なら、もっと詳しくステップバイステップで説明してください。

void OnMain()
{
  OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
  
  // Следующий OrderSend должен быть незамедлительно вызван.
  if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
    OrderSend(OP_BUYLIMIT)  
  else
    OrderSend(OP_SELLLIMIT)    
}
 
fxsaber:

なぜOrderSendを 呼び出した後に戻る ことができないのでしょうか?

void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return;
        }
//...
}

次回、新しいイベントがすでにキューに追加されているときにOnMainに戻る(またはタイマーで戻る)

 

A100:

なぜOrderSendの 呼び出しの後にreturnが ないのですか?

制限はありません。

次回、新しいイベントがキューに追加されたとき(またはタイマーで)OnMainに戻ります。

次のイベントは、保留中の注文の実行であり、テイクポジションではありません。

 
fxsaber:

次のイベントは、保留中の注文の実行であり、ポジションの引継ぎではありません。

現在のキュー全体を読み込むか、指定された数のイベントを読み込むまで、繰り返しリターンすることが推奨されます。トレードイベントが終了すると、タイマーが戻り、すべてのイベントに一度にアクセスできるようになります。

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
OnTimerを使用しない、よりエレガントなソリューションがあります。かんがみる