Pergunta sobre a função OnTradeTransaction - página 2

 
Mikalas:

Sim, é possível não usar a OnTradeTransaction, mas então você teria que pesquisar o histórico, o que reduziria o desempenho geral da EA.

Todo desenvolvedor tem uma escolha!

Foi por isso que comecei a cavar nesta direção...

Obrigado pelo esclarecimento. Vou continuar cavando. Ninguém está me apressando. :))))

 
AlexeyVik:

Foi por isso que comecei a cavar nessa direção...

Obrigado pelo esclarecimento. Vou continuar cavando. Ninguém está me apressando. :))))

A questão é que o exemplo que dei é apenas um seguro de que o evento TradeTransaction não vai acontecer

Na verdade, tive 6 meses de trabalho diário da EA em uma conta real com 2000 transações por dia,

Eu NUNCA tive uma situação de "emergência"!

Boa sorte!

 
C-4:
Como se entendêssemos tudo e batêssemos palmas de alegria. Desculpe, mas seu código está uma bagunça.

Ah sim, eu esqueci completamente, Vasiliy!

O código está 100% funcionando - jogue a EA na demonstração e veja como funciona

no modo normal, e depois comente a função OnTradeTransaction e você

você verá como funciona o modo "emergência".

 
AlexeyVik:

Então, se você não usar assíncrono, não há necessidade do manipulador da OnTradeTransaction, porque as corujas vão esperar por uma resposta do servidor?

Não complique as coisas. Não há necessidade de utilizar a assíncronia para o comércio em FORTS. Para começar, veja este artigo, capítulo 3: "O básico das operações assíncronas". Não é muito, é muito básico, mas é o suficiente para começar a estudá-lo. O código ali descrito é 100% assíncrono, porém, não o impede de trabalhar em modo síncrono sem obter toda a OnTradeTransaction e outros eventos.

AlexeyVik:

Mas até agora não encontrei a melhor maneira de determinar se uma ordem de parada foi ativada. Por exemplo, eu defini o mercado Comprar 0,1 e VenderStop 0,3, mas quando ativa 0,3, ele permanece 0,2 e em que momento devo segui-lo... Assim, acontece que temos que seguir duas ordens a cada tique. E eu queria aliviar as Corujas e controlar somente quando a transação acontecesse. Eu queria nem mesmo controlar, mas verificar o que aconteceu e decidir o que fazer. Mas acho que este não é o caso... Talvez seja melhor voltar aos métodos antigos, testados e testados.

A solução deve ser baseada em sua tarefa. No MetaTrader 5, você tem apenas uma posição ativa em um determinado momento, portanto cabe a você ficar de olho nele. Não há necessidade de olhar para o histórico do pedido. Se você ainda precisa do histórico do pedido, então você precisa esclarecer seu objetivo.

 
Mikalas:

Ah sim, eu esqueci completamente, Vasiliy!

O código está 100% funcionando - jogue a EA na demonstração e veja como ela funciona

no modo normal, e depois comente a função OnTradeTransaction e você

você verá como funciona o modo "emergência".

Examinei seu código mais de perto. Você está tornando tudo muito complicado. Não deve haver nenhum modo de "emergência". Independentemente do tipo de negociação ser síncrona ou assíncrona, você deve se concentrar na análise do ambiente comercial. A análise de eventos do tipo OnTradeTransaction é de caráter auxiliar.

Mikalas:

Sim, você pode optar por não usar a OnTradeTransaction, mas neste caso você terá que olhar para o histórico, o que reduzirá significativamente o desempenho geral de um EA.

Todo desenvolvedor tem uma escolha!

Isso não é verdade. A análise do histórico não diminui o desempenho da EA. Em vez de seu longo CheckOrder(), basta escrever algo assim (código de trabalho real):

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

Isso é tudo. A chegada de novos negócios será automaticamente detectada pela função TrackingHistoryDeals(), que por sua vez será chamada pelo temporizador do sistema. Esta função também deve ser chamada na OnTradeTransaction(), por exemplo, na ocorrência do evento TRADE_TRANSACTION_DEAL_ADD, a fim de ganhar velocidade e não depender da permissão do temporizador definido. Se este evento for perdido, o Expert Advisor descobre as mudanças um pouco mais tarde (no meu caso são 200 ms), espera pela próxima chamada do timer e recebe informações sobre o acionamento do pedido.

 
C-4:

