Limites do stop e profit no Strategy Tester

 
Sergio Gelli:
Usando EUR/USD
É possível usar menos que 0.0013 de Stop Loss ou Take Profit no Strategy Tester?
Se eu uso menos a operação não é aceita mostrando erro 4766= invalid stops

Bom dia,

os stops da ordem tem que obedecer ao nível mínimo definido no atributo SYMBOL_TRADE_STOPS_LEVEL.

 
Rogerio Giannetti Torres:

Bom dia,

os stops da ordem tem que obedecer ao nível mínimo definido no atributo SYMBOL_TRADE_STOPS_LEVEL.

E é possível definir esse nével em meu EA?
Como faço isso?

 
Sergio Gelli:

...
Como faço isso?

Bom dia.


//--- Determines last price for current symbol
double BID = SymbolInfoDouble(Symbol(), SYMBOL_BID);
double ASK = SymbolInfoDouble(Symbol(), SYMBOL_ASK);

//--- Get the SYMBOL_TRADE_STOPS_LEVEL level
ulong StopsLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL);

//--- Calculates take profit - BUY
double TP = NormalizeDouble(ASK + (StopsLevel * Point()), Digits());

//--- Calculates take profit - SELL
double TP = NormalizeDouble(BID - (StopsLevel * Point()), Digits());
 

Olá

complementado a resposta do colaborador,  todo preço deve  obedecer ( ser múltiplo )  o TICK SIZE do instrumento, então a função geral para obter um preço normalizado e ajustado ao tamanho do TICKSIZE é como mostrado abaixo.

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


   
Sendo:
tickSize = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
price = Um preço que você quer ajustar para o TICK SIZE.
 
Rogerio Giannetti Torres:


Valeu @Rogerio Giannetti Torres!  Obrigado!

 
Rogerio Giannetti Torres:

Olá

complementado a resposta do colaborador,  todo preço deve  obedecer ( ser múltiplo )  o TICK SIZE do instrumento, então a função geral para obter um preço normalizado e ajustado ao tamanho do TICKSIZE é como mostrado abaixo.

Não entendi nadica de nada.
Que raio de valor é colocado na variável  tickSise?
Meu EA continua se recusando aceitar TP e STP menores que .0013
Os senhores poderiam me passar como enviar uma ordem compra ou venda com STP e TP menores?

 
Sergio Gelli:

Não entendi nadica de nada.
Que raio de valor é colocado na variável  tickSise?
Meu EA continua se recusando aceitar TP e STP menores que .0013
Os senhores poderiam me passar como enviar uma ordem compra ou venda com STP e TP menores?

A resposta já foi dada.

Ou o seu EA está bloqueando isso por alguma razão (eu duvido), OU, a sua corretora não deixa...

Isso é obtivo pelo EA através da informação da corretora, quando se executa o código com a propriedade SYMBOL_TRADE_STOPS_LEVEL.  Todo EA minimamente decente  imprime essa e outras informações sobre "o quê" a corretora aceita, na janela de logs do MT4/5.

 
Flavio Jarabeck:

A resposta já foi dada.

Ou o seu EA está bloqueando isso por alguma razão (eu duvido), OU, a sua corretora não deixa...

Isso é obtivo pelo EA através da informação da corretora, quando se executa o código com a propriedade SYMBOL_TRADE_STOPS_LEVEL.  Todo EA minimamente decente  imprime essa e outras informações sobre "o quê" a corretora aceita, na janela de logs do MT4/5.

Desculpe, não me expliquei corretamente
Gostaria de saber à que corresponde o valor retornado pela função:

SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)

Não imagino qual seja a correspondẽncia. É o valor monetárioa do tick atual? Volume? Quantidade de Pontos?

 
Sergio Gelli:

Desculpe, não me expliquei corretamente
Gostaria de saber à que corresponde o valor retornado pela função:

Não imagino qual seja a correspondẽncia. É o valor monetárioa do tick atual? Volume? Quantidade de Pontos?

Não é Tick Size! É o que a corretora estabelece! Você não tem domínio sobre isso, só tem que aceitar, ou mudar de corretora...

leia a documentação:



 

É isso aí... E apenas para mostrar como poderia ficar o código com a complementação do @Rogerio Giannetti Torres:


//--- Get the last price for current symbol
double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- Get the SYMBOL_TRADE_STOPS_LEVEL level
ulong StopsLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);

//--- Calculates take profit - BUY
double TP = NormalizeTickSize(ASK + (StopsLevel * _Point));

//--- Calculates take profit - SELL
double TP = NormalizeTickSize(BID - (StopsLevel * _Point));


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

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


Implementando assim, o seu EA vai calcular o menor TP aceito pela corretora para o símbolo. Se ele continua incluindo à distância de 0.0013, então é porque realmente esse é o menor valor aceito pela corretora para o símbolo, como já explicado pelo @Flavio Jarabeck.

Razão: