Como eu faço para normalizar o preço para o WDO ? - página 2

 
Fernando Paiva #:

sim, eu vi q vc disse, e o mini dolar anda de meio em meio ponto, o que não estou conseguindo é resolver esse problema de fazer o BKE para o mini dolar, para o mini indice funciona blzinha, como eu ja disse. E sim, eu opero manual tanto no mini indice como no mini dolar e sim, sei o que é spread.
O caso aqui, é que quero fazer esse breakeven rodar no mini dolar 

vc pode ajudar ?


Obrigado desde ja

Cara retira esse vezes 1000 e verifica os parametros do startBreakeven, muito provavelmente esta dando invalid stop porque o preco nao andou suficiente para o stop de breakeven ser considerado valido. ex. Voce quer numa operacao que esta com perda, querendo mover para o breakeven. Obviamente nao vai aceitar. Seu problema deve ser anterior na chamada ou esta passando aquele segundo parametro errado.

Outra coisa, o WDO$ nao eh operavel. Se quiser operar ele, eh so via o testador de estrategia.
 

Olá Fernando.

Por que você está multiplicando o _positionOpened por _Point? Isso funciona no mini-índice porque _Point no índice é igual a 1, já no WDO a coisa muda. Você tem que criar um ajuste de dígitos sempre que for modificar sua posição, e tal ajuste deve ser em função do número de dígitos do símbolo. Sua solução pode não funcionar em uma corretora onde _Digits no WDO for diferente de 3.

Eu faço assim:

double digits_adjust=(symbol.Digits()==1 ||symbol.Digits()==3 || symbol.Digits()==5) ? 1/_Point : 1;
double adjusted_point=symbol.Point()*digits_adjust;
        stoploss   =stoploss*adjusted_point;
        takeprofit =takeprofit*adjusted_point;

Sempre que for modificar um preço que vai ser inserido na função PositionModify, somar ou subtrair uma quantidade k de pontos a esse preço dado, certifique de fazer:

NewSL = NormalizePrice(_positionOpened + k*adjusted_point);

Espero ter ajudado.

Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade / PositionModify
Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade / PositionModify
  • www.mql5.com
PositionModify(const string,double,double) - CTrade - Classes de negociação - Biblioteca Padrão - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Fala experts

estou  com esse msm problema, mas ainda nao conseguir resolver , aparece o erro somente depois das 10hs kkkkk engraçado que nas entradas anteriors ele funcionou normal sem apresenta erros

se alquem puder me dar um help seque meu be e ts

