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ô?
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
Agora o manipulador de eventos secundários no esquema é proposto para ser implementado desta forma:
On2TradeTransaction(...)
{
if флаг установлен goto label
/*вычисления1*/
запомнить результаты вычислений
установить флаг
return;
label: извлечь результаты вычислений
/*вычисления2*/
}
É 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)
elseOrderSend(OP_SELLLIMIT)
}
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)
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)
elseOrderSend(OP_SELLLIMIT)
}
}
há uma solução mais elegante, sem o OnTimer... pense sobre isso
Em Combat Advisors, eu embrulhei funções em todos os lugares suspeitos para _B(FuncName(...), AlertTime).
Esqueceu que é muito caro.
Na melhor das hipóteses, eu gasto dezenas de milissegundos em cada tick só por causa da HistorySelect.
Perfilando o conselheiro de combate.
Por que usar HS caro, exceto quando se inicia o robô?
Escreveu no início da linha.
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();On2TradeTransaction(...) { if флаг установлен goto label /*вычисления1*/ запомнить результаты вычислений установить флаг return; label: извлечь результаты вычислений /*вычисления2*/ }É aqui que eu realmente não entendo - se você puder, por favor, descreva-o passo a passo com mais detalhes.
Por que você não poderetornar após ligar paraOrderSend?
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.
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