Verificação da parada mínima nos EAs publicados no mercado.

 

Olá a todos, amigos!

uma característica do Marketplace: precisamos verificar todos os valores para a parada mínima.

Se o valor da variável for menor que a min-stop, então atribua uma min-stop, para que não haja erro 130.

Atualmente 90% dos corretores têm spread flutuante e min STOP e rendimento 0.

Há uma construção de código que atribui todas as variáveis à parada mínima.

 int OnInitLevels(string symToWorkmodify)
  {
   if(lot<SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MIN))lots=SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MIN);else
   if(lot>SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MAX))lots=SymbolInfoDouble(symToWorkmodify,SYMBOL_VOLUME_MAX);else lots=lot;
   if(StopLoss>0 && StopLoss<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))StopLosss=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else StopLosss=StopLoss;
   if(TakeProfit>0 && TakeProfit<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TakeProfits=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TakeProfits=TakeProfit;
   if(TrailingStop>0 && TrailingStop<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TrallingStops=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TrallingStops=TrailingStop;
   if(TakeProfitALL>0 && TakeProfitALL<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TakeProfitsAver=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TakeProfitsAver=(int)TakeProfitALL;
   if(TrailingStop>0 && TrailingStop<SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL))TrallingStops=(int)SymbolInfoInteger(symToWorkmodify,SYMBOL_TRADE_STOPS_LEVEL);else TrallingStops=TrailingStop;
   return(0);
  }

Mas não funciona mais no mercado, porque agora o minstop = 0 em todos os lugares,

Quem está lidando com este problema?

 

É claro que não )))) Não são SL, TP e TS que devem ser ajustados ao mínimo, mas o nível de parada. E não apenas uma vez no início do programa, mas a cada tic-tac:

   digits          = (int) SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   point           = SymbolInfoDouble(symbol, SYMBOL_POINT);
   
   tickSize        = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
   
   ask             = SymbolInfoDouble(symbol, SYMBOL_ASK);
   bid             = SymbolInfoDouble(symbol, SYMBOL_BID);
   spread          = ask - bid;

   stopLevel       = MarketInfo(symbol, MODE_STOPLEVEL) * point;
   
   if (stopLevel == 0)
   {
      if (!isECN)
         stopLevel = NormalizeDouble(2 * spread, digits);
   }
   else
      stopLevel = NormalizeDouble(stopLevel + tickSize, digits);
isECN - deve estar à disposição do usuário para a configuração. Há contas como "verdadeiro ECN" onde realmente não há limitações de distâncias mínimas, ou seja, paradas/lucros/posições podem ser definidos dentro do spread.
 

Obrigado. mas seu projeto é o mesmo que o meu, apenas você multiplicou na parada min = 0 apenas pelo spread*2, mas como sabemos em muitos corretores parada min = 3 spread, por que você fez 2?

Eu verifico se há uma parada mínima em cada tique.

 
StopLevel não vai ajudar, pois também retorna zero, use Ask-Bid diferença, pode ser com algum multiplicador
 
Alexander Bereznyak:
StopLevel não ajuda, pois também retorna zero, eu uso a diferença Ask-Bid
é para espalhar, mas para a parada min?
 
e também para uma parada de minutos
 
Alexander Bereznyak:
e para a parada min, também.
Então você faz o min parar igual ao spread?
 
Vladislav Andruschenko:

Olá a todos, amigos!

Há uma característica especial do Marketplace: precisamos verificar todos os valores para a parada mínima.

Se o valor da variável for menor que a min-stop, então atribua uma min-stop, para que não haja erro 130.

Atualmente 90% dos corretores têm spread flutuante e min STOP e rendimento 0.

Há uma construção de código que atribui todas as variáveis à parada mínima.

Mas não funciona mais no mercado, porque agora o minstop = 0 em todos os lugares,

Quem está lidando com este problema?

Como opção, introduza uma restrição ao tamanho mínimo de parada. Por exemplo, no OnInit(), se um usuário definir uma parada inferior a 2 pontos, dê um aviso e devolva o código INIT_PARAMETERS_INCORRECT.

Outra opção é não permitir ao usuário controlar o tamanho da parada e calculá-la dinamicamente no Expert Advisor com base nas condições comerciais.

 
como o corretor declara a parada min como zero, não há mais nada a fazer, você pode pegar o multiplicador se o spread não for suficiente
 
Vitalii Ananev:

Alternativamente, você pode introduzir um limite para o tamanho mínimo de parada. Por exemplo, no OnInit(), se um usuário definir uma parada de menos de 2 pips, ele daria um aviso e devolveria o código INIT_PARAMETERS_INCORRECT.

Outra opção é não permitir ao usuário controlar o tamanho da parada e calculá-la dinamicamente no Expert Advisor com base nas condições comerciais.

Concordo - não dando controle, mas você sabe como é exigido pelo tipo: eu quero estabelecer minha própria parada.

Vou pensar sobre a saída da mensagem - obrigado.

 
Alexander Bereznyak:
Como o corretor declara que a parada mínima é zero, não há mais nada a fazer, você pode pegar um multiplicador se o spread não for suficiente.

Sim, isto é apenas para o mercado - mas não há universalidade para nenhum corretor.

a maneira como funciona é preciso fazer uma parada mínima em 3 spreads para ser aceito no mercado,

A única diferença é que o mercado os aceita - você tem que fazer uma parada min e 3 spreads, mas na verdade isto é errado - se um broker min stop = 1 spread - então o usuário não pode colocar menos de 3 spreads.

Baffle.