Processamento OnTradeTransaction - página 5

 
fxsaber:

Cretino.

Eu pensei que você se referia a você.

O que aconteceu com"Ele vai descobrir se quiser". "?

 
fxsaber:

É mais fácil para mim responder em um posto do que fazer dezenas com "recomendações".

Se ele quiser, ele vai descobrir.

Eu costumava querer... Mas seu código é algo mais.
 
Alexey Viktorov:
Era uma vez um tempo em que eu queria... Mas seu código é algo fora deste mundo.

Neste caso, você só precisa de um pouco de conhecimento de MT4/5.

 
fxsaber:

Neste caso, você só precisa de um pouco de conhecimento de MT4/5.

Infelizmente eu sei um pouco mais do que um pouco.

Já lhe disse uma vez, você enfia seu código para dentro e para fora como um plugue de bunda em cada barril. Aqueles que precisam dele já o utilizam há muito tempo e alguns até o anunciam. Mas impor isso onde não é muito necessário é simplesmente indecente. Especialmente quando uma pessoa quer entender e entrar na programação em mql5, não através de truques.

 
Alexey Viktorov:

Infelizmente eu sei pouco mais do que um pouco.

Eu já lhe disse uma vez, você enfia seu código em cada barril para os negócios e sem nenhuma razão. Aqueles que precisam dele já o utilizam há muito tempo e alguns até o anunciam. Mas impor isso onde não é muito necessário é simplesmente indecente. Especialmente quando uma pessoa quer entender e entrar na programação em mql5, não através de truques.

Quando você faz algumas afirmações, é uma boa idéia apoiá-las de alguma forma na prática. Em algumas páginas, nenhuma solução da OnTradeTransaction apareceu. E se houver, rapidamente ficará claro por que a solução dada é do jeito que é e não o contrário. A solução deve mostrar a lógica, não o inferno fora dela. Se eu remover o plug-in, o código fonte não perderá um pouco de sua lógica. E você só precisa entender a lógica (idéia), nada mais.

Eu concordo com esta declaração. Uma vez entendida a lógica, vai jogar fora todos os includes e criar os seus próprios. É exatamente assim que é proposto: não dominar os nichos, mas mostrar por código e não assustar como a tarefa cuja solução é necessária pode funcionar.

 

Aqui eu volto à fonte do problema. E as questões surgem:

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Processamento OnTradeTransaction

Ilya Child, 2019.02.07 20:08

Boa noite.

Rapazes, por favor, ajudem a resolver isso. O problema provavelmente não é novo, mas eu não encontrei nenhuma solução inequívoca (nem na prática, nem nos fóruns).

Estou executando 2 robôs diferentes no terminal em 2 instrumentos diferentes. As magias são diferentes em todos os lugares. O robô coloca limites pendentes e o procedimento OnTradeTransaction me permite detectar uma transação e colocar ordens de parada pendentes usando esta transação.

Abaixo está o código para a transação comercial

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Este é o código da função que verifica se o negócio pertence a um robô

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

Este é o código do procedimento para ordens de parada pendentes

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Este é o código da função de busca de uma ordem na história e fora da história

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

Eu emitiria as informações sobre as transações recebidas nos arquivos de registro na ordem em que são recebidas no terminal. Agora eu tenho um problema que enfrentei ao negociar em uma conta de demonstração:

s vezes as transações vêm na seguinte ordem TRADE_TRANSACTION_ORDER_DELETE, depois TRADE_TRANSACTION_DEAL_ADD, depois TRADE_TRANSACTION_HISTORY_ADD. Neste caso, as ordens de parada não são frequentemente colocadas após uma negociação ter sido executada. Suponho que isso aconteça porque a ordem já foi apagada, mas ainda não foi acrescentada à história. Isso significa que não podemos encontrar a ordem do negócio nem na história nem no terminal. Embora seja duvidoso, o fato é que nenhuma ordem de parada é colocada porque o robô não a encontra depois de procurar a ordem em todas as dimensões(isFindOrder=false). A ordem das transações pode estar correta, mas a ordem ainda não foi encontrada em nenhum lugar. Em todos os casos, o robô detecta a transação corretamente, mas não chega a fazer pedidos.No entanto, ocasionalmente também funciona corretamente e os pedidos são feitos.

Eu tentei abordagens diferentes, nada funciona. Estou pensando agora em acrescentar um intervalo de 1 segundo no início do procedimento de colocação de pedidos pendentes. Não sei onde mais cavar.

Por favor, compartilhe suas experiências e idéias.

Como posso conciliar a frase destacada com a seguinte:

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Processamento OnTradeTransaction

Ilya Child, 2019.02.07 20:20

Esqueci de acrescentar que o modo é de rede. A posição é a mesma para todos os robôs. Ou seja, um robô comprou uma posição, o segundo a comprou, os eventos TRADE_TRANSACTION_DEAL_ADD vieram em ordem inversa e eventualmente o primeiro robô não a viu.

Sim e, logicamente, preciso obter um comentário sobre o pedido do ofício, a posição não é de grande ajuda aqui.

Não vamos prestar atenção à gralha, um comprou o outro comprou... O principal é que parece que dois EAs trabalham em um símbolo com rede do tipo conta. Ou talvez eu não entenda alguma coisa?

 
Alexey Viktorov:

Não vamos prestar atenção à gralha, um comprou o outro comprou... O principal é que parece que dois EAs estão trabalhando no mesmo instrumento com a rede do tipo conta... Ou talvez eu não entenda alguma coisa?

É normal ter vários EAs em um só símbolo de rede. Por exemplo, as de rede. Portanto, é bem possível que a posição da rede seja zero, mas existem dois SL e dois TP. O problema está claramente formulado acima.

 
fxsaber:

Os EAs múltiplos são a norma em um único símbolo de rede. Por exemplo, as posições de rede. Portanto, é bem possível que a posição da rede seja zero, mas existem dois SLs e dois TPs. O problema está claramente formulado acima.

Podemos adivinhar o que quisermos. Eu gostaria de ouvir o "Chefe de Transporte". Afinal de contas, citei seus cargos.

 
Alexey Viktorov:

Podemos compensar tudo o que quisermos. Eu gostaria de ouvir do gerente de transportes. Eu estava citando-o.

Acho que o chefe tem sido tão "intimidado" que não voltará a aparecer :)

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

Eu não o sigo muito bem. Aqui está o processamento da minha transação

Sobre o status da ordem na transação. Você percebe que eu mesmo não estou inventando isso. Em todas as transações de deal_add este é o status do pedido. Observe que é uma ordem de mercado e que costumava ser uma ordem pendente.

Agora temos outra parcela de incompreensão. Uma transação de acordo_add voou e não apareceu nenhuma posição e nenhuma posição pendente foi colocada em uma posição inexistente.

Adicionado.

A transação Deal_add é enviada, mas a posição não foi colocada e uma ordem pendente para a posição inexistente foi colocada. O tipo de negócio é Vender, o tipo de pedido é Comprar. Embora inicialmente o limite era Sell_limit

Aparentemente, ou as informações antigas não são limpas em algum lugar, ou as informações não inicializadas são tomadas.

Se eu tenho um acordo_add, a ordem normalmente já está na história, ou já foi apagada, mas ainda não apareceu na história.

Embora também aconteça que o pedido ainda está lá, e depois está no estado colocado.

Mas dificilmente poderá ser neste momento.

Verifique onde uma ordem ou história é selecionada que eles _são_ realmente selecionados.

Razão: