Questions des débutants MQL5 MT5 MetaTrader 5 - page 485

 
-Aleks-:

Aidez-moi à comprendre !

J'ai besoin de trouver le drawdown maximum pour chaque jour (disons) (l'écriture dans le fichier se fait une fois par jour) - terminal MT4.

Le drawdown maximum est la distance sur le graphique entre le pic et le drawdown actuel des fonds et le drawdown des fonds est la perte actuelle.

J'ai écrit un tel code

   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
     }

Mais elle est correcte sur certains graphiques et anormale sur d'autres.

Apparemment, j'ai fait une erreur dans le code ou la logique, mais je n'arrive pas à savoir laquelle.

Pour autant que je sache, nous devrions compter à partir du pic de l'équité jusqu'au creux de l'équité, et non à partir du solde, ce qui rend les drawdowns tellement plus beaux !

Et veuillez utiliser le bouton SRC, et non un autre bouton, afin que votre code ne soit pas répété dans la réponse, encombrant ainsi le site !

 
Boris:

Pour autant que je sache, il faut compter à partir du pic de l'équité jusqu'au creux de l'équité, et non à partir du solde, ce qui adoucit vraiment l'image du drawdown !

Et veuillez utiliser le bouton SRC, et non un autre bouton, afin que votre code ne soit pas répété dans la réponse, encombrant ainsi le site !

J'ai changé le solde en fonds - cela ne correspond toujours pas au testeur - la valeur dans le testeur est plus grande.ACCOUNT_PROFIT est en fait un delta entre le solde et les fonds, c'est peut-être le but...D'un autre côté, la tâche est de trouver combien d'argent l'EA a besoin pour fonctionner, et cela n'a aucun sens de prendre en compte le montant maximum des fonds, il me semble...

Je ne sais pas ce qu'est le SRC et c'est pourquoi je ne l'utilise pas.

 
-Aleks-:

ACCOUNT_PROFIT est en fait un delta entre le solde et les fonds, c'est peut-être ça...D'autre part, la tâche est de trouver combien d'argent est nécessaire pour que l'EA fonctionne, et cela n'a aucun sens de prendre en compte le montant maximum des fonds, il me semble....

Je ne sais pas ce qu'est le SRC et c'est pourquoi je ne l'utilise pas.

Le bouton à gauche de la caméra vidéo (voir ci-dessus) sert à insérer un code !

À propos d'Equity ! Si vous avez remplacé le solde par les capitaux propres, vous devez exclureACCOUNT_PROFIT, car les capitaux propres = solde + bénéfice. Cependant, dans le terminal, nous voyons toujours l'équité changer et le testeur rapporte que l'équité et les tirages sont fixes à la clôture des positions, donc les tirages intermédiaires ne sont pas fixés par le testeur. Par conséquent, la situation du marché est plus attrayante dans le testeur que dans la réalité. Récemment, j'ai imprimé dans le testeur, en démo et en réel toutes les informations dont j'ai besoin pour chaque action d'un EA, ouverture, modification, fermeture, etc., pour éviter les conneries, que je ne peux tolérer ni de moi-même ni des autres ! Mais vous l'avez probablement déjà remarqué. ;)

 

Bonsoir, pourriez-vous me dire, s'il vous plaît, à propos de la classe CTrailingFixedPips de la bibliothèque standard, quelle est la signification du niveau TakeProfit "trailing" ? Il ne sera jamais atteint, n'est-ce pas ? Soit je ne comprends pas quelque chose, soit le code, soit le sens.

Dans la documentation :

"Si l'indentation du prix est supérieure au niveau du Stop Loss, un nouveau prix Stop Loss de la position est suggéré.Si la condition de modification du Stop Loss est remplie et que le niveau de Take Profit n'est pas nul, ilest suggéré de définir un nouveau prix de Take Profit pour la position. "

<Expert\Trailing\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:

Bonsoir, pourriez-vous me dire, s'il vous plaît, à propos de la classe CTrailingFixedPips de la bibliothèque standard, quelle est la signification du niveau TakeProfit "trailing" ? Il ne sera jamais atteint, n'est-ce pas ? Soit je ne comprends pas quelque chose, soit le code, soit le sens.

Dans la documentation :

"Si l'indentation du prix est supérieure au niveau du Stop Loss, un nouveau prix Stop Loss de la position est suggéré.Si la condition de modification du Stop Loss est remplie et que le niveau de Take Profit n'est pas nul, ilest suggéré de définir un nouveau prix de Take Profit pour la position. "

<Expert\Trailing\CTrailingFixedPips.mqh>

Il s'agit très probablement d'une erreur d'impression. Cela devrait être Stop Loss.
 
Hexen:

Bonsoir, pourriez-vous me dire, s'il vous plaît, à propos de la classe CTrailingFixedPips de la bibliothèque standard, quelle est la signification du niveau TakeProfit "trailing" ? Il ne sera jamais atteint, n'est-ce pas ? Soit je ne comprends pas quelque chose, soit le code, soit le sens.

Dans la documentation :

"Si l'indentation du prix est supérieure au niveau du Stop Loss, un nouveau prix Stop Loss de la position est suggéré.Si la condition de modification du Stop Loss est remplie et que le niveau de Take Profit n'est pas nul, ilest suggéré de définir un nouveau prix de Take Profit pour la position. "

<Expert\Trailing\CTrailingFixedPips.mqh>

A en juger par le code ci-dessus, TP se déplace de manière synchrone avec SL. Visser un tel stop suiveur)
 
Boris:

Ce bouton à gauche de la caméra vidéo (voir ci-dessus) sert à insérer du code !

Il y a un style "Code" pour le code - il est sélectionné dans le menu - c'est ce que j'utilise.

Boris:

À propos d'Equity ! Si vous remplacez le solde par les capitaux propres, vous devez exclureACCOUNT_PROFIT, car les capitaux propres = solde + bénéfice. Cependant, dans le terminal, nous voyons toujours l'équité changer et le testeur rapporte que l'équité et les tirages sont fixes à la clôture des positions, donc les tirages intermédiaires ne sont pas fixés par le testeur. Par conséquent, la situation du marché est meilleure dans le testeur que dans la réalité. Récemment, j'ai imprimé dans le testeur, en démo et en réel toutes les informations dont j'ai besoin pour chaque action d'un EA, ouverture, modification, fermeture, etc., afin d'éviter les conneries, que je ne peux tolérer ni de moi-même ni des autres ! Mais vous l'avez probablement déjà remarqué. ;)

Si la fixation du drawdown dans le testeur pour le rapport ne se faisait qu'à la clôture de la position, il n'y aurait pas de drawdown lors de l'utilisation d'un ordre sur le marché, ce qui n'est pas le cas ;)

ACCOUNT_PROFIT = solde des fonds, je ne vois donc aucune raison de ne pas utiliser cet indicateur dans les calculs...

 
-Aleks-:

Aidez-moi à comprendre !

J'ai besoin de trouver le drawdown maximum pour chaque jour (disons) (l'écriture dans le fichier se fait une fois par jour) - terminal MT4.

Le drawdown maximum est la distance sur le graphique entre le pic et le drawdown actuel des fonds et le drawdown des fonds est la perte actuelle.

J'ai écrit un tel code

   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
     }

Mais il s'affiche correctement dans certains graphiques et pas dans d'autres. En même temps, les graphiques sont visuellement les mêmes.

J'ai dû faire une erreur dans le code ou la logique, mais je n'arrive pas à trouver laquelle.

J'ai trouvé une erreur dans le code - un signe égal supplémentaire devrait être

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Cependant, même cela ne m'a pas rapproché de la résolution de la cause de la différence entre le calcul poétique et le résultat dans le testeur.

J'ai vérifié la théorie de Boris avec des calculs d'équité et le résultat était également négatif.

   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

     }

À propos, il n'est pas clair comment l'équité et le solde sont désynchronisés sur le graphique du testeur lorsqu'un seul lot est négocié.

 
-Aleks-:

J'ai trouvé une erreur dans le code - un signe égal supplémentaire devrait être ainsi

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Cependant, même cela ne m'a pas rapproché de la résolution de la raison de la différence entre les actions calculées et le résultat dans le testeur.

J'ai vérifié la théorie de Boris avec des calculs d'équité et le résultat était également négatif.

   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

     }

D'ailleurs, il n'est pas clair comment l'équité et le solde sont désynchronisés dans le testeur sur le graphique si un seul lot est négocié.

Pour comprendre "comment l'équité et l'équilibre sont désynchronisés", nous devons comprendre ce qu'est l'équilibre et ce qu'est l'équité.

Solde - le montant des fonds propres du compte.

Fonds propres - le montant actuel, variable, de l'argent sur le compte.

La même fonction est présente dans votre testeur, elle corrige le drawdown, mais pas de la façon dont vous le souhaitez.

Pour résumer, afin de calculer le drawdown maximal, vous devez déclarer une variable statique ou globale pour stocker la valeur, puis réécrire cette variable, comme dans votre code.

C'est ce que vous avez écrit maintenant...

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

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

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

Vous devez créer deux variables max et min et y inscrire des valeurs.

Et voici une pensée à voix haute : Vous feriez mieux d'écrire dans le fichier non pas pour le jour, mais lors de la fermeture de l'ordre et de réécrire les variables. À ce moment-là, l'équité est égale à l'équilibre et nous devons remettre à zéro la variable où sont écrits max et min.

 
Alexey Viktorov:

Pour comprendre "comment l'équité et l'équilibre sont désynchronisés", vous devez comprendre ce qu'est un équilibre et ce qu'est l'équité.

Le solde est le montant fixe des fonds sur le compte.

Fonds propres - le montant actuel, variable, de l'argent sur le compte.

La même fonction est présente dans le testeur que vous êtes en train d'écrire et elle corrige le drawdown, mais pas de la façon dont vous le souhaitez.

Pour résumer, afin de calculer le drawdown maximal, vous devez déclarer une variable statique ou globale pour stocker la valeur, puis réécrire cette variable, comme dans votre code.

C'est ce que vous avez écrit maintenant...

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

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

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

Vous devez créer deux variables max et min et y inscrire des valeurs.

Et voici une pensée à voix haute : Vous feriez mieux d'écrire dans le fichier non pas pour le jour, mais lors de la fermeture de l'ordre et de réécrire les variables. À ce moment-là, l'équité est égale à l'équilibre et nous devons remettre à zéro la variable où sont écrits max et min.

Merci de répondre à la demande d'aide !

La variable globale est pertinente pour l'activité réelle du marché - j'ai besoin d'informations sur les tests, c'est pourquoi je ne m'en suis pas occupé.

Qu'est-ce que l'équité et le solde - bien sûr, je le sais, mais je n'ai pas réussi à calculer le drawdown. Mes échantillons de code montrent que j'ai essayé de prendre à la fois le solde et les fonds comme un maximum et le solde et les fonds comme un minimum.

Pourquoi pensez-vous que l'inégalitéif (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax ; n'est jamais satisfaite ? Il n'est pas rempli sur la barre que lorsque le maximum du nouveau solde est atteint (ou l'équité - toujours pas vrai), mais à ce moment-là je fixe le drawdown de profitProfitMin=ProfitNew.

L'enregistrement du fichier pour la journée est plus pertinent car le drawdown maximum n'est généralement pas atteint au moment de la fermeture d'un ordre et l'objectif est de calculer le montant moyen d'argent nécessaire au travail du conseiller expert.