Com base em minha experiência, posso dizer que a necessidade real de usar a TradeTransaction surge quando se programa no modo assíncrono. É uma pena que o artigo não diga uma palavra sobre esse modo.
s.s. Eu também pensei que "What MQL recipes". - era um título de marca registrada dos artigos de Anatoly. Mas agora parece que não é bem assim(
C-4, obrigado por sua opinião.
C-4:
Pela minha experiência, posso dizer que a necessidade real de usar a TradeTransaction surge quando se programa no modo assíncrono. É uma pena que o artigo não fale nada sobre esse modo...
Existem diferentes necessidades e requisitos que podem ser o motivo para usar o manipulador TradeTransaction. Esse é um tópico interessante, espero que colegas experientes também comentem sobre essa questão...
s.s. Eu também pensei que "MQL recipes". - era o nome da marca dos artigos de Anatoly. E agora parece que não é(
Sim, admito que Anatoly é o inventor dessa série de artigos. Eu gostei, então me juntei modestamente ao ciclo :-))))
Espero que Anatoly não se importe....
Ainda não tive tempo de abordar a questão da execução parcial de ordens(ORDER_STATE_PARTIAL) neste artigo. Pergunta para você: quantas vezes o manipulador TradeTransaction será chamado?
Não sei. Logicamente, o manipulador deve ser acionado tantas vezes quanto em uma execução completa. Porque a execução da ordem não é um evento discreto, e o MT não sabe se a ordem será executada parcial ou totalmente.
Infelizmente, a entrega de eventos não é garantida, e os próprios eventos funcionam apenas em tempo real, o que torna sua aplicação limitada. Mas eles são extremamente úteis para sistemas baseados em rastreamento de estado, como sistemas assíncronos ou copiadoras de negociação. Graças aos eventos, é possível criar um algoritmo sem looping e freios adicionais associados à espera pelo evento OnTimer.
...
Espero que Anatoly não se importe...
Não, é claro que ele não se importa. ) Especialmente porque...
...
s.s. Eu também pensei que "MQL recipes". - era um nome de marca dos artigos de Anatoly. Agora, parece que não é(
...O rótulo "MQL5 Recipes" foi sugerido pela equipe editorial da MQ, portanto, pode ser usado por qualquer pessoa. O principal é ter mais e diferentes artigos.
Obrigado por este artigo. Ele é muito útil.
Hi,
Minha situação parece ser bem simples: Coloco uma ordem pendente (Sell_Stop) e quero poder reagir no caso de a) a ordem pendente ser preenchida e, finalmente, b) a posição aberta ser fechada por um stop loss ou meta de lucro.
Entendi corretamente que:
- quando a ordem pendente foi preenchida, posso obter o número mágico apenas solicitando-o na lista de posições, apesar de o parâmetro "request" de OnTradeTransaction() possuir o campo "magic" como:
if(!PositionSelectByTicket(trans.position)) {Print(__LINE__," PositionSelectByTicket FAILED ",err());} else { OpnPos[sz].mag = PositionGetInteger(POSITION_MAGIC); }
- os vários tipos de transação de forma que não posso saber se a posição de venda foi aberta ou fechada:
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { //--- //--- static int counter=0; // contador de chamadas OnTradeTransaction() static uint lasttime=0; // hora da última chamada de OnTradeTransaction() //--- uint time=GetTickCount(); //--- se a última transação foi realizada há mais de 1 segundo, if(time-lasttime>1000) { counter=0; // então essa é uma nova operação comercial e o contador pode ser reiniciado if(IS_DEBUG_MODE) Print(__LINE__," "," New trade operation dTime",time-lasttime); } Print(__LINE__," ",counter," ",DoubleToString((double(lasttime=time)/1000.0,2) ," Tr.Type: ",EnumToString(trans.type)," DL.Type: ",EnumToString(trans.deal_type) ," RQ.Type: ",EnumToString(request.type)," RQ.Fill: ",EnumToString(request.type_filling) );
Essa impressão é produzida no caso da abertura de uma posição às 01:00:40 e do fechamento dessa posição às 10:04:40:
01:00:40 322 0 81952.76 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_SELL RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81970.73 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position 01:00:40 322 0 81955.30 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81980.91 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position 01:00:40 322 0 81965.14 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81982.69 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY DL.Type: ORDER_FILLING_FOK // close sell position 01:00:59 322 0 81968.50 Tr.Type: TRADE_TRANSACTION_REQUEST DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_SELL RQ.Fill: ORDER_FILLING_FOK // open sell position
As chamadas parecem praticamente as mesmas - como assim? Às 13:00, uma venda foi aberta - por que há 12 ..TYPE_BUY e apenas 2 TYPE_SELL?
Por que e qual é o significado de request.type = ORDER_TYPE_BUY no caso de um stop de venda ser acionado e se tornar uma venda (posição)? De onde vem o _BUY?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Guia Prático do MQL5: Processamento do Evento TradeTransaction foi publicado:
Neste artigo eu gostaria de apresentar uma das maneiras de controlar os eventos de negociação utilizando os meios que a linguagem MQL5 nos proporciona. Devo mencionar que alguns artigos já foram dedicados a este tema. "Processamento de eventos trade no Expert Advisor usando a função OnTrade()" é um deles. Mas, ao contrário do material mencionado acima, usarei outro manipulador - OnTradeTransaction().
Eu gostaria de chamar a atenção dos leitores para o seguinte ponto. A versão atual da linguagem MQL5 conta formalmente com 14 manipuladores de eventos no Terminal Cliente. Além disso, o programador tem a possibilidade de criar eventos personalizados com o EventChartCustom() e processá-los com a OnChartEvent(). No entanto, o termo "programação orientada a eventos" ou "EDP" em inglês, não é mencionado na documentação. Isso é estranho devido ao fato de que qualquer programa em MQL5 é criado com base nos princípios da EDP. Por exemplo, quando o usuário necessita fazer uma escolha no passo do "manipulador de eventos para do Expert" em um template de qualquer Expert Advisor.
É óbvio que o mecanismo da programação orientada a eventos é usado em MQL5, de uma forma ou de outra. A linguagem pode conter blocos de programa que consiste em duas partes: na seleção e no processamento de um evento. Além disso, se estamos falando dos eventos do Terminal Cliente, o programador tem controle apenas sobre a segunda parte, ou seja, o manipulador de eventos. Para ser justo, há exceções para alguns eventos. O temporizador e o evento personalizado estão entre eles. O controle desses eventos é deixado inteiramente para o programador.
Autor: Dennis Kirichenko