Takeprofit na operação, 0 no histórico

 

Bom! Em um outro tópico eu relatei minha experiência com um robô de alta frequência em uma corretora, que estava um delay absurdo na execução das ordens. Decidi mudar de corretora e agora me aparece essa. Consigo executar as ordens, a ordem a posição vai pra o histórico como se tivesse dado TP mas o resultado é 0. Alguém já passou por isso, será que é por conta do alvo de 0.5 ponto ?

Foram 7 operações, todas do mesmo jeito. 


 
HENRIQUE ARAUJO DOS SANTOS:

Bom! Em um outro tópico eu relatei minha experiência com um robô de alta frequência em uma corretora, que estava um delay absurdo na execução das ordens. Decidi mudar de corretora e agora me aparece essa. Consigo executar as ordens, a ordem a posição vai pra o histórico como se tivesse dado TP mas o resultado é 0. Alguém já passou por isso, será que é por conta do alvo de 0.5 ponto ?

Foram 7 operações, todas do mesmo jeito. 


Bom,

pois então, no outro tópico vc disse que o TP era uma SELL ou BUY LIMIT  com 1 TICKSIZE de gain, ou seja ASK +TICKSIZE ou BID+TICKSIZE, mas acho que não é isso que vc. está fazendo. 

 
Rogerio Giannetti Torres:

Bom,

pois então, no outro tópico vc disse que o TP era uma SELL ou BUY LIMIT  com 1 TICKSIZE de gain, ou seja ASK +TICKSIZE ou BID+TICKSIZE, mas acho que não é isso que vc. está fazendo. 

Não!! Na verdade a entrada dele é por ordem LIMIT, eu estou colocando na ordem um TP partindo do preço de entrada + 0.5. Utilizar de repente uma saída por uma SELL ou BUY LIMIT, eu não uso essa abordagem pois eu tenho receio de não executar a ordem de saída no caso de utilizar ordem LIMIT (falta de lote no book), se bem que 1, 2 contratos acho que não tem tanto esse risco. O mais estranho é que se eu fizer as operações manualmente, vai tranquilo, mas quando o EA envia a ordem dá isso. Acho que estou errando algo no envio das ordens mesmo.


Aqui está a parte do código de envio de ordem:


//--- Venda

if(SignalSell() && AutoTrading() && !CheckPositions() && !CheckOrders() && HorarioEntrada() && !GestaoDiaria() && OrdersAllowed() && wait_order==false)
     {
      ResetLastError();
      double preco_venda =  tick.last+0.5;
      ulong start = GetMicrosecondCount();
      bool ok = m_trade.SellLimit(volume_ordem,preco_venda,_Symbol,preco_venda+inpStoploss,0,ORDER_TIME_DAY,0,NULL);
      wait_order = true;
      if(ok)
        {
         if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009)
           {
            wait_order = false;
            erro_open_order = 0;
            ulong latencia = (GetMicrosecondCount() - start) / 1000;
            Print("[•]Ordem aberta com sucesso. [Latência: ",(string)latencia," ms]");
           }
         else
           {
            wait_order = false;
            erro_open_order = erro_open_order + 1;
            Print("[X]ERRO - > Falha do servidor. Erro("+(string)GetLastError()+") "+"[Quantidade de erros ao abrir ordem: "+(string)erro_open_order+"]");
           }
        }
      else
        {
         wait_order = false;
         erro_open_order = erro_open_order + 1;
         Print("[X]ERRO - > Falha ao enviar ordem. Erro("+(string)GetLastError()+") "+"[Quantidade de erros ao abrir ordem: "+(string)erro_open_order+"]");
        }

     }

   
   //--- Compra

   if(SignalBuy() && AutoTrading() && !CheckPositions() && !CheckOrders() && HorarioEntrada() && !GestaoDiaria() && OrdersAllowed() && wait_order==false)
     {
      ResetLastError();
      double preco_compra =  tick.last-0.5;
      ulong start = GetMicrosecondCount();
      bool ok = m_trade.BuyLimit(volume_ordem,preco_compra,_Symbol,preco_compra-inpStoploss,0,ORDER_TIME_DAY,0,NULL);
      wait_order = true;
      if(ok)
        {
         if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009)
           {
            wait_order = false;
            erro_open_order = 0;
            ulong latencia = (GetMicrosecondCount() - start) / 1000;
            Print("[•]Ordem aberta com sucesso. [Latência: ",(string)latencia," ms]");
           }
         else
           {
            wait_order = false;
            erro_open_order = erro_open_order + 1;
            Print("[X]ERRO - > Falha do servidor. Erro("+(string)GetLastError()+") "+"[Quantidade de erros ao abrir ordem: "+(string)erro_open_order+"]");
           }
        }
      else
        {
         wait_order = false;
         erro_open_order = erro_open_order + 1;
         Print("[X]ERRO - > Falha ao enviar ordem. Erro("+(string)GetLastError()+") "+"[Quantidade de erros ao abrir ordem: "+(string)erro_open_order+"]");
        }

     }

Nesse caso, ao aparecer o sinal, ele posiciona uma ordem pendente 0.5 pontos abaixo ou acima do ultimo preço e busca meio ponto de alvo.

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Negociação / Propriedades de uma Ordem
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Negociação / Propriedades de uma Ordem
  • www.mql5.com
Propriedades de uma Ordem - Constantes de Negociação - Constantes, Enumeradores e Estruturas - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
HENRIQUE ARAUJO DOS SANTOS:



Toda ordem a mercado é executada no preço ASK para compras e no preço BID para vendas, como spread do DOL fica sempre perto de 1(um) ticksize,  o seu TP  de um ticksize terá como resultado 0(zero).  Na verdade nos momentos de pico poderá ter algum ganho.  

No código que você anexou o TP está zerado ?!

 
Rogerio Giannetti Torres:


Toda ordem a mercado é executada no preço ASK para compras e no preço BID para vendas, como spread do DOL fica sempre perto de 1(um) ticksize,  o seu TP  de um ticksize terá como resultado 0(zero).  Na verdade nos momentos de pico poderá ter algum ganho.  

No código que você anexou o TP está zerado ?!

Aah sim!! Também imaginei que poderia ser o spread. Então impossibilita buscar 1 TICKSIZE de alvo da forma que está.

Sim o TP está zerado pois eu estava fazendo alguns testes e acabei esquecendo, mas ele estava assim:

bool ok = m_trade.SellLimit(volume_ordem,preco_venda,_Symbol,preco_venda+inpStoploss,preco_venda-inpTakeProfit,ORDER_TIME_DAY,0,NULL);
 
HENRIQUE ARAUJO DOS SANTOS:

Aah sim!! Também imaginei que poderia ser o spread. Então impossibilita buscar 1 TICKSIZE de alvo.

Sim o TP está zerado, pois eu estava fazendo alguns testes e acabei esquecendo, mas ele estava assim:

Henrique,

sua busca é um RESUTADO de um TICKSIZE do DOL em relação ao preço de entrada, como eu disse antes não é sonho, é possível sim, mas saia da caixa do LAST, pense nas ofertas, use BuyStopLimit e SellStopLimit e defina os stops usando valores de Ask e Bid. 

 
Rogerio Giannetti Torres:

Henrique,

sua busca é um RESUTADO de um TICKSIZE do DOL em relação ao preço de entrada, como eu disse antes não é sonho, é possível sim, mas saia da caixa do LAST, pense nas ofertas, use BuyStopLimit e SellStopLimit e defina os stops usando valores de Ask e Bid. 

Certo!! Vou continuar as pesquisas, testes e pensar bastante nisso que você recomendou. Muito obrigado por tirar um tempo pra responder aos tópicos, tenha certeza que foi de grande valia.


Forte Abraço!

 
No mesmo assunto, eu estou tendo este problema, a principio achei q era com o codigo, porém testei mais 5 EA (disponiveis aqui mesmo) e todos demonstraram isso, no historico aparece q pegou o TP ou SL, porém o resultado não contabiliza e no gráfico (backteste) a ordem aparece e some na mesma hora, mesmo com SL e TP longos (testei com win TP = 300 e SL 300 para ver realmente ele andava até os valores). ja reinstalei a plataforma algumas vezes, mas até agora n consegui resolver
Razão: