Equity-Oszillator von MQL5 bedeutet - Seite 4

 
joo:

Deklarieren Sie zwei Arrays Equity[] und Time[] auf globaler Ebene in EA.

Schreiben Sie den Wert des Eigenkapitals und der Zeit in das entsprechende Array, wenn Sie den EA testen.

Verwenden Sie ein Skript, um die Datei am Ende des Tests zu lesen und den Wert im gewünschten Diagramm darzustellen.

Dies ist die beste Lösung für Ihre Zwecke. Ich verstehe nicht, warum Sie einen Indikator benötigen.

Wenn ich klar und deutlich verstehen könnte, worin die Schwierigkeit bei dem besteht, was ich bereits getan habe, dann wäre es einfacher...

(Die sich ändernden Werte in OnCalculated sind bereits vorhanden, was wird also noch benötigt? )

Ich habe bereits über globale Variablen nachgedacht, aber per Definition:

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

Und wie schreibt man ein Array oder zumindest einen Verweis auf Value, um es später abrufen zu können? Frage.

Was die Objekte betrifft, so möchte ich zwei Dinge kombinieren:

1. die Linien der Geschäfte zeigen je nach Ergebnis (rot - alle unrentabel, blau - alle rentabel)

2. und im Indikator, um ein Diagramm der Renditen von der anfänglichen Einzahlung am Boden zu erstellen.

Andernfalls, wenn Sie Objekte in kleinem Maßstab verwenden, verhindern sogar die Kreise der Geschäfte, die Preisdynamik zu sehen (die ich übrigens loswerden möchte, aber ich weiß wieder nicht, wie).

Ich spreche über das Testen von Expert Advisors auf großen Zeitrahmen, wo genau diese Kombination von Kurven, wie ich sie jetzt verstehe, die vollständigste Vorstellung von der Verteilung von Verlusten und Gewinnen über die Geschichte geben wird, ohne die Notwendigkeit des traditionellen Vergleichs der Eröffnungsrichtung jedes Handels mit der Bewegungsrichtung.

 

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

Und das - über die Auslöschung - ist bereits "heiß"!

Aber was verhindert, dass diese Werte in OnCalculated in ein anderes fremdes und "nicht löschbares" Indicator-Array geschrieben werden, um sie dann ohne umständliche und ressourcenintensive Prozedur des Schreibens und Lesens von Dateien wiederherzustellen?

Oder ist es bereits eine Frage auf Systemebene (der erzwungenen automatischen Entladung von Arrays, die ich nicht umgehen kann)?

Obwohl ich gelesen habe, dass diese Art von Ressourcen (Erstellung und Löschung von Variablen im Speicher) auch manuell verwaltet werden können...

 
DV2010:

Wenn ich klar und deutlich verstehen könnte, worin die Schwierigkeit bei dem besteht, was ich bereits getan habe, dann wäre es einfacher, auszusteigen...

(Die sich ändernden Werte in OnCalculated sind bereits vorhanden, was wird also noch benötigt? )

Ich habe bereits über globale Variablen nachgedacht, aber per Definition:

Und wie schreibt man ein Array oder zumindest einen Verweis auf Value, um es später abrufen zu können? Frage.

Was die Objekte betrifft, so möchte ich zwei Dinge miteinander verbinden:

1. die Linien der Geschäfte zeigen je nach Ergebnis (rot - alle unrentabel, blau - alle rentabel)

2. und im Indikator, um ein Diagramm der Renditen von der anfänglichen Einzahlung am Boden zu erstellen.

Andernfalls, wenn Sie Objekte in kleinem Maßstab verwenden, verhindern sogar die Kreise der Geschäfte, dass Sie die Preisdynamik sehen (die ich übrigens loswerden möchte, aber ich weiß wieder nicht, wie).

In meinem Fall spreche ich über das Testen von Expert Advisors auf großen Zeitrahmen, wo genau diese Kombination von Kurven, wie ich sie jetzt verstehe, das vollständigste Bild der Verteilung von Verlusten und Gewinnen über die Geschichte geben wird, ohne die Notwendigkeit des traditionellen Vergleichs der Eröffnungsrichtung mit der Bewegungsrichtung für jeden Handel.

Ich meinte die globalen Variablen des Programms, nicht des Terminals.

Die Objekte können sogar auf einem 1-Minuten-Chart gezeichnet werden, um die maximale Präzision (Häufigkeit) zu erreichen. Dann, nach dem Lesen der Objekte aus dem Chart, können Sie Linien mit dem Indikator zeichnen (wenn es ein unglaublich starkes Verlangen, es mit dem Indikator zu tun), können Sie sogar einen Korrekturfaktor in den Einstellungen des Indikators eingeben, so dass Sie das Eigenkapital von jeder anfänglichen Einzahlung sehen können.

Auch hier können alle Linien und Diagramme durch ein Skript erstellt werden.

 
joo:

Ich meinte globale Programmvariablen, nicht Terminalvariablen.

Objekte können sogar auf einem Ein-Minuten-Diagramm für maximale Genauigkeit (Häufigkeit) aufgezeichnet werden. Sie können sogar den Korrekturfaktor in den Einstellungen des Indikators eingeben, so dass Sie das Eigenkapital jeder anfänglichen Einlage sehen können.

Was die globalen Variablen des Programms betrifft - so wie ich es verstehe, kann es globale Variablen im Code des Indikators und im Code des Expert Advisors geben.

Bei einer dieser Variablen handelt es sich um ein Array von Indikatorwerten, aus dem sie nach der Prüfung aus irgendeinem Grund (wahrscheinlich systembedingt) gelöscht werden.

Aber dann verstehe ich richtig, dass es notwendig ist, die Werte für die Anzeige der Equty-Historie, sei es die Historie aus globalen Variablen, Objekten oder aus einer Datei, in OnCalculated Indicator zu übernehmen?

 
DV2010:

Aber dann verstehe ich richtig, dass es notwendig ist, die Werte für die Anzeige der Equty-Historie aus globalen Variablen, Objekten oder aus einer Datei zu nehmen, nur in OnCalculated Indicator?

Ganz genau.
 
joo:
Ganz genau.

Ist es in diesem Fall möglich, die globalen Variablen des Programms zu verwenden?

Weil die globalen Variablen des Expert Advisors im Indikator nicht sichtbar sein werden und wir dann die globalen Variablen des Indikators verwenden müssen, die im Gegensatz zum Array der Indikatorwerte nach der Arbeit von OnCalculated im Expert Advisor-Modus "unauslöschlich" sein sollten?

Und eine weitere, wenn möglich, Frage zu den Objekten der aktuellen Karte. Ich habe versucht herauszufinden, wie man die Liste der dazugehörigen Objekte extrahieren kann, aber es ist immer noch schwierig zu finden. Könnten Sie vorschlagen, wie man das programmatisch machen kann?

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

Und, wenn Sie können, auch eine Frage zu den Objekten im aktuellen Fahrplan. Ich habe versucht, herauszufinden, wie man die Liste der zugehörigen Objekte extrahieren kann, aber es ist immer noch schwer zu finden. Können Sie mir sagen, wie ich das programmatisch machen kann?

Verwenden Sie die Funktion ObjectsTotal, um die Anzahl der Objekte im Diagramm zu ermitteln

int  ObjectsTotal(
   long  chart_id,     // идентификатор графика
   int   nwin=-1,      // индекс окна
   int   type=-1       // тип объекта     
   );
Abrufen der Diagramm-ID mit ChartID
 

Grob gesagt, geht es ungefähr so:

//+------------------------------------------------------------------+
//|                                                      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);
  }
//+------------------------------------------------------------------+
Dann können Sie mit den erstellten Dateien machen, was Sie wollen.
 

Danke, Rosh, für den Tipp mit den Objekten, ich glaube, ich kann diesen Teil meiner Aufgabe jetzt bewältigen.

...Aber bei den Dateioperationen, die ich gerade versucht habe zu beherrschen, ist es etwas komplizierter (was ich eigentlich befürchtet hatte!).

: )

Gleich mehrere Überraschungen auf einmal:

1. Die in der Schleife beschreibbare Datei schreibt aus irgendeinem Grund nur einen Wert anstelle von mehreren.

2. Obwohl die FileWriteArray-Operation erfolgreicheinen Zeiger erhält und überprüft, ob das übergebene Array nicht leer ist, wird die

ist die Anzahl der geschriebenen Artikel gleich -1.

3.In der Dokumentation heißt es, dass die Öffnungsvorgänge während des Tests im Ordner MQL5\tester\files und während des Hauptvorgangs - in MQL5/Dateien, und daher stellte sich sofort die Frage, wie der Indikator die während der Testphase aufgezeichneten Daten während der Hauptarbeit erhalten könnte (und der Pfad zum Ordner ist nicht einfach und kann sich höchstwahrscheinlich im Laufe der Zeit ändern - \tester\Agent-127.0.0.1-3000\MQL5\Files )

 
DV2010:


3.In der Dokumentation heißt es, dass während der Testphase die Öffnungsvorgänge im Ordner MQL5\tester\files und während der Hauptbetriebsphase - in MQL5/Dateien, und daher stellte sich die Frage, wie der Indikator die während der Testphase aufgezeichneten Daten während der Hauptarbeit erhalten könnte (und der Pfad zum Ordner ist nicht einfach und kann sich höchstwahrscheinlich im Laufe der Zeit ändern - \tester\Agent-127.0.0.1-3000\MQL5\Files )

Sie müssen von Hand übertragen.

Hier ist Ihr Code, um aus der Datei zu lesen:

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);
        }
}
//+------------------------------------------------------------------+
Grund der Beschwerde: