Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 565

 
PolarSeaman:

Ha sustituido en el código

a

pero no sirvió de nada).

Siento que eso sea lo único que hayas notado)

 
Alekseu Fedotov:

FileSeek() con la bandera SEEK_END, le ayudará.

<

¡Gracias! ¡Lo probaré!

 
YanSay:

¡Buenas noches!

Estoy confundido sobre cómo añadir un código universal (para diferentes instrumentos) para calcular el lote para un acuerdo basado en el % del depósito.

Lo hice así:

El precio ( de apertura) y el SL (Stop Loss) se calculan por separado.

Para los pares en los que la moneda cotizada está en dólares (por ejemplo, EURUSD), para el índice SPX500 y para el oro - todo calculado correctamente, pero para los pares en los que el dólar es el primero en una cotización (por ejemplo, USDJPY) no funciona.

Por favor, indique qué es lo que me he perdido.

Preste atención a la normalización

La variable _Digits almacena el número de decimales después del punto decimal que determina la precisión del precio del símbolo del gráfico actual.

 
Alekseu Fedotov:

Obsérvese la normalización

La variable _Digits almacena el número de posiciones decimales después del punto decimal que determina la precisión del precio del símbolo del gráfico actual.

Gracias. Así es como se ha rehecho:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

En la 1ª variante: EURUSD y XAUUSD - todo es correcto; USDJPY - en lugar del 2% del depósito arriesga el 0,2% del depósito; en el caso de SPX500 y BRN genera el error OrderSend 131 (error en el cálculo del lote).

En la 2ª variante: EURUSD, XAUUSD y USDJPY - todo es correcto; SPX500 arriesga el 20% del depósito en lugar del 2%; para BRN, genera el error OrderSend 131 (un error con el cálculo del lote).

Hay un error en algún otro lugar, no puedo entender en qué lugar, por favor aconsejar.

 
YanSay:

Gracias. Así es como se rehace:

La primera versión: EURUSD y XAUUSD - todo es correcto; USDJPY - arriesga el 0,2% del depósito en lugar del 2% del depósito; el caso con SPX500 y BRN incluso muestra el error OrderSend 131 (error en el cálculo del lote).

En la 2ª variante: EURUSD, XAUUSD y USDJPY - todo es correcto; SPX500 arriesga el 20% del depósito en lugar del 2%; para BRN, genera el error OrderSend 131 (un error con el cálculo del lote).

En algún otro lugar hay un error, no puedo entender en qué lugar, por favor aconsejar.

SustituirPunto, porMarketInfo(Symbol(),MODE_POINT)

 
Vitaly Muzichenko:

SustituirPunto, porMarketInfo(Symbol(),MODE_POINT)

¿Qué sentido tiene? Si todo está calculado por el símbolo del gráfico. Tiene sentido si hay una multivariable y se calcula un símbolo diferente al del gráfico actual.

 
Vitaly Muzichenko:

SustituirPunto, porMarketInfo(Symbol(),MODE_POINT)

Desgraciadamente, no ha servido de nada.

La información de MODE_POINT dice "Tamaño del punto en la moneda de cotización". Se almacena en la variable predefinida Punto para el símbolo actual".

A juzgar por la descripción, no importa qué variante utilizar. Pero lo he probado y no ha servido de nada.


 

¿Puede decirme si es posible colocar una "selección" de una herramienta gráfica en el botón del Asesor Experto, de modo que aparezca un icono de la herramienta bajo el cursor y se pueda estirar haciendo clic en el botón?

Y el canal ya debería tener propiedades especificadas

 
Roman Sharanov:

¿Pueden decirme si es posible poner una "selección" de una herramienta gráfica en el botón del Asesor Experto, de modo que al pulsar el botón aparezca el icono de la herramienta bajo el cursor y sea posible estirarlo?

Además, el canal puede tener ya propiedades especificadas.

Quizás

 
YanSay:

Desgraciadamente no ha servido de nada(

Y en la información de MODE_POINT dice "Tamaño de punto en moneda de cotización. Para el símbolo actual se almacena en la variable predefinida Punto".

A juzgar por la descripción, no importa qué variante utilizar. Pero lo he probado y no ha servido de nada.

Prueba la función:

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }
Razón de la queja: