Colocar ordem SL na pedra, servidor B3. - página 3

 
Marcio Andrade:

Senhores, fiz um teste com o seguinte resultado;


Comprei com o Expert com SL programado de 50pts no mini índice futuro da BMF.

Fechei o MetaTrader, a ordem SL não foi acionada nos 50pts. Ela foi acionada bem depois e paguei 100pts de SL.


Repeti o teste mais uma vez, o resultado foi o mesmo.


Conclusão, a ordem é disparada com o MetaTrader desligado porém aparentemente com o dobro do valor programado, seria possível mudar esse offset? Fazer a ordem ser acionada com maior antecedência?

Como disse o Minions, tem algo MUITO errado aí. 

Você tentou mais de 1 vez e a ordem dispara SEMPRE no dobro do SL programado?

Isso acontece só quando ele dispara o SL com o terminal desligado? Quando o terminal está ligado ele respeita o SL ?

Qual o intervalo de tempo decorrido entre o momento em que o SL deveria ter sido disparado (50pts) e o momento em que foi disparado (100pts)? Foi muito rápido? Menos que alguns poucos segundos?

Estou fazendo essas perguntas para confirmar a informação, pois esses sintomas são MUITO estranhos. Difícil justificar alguma explicação baseada em slippage ou latência de rede. Parece mais haver algum bug bizarro aí no seu EA.

Se for isso mesmo, só olhando com mais atenção o código-fonte completo.

obs: mesmo na minha hipótese anterior (provavelmente errada) de o SL ser disparado pelo servidor MT5 da corretora, não faria nenhuma diferença o seu terminal MT5 local estar ligado ou desligado, pois o disparo do SL certamente não é feito pelo terminal, mas sim pelo servidor ou pela B3 (provavelmente pela B3 mesmo, conforme o link que o Minions encontrou). 

 
Trader_Patinhas:

Como disse o Minions, tem algo MUITO errado aí. 

Você tentou mais de 1 vez e a ordem dispara SEMPRE no dobro do SL programado?

Isso acontece só quando ele dispara o SL com o terminal desligado? Quando o terminal está ligado ele respeita o SL ?

Qual o intervalo de tempo decorrido entre o momento em que o SL deveria ter sido disparado (50pts) e o momento em que foi disparado (100pts)? Foi muito rápido? Menos que alguns poucos segundos?

Estou fazendo essas perguntas para confirmar a informação, pois esses sintomas são MUITO estranhos. Difícil justificar alguma explicação baseada em slippage ou latência de rede. Parece mais haver algum bug bizarro aí no seu EA.

Se for isso mesmo, só olhando com mais atenção o código-fonte completo.

obs: mesmo na minha hipótese anterior (provavelmente errada) de o SL ser disparado pelo servidor MT5 da corretora, não faria nenhuma diferença o seu terminal MT5 local estar ligado ou desligado, pois o disparo do SL certamente não é feito pelo terminal, mas sim pelo servidor ou pela B3 (provavelmente pela B3 mesmo, conforme o link que o Minions encontrou). 

Pela explicação do Minions pode ser o preço que estou usando.

Programo o estope com o seguinte código;

#include <Trade\Trade.mqh>

input double   valorEstope                         =50;                  // Valor Estope


//OrdemBuy
double Estope=0;
Estope=iOpen(InpSymbol,0,0)-valorEstope;
OpenBuy(InpLots,iOpen(InpSymbol,0,0),Estope,lucroAlvoDefinido);


//OrdemSell
double Estope=0;
Estope=iOpen(InpSymbol,0,0)+valorEstope;
OpenSell(InpLots,iOpen(InpSymbol,0,0),Estope,lucroAlvoDefinido);

bool OpenBuy(double lot,double valorcompra,int sl,double tp)// Abrir posição de Buy #######################################
  {
   if (GlobalVariableGet("OrdemCompra"+InpSymbol)==0)
     {
      DeleteOrdensNaoExecutadasBuy();
      DeleteOrdensNaoExecutadasSell();
      if (OrdemMercado==1)
         {
            if (m_trade.Buy(lot,InpSymbol,valorcompra,sl,tp,"0"))
               {
                return(true);
                PlaySound("Ok.wav");
               }
            else
               {
                return(false);
               }
         }
      else
         {
            if (m_trade.BuyLimit(lot,valorcompra,InpSymbol,sl,tp,0,0,"0"))
               {
                return(true);
                PlaySound("Ok.wav");
               }
            else
               {
                return(false);
               }
         }
     }
     else
     {
      return(false);
     }
  }

bool OpenSell(double lot,double valorcompra,double sl,double tp)// Abrir posição de Sell #####################################
  {
   if (GlobalVariableGet("OrdemVenda"+InpSymbol)==0)
     {
      DeleteOrdensNaoExecutadasBuy();
      DeleteOrdensNaoExecutadasSell();
      if (OrdemMercado==1)
         {
            if (m_trade.Sell(lot,InpSymbol,valorcompra,sl,tp,"0"))
               {
                return(true);
                PlaySound("Ok.wav");
               }
            else
               {
                return(false);
               }
         }      
      else
         {
            if (m_trade.SellLimit(lot,valorcompra,InpSymbol,sl,tp,0,0,"0"))
               {
                return(true);
                PlaySound("Ok.wav");
               }
            else
               {
                return(false);
               }
         }
     }
   else 
     {
         return(false);
     }
  }
 
 
Estou usando MT5 DMA4 da Modal, será o servidor Beta deles com problemas?
 

Pode ser essa configuração?


Mudei para;


 
Marcio Andrade:

Perai... não opero ainda Índice, somente dólar, mas o menor Tick do mini-índice é 5pts, correto?

Todas as saídas pra mim estão corretas. Você sofreu o spread de Book...

E os STOPS LOSS de seus BUYS estão completamente estranhos. Estão no preço de Entrada!?

 

E esqueci de mencionar... Cuidado ao usar iOpen()! iOpen é o Preço de Abertura da Barra, NÃO é o seu Preço de ENTRADA na OPERAÇÃO... você pode estar colocando Stop Loss no lugar errado, segundo sua estratégia (se você tiver alguma, é claro...).

;)

 
Minions Labs:

E esqueci de mencionar... Cuidado ao usar iOpen()! iOpen é o Preço de Abertura da Barra, NÃO é o seu Preço de ENTRADA na OPERAÇÃO... você pode estar colocando Stop Loss no lugar errado, segundo sua estratégia (se você tiver alguma, é claro...).

;)

Posiciono uma ordem BuyLimit ou SellLimit na abertura da barra, faz parte da minha estratégia. Quanto ao SL tiro do preço ou somo a ele o valor que estou usando de estope. Fico muito grato por sua ajuda, o que me aconselha?
 
Marcio Andrade:
Posiciono uma ordem BuyLimit ou SellLimit na abertura da barra, faz parte da minha estratégia. Quanto ao SL tiro do preço ou somo a ele o valor que estou usando de estope. Fico muito grato por sua ajuda, o que me aconselha?

Você tem que arrumar seu código... não sei se você condensou pra efeito de compreensão aqui no post, mas se realmente é esse o código que você está executando, está totalmente errado!


A variável Estope está sendo reescrita 2 vezes. NUNCA o Estope do BUY será respeitado, pois está sendo sobrescrito pelo Estope do SELL!!!

Por isso os SL dos BUYS estão indo pro limbo!

:O

 
Minions Labs:

Você tem que arrumar seu código... não sei se você condensou pra efeito de compreensão aqui no post, mas se realmente é esse o código que você está executando, está totalmente errado!


A variável Estope está sendo reescrita 2 vezes. NUNCA o Estope do BUY será respeitado, pois está sendo sobrescrito pelo Estope do SELL!!!

Por isso os SL dos BUYS estão indo pro limbo!

:O

void AvaliaEntrada(double bPrecoClose, double bPrecoOpen, double IndicadorA, double IndicadorB, int barraA)
   {
      double Estope=0, lucroAlvoDefinido=0;

      if (IndicadorA > IndicadorB)
       {
         if (GlobalVariableGet("SinalAlta"+InpSymbol)==0)
         {
          GlobalVariableSet("SinalAlta"+InpSymbol,1);
          GlobalVariableSet("SinalBaixa"+InpSymbol,0);
          GlobalVariableSet("BarraSinal"+InpSymbol, barraA);
         }
         
         if (GlobalVariableGet("TraidouBaixa"+InpSymbol)==1)
          {
           FecharPosicao(GlobalVariableGet("Bilhete"+InpSymbol));
           GlobalVariableSet("TraidouBaixa"+InpSymbol, 0);
          }
         
         if (GlobalVariableGet("TraidouAlta"+InpSymbol)==0)
         {
          int barraSinal=GlobalVariableGet("BarraSinal"+InpSymbol), barraAtual=barraA;
          if (barraSinal==barraAtual)
           {
            if (UsaEstope==1)
             {
               Estope=iOpen(InpSymbol,0,0)-valorEstope;
               if (EstopeMinimaAnterior==1)
                {
                 Estope=iLowest(InpSymbol,0,MODE_LOW,5,0);
                 Estope=iLow(InpSymbol,0,Estope);
                }
             }
            if (lucroDefinido==1) lucroAlvoDefinido=iOpen(InpSymbol,0,0)+lucroAlvo;
            if (OpenBuy(InpLots,iOpen(InpSymbol,0,0),Estope,lucroAlvoDefinido))
             {
              GlobalVariableSet("TraidouAlta"+InpSymbol, 1);
              GlobalVariableSet("FezParcial"+InpSymbol, 0);
              GlobalVariableSet("BarraBilhete"+InpSymbol,barraA);
             }
           }
         }
       }
      if (IndicadorA < IndicadorB)
       {
         if (GlobalVariableGet("SinalBaixa"+InpSymbol)==0)
         {
          GlobalVariableSet("SinalBaixa"+InpSymbol,1);
          GlobalVariableSet("SinalAlta"+InpSymbol,0);
          GlobalVariableSet("BarraSinal"+InpSymbol, barraA);
         }

         if (GlobalVariableGet("TraidouAlta"+InpSymbol)==1)
          {
           FecharPosicao(GlobalVariableGet("Bilhete"+InpSymbol));
           GlobalVariableSet("TraidouAlta"+InpSymbol, 0);
          }
         
         if (GlobalVariableGet("TraidouBaixa"+InpSymbol)==0)
         {
          int barraSinal=GlobalVariableGet("BarraSinal"+InpSymbol), barraAtual=barraA;
          if (barraSinal==barraAtual)
           {
            if (UsaEstope==1)
               {
                  Estope=iOpen(InpSymbol,0,0)+valorEstope;
                  if (EstopeMinimaAnterior==1)
                   {
                    Estope=iHighest(InpSymbol,0,MODE_HIGH,5,0);
                    Estope=iHigh(InpSymbol,0,Estope);
                   }
               }
            if (lucroDefinido==1) lucroAlvoDefinido=iOpen(InpSymbol,0,0)-lucroAlvo;
            if (OpenSell(InpLots,iOpen(InpSymbol,0,0),Estope,lucroAlvoDefinido))
             {
              GlobalVariableSet("TraidouBaixa"+InpSymbol, 1);
              GlobalVariableSet("FezParcial"+InpSymbol, 0);
              GlobalVariableSet("BarraBilhete"+InpSymbol,barraA);
             }
           }
         }
       }
   }

Condensei sim, achei ser irrelevante para a avaliação, perdão!

Razão: