Comprobación del stop mínimo en los EAs publicados en el mercado.

 

¡Hola a todos, amigos!

Hayuna característica especial de Marketplace: tenemos que comprobar todos los valores para la parada mínima.

Si el valor de la variable es menor que el min-stop, entonces asigna un min-stop, para que no haya error 130.

Actualmente el 90% de los brokers tienen spread flotante y min STOP y yield 0.

Hay una construcción de código que asigna todas las variables al tope mínimo.

 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);
  }

Pero ya no funciona en el mercado, porque ahora minstop = 0 en todas partes,

¿Quién se ocupa de este problema?

 

Por supuesto que no )))) No es el SL, el TP y el TS lo que debe ponerse al mínimo, sino el nivel de parada. Y no sólo una vez al inicio del programa, sino en cada tic:

   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 - debe estar a disposición del usuario para su configuración. Hay cuentas como "true ECN" en las que realmente no hay limitaciones en cuanto a las distancias mínimas, es decir, se pueden establecer stops/ganancias/posiciones dentro del spread.
 

Gracias. pero tu diseño es el mismo que el mío, solo que multiplicaste en min stop = 0 solo por el spread*2, pero como sabemos en muchos brokers min stop = 3 spread, ¿por qué hiciste 2?

Compruebo la parada mínima en cada tic.

 
StopLevel no ayudará ya que también devuelve cero, utilice la diferencia Ask-Bid, puede ser con algún multiplicador
 
Alexander Bereznyak:
StopLevel no ayuda, ya que también devuelve cero, utilizo la diferencia Ask-Bid
¿es para spread, pero para min stop?
 
y también para una parada mínima
 
Alexander Bereznyak:
y también por la parada del min.
Entonces, ¿haces que el min stop sea igual al spread?
 
Vladislav Andruschenko:

¡Hola a todos, amigos!

Hay una característica especial de Marketplace: tenemos que comprobar todos los valores para la parada mínima.

Si el valor de la variable es menor que el min-stop, entonces asigna un min-stop, para que no haya error 130.

Actualmente el 90% de los brokers tienen spread flotante y min STOP y yield 0.

Hay una construcción de código que asigna todas las variables al tope mínimo.

Pero ya no funciona en el mercado, porque ahora min stop = 0 en todas partes,

¿Quién se ocupa de este problema?

Como opción, introduzca una restricción en el tamaño mínimo de la parada. Por ejemplo, en OnInit(), si un usuario establece un tope inferior a 2 puntos, da un aviso y devuelve el código INIT_PARAMETERS_INCORRECT.

Otra opción es no permitir que el usuario controle el tamaño del stop, sino calcularlo dinámicamente en el Asesor Experto en función de las condiciones de negociación.

 
como el broker indica que el min stop es cero, no hay nada más que hacer, puedes coger el multiplicador si el spread no es suficiente
 
Vitalii Ananev:

Como alternativa, puede introducir un límite en el tamaño mínimo de la parada. Por ejemplo, en OnInit(), si un usuario establece un stop de menos de 2 pips, daría un aviso y devolvería el código INIT_PARAMETERS_INCORRECT.

Otra opción es no permitir que el usuario controle el tamaño del stop, y calcularlo dinámicamente en el Asesor Experto en función de las condiciones de negociación.

Estoy de acuerdo - no dar el control, pero usted sabe cómo se requiere por el tipo: Quiero establecer mi propia parada.

Pensaré en la salida del mensaje - gracias.

 
Alexander Bereznyak:
Como el broker declara que el min stop es cero, no hay nada más que hacer, puedes coger un multiplicador si el spread no es suficiente

Sí, esto es sólo para el mercado - pero no hay universalidad para ningún corredor

la forma en que funciona es que tienes que hacer un min stop a 3 spreads para ser aceptado en el mercado,

La única diferencia es que el mercado los acepta - hay que hacer un min stop y 3 spreads, pero en realidad esto es erróneo - si un broker min stop = 1 spread - entonces el usuario no puede poner menos de 3 spreads.

Bafle.