Discussão do artigo "Operações de negociação Estruturas das solicitações e das resposta, descrição e registro" - página 8

 
MrBrooklin #:

Então, como esse manipulador de eventos encontrou uma posição aberta após um dia de negociação?

Saudações, Vladimir.

Milagres não acontecem. Você criou a lógica. Você deve ver por quê... O que você procurou no manipulador quando ele foi acionado? Como você procurou... E o que exatamente o acionou.

Há um evento - os sinais do manipulador. Nele, você precisa filtrar esses eventos...

Mas, em geral, eu não dependia desses manipuladores. Eu controlava a diferença entre o estado passado e o atual. E com base nisso. Tomei decisões sobre o que fazer.

 
Artyom Trishkin #:
Alexei respondeu. Depende do corretor.

Isso é uma afirmação ou uma suposição? Não estou fazendo a pergunta porque não tenho mais nada para fazer. Quero entender.

Atenciosamente, Vladimir.

 
Artyom Trishkin #:
Não há milagres.

Meu primeiro mentor de eletrônica também disse a mesma coisa quando trabalhou no Centro Regional de Serviços de Informática (na época da URSS). Concordo plenamente com ele e com você. Portanto, deve haver alguma explicação lógica para o problema. E uma vez em 8 meses de negociação com o Expert Advisor em uma conta real. É por isso que estou tentando descobrir para eliminar qualquer possibilidade de tal situação.

Atenciosamente, Vladimir.

 

Tentarei usar essa variante da função OnTradeTransaction() na vida real, para que o Expert Advisor sempre encontre uma posição aberta. Destaquei em amarelo a parte do código que deve excluir o fato de uma posição aberta "cair no esquecimento":

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void  OnTradeTransaction(
   const MqlTradeTransaction&    trans,   // estrutura da transação comercial
   const MqlTradeRequest&        request, // estrutura da solicitação
   const MqlTradeResult&         result   // estrutura de resposta
)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal) && HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN)
        {
         pos_ticket=trans.position;
         pos_open=trans.price;
        }
     }
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void Open_Add_Position()
  {
//--- se uma posição com um medjik e ticket da última posição aberta for selecionada pelo símbolo atual
   if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&
      PositionGetString(POSITION_SYMBOL)==_Symbol &&
      PositionGetInteger(POSITION_MAGIC)==Magic_Number)
     {
      ....... тогда выполняем определённые действия с целью открытия дополнительной позиции
     }
  }

Funciona bem no testador, mas verei como se comporta na negociação real.

Atenciosamente, Vladimir.

 
MrBrooklin posição aberta. Destaquei em amarelo a parte do código que deve excluir o fato de uma posição aberta "cair fora de vista":

Funciona bem no testador, mas verei o que acontecerá na negociação real.

Atenciosamente, Vladimir.

Vladimir, não há nenhuma conexão entre essas funções. Remova a função OpTradeTransaction() e o código funcionará exatamente da mesma forma.

Se a estratégia envolver a abertura de várias posições e uma conta grande, essa parte do código

if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&

pode causar muitos danos.

 
Alexey Viktorov #:

Vladimir, não há nenhuma conexão entre essas funções. Remova a função OpTradeTransaction() e o código funcionará exatamente da mesma forma.

Se a estratégia permitir a abertura de várias posições e uma conta de depósito, então essa parte do código

pode causar muitos danos.

