Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 485

 
-Aleks-:

Por favor, ayúdenme a entender.

Necesito encontrar el máximo drawdown en cada (que sea) día (la escritura en el archivo ocurre una vez al día) - terminal MT4.

La reducción máxima es la distancia en el gráfico desde el pico hasta la reducción de fondos actual y la reducción de fondos es la pérdida actual.

He escrito el siguiente código

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Pero es correcto en algunos gráficos y anormal en otros.

Al parecer, he cometido un error en el código o en la lógica, pero no puedo averiguar cuál.

Por lo que sé, deberíamos contar desde el pico de la Renta Variable hasta el pozo de la Renta Variable, no desde el saldo, ¡lo que hace que los drawdowns se vean mucho mejor!

Y, por favor, utiliza el botón SRC, no otro, para que tu código no se repita en la respuesta, desordenando el sitio.

 
Boris:

Por lo que sé, hay que contar desde el pico de la equidad hasta el pozo de la equidad, no desde el balance, lo que realmente suaviza el panorama de las detracciones.

Y, por favor, utiliza el botón SRC, no otro, para que tu código no se repita en la respuesta, abarrotando el sitio.

Cambiado el saldo a los fondos - todavía no cuadra con el probador - el valor en el probador es mayor.ACCOUNT_PROFIT es en realidad un delta entre el saldo y los fondos, tal vez ese es el punto...Por otro lado, la tarea es averiguar cuánto dinero necesita para que el EA funcione, y no tiene sentido tener en cuenta la cantidad máxima de fondos, me parece...

No sé qué es el SRC y por eso no lo uso.

 
-Aleks-:

ACCOUNT_PROFIT es en realidad un delta entre el saldo y los fondos, tal vez sea eso...Por otro lado, la tarea es averiguar cuánto dinero se necesita para que el EA funcione, y no tiene sentido tener en cuenta la cantidad máxima de fondos, me parece...

No sé qué es el SRC y por eso no lo uso.

Ese botón a la izquierda de la cámara de vídeo (ver arriba) es para insertar el código.

¡Sobre la equidad! Si se sustituye el saldo por el Patrimonio, hay que excluirACCOUNT_PROFIT, porque el Patrimonio = saldo + beneficio. Sin embargo, en el terminal siempre vemos que la equidad cambia y el probador informa de que la equidad y las detracciones se fijan al cierre de las posiciones, por lo que las detracciones intermedias no son fijadas por el probador. Como resultado, la situación del mercado es mejor en el probador que en la realidad. Últimamente imprimo en el probador, en demo y en real toda la información que necesito para cada acción de un EA, apertura, modificación, cierre, etc., para evitar gilipolleces, ¡que no tolero ni de mí ni de los demás! Pero probablemente ya te hayas dado cuenta. ;)

 

Buenas noches, ¿podrían decirme, por favor, sobre la clase CTrailingFixedPips de la biblioteca estándar, qué significa el nivel de TakeProfit "trailing"? Nunca se alcanzará, ¿verdad? O no entiendo algo o el código o el significado.

De la documentación:

"Si la sangría de precios es superior al nivel de Stop Loss, se sugiere un nuevo precio de Stop Loss de la posición.Si se cumple la condición de modificación del Stop Loss y el nivel de Take Profit no es cero, sesugiere establecer un nuevo precio de Take Profit para la posición. "

<ExpertoTrailing\CTrailingFixedPips.mqh>

//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for long position.          |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
...
...   
   delta=m_stop_level*m_adjusted_point;
   if(price-base>delta)
     {
      sl=price-delta;
      if(m_profit_level!=0) tp=price+m_profit_level*m_adjusted_point;
     }
...
  }
 
Hexen:

Buenas noches, ¿podrían decirme, por favor, sobre la clase CTrailingFixedPips de la biblioteca estándar, qué significa el nivel de TakeProfit "trailing"? Nunca se alcanzará, ¿verdad? O no entiendo algo o el código o el significado.

De la documentación:

"Si la sangría de precios es superior al nivel de Stop Loss, se sugiere un nuevo precio de Stop Loss de la posición.Si se cumple la condición de modificación delStop Loss y el nivel de Take Profit no es cero, sesugiere establecer un nuevo precio de Take Profit para la posición. "

<ExpertoTrailing\CTrailingFixedPips.mqh>

Lo más probable es que se trate de un error de imprenta. Debería ser Stop Loss.
 
Hexen:

Buenas noches, ¿podrían decirme, por favor, sobre la clase CTrailingFixedPips de la biblioteca estándar, qué significa el nivel de TakeProfit "trailing"? Nunca se alcanzará, ¿verdad? O no entiendo algo o el código o el significado.

De la documentación:

"Si la sangría de precios es superior al nivel de Stop Loss, se sugiere un nuevo precio de Stop Loss de la posición.Si se cumple la condición de modificación del Stop Loss y el nivel de Take Profit no es cero, sesugiere establecer un nuevo precio de Take Profit para la posición. "

<ExpertoTrailing\CTrailingFixedPips.mqh>

A juzgar por el código anterior, TP se mueve de forma sincronizada con SL. Atornillar tal trailing stop)
 
Boris:

¡Este botón a la izquierda de la cámara de video (ver arriba) es para insertar el código!

Hay un estilo "Código" para el código - se selecciona en el menú - que es lo que yo uso.

Boris:

¡Sobre la equidad! Si se sustituye el saldo por el Patrimonio, hay que excluirACCOUNT_PROFIT, porque el Patrimonio = saldo + beneficio. Sin embargo, en el terminal siempre vemos que la equidad cambia y el probador informa de que la equidad y las detracciones se fijan al cierre de las posiciones, por lo que las detracciones intermedias no son fijadas por el probador. Como resultado, la situación del mercado es mejor en el probador que en la realidad. Últimamente imprimo en el probador, en demo y en real toda la información que necesito para cada acción de un EA, apertura, modificación, cierre, etc., para evitar chorradas, ¡que no tolero ni de mí ni de los demás! Pero probablemente ya te hayas dado cuenta. ;)

Si la fijación del drawdown en el probador para el informe fuera sólo al cierre de la posición, no habría drawdown cuando se utiliza una orden en el mercado, lo que no es el caso ;)

ACCOUNT_PROFIT = Balance de fondos, por lo que no veo ninguna razón para no utilizar este indicador en los cálculos...

 
-Aleks-:

Por favor, ayúdenme a entender.

Necesito encontrar el máximo drawdown en cada (que sea) día (la escritura en el archivo ocurre una vez al día) - terminal MT4.

La reducción máxima es la distancia en el gráfico desde el pico hasta la reducción de fondos actual y la reducción de fondos es la pérdida actual.

He escrito el siguiente código

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew== AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Pero se muestra correctamente en algunos gráficos y no en otros. Al mismo tiempo, los gráficos son visualmente iguales.

Debo haber cometido un error en el código o en la lógica, pero no consigo averiguar cuál.

He encontrado un error en el código - un signo igual extra debería ser

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Sin embargo, ni siquiera eso me acercó a resolver la causa de la diferencia entre el cálculo poético y la salida en el probador.

He comprobado la teoría de Boris con cálculos de equidad y el resultado también fue negativo.

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

Por cierto, no está claro cómo la equidad y el equilibrio están fuera de sincronización en el gráfico en el probador cuando sólo un lote se negocia.

 
-Aleks-:

He encontrado un error en el código - un signo igual extra debería ser así

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Sin embargo, ni siquiera esto me acercó a resolver la razón de la diferencia entre las acciones calculadas y el resultado en el probador.

Comprobé la teoría de Boris con cálculos de equidad y el resultado también fue negativo.

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

Por cierto, no está claro cómo se desincroniza la equidad y el balance en el probador en el gráfico si sólo se negocia un lote.

Para entender el "cómo el patrimonio y el equilibrio no están sincronizados", tenemos que entender qué es el equilibrio y qué es el patrimonio.

Saldo: el importe de los fondos propios de la cuenta.

Capital - la cantidad de dinero actual y variable en la cuenta.

La misma función está presente en su probador, arregla el drawdown, pero no de la manera que usted quiere.

En resumen, para calcular la reducción máxima, es necesario declarar una variable estática o global para almacenar el valor, y luego reescribir esta variable, al igual que en su código.

Esto es lo que has escrito ahora...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

Tienes que hacer dos variables max y min y escribir valores en ellas.

Y aquí hay un pensamiento en voz alta: Es mejor que escribas en el archivo no para el día, sino al cerrar la orden y reescribir las variables. En ese momento Equidad es igual a equilibrio y debemos poner a cero la variable donde se escriben máx. y mín.

 
Alexey Viktorov:

Para entender "cómo el patrimonio y el equilibrio no están sincronizados" hay que entender qué es el equilibrio y qué es el patrimonio.

El saldo es la cantidad fija de fondos en la cuenta.

Capital - la cantidad de dinero actual y variable en la cuenta.

La misma función está presente en el probador que está escribiendo ahora y arregla el drawdown, pero no de la manera que usted quiere.

En resumen, para calcular la reducción máxima, es necesario declarar una variable estática o global para almacenar el valor, y luego reescribir esta variable, al igual que en su código.

Eso es lo que has escrito ahora...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

Tienes que hacer dos variables max y min y escribir valores en ellas.

Y aquí hay un pensamiento en voz alta: Es mejor que escribas en el archivo no para el día, sino al cerrar la orden y reescribir las variables. En ese momento la Equidad es igual al equilibrio y debemos poner a cero la variable donde se escriben max y min.

Gracias por responder a la petición de ayuda.

La variable global es relevante para la actividad real del mercado - necesito información de prueba, por eso no me molesté con ella.

Mis muestras de código muestran que intenté tomar tanto el saldo como los fondos como un máximo y el saldo y los fondos como un mínimo.

¿Por qué crees que la desigualdadsi (BalansNuevo<BalansMax) BeneficioNuevo=BalansNuevo-BalansMax; nunca se satisface? Sólo no se cumple en la barra cuando se alcanza el nuevo máximo de saldo (o la equidad - todavía no es cierto), pero en ese momento fijo la reducción de beneficiosProfitMin=ProfitNew.

El registro del archivo del día es más relevante, ya que el drawdown máximo no suele alcanzarse en el momento de cerrar una orden y el objetivo es calcular la cantidad media de dinero necesaria para el trabajo del Asesor Experto.