Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 740

 
evillive:
Me refiero al terreno de juego, no al lote mínimo, pero bueno, olvídalo.
Sí, claro, si no escribes para ti, tienes que tenerlo en cuenta.
 
evillive:

Gracias, ya me lo han explicado :D

Está claro que para mí escribo con todos los cheques, como debe ser, sólo había un esbozo de cómo el lote para equilibrar/10 para llevar la proporción, pero la idea no tuvo éxito ...

Pero tienes mucho texto, podría ser más sencillo:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

Podría ser más sencillo. Sólo, ¿qué pasará si MarketInfo() para lotstep devuelve 0? ¿Cuáles serán las consecuencias? ¿Se detendrá el Asesor Experto y se abandonarán las posiciones?

Y si el broker fija el MINLOT en 0,03 y el LOTSTEP en 0,02, es decir, los dos primeros valores de lote permitidos son 0,03 y 0,05, y el saldo actual es 41, ¿cuál será el valor del lote calculado en su código?

¿Por qué, si el lote es inferior al valor mínimo -por ejemplo, con un saldo igual a 1, será igual a 0 después de que la expresión se calcule completamente-, por qué en este caso su código toma el lote igual a MINLOT, que puede ser 0,03, es decir, 30 veces más que el valor "bruto" de "AccountBalance()*0,001", que en este caso es igual a 0,001?

No siempre se puede obtener un valor de lote válido, porque las condiciones pueden ser tales que NINGUNO de los valores de lote válidos se corresponda con ellas. Hay que programar todas las situaciones erróneas, y hay que recordar que esto es al menos el 90% del trabajo.

El modelo aplicado establecido por MetaQuotes es que lote = MINLOT + N * LOTSTEP, donde N = 0, 1, 2... M. Y M es tal que MINLOT + M * LOTSTEP <= MAXLOT y MINLOT + (M + 1) * LOTSTEP > MAXLOT. En consecuencia, también debe calcular dentro del modelo de conjunto, es decir, lote = MINLOT + N * LOTSTEP. Entonces todo tipo de combinaciones incómodas de MINLOT y LOTSTEP carecen de importancia, porque la fórmula funciona de forma general. Una vez que lo hayas escrito bien, lo hayas depurado correctamente y te hayas concentrado en otra cosa interesante y divertida. Y con gusto - porque no tienes que volver constantemente a un código mal escrito porque de nuevo este código no funciona, sino que sólo tiene fallos...

 
simpleton:

Podría ser más sencillo. Pero, ¿qué ocurrirá si MarketInfo() devuelve 0 para lotstep? ¿Cuáles serán las consecuencias? ¿Se detendrá el Asesor Experto y se abandonarán las posiciones?

Si el valor de MINLOT está fijado por un corredor en 0,03, y LOTSTEP en 0,02, es decir, los dos primeros valores de lote son 0,03 y 0,05, y el saldo actual es 41, ¿cuál es el valor de lote calculado en su código?

¿Por qué si el lote es menor que el valor mínimo - por ejemplo, con un saldo igual a 1, después del cálculo completo será igual a 0? ¿Por qué en este caso su código toma el lote igual a MINLOT, que puede ser, por ejemplo, 0,03, que es 30 veces más que el valor "bruto" "AccountBalance()*0,001", que en este caso es igual a 0,001?

No siempre se puede obtener un valor de lote válido, porque las condiciones pueden ser tales que NINGUNO de los valores de lote válidos se corresponda con ellas. Hay que programar todas las situaciones erróneas, y hay que recordar que esto es al menos el 90% del trabajo.

El modelo aplicado establecido por MetaQuotes es que lote = MINLOT + N * LOTSTEP, donde N = 0, 1, 2... M. Y M es tal que MINLOT + M * LOTSTEP <= MAXLOT y MINLOT + (M + 1) * LOTSTEP > MAXLOT. En consecuencia, también debe calcular dentro del modelo de conjunto, es decir, lote = MINLOT + N * LOTSTEP. Entonces todo tipo de combinaciones incómodas de MINLOT y LOTSTEP carecen de importancia, porque la fórmula funciona de forma general. Una vez que lo hayas escrito bien, lo hayas depurado correctamente y te hayas concentrado en otra cosa interesante y divertida. Y con gusto - porque no tienes que volver constantemente a un código mal escrito porque de nuevo este código no funciona, sino que sólo tiene fallos...

Para tales horrores, también hay que comprobar la suficiencia de fondos para abrir con tal lote. Nadie en su sano juicio permitiría a un robot depositar 10 libras sabiendo que el mínimo/lote es 0,1 y el paso es 0,1, por ejemplo.

Y si se encontrara uno tan listo, el robot le diría "dame el dinero y adiós mientras tanto" :D.

Y nunca he visto ni leído en ningún sitio que el paso del lote sea cero, es una fantasía...

 
evillive:

Para tales horrores, también hay que comprobar la suficiencia de fondos para abrir con tal lote. Nadie en su sano juicio permitiría a un robot depositar 10 libras, sabiendo que el lote mínimo es 0,1 y el paso es 0,1, por ejemplo.

Y si se encuentra uno tan listo, el robot le dirá "dame el dinero, pero mientras tanto, despídete" :D

Para evitar los ceros de MarketInfo en el probador, hago esto:

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

Para tales horrores, también hay que comprobar la suficiencia de fondos para abrir con tal lote. Nadie en su sano juicio permitiría a un robot depositar 10 libras sabiendo que el lote mínimo es 0,1 y el incremento es 0,1, por ejemplo.

Y si se encontrara uno tan listo, el robot le diría "dame el dinero y adiós" :D

Y nunca he visto ni leído en ningún sitio que el paso de lote sea cero, es una imaginación...

¿Por qué es terrible? ¿Porque no encaja en el modelo simplificado?

Me refería a que con MINLOT = 0,03 y LOTSTEP = 0,02 los dos primeros valores de lote permitidos son 0,03 y 0,05. Dicho esto, si el saldo es, digamos, 41, entonces su código:

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Dará un valor de lote de 0,04, que no está permitido. El robot dirá algo como "el servidor dice que el tamaño de mi lote es incorrecto".

Y se puede obtener un tamaño de lote cero cuando se produce un error al solicitar su valor a través de MarketInfo(). Cómo provocar un error de forma artificial - cité el código:

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

Devuelve 0. ¿Qué clase de fantasía es esta?

 
simpleton:

¿Por qué el horror? ¿Porque no encaja en el modelo simplificado?

Me refería a que con MINLOT = 0,03 y LOTSTEP = 0,02, los dos primeros valores de lote permitidos son 0,03 y 0,05. Dicho esto, si el saldo es, por ejemplo, 41, entonces su código:

Dará un valor de lote de 0,04, que no está permitido. El robot dirá algo como "el servidor dice que el tamaño de mi lote es incorrecto".

Y se puede obtener un tamaño de lote cero cuando se produce un error al solicitar su valor a través de MarketInfo(). Le he dado el código anterior sobre cómo inducir artificialmente este error:

Devolverá 0. Entonces, ¿cuál es la fantasía?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Esta fórmula se corrige fácilmente para cumplir los requisitos. Sólo hay que tener en cuenta el lote mínimo

Se verá un poco diferente

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

Donde X - Saldo por apertura de lote mínimo,

Pero el cheque del lote mínimo seguirá siendo necesario.

 

¡Buenas tardes!

Ayudar a un ignorante ) En el probador no hay pedidos abiertos error 10013 Solicitud errónea, mira el código donde está el error.

Todos los números del diario aparecen en el pedido y éste no se abre.

2014.10.19 12:14:34.984 2014.02.03 00:06:00 solicitud fallida buy 0.10 at 102.31100 sl: 102.27200 tp: 102.33600 [Solicitud inválida]

2014.10.19 12:22:17.928 2014.02.03 00:06:00 ticket =0 retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
El pequeño robot ha corregido su mensaje
 

¡¿Dónde ves eso?!

if(OrderSend(Req,Res))

Consulte la documentación. Y utiliza el botón SRC para insertar el código.

Si le da pereza, vea la primera y última vez:

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Nunca está de más aprender.

 

Estimados señores.

Por favor, avise a .....

Esta es una función

OrdenProfit( )

Esta función devuelve el valor del beneficio neto del pedido seleccionado.

PREGUNTA

Esta función, al igual que la anterior, devuelve el valor de las pérdidas de la orden seleccionada en lugar del valor de los beneficios.

Por ejemplo, si una orden se cierra en SL con una pérdida de $150, necesito que la función devuelvauna pérdida de $150.

Gracias.

 
solnce600:

Estimados señores.

Por favor, avise a .....

Esta es una función

OrdenProfit( )

Esta función devuelve el valor del beneficio neto del pedido seleccionado.

PREGUNTA

Esta función, al igual que la anterior, devuelve el valor de la pérdida para la orden seleccionada en lugar del beneficio.

Por ejemplo, si una orden se cierra en SL con una pérdida de $150, necesito que la función devuelvauna pérdida de $150.

Gracias.

Es lo mismo. Sólo el importe saldrá con un menos.