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

 
joo:

Voici le code pour lire à partir d'un fichier :

PourquoiFileReadString() ?

Vous pouvez utiliserFileReadArray(), ainsi vous n'avez pas besoin de faire une boucle.

 
Serj_Che:

PourquoiFileReadString() ?

Ne serait-il pas préférable d'utiliserFileReadArray(), ce qui évite d'avoir à faire une boucle.

C'est peut-être mieux. Je suis juste habitué à ça. :)
 

Rosh:
Écrire les valeurs d'équité dans un fichier. Ensuite, construisez l'indicateur en fonction de ces valeurs. Cependant, le fichier de données doit être déplacé manuellement car, pendant les tests, les fichiers sont écrits dans le dossier Agent_name/MQL5/Files.

Ce n'est que maintenant que je me suis rendu compte à quel point tout est compliqué.

Mais la méthode manuelle n'est clairement pas la solution à ce problème, car nous parlons de centaines de tests.

Et il semblerait qu'au début, les données sont disponibles, mais - oh, Miracle ! - le programme est conçu de telle manière qu'il n'y a aucune possibilité de les sauvegarder d'une manière ou d'une autre et quelque part jusqu'à ce qu'ils soient extraits et utilisés de manière programmatique !

Je ne suis pas un programmeur professionnel, mais cette situation est difficile à comprendre.

Une énorme documentation..., de vastes possibilités pour construire, semble-t-il, tout et n'importe quoi..., la gestion de la mémoire, la POO, et ici, de façon fondamentalement simple et critiquement nécessaire (ce que, j'espère, j'ai déjà expliqué) - une impasse.

...Et pourtant... Question !

N'y a-t-il pas la possibilité d'écrire en mode test dans des tableaux de programmes forcés et presque effaçables, qui pourraient ensuite être utilisés pour construire un indicateur ?

Y compris la possibilité de faire passer par une variable globale un pointeur vers un tel tableau ?

Et quel est le problème du stockage et du transfert des données entre la phase de test et le moment du travail principal, non pas en termes de mise en œuvre actuelle, mais en principe ?

Renat a mentionné des centaines de mégaoctets de données, mais, premièrement, pourquoi devrions-nous toujours recharger les données alors que nous ne pouvons prévoir une telle possibilité qu'à la demande explicite du programmeur et, deuxièmement, la quantité de données en termes de la tâche à accomplir est beaucoup plus petite et s'élève à quelques milliers de chiffres.

Une fois de plus, je déclare que du point de vue de l'utilisateur, l'option de transfert manuel des fichiers pendant les tests multiples (et le marché, en raison de sa complexité, nécessite des tests multiples) est absolument gênante et peu prometteuse, alors que je suis prêt à discuter avec quiconque que la dynamique des indicateurs de compte en corrélation directe avec la dynamique des prix dans l'historique des tests est l'une des plus importantes en général.

Qu'en est-il de l'extension de la visibilité dans le mode principal des opérations d'ouverture des fichiers en mode lecture au dossier des fichiers du testeur ? Quelle serait la menace même hypothétique dans ce cas ?

Et quel est le problème de ne pas pouvoir forcer le stockage des données requises entre le mode principal et le mode test dans la RAM ?

 

Utilisez le DLL pour écrire et lire des fichiers à partir de dossiers arbitraires sur le disque. Il suffit de déplacer les fonctions d'écriture et de lecture de fichiers dans la dll et le tour est joué.

 
DV2010:

...Et pourtant... Question !

N'y a-t-il pas la possibilité d'écrire en mode test dans certains tableaux de programmes à étroitesse forcée, qui pourraient ensuite être utilisés pour construire un indicateur ?


Essayez de définir l'indicateur FILE_COMMON lors de l'ouverture du fichier - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Identifiant

Valeur

Description

FICHIER_COMMON

4096

Emplacement d'un fichier dans le dossier partagé de tous les terminaux clients. Cet indicateur est utilisé lors de l'ouverture de fichiers (FileOpen()), la copie de fichiers (FileCopy(), FileMove()) et la vérification de l'existence de fichiers (FileIsExist()).

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов - Документация по MQL5
 
Rosh:

Essayez de spécifier l'indicateur FILE_COMMON lors de l'ouverture d'un fichier - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Exécutez ce script et voyez où il écrit

//+------------------------------------------------------------------+
//|                                             Demo_File_Common.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string   filename="file_common.txt";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }

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

joo, Rash, merci !

L'option du dossier partagé semble plus... intégré.

La seule chose qui surprend est que lors de l'exécution de ce code, un message concernant l'échec de l'écriture s'affiche dans l'indicateur, bien que l'écriture elle-même soit toujours effectuée. De plus - toujours une question ouverte comment et quand exactement il est préférable d'écrire les données (séparément pour chaque tick, mais c'est gourmand en ressources, ou à la toute fin - le tableau entier, mais avec l'écriture du tableau quelque chose n'est pas encore tout à fait clair et, en outre, il est difficile de comprendre comment OnCalculated fonctionnera dans ce cas pour son extraction - dans le second, il s'avère le passage déjà après le test ?)

Et une autre question, quelque peu hors sujet, mais sur la question déjà abordée hier.

Inséré dans OnTick et dans OnCalculated :

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
mais après l 'achèvement du test, malgré la présence d'objets liés aux positions d'ouverture et de fermeture (flèches et lignes - visibles dans Terminal : Charts>Objects>Objects List), la valeur de retour est 0 pour une raison quelconque.
 

Il est préférable d'écrire dans le fichier aussi rarement que possible, et donc de le faire sous forme de tableau d'entiers. Les valeurs ne doivent pas être mesurées plus d'une fois par minute, sinon leur affichage sur le graphique posera des problèmes (sans compter que cela consommera beaucoup de ressources). C'est-à-dire, à la fin de la course. Mais c'est aussi possible :

L'algorithme se présente comme suit :

1) Exécuter l'expert dans le testeur.

2) Mesuré la valeur de l'intérêt.

3) Enregistré la valeur dans le fichier.

4) Écrire vrai dans un fichier séparé, ce qui signifie que nous avons enregistré une nouvelle valeur.

5) Démarrer une boucle infinie, la condition de sortie est fausse dans le fichier flag.

6) Dans un graphique séparé, le script lit le fichier avec le drapeau, s'il y a une nouvelle valeur, dessine un risque sur le graphique, écrit false dans le fichier.


Voici en gros à quoi ressemblera le mode visuel des tests dans le testeur.

Attendez un peu, le concours sera terminé, peut-être que des solutions plus élégantes et plus belles seront présentées.

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
DV2010:

joo, Rash, merci !

L'option du dossier partagé semble plus... intégré.

La seule chose surprenante est qu'en exécutant ce code dans l'indicateur, un message d'échec d'écriture s'affiche, bien que l'écriture elle-même soit effectuée.

Je ne reçois aucune de ces données. Essayez-le :

//+------------------------------------------------------------------+
//|                                   Demo_File_Common_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double buffer[];
input string   filename="file_common.txt";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,buffer,INDICATOR_DATA);

   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }
//---
   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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Rosh:

Je ne comprends rien à tout ça. Vous devriez essayer :

Rosh

Je ne comprends pas la raison, mais contrairement à mes indicateurs, lorsque je les démarre avec les vôtres, j'obtiens un message :

2011.01.21 13:52:53     Core 1  2011.01.14 00:00:00   Expert removed because indicator 43 cannot load [4002]

Maintenant, j'ai fait un Conseiller Expert simple similaire, basé sur votre code, qui devrait écrire toutes les valeurs d'équité dans le fichier (j'ai changé seulement la sortie de toutes les valeurs, y compris les octets zéro écrits, rendu les variables globales, et divisé l'ouverture et l'écriture du fichier en OnInit et OnTick), mais bien qu'aucune erreur ne soit écrite et que le fichier soit créé, les enregistrements et le fichier sont vides.

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

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;
int handle;
string common_folder;
string filename;

void OnInit(){
   Expert1.Init();
   //--
   filename="equity.txt";
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
}
void OnTick(){
   Expert1.OnTick();
   //---
   if(handle!=INVALID_HANDLE){
      uint written=FileWrite(handle, AccountInfoDouble(ACCOUNT_EQUITY),common_folder);
      PrintFormat("Expert OnTick: Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
   }
   else{
      Print("Expert OnTick: Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
   }  
}
void OnDeinit(const int reason){
   Expert1.Deinit();
   //---
   FileClose(filename);
}

2011.01.21 14:00:46     Core 1  connect closed
2011.01.21 14:00:46     Core 1  log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written
2011.01.21 14:00:46     Core 1  EURUSD,H1: 5516 ticks (23 bars) generated within 47 ms (total bars in history 6419, total time 3093 ms)
2011.01.21 14:00:46     Core 1  OnTester result 0
2011.01.21 14:00:46     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.21 14:00:46     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.21 14:00:46     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.21 14:00:46     Core 1  2011.01.14 22:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01.21 14:00:46     Core 1  2011.01.14 21:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
Raison: