Processamento OnTradeTransaction - página 8

 
fxsaber:

Assista a este vídeo de 01:35 e 03:35.


Por que eu preciso das suas coisas caseiras? Você me surpreende. Com tal conhecimento de programação você não pode entender o manipulador da OnTradeTransaction

 
Alexey Viktorov:

Por que eu preciso das suas coisas caseiras? Você me surpreende. Com tal conhecimento de programação você não pode entender o manipulador da OnTradeTransaction

É difícil falar com alguém que não consegue sequer imaginar a tarefa.

 
Alexey Viktorov:

Então não há posições, ou elas estão em vírgulas invertidas?

É bastante normal quando em termos de rede - não há posição (ou seja, posição total == 0,0).

E do ponto de vista de dois EAs - cada um tem sua própria posição aberta.

Pode haver mais de um Expert Advisor em um único símbolo. Além disso, alguns negócios podem ser feitos à mão.

 
JRandomTrader:

É bastante normal quando em termos de rede - não há posição (ou seja, posição total == 0,0).

E do ponto de vista de dois assessores - cada um tem sua própria posição aberta.

Pode haver mais de um Expert Advisor em um único símbolo. Além disso, alguns ofícios podem ser feitos à mão.

A esposa pegou o dinheiro na mesa-de-cabeceira e comprou uma TV. O marido pegou a TV, vendeu-a e colocou o dinheiro na mesa-de-cabeceira. Em termos de rede, não há TV. E de acordo com sua lógica, a esposa tem a TV e o dinheiro na mesa-de-cabeceira. Assim, eles decidem se compram outra televisão ou se gastam o dinheiro.

Ou cada um deles tem uma TV? Afinal de contas, cada um deles o segurou em suas mãos. Exagero.


Se um conselheiro abriu uma posição e o outro a fechou, ela se foi. Esquece-os... Não há nenhuma posição.

 
Alexey Viktorov:

A esposa levou o dinheiro na mesa-de-cabeceira, comprou uma televisão. O marido pegou a TV, vendeu-a e colocou o dinheiro na mesa-de-cabeceira. Em termos de rede, não há TV. E de acordo com sua lógica, a esposa tem a TV e o dinheiro na mesa-de-cabeceira. Assim, eles decidem se compram outra televisão ou se gastam todo o dinheiro obtido com ela em bebidas.

Ou cada um deles tinha um aparelho de televisão? Afinal de contas, cada um deles tem uma em suas mãos. Eu exagero.


Se um conselheiro abriu uma posição e o outro a fechou, ela se foi. Esquece-os... Não há nenhuma posição.

Não há posição.

Mas como parte de sua lógica - cada EA detém uma posição diferente. Por exemplo, um - "a longo prazo" vai deixar de lado a perda, enquanto o outro - "escalpador" vai assumir a sua própria tendência contrária ao mesmo tempo.

 
JRandomTrader:

Não há nenhuma posição.

Mas dentro dos limites de sua lógica - cada EA mantém sua própria posição. Por exemplo, um - o "longo prazo" vai esperar pelas perdas, e o outro - o "escalpador" vai para uma contra-tendência.

Aparentemente, você está tentando aplicar a lógica de duas estratégias de hedge para a compensação. A seqüência mais lógica seria a seguinte.

Um escalador em uma contra-tendência fecha uma posição e estabelece uma ordem limite ao preço TP esperado para sua posição imaginária. E se este interruptor de limite funcionar, a posição será restaurada em sua totalidade MAS!! com um bilhete diferente. Portanto, não é absolutamente correto considerá-lo como uma continuação dessa posição fechada, e a EA a longo prazo não será capaz de determiná-lo como o seu.

É outra questão se o escalpador funcionará com um volume menor. Então o bilhete permanecerá o mesmo, apesar do fato de que o preço de abertura será alterado. Em geral, não tente simplesmente transferir a estratégia para a rede para hedge, nada de bom sairá. A analogia vai funcionar, mas as ações devem ser diferentes. As especificidades da rede devem ser levadas em conta.

 
Alexey Viktorov:

Aparentemente, você está tentando aplicar a lógica de duas estratégias de hedge para a compensação. Uma seqüência mais lógica seria a seguinte.

Um escalador em uma contra-tendência fechará a posição e estabelecerá uma ordem limite ao preço TP esperado para sua posição imaginária. E se este interruptor de limite funcionar, a posição será restaurada em sua totalidade MAS!! com um bilhete diferente. Portanto, não é absolutamente correto considerá-lo como uma continuação dessa posição fechada e a EA a longo prazo não será capaz de determiná-lo como sendo seu.

É uma outra questão, se o escalpador trabalha com valores menores. Então o bilhete permanecerá pelo menos o mesmo, apesar do fato de que o preço de abertura mudou. Em geral, não tente simplesmente transferir a estratégia da rede para se proteger, nada de bom sairá. A analogia vai funcionar, mas as ações devem ser diferentes. As especificidades da rede devem ser levadas em conta.

Este é apenas um exemplo do escalpador e do longo riscador, pode haver muitos EAs no símbolo, e eles podem ter lotes diferentes.

"O escalper fecha uma posição em uma contra tendência e coloca um limite no preço do TP esperado para sua posição imaginária. - Mas o escalpador assume para si mesmo que ele tem uma "posição imaginária".

E o fato de a posição total ter mudado o bilhete - portanto o Assessor de longo prazo não precisa dele, ele já sabe que tem sua própria posição, que não está relacionada com a posição total.

Como resultado, cada EA trabalha independentemente de quem mais está trabalhando com ele neste símbolo, sem saber ou desejar saber nada sobre ele.

E sim, não estou tentando transferir estratégias de hedge, pois comecei imediatamente com MT5, FORTS e netting. Eu só queria que vários robôs pudessem comercializar o símbolo e ainda ser capazes de trocar de mãos sem interferir com eles.

 

JRandomTrader:

Mas para si mesmo, o esbanjador pensa que tem uma "posição imaginária".

É isso que estou dizendo, você tem que construir uma lógica diferente para a rede. Não deveria haver posições imaginárias . Só coloquei dessa forma porque não consegui encontrar outra palavra para que vocês me entendessem. Se houver um preenchimento, então o volume total da posição e o novo preço da posição aberta são levados em consideração, se houver um fechamento parcial do mesmo e o preço e o volume são levados em consideração.

 
Alexey Viktorov:

É isso que estou dizendo: você tem que construir uma lógica diferente para a rede. Não deve haver posições imaginárias . Eu só disse isso porque não consegui encontrar outra palavra para que vocês me entendessem. Se houver um preenchimento, então o volume total da posição e o novo preço de abertura são levados em conta; se houver um fechamento parcial, então o mesmo é verdadeiro e o preço e o volume total são levados em conta.

Então teremos que estabelecer alguma interação entre os robôs e levar em conta as ações dos "vizinhos", que são os mesmos hoje e podem ser diferentes amanhã. E não está claro que benefícios isso trará.

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

 
JRandomTrader:

Então tenho que criar algum tipo de interação entre os robôs e levar em conta os "vizinhos" que são um hoje e talvez outro amanhã. E não está claro que benefícios isso trará.

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

Para simplificar as coisas, sim. Eu concordo.

Então o "Gerente de Transporte" não articulou completamente o problema e suas ações.

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

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;
     }

Coloco as informações sobre as transações recebidas no log 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.

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.

O que significam as ordens de parada? Para a posição total ou apenas para a parte com a qual este Expert Advisor está trabalhando?