Equity-Oszillator von MQL5 bedeutet - Seite 5

 
joo:

Hier ist der Code zum Lesen aus einer Datei:

WarumFileReadString() ?

Sie könnenFileReadArray() verwenden, dann brauchen Sie keine Schleife zu machen.

 
Serj_Che:

WarumFileReadString() ?

Wäre es nicht besser,FileReadArray() zu verwenden, dann braucht man keine Schleife zu machen.

Vielleicht ist es besser. Ich bin einfach daran gewöhnt. :)
 

Rosh:
Aktienwerte in eine Datei schreiben. Bilden Sie dann einen Indikator mit diesen Werten. Die Datendatei muss jedoch manuell verschoben werden. Die Dateien werden beim Testen in den Ordner Agent_name/MQL5/Files geschrieben.

Erst jetzt ist mir klar geworden, wie kompliziert alles ist.

Aber manuell ist eindeutig nicht die Lösung für dieses Problem, da es sich um Hunderte von Tests handelt.

Und es scheint so: Am Anfang sind die Daten vorhanden, aber - oh Wunder! - das Programm ist so konzipiert, dass es keine Möglichkeit gibt, sie irgendwie und irgendwo zu speichern, bis sie extrahiert und programmatisch verwendet werden!

Ich bin kein professioneller Programmierer, aber diese Situation ist schwer zu begreifen.

Riesige Dokumentation..., riesige Möglichkeiten, alles und jedes zu bauen..., Speicherverwaltung, OOP, und hier, in grundlegend einfach und kritisch notwendig (was ich hoffentlich schon erklärt habe) - ein Deadlock.

...und doch... Frage!

Gibt es keine Möglichkeit, im Testmodus in einige erzwungenermaßen annotierte Programm-Arrays zu schreiben, die anschließend zur Erstellung eines Indikators verwendet werden könnten?

Einschließlich der Möglichkeit, über eine globale Variable einen Zeiger auf ein solches Array zu übergeben?

Und was ist das Problem der Speicherung und des Transfers von Daten zwischen der Testphase und dem Zeitpunkt der Hauptarbeit, nicht in Bezug auf die aktuelle Umsetzung, aber im Prinzip?

Renat erwähnte Hunderte von Megabytes an Daten, aber erstens, warum sollten wir immer Daten nachladen, wenn wir eine solche Möglichkeit nur auf ausdrücklichen Wunsch des Programmierers vorsehen können, und zweitens ist die Datenmenge im Hinblick auf die vorliegende Aufgabe viel kleiner und beläuft sich auf einige Tausend Ziffern.

Ich erkläre noch einmal, dass die Möglichkeit der manuellen Übertragung von Dateien bei Mehrfachtests (und der Markt erfordert aufgrund seiner Komplexität Mehrfachtests) aus der Sicht des Benutzers absolut unbequem und wenig erfolgversprechend ist, während ich bereit bin, mit jedem zu argumentieren, dass die Dynamik der Kontoindikatoren in ihrer direkten Korrelation mit der Preisdynamik in der Testhistorie eine der wichtigsten überhaupt ist.

Was ist die Frage der Ausweitung der Sichtbarkeit in der Hauptbetriebsart des Öffnens von Dateien im Lesemodus auf den Ordner der Prüferdateien? Was wäre auch nur eine hypothetische Bedrohung in diesem Fall?

Und was ist das Problem, dass man die Speicherung der erforderlichen Daten zwischen Haupt- und Testmodus im RAM nicht erzwingen kann?

 

Verwenden Sie dll zum Schreiben und Lesen von Dateien aus beliebigen Ordnern auf der Festplatte. Verschieben Sie einfach die Funktionen zum Schreiben und Lesen von Dateien in die DLL und das war's.

 
DV2010:

...und doch... Frage!

Gibt es keine Möglichkeit, im Testmodus in einige erzwungenermaßen enge Programmfelder zu schreiben, die anschließend zum Aufbau eines Indikators verwendet werden könnten?


Versuchen Sie, beim Öffnen der Datei das Flag FILE_COMMON zu setzen - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Kennung

Wert

Beschreibung

FILE_COMMON

4096

