MT5 e velocidade em ação - página 5

 
fxsaber:

Em Combat Advisors, eu embrulhei funções em todos os lugares suspeitos para _B(FuncName(...), AlertTime).

Esqueceu que é muito caro.

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

Na melhor das hipóteses, eu gasto dezenas de milissegundos em cada tick só por causa da HistorySelect.

Perfilando o conselheiro de combate.


 
Ou é isso ou outra coisa qualquer. Quando um pedido é feito com sucesso, seu bilhete é devolvido? O retorno da função HistoryOrderSelect(ticket) lhe diz alguma coisa? Por que se preocupar em usar HS caro, exceto ao iniciar o robô?
 
Vladimir Simakov:
Por que usar HS caro, exceto quando se inicia o robô?

Escreveu no início da linha.

 
fxsaber:

Você faz um OrderSend. Se, imediatamente após o fim da OrderSend, uma determinada posição não tiver sido fechada ao mesmo tempo, você faz outra OrderSend. Esta é toda a lógica que você precisa para programar. O Async não é utilizado.

Agora a situação que aconteceu com o nosso robô. Você enviou uma OrderSend e enquanto ela está sendo executada o Limitador acionou e então o TP de nossa posição foi executado, como eu mencionei anteriormente.

Eu realmente não entendo nada sobre isto - se você puder, por favor, descreva as etapas com mais detalhes. A única coisa que consegui foi que somente o gerenciador de eventosda OnTradeTransaction é usado, o que significa que não precisamos de gerenciamento prioritário de eventos e o sugerido

bool HandleNextEvent(ENUM_EVENT_TYPE);

degenera em

bool HandleNextEvent();
Qual foi o pedido? Dê-nosHandleNextEvent()
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
Agora o manipulador de eventos secundários no esquema é proposto para ser implementado desta forma:
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

É aqui que eu realmente não entendo - se você puder, por favor, descreva-o passo a passo com mais detalhes.

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

Por que você não poderetornar após ligar paraOrderSend?

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

Da próxima vez que você retornar à OnMain quando um novo evento tiver sido adicionado à fila (ou por timer)

 

A100:

Por que a chamada deOrderSend não pode ser seguida porum retorno?

Não há limitação.

Da próxima vez que você retornar à OnMain quando um novo evento for adicionado à fila (ou por timer)

O próximo evento é a execução de uma ordem pendente e não de uma tomada de posição.

 
fxsaber:

O próximo evento é a execução da ordem pendente, não a tomada do cargo.

Sugere-se voltar repetidamente, até ler toda a fila atual ou para um determinado número de eventos. Quando os eventos comerciais terminarem - haverá um retorno de tempo e você terá acesso a todos os eventos de uma só vez

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
há uma solução mais elegante, sem o OnTimer... pense sobre isso