Alexey, obrigado por me incentivar e ajudar constantemente a melhorar o código do EA. Agora vamos ao que interessa. Sim, tenho uma conta de hedge e várias posições podem ser abertas. A conexão entre OpTradeTransaction() e a parte do código que você sugere excluir é direta. Em OpTradeTransaction(), obtenho o tíquete da posição e seu preço de abertura para usar na abertura de posições adicionais. Tudo estava funcionando perfeitamente até agora. O problema surgiu quando o Expert Advisor não "viu" uma posição aberta uma vez. Eu não havia notado isso antes e pensei que o problema havia ocorrido apenas uma vez, mas, depois de executá-lo no histórico e examinar a impressão com mais detalhes, percebi que ele ocorreu mais de uma vez e não duas. Eu simplesmente não havia notado antes, mas agora percebi que o problema às vezes ocorria quando uma posição estava passando de uma sessão de negociação para outra. Enfatizo - às vezes. Por quê? Eu mesmo não consigo descobrir. Minha corretora de câmbio tem um rollover entre as sessões de negociação. Talvez por causa disso, talvez não por causa disso. Não sei. Agora tenho uma situação semelhante, mas ainda está faltando uma condição para abrir uma posição adicional. Quero testar o novo código e ver se ele causará algum dano ou não. Não tenho medo de realizar um experimento, pois não será pior e, principalmente, porque já aprendi a "resolver" situações ruins com minhas mãos. Simplesmente paro o trabalho dos dois robôs e abro uma posição ao preço que preciso.

Saudações, Vladimir.

 
MrBrooklin #:

Alexey, obrigado por me alertar e ajudar constantemente a aprimorar o código do EA. Agora vamos ao que interessa. Sim, tenho uma conta de hedge e várias posições podem ser abertas. A conexão entre OpTradeTransaction() e a parte do código que você sugere excluir é direta. Em OpTradeTransaction(), obtenho o tíquete da posição e seu preço de abertura para usar na abertura de posições adicionais. Tudo funcionava perfeitamente até agora. O problema surgiu quando o Expert Advisor não "viu" uma posição aberta uma vez. Eu não havia notado isso antes e pensei que o problema havia ocorrido apenas uma vez, mas depois de executá-lo no histórico e examinar a impressão com mais detalhes, percebi que ele ocorreu mais de uma vez e não duas. Eu simplesmente não havia notado antes, mas agora percebi que o problema às vezes ocorria quando uma posição estava passando de uma sessão de negociação para outra. Enfatizo - às vezes. Por quê? Eu mesmo não consigo descobrir. Minha corretora de câmbio tem um rollover entre as sessões de negociação. Talvez por causa disso, talvez não por causa disso. Não sei. Agora tenho uma situação semelhante, mas ainda está faltando uma condição para abrir uma posição adicional. Quero testar o novo código e ver se ele causará algum dano ou não. Não tenho medo de realizar um experimento, pois não será pior e, principalmente, porque já aprendi a "resolver" situações ruins com minhas mãos. Simplesmente paro o trabalho dos dois robôs e abro uma posição no preço que preciso manualmente.

Saudações, Vladimir.

O problema é que PositionSelect(_Symbol) não seleciona necessariamente a última posição. Portanto, se você não tiver recebido um tíquete de posição em OnTradeTransaction(), corre o risco de tomar uma decisão com base em dados errados.

 
Alexey Viktorov #:

O problema é que PositionSelect(_Symbol) não seleciona necessariamente a última posição. Portanto, se você não obtiver um tíquete de posição em OnTradeTransaction(), corre o risco de tomar uma decisão com base em dados errados.

Obrigado pela dica. Vou pensar um pouco e ver como isso pode prejudicar as negociações reais. Ainda não concordo com a ideia de abandonar a função OnTradeTransaction(). Precisamos entender completamente o problema e depois tomar uma decisão final.

Saudações, Vladimir.

 
MrBrooklin #:

Obrigado pela dica. Vou pensar um pouco e ver como isso pode prejudicar as negociações reais. Ainda não posso concordar em abandonar a função OnTradeTransaction(). Preciso entender completamente o problema e depois tomar uma decisão final.

Atenciosamente, Vladimir.

Eu não disse para recusar. Mas os benefícios de usá-lo dessa forma são nulos.

 
Alexey Viktorov #:
Remova a função OpTradeTransaction() e o código funcionará exatamente da mesma forma

No meu entendimento, excluir uma função é como se recusar a usá-la. Não importa quem e como você diz isso, o principal é descobrir. : )

Atenciosamente, Vladimir.