[Invalid stops]

 

 Pessoal alguém saberia ajudar com este problema?

 A compra é realizada, porém o takestop não funciona. Estou tentando converter um código do profitchart. 

Estou com dificuldade em achar função SellToCoverStop equivalente para MQL.

Outra coisa que o Sell Stop é logo acionado sem menos ocorrer a condição. 

Obrigado pela atenção pessoal.


Código ProfitChart

    if(trend < 0) then
    begin
      SellToCoverStop(bsmax , bsmax);
    end;

    if ((BuyPrice-open) >= -200) then
    begin
      SellToCoverStop(BuyPrice-500, BuyPrice-500);
    end;

    SellToCoverStop(BollingerBands(2.00,periodo,0)|0|,BollingerBands(2.00,periodo,0)|0|);

 


Código MT5

               if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){
           
               SL = NormalizeDouble(precoEntrada - (500 * _Point), _Digits);
     
                if(trend < 0){
                  trade.SellStop(5, precoEntrada, Symbol(), NormalizeDouble(bsmax_0,0), 0.0 );
                  printf("SELL 1: " + NormalizeDouble(bsmax_0,0));
 
                }
                
            
                if ((precoEntrada - PRICE_OPEN) >= -200) {
                  trade.SellStop(5, precoEntrada, Symbol(), NormalizeDouble(SL,0), 0.0 );
                  printf("SELL 2: " + SL);
                }
                
                trade.SellStop(5, precoEntrada, Symbol(), NormalizeDouble(upBand[1],0), 0.0 );
        
            
               
            }


Resultado

2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   exchange buy 5 WINM20.8R at 82115 (82110 / 82115 / 82110)
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   deal #2 buy 5 WINM20.8R at 82115 done (based on order #2)
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   deal performed [#2 buy 5 WINM20.8R at 82115]
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   order performed buy 5 at 82115 [#2 buy 5 WINM20.8R at 82115]
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   CTrade::OrderSend: exchange buy 5.00 WINM20.8R [done]
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   failed sell stop 5 WINM20.8R at 82115 sl: 82234 [Invalid stops]
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   CTrade::OrderSend: sell stop 5.00 WINM20.8R at 82115 sl: 82234 [invalid stops]
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   SELL 1: 82234.0
2020.05.23 23:02:07.036 Core 1  2020.05.20 13:38:00   SELL 2: 81615.0
 
O índice mini se move de 5 em 5 pontos e você está colocando o stop loss num preço quebrado com final 4, não pode, é preciso arredondar. Pode-se usar o comando NormalizeDouble para isso.
 
Thiago Duarte:
O índice mini se move de 5 em 5 pontos e você está colocando o stop loss num preço quebrado com final 4, não pode, é preciso arredondar. Pode-se usar o comando NormalizeDouble para isso.

Oi Thiago, obrigado pela atenção. 


Estou usando.

Será que estou usando incorretamente?

 
marcelodelta:

Oi Thiago, obrigado pela atenção. 


Estou usando.

Será que estou usando incorretamente?

Vc tá normalizando pra número inteiro. Tem que normalizar pra múltiplo de 5.

Divide por 5, normaliza o resultado pra inteiro e em seguida multiplica por 5, que vai dar certo.

 
Trader_Patinhas:

Vc tá normalizando pra número inteiro. Tem que normalizar pra múltiplo de 5.

Divide por 5, normaliza o resultado pra inteiro e em seguida multiplica por 5, que vai dar certo.

Obrigado pela atenção Patinhas.

Ainda não foi normalizado.

Consegue ter outra sugestão ou algo que estou fazendo errado ?


2020.05.24 02:35:32.449 2020.05.21 11:29:00   BSMAX :82713.38536828017
2020.05.24 02:35:32.449 2020.05.21 11:29:00   SELL 1: 82713.39


 Print("BSMAX :" +bsmax_0);
 double LOSSTrend = (bsmax_0 / 5);
 Print("SELL 1: " + NormalizeDouble(LOSSTrend * 5,2));


Também tentei assim:

double LOSSTrend = NormalizeDouble((bsmax_0 / 5)*5,_Digits) ;
trade.SellStop(5, precoEntrada, Symbol(), LOSSTrend, 0.00);
 
marcelodelta:

Obrigado pela atenção Patinhas.

Ainda não foi normalizado.

Consegue ter outra sugestão ou algo que estou fazendo errado ?




Também tentei assim:

Tenta ler este tópico.

 

Visto que o ponto de entrada da operação já está no preço correto basta colocar o SL a 20, 30, 40, 45, 55 etc, pontos de distância.

Tente fazer o EA calcular o Sl desta forma.

 
marcelodelta:

Obrigado pela atenção Patinhas.

Ainda não foi normalizado.

Consegue ter outra sugestão ou algo que estou fazendo errado ?




Também tentei assim:

Oi Marcelo,

Conforme expliquei antes, vc tem que primeiro dividir por 5, em seguida normalizar (arredondar para inteiro) e, ao final, multiplicar por 5. Somente nessa ordem obterá o resultado correto:

double LOSSTrend = 5 * NormalizeDouble((bsmax_0 / 5),_Digits) ;

Porém, eu prefiro fazer do jeito abaixo, que funciona pra qualquer ativo, e não apenas pro índice:

double price_step  = SymbolInfoDouble ( Symbol() , SYMBOL_TRADE_TICK_SIZE );
double round_price = price_step * MathRound ( price / price_step );
 

 Perfeito. Funcionou. 


 Muito obrigado Patinhas!

 
marcelodelta:

 Perfeito. Funcionou. 


 Muito obrigado Patinhas!

Prezado Marcelo, tudo bem? Estou com o mesmo problema postado em relação ao arredondamente. Verifiquei que no seu caso deu certo.
double price_step  = SymbolInfoDouble ( Symbol() , SYMBOL_TRADE_TICK_SIZE );
double round_price = price_step * MathRound ( price / price_step );
No exemplo acima, só não entendi o campo price. Fico no aguardo. Grato.
 
Juscelino Pereira:
. . .

Price é o preço a normalizar e ajustar (stop loss, take profit, trailing, preço de abertura, ...):

//+--------------------------------------------------------------------------------------------------------------------+
//| This function normalizes and adjusts the price to the TICK SIZE                                                    |
//+--------------------------------------------------------------------------------------------------------------------+
double NormalizePrice(double Price)
  {
   //--- Get the minimal price change
   double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

   //--- Return the price normalized
   if(TickSize == 0.0) {return(NormalizeDouble(Price, _Digits));}

   //--- Return the price normalized and adjusted to the TICK SIZE
   return(NormalizeDouble(MathRound(Price / TickSize ) * TickSize, _Digits));
  }
Razão: