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

Para adicionar comentários, por favor Faça o login ou registrar
sergiomt
332
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;

        }

     }

  }

Trader_Patinhas
1127
Trader_Patinhas  
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.

Rogerio Giannetti Torres
3155
Rogerio Giannetti Torres  
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!  

sergiomt
332
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.

Rogerio Giannetti Torres
3155
Rogerio Giannetti Torres  
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.

sergiomt
332
sergiomt  

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.

sergiomt
332
sergiomt  

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).

Trader_Patinhas
1127
Trader_Patinhas  

@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.

sergiomt
332
sergiomt  

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

sergiomt
332
sergiomt  

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;

sergiomt
332
sergiomt  

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.

12
Para adicionar comentários, por favor Faça o login ou registrar