Speicherort einer Datei im gemeinsamen Ordner aller Client-Terminals. Dieses Flag wird beim Öffnen von Dateien (FileOpen()), beim Kopieren von Dateien (FileCopy(), FileMove()) und beim Überprüfen der Existenz von Dateien (FileIsExist()) verwendet

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

Versuchen Sie, beim Öffnen einer Datei das Flag FILE_COMMON anzugeben - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Führen Sie dieses Skript aus und sehen Sie, wo es schreibt

//+------------------------------------------------------------------+
//|                                             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, ich danke Ihnen!

Die Option des gemeinsamen Ordners scheint mehr... integriert.

Das Einzige, was überrascht, ist, dass bei der Ausführung dieses Codes eine Meldung über das erfolglose Schreiben im Indikator angezeigt wird, obwohl das Schreiben selbst noch erfolgt. Plus - immer noch eine offene Frage, wie und wann genau es besser ist, die Daten zu schreiben (separat für jeden Tick, aber es ist ressourcenintensiv, oder ganz am Ende - das ganze Array, aber mit Array schreiben etwas ist noch nicht ganz klar, und außerdem ist es schwer zu verstehen, wie OnCalculated wird in diesem Fall für seine Extraktion arbeiten - in der zweiten, es stellt sich heraus, die Passage bereits nach dem Testen?)

Und noch eine Frage, die zwar nicht ganz zum Thema gehört, aber die bereits gestern angesprochen wurde.

Eingefügt in OnTick und in OnCalculated:

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
aber nach Abschluss des Tests ist der Rückgabewert trotz des Vorhandenseins von Objekten, die sich auf Öffnungs- und Schließpositionen beziehen (Pfeile und Linien - sichtbar in Terminal: Charts>Objects>Objects List), aus irgendeinem Grund 0.
 

Es ist besser, so selten wie möglich in die Datei zu schreiben, daher ist es besser, dies als Integer-Array zu tun. Die Werte sollten nicht öfter als einmal pro Minute gemessen werden, da es sonst zu Problemen bei der Darstellung auf dem Diagramm kommt (außerdem ist es unverhältnismäßig ressourcenintensiv). Das heißt, am Ende des Laufs. Aber es ist auch möglich:

Der Algorithmus sieht folgendermaßen aus:

1) Führen Sie den Experten im Prüfgerät aus.

2) Der Wert des Interesses wurde gemessen.

3) Aufzeichnung des Wertes in der Datei.

4) Schreibe true in eine separate Datei, was bedeutet, dass wir einen neuen Wert aufgezeichnet haben.

5) Starten Sie eine Endlosschleife, die Exit-Bedingung ist false in der Flag-Datei.

6) In einem separaten Diagramm liest das Skript die Datei mit dem Flag, wenn es einen neuen Wert gibt, zeichnet es ein Risiko in das Diagramm und schreibt false in die Datei.


So sieht der visuelle Testmodus des Testers in etwa aus.

Warten Sie ein wenig, der Wettbewerb ist bald vorbei, vielleicht werden dann elegantere und schönere Lösungen präsentiert.

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

joo, Rash, ich danke Ihnen!

Die Option des gemeinsamen Ordners scheint mehr... integriert.

Das einzig Überraschende ist, dass bei der Ausführung dieses Codes innerhalb des Indikators eine Meldung über einen fehlgeschlagenen Schreibvorgang angezeigt wird, obwohl der Schreibvorgang selbst durchgeführt wird.

Ich bekomme nichts von dieser Ausgabe. Probieren Sie es aus:

//+------------------------------------------------------------------+
//|                                   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:

Ich verstehe das alles nicht. Sie sollten es versuchen:

Rosch

Ich kann nicht verstehen, woran das liegt, aber im Gegensatz zu meinen Indikatoren erhalte ich eine Meldung, wenn ich sie mit Ihrem Indikator starte:

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

Jetzt habe ich einen ähnlichen einfachen Expert Advisor auf der Grundlage Ihres Codes erstellt, der alle Equity-Werte in eine Datei schreiben sollte (ich habe nur die Ausgabe aller Werte geändert, einschließlich der geschriebenen Null-Bytes, die Variablen global gemacht und das Öffnen und Schreiben der Datei in OnInit und OnTick aufgeteilt), aber obwohl kein Fehler geschrieben wird und die Datei erstellt wird, sind die Datensätze und die Datei leer.

#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
Grund der Beschwerde: