MT5 и скорость в боевом исполнении - страница 5

 
fxsaber:

В боевых советниках везде в подозрительных местах облачил функции в _B(FuncName(...), AlertTime).

Забыл, что это очень дорого.

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

ЗЫ На каждом тике в лучшем случае трачу суммарно десятки миллисекунд только из-за HistorySelect.

Профилирование боевого советника.


 
Толи лыжи не едут, толи еще что. При успешном выставлении ордера его ticket возвращается? Возврат функции HistoryOrderSelect(ticket) Вам о чем-нибудь говорит? Зачем вообще использовать дорогой HS, кроме как при старте робота?
 
Vladimir Simakov:
Зачем вообще использовать дорогой HS, кроме как при старте робота?

Написал в начале ветки.

 
fxsaber:

Вы делаете OrderSend. Если СРАЗУ после окончания OrderSend определенная позиция не закрылась по тейку, то делаете еще один OrderSend. Это вся логика, которую надо запрограммировать. Async не используем.

Теперь ситуация, которая произошла для нашего робота. Вы отправили OrderSend, и пока он выполнялся произошло срабатывание лимитника и после этого срабатывание тейка нашей позиции, что упоминал выше.

Вот здесь я действительно ничего не понял - если есть возможность распишите пожалуйста более детально по шагам. Единственное что понял, что используется только обработчик событий 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 сделать return ?

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

в следующий раз Вы вернетесь в OnMain когда новое событие уже будет добавлено в очередь (либо по таймеру)

 

A100:

А почему нельзя после вызова OrderSend сделать return ?

Нет на это ограничений.

в следующий раз Вы вернетесь в OnMain когда новое событие уже будет добавлено в очередь (либо по таймеру)

Следующее событие - исполнение отложки, а не тейка позиции.

 
fxsaber:

Следующее событие - исполнение отложки, а не тейка позиции.

Предлагается делать неоднократный возврат (return), пока Вы или всю текущую очередь не прочитаете или на заданное число событий. Когда торговые события закончатся - будет возврат по таймеру и у Вас будет доступ сразу ко всем событиям

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