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

 
joo:

Déclarez deux tableaux Equity[] et Time[] au niveau global dans EA.

Inscrivez la valeur de l'équité et du temps dans le tableau approprié lorsque vous testez l'EA.

Utilisez un script pour lire le fichier à la fin du test et tracer l'équité sur le graphique requis.

C'est la meilleure façon de procéder pour vos besoins, je ne comprends pas pourquoi vous avez besoin d'un indicateur.

Eh, si je pouvais comprendre clairement et précisément quelle est la difficulté de ce que j'ai déjà fait, alors ce serait plus facile...

( Les valeurs changeantes dans OnCalculated sont déjà là, alors qu'est-ce qu'il faut de plus ? )

J'ai déjà pensé aux variables globales, mais par définition :

datetime  GlobalVariableSet(
   string  name,      // имя
   double  value      // устанавлимое значение
   );

Et comment écrire un tableau ou au moins une référence à Value pour pouvoir le récupérer plus tard... Question.

En ce qui concerne les objets, je veux combiner deux choses :

1. les lignes de transactions sont indiquées en fonction du résultat (rouge - toutes non rentables, bleu - toutes rentables)

2. et dans l'Indicateur pour construire un graphique des rendements à partir du dépôt initial en bas.

Sinon, lors de l'utilisation d'objets à petite échelle, même les cercles de transactions empêchent de voir la dynamique des prix (dont, d'ailleurs, je veux me débarrasser, mais encore une fois, je ne sais pas comment).

Je parle de tester les conseillers experts sur de grandes échelles de temps, où exactement cette combinaison de courbes, comme je le comprends maintenant, donnera l'idée la plus complète de la distribution des transactions perdantes et rentables sur l'historique sans la nécessité de la comparaison traditionnelle de la direction d'ouverture avec la direction du mouvement pour chaque transaction.

 

sergey1294:
Даже не знаю как вам объяснить. AccountInfoDouble(ACCOUNT_EQUITY) хранит последнее значение эквити. После тестирования как сказал Ренат индикатор инициилизируется заново и пересчитывается. По этому данные эквити накопленные в буфере индикатора за время прогона стираются.

Et ce sujet - l'effacement - est déjà "chaud" !

Mais qu'est-ce qui empêche d'écrire ces valeurs dans OnCalculated dans un autre tableau Indicator étranger et "non effaçable", afin de les restaurer ensuite sans procédure plus lourde et gourmande en ressources d'écriture et de lecture de fichiers ?

Ou c'est déjà une question de niveau système (de déchargement automatique forcé des tableaux, que je ne peux pas contourner) ?

Bien que j'ai lu que ce type de ressources (création et suppression de variables en mémoire) peut également être géré manuellement...

 
DV2010:

Eh, si je pouvais comprendre clairement et précisément quelle est la difficulté de ce que j'ai déjà fait, alors il serait plus facile de renoncer...

( Les valeurs changeantes dans OnCalculated sont déjà là, alors qu'est-ce qu'il faut de plus ? )

J'ai déjà pensé aux variables globales, mais par définition :

Et comment écrire un tableau ou au moins une référence à Value pour pouvoir le récupérer plus tard... Question.

En ce qui concerne les objets, je veux combiner deux choses :

1. les lignes de transactions sont indiquées en fonction du résultat (rouge - toutes non rentables, bleu - toutes rentables)

2. et dans l'Indicateur pour construire un graphique des rendements à partir du dépôt initial en bas.

Sinon, lors de l'utilisation d'objets à petite échelle, même les cercles de transactions empêchent de voir la dynamique des prix (dont, d'ailleurs, je veux me débarrasser, mais encore une fois, je ne sais pas comment).

Dans mon cas, je parle de tester des conseillers-experts sur de grandes échelles de temps, où exactement cette combinaison de courbes, comme je le comprends maintenant, donnera l'image la plus complète de la distribution des transactions perdantes et rentables sur l'historique sans la nécessité de comparer traditionnellement la direction d'ouverture avec la direction du mouvement pour chaque transaction.

Je voulais dire les variables globales du programme, pas du terminal.

Les objets peuvent être dessinés même sur un graphique de 1 minute pour obtenir une précision (fréquence) maximale. Ensuite, après avoir lu les objets du graphique, vous pouvez tracer des lignes avec l'indicateur (s'il y a un désir incroyablement fort de le faire avec l'indicateur), vous pouvez même entrer un facteur de correction dans les paramètres de l'indicateur, de sorte que vous pouvez voir l'équité de tout dépôt initial.

Là encore, toutes les lignes et tous les diagrammes peuvent également être construits par un script.

 
joo:

Je voulais parler des variables globales du programme, pas des variables du terminal.

Les objets peuvent être tracés même sur un graphique d'une minute pour une précision maximale (fréquence). Ensuite, en lisant les objets du graphique, vous pouvez construire des lignes à l'aide de l'indicateur. Vous pouvez même entrer un facteur de correction dans les paramètres de l'indicateur, de sorte que vous puissiez voir l'équité de tout dépôt initial.

Concernant les variables globales du programme - si je comprends bien, il peut y avoir des variables globales dans le code de l'indicateur et dans le code du conseiller expert.

L'une de ces variables est un tableau de valeurs d'Indicateur dont elles sont effacées après le test pour une raison quelconque (probablement de nature système).

Mais alors je comprends bien qu'il est nécessaire de prendre les valeurs pour afficher l'historique d'Equty, que ce soit l'historique des variables globales, des objets ou d'un fichier, dans l'indicateur OnCalculated ?

 
DV2010:

Mais alors je comprends correctement, qu'il est nécessaire de prendre les valeurs pour afficher l'historique d'Equty à partir de variables globales, d'objets ou d'un fichier, juste dans l'indicateur OnCalculated ?

Exactement.
 
joo:
Exactement.

Peut-on utiliser les variables globales du programme dans ce cas ?

Parce que les variables globales du conseiller-expert ne seront pas visibles dans l'indicateur, et que nous devons alors utiliser les variables globales de l'indicateur, qui, contrairement au tableau de valeurs de l'indicateur, devraient être "indélébiles" après le travail de OnCalculated en mode conseiller-expert ?

Et une autre question, si possible, sur les objets du tableau actuel. J'ai essayé de trouver comment extraire la liste des objets qui lui appartiennent, mais c'est toujours difficile à trouver. Pourriez-vous suggérer comment le faire de manière programmatique ?

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
DV2010:

Et aussi, si vous le pouvez, une question sur les objets de l'horaire actuel. J'ai essayé de trouver comment extraire la liste des objets qui lui appartiennent, mais c'est toujours difficile à trouver. Pouvez-vous me dire comment le faire de manière programmatique ?

Utilisez la fonction ObjectsTotal pour obtenir le nombre d'objets sur le graphique.

int  ObjectsTotal(
   long  chart_id,     // идентификатор графика
   int   nwin=-1,      // индекс окна
   int   type=-1       // тип объекта     
   );
Obtenez l'ID du graphique en utilisant ChartID
 

En gros, ça donne quelque chose comme ça :

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2010, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int TradeHistoy=10000;

//Глобальные пременные
double   Equity[];
datetime EquityTime[];
int      cnt;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(Equity,TradeHistoy);ArrayInitialize(Equity,0.0);
   ArrayResize(EquityTime,TradeHistoy);ArrayInitialize(Equity,1);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//Записать накопленные данные в файл
   D_ArrayToCsv("DATA",Equity,TradeHistoy,";");
   D_ArrayToCsv("TIME",Equity,TradeHistoy,";");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

//В нужном месте эксперта проверить значение эквити
//записать эквити и время замера 
   if(cnt<TradeHistoy)
     {
      Equity[cnt]=AccountInfoDouble(ACCOUNT_EQUITY);
      EquityTime[cnt]=TimeTradeServer();
     }

  }
//+------------------------------------------------------------------+

void D_ArrayToCsv(string filename,double &mass[],int line,string Separator)
  {
// запись массива в файл
   string str;
   int handle=FileOpen(filename,FILE_CSV|FILE_WRITE,Separator);
//Цикл записи строчек в файл
   for(int l=0;l<line;l++)
     {
      str=DoubleToString(mass[l],8);
      FileWrite(handle,str);
     }
   FileClose(handle);
  }
//+------------------------------------------------------------------+
Ensuite, vous pouvez faire ce que vous voulez avec les fichiers que vous avez créés.
 

Merci, Rosh, pour l'astuce sur les objets, je pense pouvoir gérer cette partie de ma tâche maintenant.

...Mais avec les opérations sur les fichiers, que je viens d'essayer de maîtriser, c'est un peu plus compliqué (ce dont j'avais peur en fait !).

: )

Quelques surprises à la fois :

1. Le fichier accessible en écriture dans la boucle, pour une raison quelconque, n'écrit qu'une seule valeur au lieu de plusieurs.

2. Bien que l'opération FileWriteArrayobtienne avec succèsun pointeur et vérifie si le tableau transmis n'est pas vide, l'opération

le nombre d'articles écrits est égal à -1.

3.La documentation indique que pendant les tests, les opérations d'ouverture sont effectuées dans le dossier MQL5\tester\files, et pendant l'opération principale - dans le dossier MQL5/files, et donc la question s'est immédiatement posée de savoir comment l'Indicateur pouvait recevoir les données enregistrées pendant la phase de test, pendant le travail principal (et le chemin vers le dossier n'est pas simple et peut très probablement changer avec le temps - \tester\Agent-127.0.0.1-3000\MQL5\Files )

 
DV2010:


3.La documentation indique que pendant la phase de test, les opérations d'ouverture sont effectuées dans le dossier MQL5\tester\files, et pendant la phase d'exploitation principale - dans le dossier MQL5/files, et donc la question s'est posée de savoir comment l'Indicateur pouvait recevoir les données enregistrées pendant la phase de test, pendant le travail principal (et le chemin vers le dossier n'est pas simple et peut très probablement changer avec le temps - \tester\Agent-127.0.0.1-3000\MQL5\Files )

Vous devez faire le transfert à la main.

Voici votre code pour lire le fichier :

void CsvTo1D_Array(string nameFile,double &array[],int line,string Separator)
{
        int end=0;
        int handle=FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);

        if (handle!=1)
        {
                Alert("Файл ",nameFile," не найден!");
        }
        else
        {
                for (int l=0;l<line;l++)
                {
                        array[l]=StringToDouble(FileReadString(handle));
                }
                FileClose(handle);
        }
}
//+------------------------------------------------------------------+