Processamento OnTradeTransaction - página 9

 
JRandomTrader:

Uma posição imaginária é necessária do ponto de vista do algoritmo do robô: se ele o abriu, ele deve fechá-lo.

Devo acrescentar que a tarefa do primeiro posto foi ainda mais fácil - precisávamos implementar a operação de uma grade de ordens limite onde cada nó da grade fecha seu SL/TP.

Por exemplo, apenas um desses EA unidirecionais funciona em uma conta e ninguém mais o faz. Mas estamos falando aqui também de posições imaginárias.


E a questão levantada não se trata apenas de redes. Pode ser o mesmo em uma sebe. Há vários Expert Advisors em hedging, e alguém acabou de fechar várias posições por CloseBy. Se os Expert Advisors forem implementados através de posições imaginárias, então tal colapso não quebrará a lógica.


Geralmente, isto pode ser resolvido através de um ambiente comercial virtual. Pode ser resolvido facilmente. É assim que os escritórios algorítmicos administram suas carteiras de TS nas bolsas.

 
Alexey Viktorov:

Para simplificar as coisas, sim. De acordo.

Neste ponto, o "Gerente de Transporte" ainda não esclareceu completamente o problema e suas ações.

O que você quer dizer com ordens de parada? Para a posição total ou apenas a parte com que esta EA lida???

Naturalmente, para uma parte de uma posição com a qual nossa EA está trabalhando, as ordens de parada estão pendentes de parada de compra/venda e limite de compra/venda.

Até agora, eu percebi que seria melhor mudar para a OnTrade devido a um grande número de armadilhas da OnTradeTransactions.

 
Илья Ребенок:

Naturalmente, as ordens de parada estão pendentes de parada de compra/venda e limite de compra/venda para uma parte de uma posição que é tratada por uma EA específica.

Até agora, entendi que é melhor ir para a OnTrade devido a um grande número de armadilhas da OnTradeTransactions.

Preste atenção apenas que eles trabalhem juntos. Não me lembro qual é o primeiro e qual é o segundo. Mas a OnTradeTransactions tem pelo menos algumas informações sem nenhum código adicional, enquanto a OnTrade tem que obter tudo pela força. Antes de mais nada, temos de determinar qual evento desencadeou a função.

 

Escrevi um capturador de transações - pode ser útil determinar o quê e de onde (embora haja um processamento simples, dependendo do tipo de transação) - não há referência ao histórico de pedidos e transações (por exemplo, para imprimir o ID do Expert Advisor)

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

fxsaber agradece pelo exemplo!

Só que não é realmente um exemplo, é uma solução completa para o problema original.

 
Илья Ребенок:

Naturalmente, as ordens de parada estão pendentes de parada de compra/venda e limite de compra/venda para uma parte de uma posição que é tratada por uma EA específica.

Até agora, entendi que é melhor ir para a OnTrade devido a um grande número de armadilhas da OnTradeTransactions.

Continuar o bom trabalho :)

Uma pequena dica MqlTradeTransaction &trans - SOMENTE os campos são relevantes

CAMPOS DE COMÉRCIO_DE_TRANSAÇÃO_DEAL_*

Para transações comerciais relacionadas com o processamento comercial (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE) os seguintes campos são preenchidos na estrutura MqlTradeTransaction

  • negócio - troca de bilhetes;
  • ordem - o bilhete da ordem, com base no qual a negociação foi executada;
  • símbolo - nome de um instrumento financeiro no comércio;
  • tipo - tipo de transação comercial;
  • deal_type - tipo de comércio;
  • preço - preço pelo qual o negócio foi executado;
  • price_sl - price Stop Loss (a ser preenchido se for especificado na ordem, com base no qual o negócio é executado);
  • price_tp - preço de Take Profit (preenchido se especificado no pedido, com base no qual o negócio é executado);
  • volume - volume de um negócio em lotes.
  • posição - bilhete de uma posição aberta, modificada ou fechada como resultado da execução de uma negociação.
  • position_by - bilhete da posição oposta. Preenchido somente para as transações de fechamento de uma posição pela posição oposta (out by).

E veja a MqlTradeResult &result.

Mas agora você tem 1000 linhas de código!

 
prostotrader:

Continuar o bom trabalho :)

Uma pequena dica MqlTradeTransaction &trans - SOMENTE os campos são relevantes

TRADE_TRANSACTION_DEAL_*.

Para transações comerciais relacionadas com o processamento comercial (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE) os seguintes campos são preenchidos na estrutura MqlTradeTransaction

  • negócio - troca de bilhetes;
  • ordem - o bilhete da ordem, com base no qual a negociação foi executada;
  • símbolo - nome de um instrumento financeiro no comércio;
  • tipo - tipo de transação comercial;
  • deal_type - tipo de comércio;
  • preço - preço pelo qual o negócio foi executado;
  • price_sl - price Stop Loss (a ser preenchido se for especificado na ordem, com base no qual o negócio é executado);
  • price_tp - preço de Take Profit (preenchido se especificado no pedido, com base no qual o negócio é executado);
  • volume - volume de um negócio em lotes.
  • posição - bilhete de uma posição aberta, modificada ou fechada como resultado da execução de uma negociação.
  • position_by - bilhete da posição oposta. Preenchido somente para as transações de fechamento de uma posição pela posição oposta (out by).

E veja a MqlTradeResult &result.

Mas agora você tem 1000 linhas de código!

Claro, entendo que você está transbordando de ego. Experiência, tudo...

Mas eu vim aqui não por um pouco de sarcasmo, mas por ajuda. Se você olhar um pouco mais alto, verá que eu concordei que cometi um erro nos campos de análise que não estão preenchidos para o deal_add.

Eu ficaria grato a vocês por mais ajuda construtiva, eu mesmo posso "cagar") Eu aceito críticas construtivas.

Sobre"And look at MqlTradeResult &result".

De acordo com a ajuda, o resultado da transação comercial é preenchido somente comTRADE_TRANSACTION_REQUEST e deve ser analisado somente com este tipo de transação.

 

Você tem uma percepção estranha.

Eu não sonharia em "cagar em ninguém", essa é provavelmente sua percepção da vida e provavelmente você mesmo a usa muito.

Provavelmente você mesmo a usa muito.

Não sou eu, mas o fxsaber(a), porque em quase todos os tópicos ele empurra seu

Mas ele mesmo não negocia no mercado real, e certamente não no FORTS!

Existem soluções simples e complexas para o mesmo problema.

A julgar por sua pergunta, você é um principiante.

Mas como diz o ditado: "Não procuramos caminhos fáceis"!

A função OnTradeTransaction foi especificamente projetada para simplificar

"vida para programadores no desenvolvimento de robôs, mas os veteranos não querem usá-la,

porque eles estão acostumados com a OnTrade e têm que escrever um monte de código para que funcione.

Já lhe disse que a ordem é a cabeça, não o negócio!

O que você fará se o volume do pedido inicial não for 1, mas 2, 10?

Você estabelece uma ordem pendente, e isso significa que você não pode "estritamente" controlá-la, muito menos controlar os negócios!

Você não pode controlá-lo "firmemente", ainda mais se você fizer algum negócio! Há muitas armadilhas com ordens pendentes.

Mas, você escolheu o caminho mais fácil, obtendo uma solução pronta e duvidosa, em vez de tentar

Mas você escolheu o caminho mais fácil, em vez de tentar descobrir por si mesmo (com dicas).

Boa sorte, eu não estou mais envolvido.

 
prostotrader:

Você tem uma percepção estranha.

Eu não sonharia em "cagar em ninguém", essa é provavelmente sua percepção da vida e provavelmente você mesmo a usa muito.

Provavelmente você mesmo a usa muito.

Não sou eu, mas o fxsaber(a), porque em quase todos os tópicos ele empurra seu

Mas ele mesmo não negocia no mercado real, e certamente não no FORTS!

Existem soluções simples e complexas para o mesmo problema.

A julgar por sua pergunta, você é um principiante.

Mas como diz o ditado: "Não procuramos caminhos fáceis"!

A função OnTradeTransaction foi especificamente projetada para fazer

"vida" para programadores no desenvolvimento de robôs, mas são os veteranos que não querem usá-la,

porque eles estão acostumados com a OnTrade e têm que escrever um monte de código para que funcione.

Já lhe disse que a ordem é a cabeça, não o negócio!

O que você fará se o volume do pedido inicial não for 1, mas 2, 10?

Você estabelece uma ordem pendente, e isso significa que você não pode "estritamente" controlá-la, muito menos controlar os negócios!

Você não pode controlá-lo "firmemente", ainda mais se você fizer algum negócio! Há muitas armadilhas com ordens pendentes.

Mas, você escolheu o caminho fácil, obtendo uma duvidosa solução pronta, em vez de tentar

Mas você escolheu o caminho mais fácil, em vez de tentar descobrir por si mesmo (com dicas).

Boa sorte, eu não estou mais envolvido.

Vamos começar com o fato de que não uso soluções prontas. Não sei o que você inventou para mim, mas não usei nenhuma das soluções do fio (embora tenha extraído algum conhecimento útil) e ainda estou experimentando e descobrindo coisas. Em geral, percebi de seus cargos que você gosta de adivinhar os outros. Sem ofensa.

Quanto ao volume do pedido, não importa o que é. É um acordo que me permite julgar que volume é realmente executado. Acho que é mais fácil do que pegar a execução parcial da ordem de acordo com o tipo de ordem apropriado. Em um dos tópicos, além disso, foi salientado que somente um acordo garante que a posição tenha sido executada.

 
Илья Ребенок:

Para começar, eu não uso soluções prontas. Não sei o que você inventou para mim, mas não usei nenhuma das soluções do fio (embora tenha aprendido algo útil) e ainda estou experimentando e descobrindo. Em geral, percebi de seus cargos que você gosta de adivinhar os outros. Sem ofensa.

Quanto ao volume do pedido, não importa o que é. É um acordo que me permite julgar que volume é realmente executado. Acho que é mais fácil do que pegar a execução parcial da ordem de acordo com o tipo de ordem apropriado. Em um dos tópicos, foi apontado que somente um acordo nos faz ter certeza de que a posição foi executada.

Você já esqueceu como ler?

"Boa sorte, eu não estou mais envolvido."