Analisou seu código mais de perto. Você está complicando as coisas. Não deve haver nenhum modo "crash". Independentemente do tipo de negociação ser síncrona ou assíncrona, você deve se concentrar na análise do ambiente comercial. A análise de eventos como a OnTradeTransaction é de natureza auxiliar.

Isto não é verdade. A análise do histórico não reduz o desempenho do Expert Advisor. Ao invés de seu longo CheckOrder(), você só precisa escrever algo como isto (código de trabalho real):

Isso é tudo. A chegada de novos negócios será automaticamente detectada pela função TrackingHistoryDeals(), que por sua vez será chamada pelo temporizador do sistema. Esta função também deve ser chamada na OnTradeTransaction(), por exemplo, na ocorrência do evento TRADE_TRANSACTION_DEAL_ADD, a fim de ganhar velocidade e não depender da permissão do temporizador definido. Se o evento for perdido, o Expert Advisor descobre as mudanças um pouco mais tarde (no meu caso são 200 ms), espera pela próxima chamada do timer e recebe informações sobre o acionamento do pedido.

Estamos falando idiomas diferentes.

Você tem sua opinião, e eu, se me permite, terei a minha.

Você não vê nem mesmo as coisas óbvias:

Quando o evento TradeTransaction chegar, você não precisa verificar QUALQUER COISA - TODOS os dados já existem!

A função CheckOrder() NÃO funciona de forma alguma se o evento TradeTransaction chegou!!!

 
Mikalas:

Estamos falando em "línguas diferentes".

Fique com sua opinião e deixe-me, com sua permissão, ficar com a minha.

Não, estamos falando a mesma língua - MQL5 e seu dialeto assíncrono OrderSendAsync. Não importa como você olhe para isso, as tarefas na Async precisam ser resolvidas da mesma maneira. Dê uma olhada no meuartigo acima. Código assíncrono - interagindo de forma sincronizada com especialistas externos. Essencialmente uma manifestação não trivial de polimorfismo. Tudo graças ao fato de que a ênfase neste código é colocada na análise das mudanças do ambiente comercial. Isto prova mais uma vez que o modelo do evento é útil, mas de caráter secundário, o que podemos fazer sem mesmo em operações assíncronas.
 
C-4:
Não, estamos falando a mesma língua - MQL5 e seu dialeto assíncrono OrderSendAsync. Não importa como você olhe para ela, você tem que resolver os mesmos problemas com a Async. Dê uma olhada no meuartigo acima. Código assíncrono - interagindo de forma sincronizada com especialistas externos. Essencialmente uma manifestação não trivial de polimorfismo. Tudo devido ao fato de que a ênfase neste código é colocada na análise das mudanças do ambiente comercial. Isto prova mais uma vez que o modelo orientado por eventos é útil, mas de importância secundária, e podemos passar sem ele mesmo em operações assíncronas.
Vasiliy, não seja teimoso, dê o exemplo em demonstração - então você vai entender TUDO!
 
Mikalas:
Vasily, não persista, e dê o exemplo em uma demonstração - então você entenderá TUDO!

Obrigado, não se sinta mais assim:

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 9

2015.02.05 23:37:19.036 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Pedido de bilhete não recebido. Solicitação = 2

2015.02.05 23:36:44.410 Peritos AutoComércio está habilitado

2015.02.05 23:36:41.995 TestTradeTrans (AUDCAD,H1) Pedido não enviado! Código de retorno AUDCAD = o AutoTrading não é permitido pelo terminal do cliente

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) Ordem não enviada! Código de Retorno AUDCAD = AutoTradeTrans não é permitido pelo terminal do cliente

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) Ordem não enviada! Código de Retorno AUDCAD = AutoTradeTrans não é permitido pelo terminal do cliente

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5' compilado com sucesso

Consegui desativá-lo, caso contrário teria inundado todo o terminal.

Z.I. A propósito, não tente incorporar este código no artigo. Este exemplo não é aceitável em nenhuma circunstância, pois ele é horrível com inúmeras ordens em cada carrapato!!!

 
C-4:

Obrigado, já não me apetece mais:

Consegui desligá-lo, caso contrário, os ressaltos teriam inundado todo o terminal.

:)

1. EXEMPLO para FORTS

2. você não pode colocar parênteses?

3. Tenho a impressão de que você está lendo mensagens através de uma linha :)

Vamos fazer desta maneira.

Eu lhe farei perguntas e você as responderá.

Pergunta 1: Como você reconhece o Order Ticket (enviando o comando OrderSendAsync) se nenhum evento TradeTransaction chegou (ou não é utilizado)?