//============================================================================
void Breakeven(double preco)
  {
   
   
   int PosTotal = PositionsTotal();
   for(int i = PosTotal - 1; i>=0; i--)
    {
      string symbol = PositionGetSymbol(i);
      if(symbol == _Symbol)
        {   
           /* double digits_adjust=(_Symbol._Digits()==1 ||_Symbol._Digits()==3 || _Symbol._Digits()==5) ? 1/_Point : 1;
            double adjusted_point=_Symbol._Digits()*digits_adjust;
                 stoploss   =stoploss*adjusted_point;
                 takeprofit =takeprofit*adjusted_point;*/

            ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
            double PrecoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);
            double TakeProfitCurrent = PositionGetDouble(POSITION_TP);
            double StopLossCurrent = PositionGetDouble(POSITION_SL);
                  
            /*SymbolInfoInteger(_Symbol,SYMBOL_DIGITS,_Digits);
            SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE,tickSize);

            preco=NormalizeDouble(MathRound(preco/tickSize)*tickSize,_Digits);*/

            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
              {
               if(preco >= PrecoEntrada + GatilhoBE[BE])
                 {
                 if(StopLossCurrent!=PrecoEntrada+alvoBE[BE])
                 {
                     if(trade.PositionModify(PositionTicket, NormalizeTick(PrecoEntrada+alvoBE[BE]),TakeProfitCurrent))
                     {
                        Print("Breakeven - sem falha11"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                        flagBEST = true;
                        BE++;
                     }
                     else
                     {
                        Print("Breakeven - com falha11"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                     }
                  }
                 }
              }
            else
               if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                 {
                  if(preco <= PrecoEntrada - GatilhoBE[BE])
                    {
                    if(StopLossCurrent!=PrecoEntrada-alvoBE[BE])
                    {
                     if(trade.PositionModify(PositionTicket, NormalizeTick(PrecoEntrada-alvoBE[BE]),TakeProfitCurrent))
                       {
                        Print("Breakeven - sem falha"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                        flagBEST = true;
                        BE++;
                       }
                     else
                       {
                        Print("Breakeven - com falha"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                       }
                    }
                 }
              }
        }
     }
  }
//=====================================================================
//============================================================================
double NormalizeTick(double num)
  {
   
   if(mercado==0)//B3
      return ceil(num/tickSize)*tickSize;
   else
      return ceil((num*_Point)/tickSize)*tickSize;
      

  }   


 
void Breakeven(double preco)
  {
   
   
   int PosTotal = PositionsTotal();
   for(int i = PosTotal - 1; i>=0; i--)
    {
      string symbol = PositionGetSymbol(i);
      if(symbol == _Symbol)
        {   
           /* double digits_adjust=(_Symbol._Digits()==1 ||_Symbol._Digits()==3 || _Symbol._Digits()==5) ? 1/_Point : 1;
            double adjusted_point=_Symbol._Digits()*digits_adjust;
                 stoploss   =stoploss*adjusted_point;
                 takeprofit =takeprofit*adjusted_point;*/

            ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
            double PrecoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);
            double TakeProfitCurrent = PositionGetDouble(POSITION_TP);
            double StopLossCurrent = PositionGetDouble(POSITION_SL);
                  
            /*SymbolInfoInteger(_Symbol,SYMBOL_DIGITS,_Digits);
            SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE,tickSize);

            preco=NormalizeDouble(MathRound(preco/tickSize)*tickSize,_Digits);*/

            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
              {
               if(preco >= PrecoEntrada + GatilhoBE[BE])
                 {
                 if(StopLossCurrent!=PrecoEntrada+alvoBE[BE])
                 {
                     if(trade.PositionModify(PositionTicket, NormalizeTick(PrecoEntrada+alvoBE[BE]),TakeProfitCurrent))
                     {
                        Print("Breakeven - sem falha11"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                        flagBEST = true;
                        BE++;
                     }
                     else
                     {
                        Print("Breakeven - com falha11"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                     }
                  }
                 }
              }
            else
               if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                 {
                  if(preco <= PrecoEntrada - GatilhoBE[BE])
                    {
                    if(StopLossCurrent!=PrecoEntrada-alvoBE[BE])
                    {
                     if(trade.PositionModify(PositionTicket, NormalizeTick(PrecoEntrada-alvoBE[BE]),TakeProfitCurrent))
                       {
                        Print("Breakeven - sem falha"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                        flagBEST = true;
                        BE++;
                       }
                     else
                       {
                        Print("Breakeven - com falha"+IntegerToString(trade.ResultRetcode())+", RetcodeDescription: "+ trade.ResultRetcodeDescription());
                       }
                    }
                 }
              }
        }
     }
  }
//============================================================================
double NormalizeTick(double num)
  {
   
   if(mercado==0)//B3
      return ceil(num/tickSize)*tickSize;
   else
      return ceil((num*_Point)/tickSize)*tickSize;
      

  }   
  
        
//NewSL = NormalizePrice(_positionOpened + k*adjusted_point);

//=====================================================================

 

meu trailingstop tbm , porfavor me ajudem


//==========================================================================================
void TrailingStop(double preco)
{
   for(int i = PositionsTotal()-1; i>=0; i--)
   {
      string symbol = PositionGetSymbol(i);
      ulong magic = PositionGetInteger(POSITION_MAGIC);
      if(symbol == _Symbol)
      {
         if(magicNumber == magic)
         {
            /*//SymbolInfoInteger(_Symbol,SYMBOL_DIGITS,_Digits);
            SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE,tickSize);

            preco=NormalizeDouble(MathRound(preco/tickSize)*tickSize,_Digits);*/

            ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
            double StopLossCorrente = PositionGetDouble(POSITION_SL);
            double TakeProfitCorrente = PositionGetDouble(POSITION_TP);
            double pontos = SymbolInfoDouble (symbol, SYMBOL_POINT);
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
            {
               if(preco >= (StopLossCorrente + NormalizeTick(TrailingStopStart)))
               {
                  double novoSL = StopLossCorrente + NormalizeTick(AjusteTrailingStop);
                  if(StopLossCorrente!=novoSL)
                     if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                     {
                        Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
                     else
                     {
                        Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
                  }
               }
            else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
            {
               if(preco <= (StopLossCorrente - NormalizeTick(TrailingStopStart)))
               {
                  double novoSL = StopLossCorrente - NormalizeTick(AjusteTrailingStop);
                  if(StopLossCorrente!=novoSL)
                     if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                     {
                        Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
                     else
                     {
                        Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
               }
            }
         }
      }
   }
}
//==========================================================================================
 
Na Onda #:

Quem é o preço que você esta enviando para função?

Vem de onde? 

 
Fernando Paiva #:

Ja seleciono aqui: 

O problema não é selecionar a ordem, é fazer o breakeven no Dolar (WDO)

Essa expressão não seleciona posição, obtém o ticket de uma posição mas não seleciona a posição para trabalhar as outras funções PositionGet. As funções apropriadas para selecionar uma posição são PositionSelect(string symbol) e PositionSelectByTicket(ulong ticket). As funções PositionGetInteger/Double/String não funcionam sem selecionar a posição.
 
Na Onda #:

meu trailingstop tbm , porfavor me ajudem

ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
Essa expressão não seleciona posição, obtém o ticket de uma posição mas não seleciona a posição para trabalhar as outras funções PositionGet. As funções apropriadas para selecionar uma posição são PositionSelect(string symbol) e PositionSelectByTicket(ulong ticket). As funções PositionGetInteger/Double/String não funcionam sem selecionar a posição.
 

Segue um exemplo de como percorrer a lista de posições.

input ulong inpMagic;
input string inpSymbol;

void PercorrerPosicoes(void)
  {
   for(int i=0;i<PositionsTotal();i++)
     {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket))
        {
         if(PositionGetInteger(POSITION_MAGIC) == inpMagic && 
            PositionGetString(POSITION_SYMBOL) == inpSymbol)
           {
            // ---
            TratarPosicao(ticket);
           }
        }
     }
  }

void TratarPosicao(ulong ticket)
  {
   // ---
  }
 
Documentação sobre MQL5: Funções de Negociação
Documentação sobre MQL5: Funções de Negociação
  • www.mql5.com
Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5