L'oscillateur d'équité de MQL5 signifie - page 2

 
DV2010: mais pourquoi une valeur d'équité changeante n' est pas affichée sur l'indicateur, bien que les valeurs changeantes (vérifiées !) soient écrites dans le tableau de l'indicateur ?

Rien n'est écrit à cet endroit, la boucle n'est pas appelée. Vérifiez vous-même.
 

C'est ça le problème : la boucle est appelée sur tous les ticks !

Voyez par vous-même ! J'ai mis la sortie dans le corps de la boucle exprès :

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[]){
   for (int i = prev_calculated; i <= rates_total-1; ++i){
      Print("Equity - OnCalculate - Cycle: prev_calculated=",prev_calculated,"   rates_total=",rates_total);
      Print("Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=", AccountInfoDouble(ACCOUNT_EQUITY));
      Values[i] = AccountInfoDouble(ACCOUNT_EQUITY);
   }
   return rates_total;
}

Et voici le résultat final :

2011.01.20 13:58:56     Core 1  OnTester result 0
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9949.299999999999
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: prev_calculated=6418   rates_total=6419
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #12 buy 0.15 EURUSD at 1.33593 done (based on order #12)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #11 buy 0.15 EURUSD at 1.33593 done (based on order #11)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9929.65
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: prev_calculated=6417   rates_total=6418
 
DV2010:

C'est ça le problème : la boucle est appelée sur tous les ticks !

Voyez par vous-même ! J'ai mis la sortie dans le corps de la boucle exprès :

Et voici le résultat final :

Qu'est-ce que les tests ont à voir avec ça ? Exécutez l'indicateur sur le graphique et vous verrez. N'oublie pas de faire mes modifications.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

La raison de ce test est que j'ai besoin de voir le changement d'équité dans la période testée sur l'historique.

J'ai fait vos corrections, j'ai exécuté l'indicateur à la fois en mode test et en le faisant glisser sur un nouveau graphique.

L'indicateur fonctionne pour l'ensemble de la période, jusqu'aux cotations actuelles, ainsi que pour n'importe quel horizon temporel (ou que signifie exactement "vous verrez tout" ?).

Néanmoins, la valeur d'équité reste constante, bien que la sortie vers le journal montre qu'elle change.

( Sinon, comment savoir si la boucle fonctionne ou non, autrement que par l'impression ? )

...Juste au cas où, voici le "squelette" du Conseiller Expert avec l'indicateur attaché :

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1=0;
void OnInit(){
   Equity1 = iCustom(NULL,0,"Equity",
                          5,          // Период
                          0,          // Смещение
                          MODE_SMA,   // Метод рассчета
                          PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick(){
   Expert1.OnTick();
}
void OnDeinit(const int reason){
   Expert1.Deinit();
}
 
DV2010:

La raison de ce test est que j'ai besoin de voir le changement d'équité dans la période testée sur l'historique.

J'ai fait vos corrections, j'ai exécuté l'indicateur en mode test et en le glissant et le déposant sur un nouveau graphique.

L'indicateur fonctionne pour l'ensemble de la période, jusqu'aux cotations actuelles, ainsi que pour n'importe quel horizon temporel (ou que signifie exactement "vous verrez tout" ?).

Néanmoins, la valeur d'équité reste constante, bien que la sortie vers le journal montre qu'elle change.

( Sinon, comment savoir si la boucle fonctionne ou non, autrement que par l'empreinte ? )

...Juste au cas où, voici le "squelette" du Conseiller Expert avec l'indicateur attaché :

Il ne sert à rien de mettre le mauvais indicateur dans un EA, cela ne l'améliorera pas. Vous n'avez toujours pas vérifié mon option ?
 

Je me trompe peut-être, mais ne comparez-vous pas l'apparence de l'indicateur sur le graphique une fois le test terminé avec les calculs effectués pendant le test ?

Le fait est que les résultats (tableaux de calcul) de l'indicateur personnalisé du testeur ne sont pas transférés sur le graphique de quelque manière que ce soit, mais l'indicateur spécifié est simplement lancé sur un nouveau calcul sur le graphique.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

Exécutez cet indicateur sur un graphique en minutes (si vous avez une position ouverte) et après 10-15 minutes, vous obtiendrez une image comme celle-ci.


Code :

//+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,100);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Values,false);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {


   Print("prev_calculated=",prev_calculated,"   rates_total=",rates_total);
   int limit=prev_calculated;
   if(limit>0) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for(int i=limit; i<rates_total;++i)
     {
      Values[i]=AccountInfoDouble(ACCOUNT_EQUITY);
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

Roche, je vous ai déjà demandé ce qui clochait dans mon indicateur, et je vous ai écrit pour vous expliquer comment j'ai vérifié votre variante également . Et j'ai essayé de te l'expliquer avec le plus de détails possible, alors que tu n'as écrit que brièvement "la boucle ne fonctionne pas" et "tu verras par toi-même"...

...Renat, si je comprends bien, l' indicateur s'affichera sur le graphique une fois le test terminé, en fonction des calculs effectués pendant le test et du remplissage du tableau de l'indicateur. Mais qu'est-ce que cela signifie que les résultats du testeur ne sont pas transférés au graphique de l'indicateur personnalisé du testeur ?

Alors à quoi servent-ils et pourquoi la ligne de l'indicateur disparaît-elle d'un coup, lorsque je supprime du code l'affectation des valeurs à un tableau (même si c'est une ligne horizontale constante, elle disparaît) ?

Je pensais que la correspondance entre le tableau des valeurs des indicateurs qui sont remplis à OnCalculated et les valeurs des indicateurs sur le graphique est sans ambiguïté, sinon comment initialiser les valeurs des indicateurs ?

C'est difficile à comprendre... Cela semble être une tâche triviale, mais je me débats avec elle depuis plusieurs jours, et il est difficile de trouver quelqu'un qui puisse au moins donner une idée de la façon dont elle peut être résolue différemment sur l'histoire et si elle est résolue du tout.

Encore une fois, tel que je le comprends (corrigez-moi si je me trompe, si vous le voulez bien).

1.je spécifie une période de test dans letesteur et je sélectionne un conseiller expert auquel est attaché mon indicateur.

2. lepremier appel OnCalculated est appelé avec les paramètres prev_calculated =0 et rates_total = nombre de tick (barre) correspondant au début du test. Pendant cette période, la valeur du solde reste au niveau initial et constant.

Lesappels consécutifs de OnCalculated par barre dans la période de test, se produisent pour chaque barre individuelle, et ici nous pouvons initialiser un tableau de valeurs d'indicateurs avec les données qui changent (par exemple, dupliquer le prix, que j'ai reçu, mais pourquoi ne pas initialiser les valeurs d'équité au lieu de changer les prix ?)

Et de toute façon, ici, vous êtes un pro. J'espère que cette tâche simple est résolue, ou MetaTraderdoit encore atteindre de tels "sommets" ? :)))

J'ai proposé ma solution simple à ce problème, mais elle refuse de fonctionner.

Alors comment le mettre en œuvre - un graphique d'équité sous le graphique des prix basé sur les résultats des tests sur l'historique ?

 
Je vais vous dire une chose, il ne sera pas facile de résoudre votre problème tant que le mode de visualisation ne sera pas lancé. Il existe une solution : écrire les données relatives aux actions dans un fichier pendant le test, puis écrire les données du fichier dans le tampon de l'indicateur et tracer le graphique des actions.
 

Rosh, la variante pour online a déjà été postée, mais en tant que personne qui travaille principalement avec l'histoire, j'ai besoin d'une variante qui fonctionne sur les données historiques. Et j'ai encore du mal à comprendre quelle peut être la principale difficulté.

Le trader a une idée du graphique d'équilibre en ligne en raison d'un nombre plus restreint de transactions (à moins qu'il ne soit un extrascalpeur qui n'a guère le temps d'appuyer sur Achat et Vente).

En effet, la dynamique de l'équité devient critique sur un long historique avec des centaines ou même des milliers de transactions, mais le graphique dans le testeur ne permet pas une comparaison simple de cette dynamique avec la dynamique des prix en principe (à moins, bien sûr, que MetaQuote considère que l'essentiel pour les programmeurs est une élimination rapide des experts déjà préparés sans analyse des séries distinctes de positions faibles et fortes).