Por que não está virando a mão no mini dólar ?

 

Prezados,

Alguém ajuda ? Um trecho do código de um EA que estou testando apenas experimentalmente em conta Demo funciona bem no mini-índice. Quando o preço InpValor é superado pelo preço do WIN o EA encerra venda e abre imediatamente compra, e vice-versa para abrir venda. Só tem 1 posição, ou compra ou venda. Funciona bem. Porém no mini-dólar não ocorre alternância de posições. No caso abaixo ele só abre compras (Buy). Não importa se o Ask ou Bid está acima ou abaixo do InpValor, só abre compra. Se eu trocar sell por buy após o bool, aí ele só abre venda. Não alterna. Já no mini índice funciona alternando perfeitamente.

O que fazer para alternar ? OBS: O valor ali mostrado como 3870.500 é que já tentei de todas as formas possíveis.

 

input double   InpLots           = 5;               // Lote

input double   InpValor          = 3870.500;   // Limite para comprar ou vendar

input ulong    m_magic=0123456;               //

//---

ulong  m_slippage=10;         // slippage


double ExtTakeProfit=0.0;

double ExtValor=0.0;

double m_adjusted_point;      // point value adjusted for 3 or 5 points


//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;

         

   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtTakeProfit=InpTakeProfit*m_adjusted_point;

   ExtValor=InpValor*m_adjusted_point;


//---

   bool buy=(m_symbol.Ask()>ExtValor); //&& m_last_date_IN < time_0);

   bool sell=(m_symbol.Bid()<ExtValor); //&& m_last_date_IN < time_0);

   

   if(IsPositionExists())

     {

      if(buy)

        {

         ClosePositions(POSITION_TYPE_SELL);

         return;

        }

      if(sell)

        {

         ClosePositions(POSITION_TYPE_BUY);

         return;

        }

     }

   else

     {

      if(!RefreshRates())

         return;

      if(buy)

        {

         OpenBuy(0.0,0.0);

         return;

        }

      if(sell)

        {

         OpenSell(0.0,0.0);

         return;

        }

     }

  }

 
sergiomt:

Prezados,

Alguém ajuda ? Um trecho do código de um EA que estou testando apenas experimentalmente em conta Demo funciona bem no mini-índice. Quando o preço InpValor é superado pelo preço do WIN o EA encerra venda e abre imediatamente compra, e vice-versa para abrir venda. Só tem 1 posição, ou compra ou venda. Funciona bem. Porém no mini-dólar não ocorre alternância de posições. No caso abaixo ele só abre compras (Buy). Não importa se o Ask ou Bid está acima ou abaixo do InpValor, só abre compra. Se eu trocar sell por buy após o bool, aí ele só abre venda. Não alterna. Já no mini índice funciona alternando perfeitamente.

O que fazer para alternar ? OBS: O valor ali mostrado como 3870.500 é que já tentei de todas as formas possíveis.

 

input double   InpLots           = 5;               // Lote

input double   InpValor          = 3870.500;   // Limite para comprar ou vendar

input ulong    m_magic=0123456;               //

//---

ulong  m_slippage=10;         // slippage


double ExtTakeProfit=0.0;

double ExtValor=0.0;

double m_adjusted_point;      // point value adjusted for 3 or 5 points


//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;

         

   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtTakeProfit=InpTakeProfit*m_adjusted_point;

   ExtValor=InpValor*m_adjusted_point;


//---

   bool buy=(m_symbol.Ask()>ExtValor); //&& m_last_date_IN < time_0);

   bool sell=(m_symbol.Bid()<ExtValor); //&& m_last_date_IN < time_0);

   

   if(IsPositionExists())

     {

      if(buy)

        {

         ClosePositions(POSITION_TYPE_SELL);

         return;

        }

      if(sell)

        {

         ClosePositions(POSITION_TYPE_BUY);

         return;

        }

     }

   else

     {

      if(!RefreshRates())

         return;

      if(buy)

        {

         OpenBuy(0.0,0.0);

         return;

        }

      if(sell)

        {

         OpenSell(0.0,0.0);

         return;

        }

     }

  }

Prezado,

Esse código está incompleto. Para entender o que está acontecendo será necessário olhar dentro dessas funções OpenBuy, OpenSell, ClosePositions, etc.

 
Trader_Patinhas:

Prezado,

Esse código está incompleto. Para entender o que está acontecendo será necessário olhar dentro dessas funções OpenBuy, OpenSell, ClosePositions, etc.

Incompleto é pouco!  Ele limpou várias linhas do código e postou o que ele achava que seria suficiente para entendermos, francamente é muita pretensão.

Sérgio, nos próximas postagens se quiser minha ajuda, faça por merecer, assim não dá cara, paciência tem limite.

Passar bem!  

 

Patinhas, grato pela tentativa em ajudar e indicar sobre a necessidade de postar o código completo. Realmente achei que só esta parte serviria para chegar na questão.


Rogério G Torres, um favor, se tiver decência (veja no Google) nunca mais escreva nas minhas postagens...passar bem também.

 
sergiomt:

Patinhas, grato pela tentativa em ajudar e indicar sobre a necessidade de postar o código completo. Realmente achei que só esta parte serviria para chegar na questão.


Rogério G Torres, um favor, se tiver decência (veja no Google) nunca mais escreva nas minhas postagens...passar bem também.

Atenderei com prazer.

Passar bem.

 

Com a cotação do mini dólar a 3866.000 se eu coloco o Limitador InpValor em 9999999 aí sim ele abre venda (entende que este número é maior que a cotação atual) e se eu coloco 8888888 aí ele abre compra (entende que este valor é menor que a cotação atual).

Mas no código tem esta parte que talvez deveria 'cuidar' disso

//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;

         

   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtTakeProfit=InpTakeProfit*m_adjusted_point;

   ExtValor=InpValor*m_adjusted_point;


Aprendendo...e ainda pesquisando.

 

O que eu percebi é que:

Se só funciona bem no mini índice (dólar e ações não), é porque o mini índice não tem ponto decimal na sua cotação (já dólar e ações tem)

Talvez seja por isso


A idéia deste EA para estudos é que se a cotação atual está acima do InpValor o EA tem que imediatamente abrir compra (fechar venda se houver), e se a cotação estiver abaixo do InpValor deve 'virar a mão' e imediatamente abrir venda.


Aprendendo...e pesquisando (e vice-versa).

 

@sergiomt

Infelizmente não há como ajudar com base nessas poucas informações que vc posta. Somente vendo o código completo da parte que deveria "virar a mão" é que seria possível opinar.

 

Valeu Patinhas,

No mini-índice está funcionando 100%

A parte que vira a mão, ao meu ver, é a condição de Sell e Buy e o fato de fechar Sell para poder Buy ocorrer, e vice-versa (ambas descritas no trecho que colei)

Creio que o problema deva estar na normalização do preço pois o WIN não tem ponto decimal, já WDO e ações tem


Opinião de leigo que sou

 

Não é bool mas sim double. Ao meu ver o IsPositionExists monitora se há ordem aberta, se houver Buy fecha Sell, e vice-versa. Depois abre Buy ou abre Sell se o InpValor for maior ou menor que o preço corrente do ativo. Pelo menos tá funcionando 100% no WIN provando que a lógica está certa. Só não funciona no WDO nem em ações.



//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;

   m_adjusted_point=m_symbol.Point()*digits_adjust;

   

   ExtStopLoss        = InpStopLoss        * m_adjusted_point;

   ExtTakeProfit      = InpTakeProfit      * m_adjusted_point;

   ExtTrailingStop    = InpTrailingStop    * m_adjusted_point;

   ExtTrailingStep    = InpTrailingStep    * m_adjusted_point;

   ExtBreakeven       = InpBreakeven       * m_adjusted_point;

   ExtBreakevenProfit = InpBreakevenProfit * m_adjusted_point;

   ExtValor           = InpValor           * m_adjusted_point;

   

//---

   double BUY=(m_position.PriceCurrent()>ExtValor); 

   double SELL=(m_position.PriceCurrent()<ExtValor); 

      

   if(IsPositionExists())

     {

      if(BUY)

        {

         ClosePositions(POSITION_TYPE_SELL);

         return;

        }

      if(SELL)

        {

         ClosePositions(POSITION_TYPE_BUY);

         return;

        }

     }

   else

     {

      if(!RefreshRates())

         return;


      if(BUY)

        {

         double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;

         double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;

         OpenBuy(sl,tp);

         return;

        }

      if(SELL)

        {

         double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;

         double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;

         OpenSell(sl,tp);

         return;

 

Quando eu coloco nos settings do EA o valor de InpLots em 9999999.999999999

Ou seja sete dígitos noves depois . e mais quantos dígitos forem, o EA insiste em só abrir Buy

Se eu mudo o InpLots para 10000000 (oito digitos) aí ele abre Sell

Ou seja, só 8 dígitos é que ele entende ser maior que o valor que eu coloco no InpLots (no caso 3870)

Menos de 8 dígitos ele entende que são todos valores menores que InpLots e por isso só abre Buy


Não deve ser um problema de lógica, se fosse daria erro também no WIN (funciona 100%). Falta alguma normalização de dígitos para aceitar cotações com ponto decimal...eu acho.

Razão: