Como eu faço para normalizar o preço para o WDO ?

Fernando Paiva  

Estou criando um Breakeven para o Dolar(WDO), o problema é que não estou conseguindo normalizar o preço para assim alterar o stop loss. 
Ja tentei usar simbolo.NormalizePrice e NormalizeDouble e não consegui.

O preço da ordem aberta esta 5185.0, o do SL esta 5180.0, mas quando tento usar isso no PositionModify e _Point fica como 5.185 e da o erro de stop

Como resolver isso ?


double _currentSL = PositionGetDouble(POSITION_SL);
double _currentTP = PositionGetDouble(POSITION_TP);
double _positionOpened = PositionGetDouble(POSITION_PRICE_OPEN);   

Print("Position Opened: " + _positionOpened); //exibe 5185.0
Print("Current SL: " + _currentSL ); //exibe 5180.0
Print("NewSL: " + _positionOpened * _Point); //exibe 5.185
Print("NewSL NormalizePrice: " + _simbolo.NormalizePrice(_positionOpened * _Point)); //exibe 5.185


Documentação sobre MQL5: Funções de Conversão / NormalizeDouble
Documentação sobre MQL5: Funções de Conversão / NormalizeDouble
  • www.mql5.com
NormalizeDouble - Funções de Conversão - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
Flavio Javier Jarabeck  
Fernando Paiva:

Estou criando um Breakeven para o Dolar(WDO), o problema é que não estou conseguindo normalizar o preço para assim alterar o stop loss. 
Ja tentei usar simbolo.NormalizePrice e NormalizeDouble e não consegui.

O preço da ordem aberta esta 5185.0, o do SL esta 5180.0, mas quando tento usar isso no PositionModify e _Point fica como 5.185 e da o erro de stop

Como resolver isso ?


//----------------------------------------------------------------------------------------------------------------
// ROUND PRICE TO TICK            Round numbers to the best optimal values of Tick value
//----------------------------------------------------------------------------------------------------------------
double ML_MATH_RoundPriceToTick( double number, double tick ) {
    return  (MathRound(number / tick) * tick);
}

;)

Fernando Paiva  
Flavio Jarabeck #:

;)

Obrigado pela atenção @Flavio Jarabeck 

Ainda não consegui fazer funcionar, esta acontecendo o seguinte erro.

Agradeço se puder ajudar!

//Erro
2021.09.05 03:23:05.027 2021.08.02 15:55:43   New SL: 5175.0
2021.09.05 03:23:05.027 2021.08.02 15:55:43   failed modify #24 buy 1 WDO$ sl: 5163.500, tp: 0.000 -> sl: 5175.000, tp: 0.000 [Invalid stops]
2021.09.05 03:23:05.027 2021.08.02 15:55:43   CTrade::OrderSend: modify WDO$ (sl: 5175.000, tp: 0.000) [invalid stops]
2021.09.05 03:23:05.027 2021.08.02 15:55:43   Erro envio ordem compra: 4756
2021.09.05 03:23:05.027 2021.08.02 15:55:43   Retorno do erro: unknown retcode 0

Estou tentando assim.

double _newSL = NormalizeDouble(ML_MATH_RoundPriceToTick(_positionOpened * _Point * 1000, _simbolo.TickValue()), _Digits);
Print("New SL: " + _newSL);
if(_trade.PositionModify(_positionTicket, _newSL, _currentTP)){
      BREAKEVEN_EXECUTE = 1;
}else{
      PrintFormat("Erro envio ordem compra: %d", GetLastError());
      PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription());
      BREAKEVEN_EXECUTE = 0;
}               
Robson Ferreira  
Fernando Paiva #:

Obrigado pela atenção @Flavio Jarabeck 

Ainda não consegui fazer funcionar, esta acontecendo o seguinte erro.

Agradeço se puder ajudar!

Estou tentando assim.

_positionOpened=NormalizeDouble_positionOpened,Digits());
  
Fernando Paiva  
Robson Ferreira #:
_positionOpened=NormalizeDouble_positionOpened,Digits());
  

Opa Robson, o erro permanece. 


2021.09.05 04:00:38.887 2021.09.02 09:12:14   failed modify #2 buy 1 WDO$ sl: 5193.500, tp: 0.000 -> sl: 5.204, tp: 0.000 [Invalid stops]
2021.09.05 04:00:38.887 2021.09.02 09:12:14   CTrade::OrderSend: modify WDO$ (sl: 5.204, tp: 0.000) [invalid stops]
2021.09.05 04:00:38.887 2021.09.02 09:12:14   Erro envio ordem compra: 4756
2021.09.05 04:00:38.887 2021.09.02 09:12:14   Retorno do erro: unknown retcode 0
_positionOpened = NormalizeDouble(_positionOpened,Digits());
                     
                     if(_trade.PositionModify(_positionTicket, _positionOpened, _currentTP)){
                        BREAKEVEN_EXECUTE = 1;
                     }else{
                        PrintFormat("Erro envio ordem compra: %d", GetLastError());
                        PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription());
                        BREAKEVEN_EXECUTE = 0;
                     }
Flavio Javier Jarabeck  
Fernando Paiva #:

Obrigado pela atenção @Flavio Jarabeck 

Ainda não consegui fazer funcionar, esta acontecendo o seguinte erro.

Agradeço se puder ajudar!

Estou tentando assim.

A rotina que te passei é para resolver o problema de arredondamento.

O seu outro problema é a conta que vc está fazendo. SL de 0,5pts não existe. Sai à Mercado que é mais fácil.

Fernando Paiva  
Flavio Jarabeck #:

A rotina que te passei é para resolver o problema de arredondamento.

O seu outro problema é a conta que vc está fazendo. SL de 0,5pts não existe. Sai à Mercado que é mais fácil.

@Flavio Jarabeck enviando ordem no Dolar funciona blzinha, o problema esta no Breakeven que estou tentando criar.

No indice roda muito bem, mas no dolar não vai. Abaixo o código que estou tentando.


void startBreakeven(ulong mn, double points){ 
   
   CTrade _trade;
   CSymbolInfo _simbolo;
   _simbolo.Name(_Symbol);   
   _simbolo.RefreshRates();   
   
   double _PontosBreakeven = 0;
   _PontosBreakeven = NormalizeDouble(points,0);   
   
   if(PositionsTotal() > 0 && points > 0){
    
      for(int x = 0 ; x <= PositionsTotal(); x++){
         string _symbol = PositionGetSymbol(x);
         ulong _magicNumber = PositionGetInteger(POSITION_MAGIC);
         if(_symbol == _Symbol && _magicNumber == mn){
            ulong _positionTicket = PositionGetInteger(POSITION_TICKET);
            double _currentSL = PositionGetDouble(POSITION_SL);
            double _currentTP = PositionGetDouble(POSITION_TP);
            double _positionOpened = PositionGetDouble(POSITION_PRICE_OPEN);   
            
            Print("Position Opened: " + _positionOpened);
            Print("Current SL: " + _currentSL);
            Print("New SL:--> " + ML_MATH_RoundPriceToTick(_positionOpened * _Point, _simbolo.TickValue()));
            //Print("New SL: " + _currentSL + _PontosBreakeven);         
            
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && _PontosBreakeven > 0 && BREAKEVEN_EXECUTE == 0){
               //comprado
               double Bid = _simbolo.Bid();
               if(Bid >= (_PontosBreakeven + _positionOpened * _Point)){
                  if(!isDolar()){
                     //indice win preço 
                     if(_trade.PositionModify(_positionTicket, _positionOpened * _Point, _currentTP)){
                        BREAKEVEN_EXECUTE = 1;
                     }else{
                        PrintFormat("Erro envio ordem compra: %d", GetLastError());
                        PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription());
                        BREAKEVEN_EXECUTE = 0;
                     }
                  }else{
                     //dolar wdo -> 0000.000                                         
                     double _newSL = ML_MATH_RoundPriceToTick(_positionOpened * _Point, _simbolo.TickValue());
                     Print("New SL: " + _newSL);
                     if(_trade.PositionModify(_positionTicket, _positionOpened, _currentTP)){
                        BREAKEVEN_EXECUTE = 1;
                     }else{
                        PrintFormat("Erro envio ordem compra: %d", GetLastError());
                        PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription());
                        BREAKEVEN_EXECUTE = 0;
                     }
                  }                    
               }               
            }
            
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && _PontosBreakeven > 0 && BREAKEVEN_EXECUTE == 0){
               //vendido
               double Ask = _simbolo.Ask();               
               if(Ask <= (_positionOpened - _PontosBreakeven  * _Point)){ 
                    if(!isDolar()){
                        //indice win
                        if(_trade.PositionModify(_positionTicket, _positionOpened * _Point, _currentTP)){
                              BREAKEVEN_EXECUTE = 1;
                        }else{
                           PrintFormat("Erro breakeven ordem compra: %d", GetLastError());
                           PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription());
                           BREAKEVEN_EXECUTE = 0;
                        }  
                    }else{
                        //dolar wdo -> 0000.000
                        double _newSL = ML_MATH_RoundPriceToTick(_positionOpened * _Point, _simbolo.TickValue());
                        if(_trade.PositionModify(_positionTicket, _newSL, _currentTP)){
                           BREAKEVEN_EXECUTE = 1;
                        }else{
                           PrintFormat("Erro breakeven ordem venda: %d", GetLastError());
                           PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription());
                           BREAKEVEN_EXECUTE = 0;
                        }
                    }                      
                     
                     
               }
               
            }
            
            
         }//if symbol         
      }
   }else {
      BREAKEVEN_EXECUTE = 0;
   }
   
   
   
}//startBreakeven
Samuel Manoel De Souza  
Fernando Paiva #:

@Flavio Jarabeck enviando ordem no Dolar funciona blzinha, o problema esta no Breakeven que estou tentando criar.

No indice roda muito bem, mas no dolar não vai. Abaixo o código que estou tentando.


Antes de usar as funções PositionGet precisa selecionar a posição. Se em algum momento houver mais de uma posição aberta no terminal vai dar erro com certeza.

ulong ticket = PositionGetTicket(x);
if(!PositionSelectByTicket(ticket))
  {
   // ERRO
  }
Fernando Paiva  
Samuel Manoel De Souza #:

Antes de usar as funções PositionGet precisa selecionar a posição. Se em algum momento houver mais de uma posição aberta no terminal vai dar erro com certeza.

Ja seleciono aqui: 

ulong _positionTicket = PositionGetInteger(POSITION_TICKET);

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

Flavio Javier Jarabeck  
Fernando Paiva #:

Ja seleciono aqui: 

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

Eu já te falei!

NÃO EXISTE BreakEven de 0,5 pts!

Você já operou o Dólar manualmente?? Você sabe o que é Spread?

Você sabe que existe inclusive um imposição da corretora que ela te impede de colocar SL/TP dentro do Spread??

Fernando Paiva  
Flavio Jarabeck #:

Eu já te falei!

NÃO EXISTE BreakEven de 0,5 pts!

Você já operou o Dólar manualmente?? Você sabe o que é Spread?

Você sabe que existe inclusive um imposição da corretora que ela te impede de colocar SL/TP dentro do Spread??

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

Razão: