Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 352

 

Danke, aber sie ist

Vitaly Muzichenko:

iCustom soll helfen


iCustom ist eine gute Lösung für iCustom, aber iCustom führt immer den gesamten Code des Indikators aus, und wenn ich viele Indikatorparameter in einem EA benötige (und das ist es), dann erhalten wir statt einer Indikatorberechnung mehrere, was den Prozess erheblich verlangsamen kann, bis der aktuelle Tick verpasst wird, ich habe die vordefinierten Variablen vergessen.....

int rates_total=Bars;

definierte globale Variable

int prev_calculated=0;

stürzt bei der Anzahl der Array-Elemente ab

 
ijonhson:

Es tut mir leid, aber ich verstehe nicht, warum oncalculate die Werte von vordefinierten Variablen übergeben sollte, wenn sie global und ebenfalls verfügbar sind

Sehen Sie sich ein Beispiel an

//+-------------------------------------------------------+
//|Параметры функции                             PROBA.mq4|
//+-------------------------------------------------------+
#property   strict

void OnStart()
{
 Alert(Сумма(2,5));
 
 int Сум=0;
 Сумма(2,5,Сум);  // Передаем в функцию 2 числа и получаем сумму
 Alert(Сум);
}

int Сумма(int a, int b)
{
  return a+b;
}

void Сумма(int a, int b, int & s)
{
  s= a+b;
}

Parameter einer Funktion können Eingabe - die wir ihr übergeben - und Ausgabe - die sie an uns zurückgibt - sein

 
ijonhson: int rates_total=Bars; int prev_calculated=0;

Diese Variablen werden benötigt, um die gesamte Indikatorlinie zu berechnen, aber Sie benötigen einen einzigen Wert. Alles ist viel einfacher. Analysieren Sie das Indikatorenprogramm und stellen Sie fest, welche Formel zur Berechnung verwendet wird. Und verwenden Sie diese Formel im Expert Advisor

 

Leute, sagt mir, wie man diesen Algorithmus implementiert:

Es gibt eine Zeitreihe mit dem Volumen Volume

Ich möchte Volume[1] so vergleichen, dass es größer ist als jeder der vorherigen Volume[1]-Balken und ein Fenster (Anzahl) der vorherigen Balken mit einer externen Variablen (extern int) angeben


Schreiben Sie ein Codebeispiel, wenn es nicht schwierig ist

 
John Smith:

Leute, sagt mir, wie man diesen Algorithmus implementiert:

Es gibt eine Zeitreihe mit dem Volumen Volume

Ich möchte Volume[1] so vergleichen, dass es größer ist als jeder der vorherigen Volume[1]-Balken und ein Fenster (Anzahl) der vorherigen Balken mit einer externen Variablen (extern int) angeben


Schreiben Sie ein Codebeispiel, wenn es nicht schwierig ist

  for(int i=1; i<NumBar; i++) {
    ArrayResize(Buf, i);
    Buf[i-1] = Volume[i];
  }

 double min= Buf[ArrayMinimum(Buf)];
 double max= Buf[ArrayMaximum(Buf)];

 if(max < Volume[0]) { ... }
 
STARIJ:

Hat es funktioniert? Wie hat es früher funktioniert?


Es hat ohne Fehler funktioniert, ich habe es anscheinend selbst entfernt, durch automatisches Ersetzen mit Strg+h, und habe es nicht bemerkt >_<. Wie auch immer, wahrscheinlich sind die Illuminaten dafür verantwortlich. Nochmals vielen Dank!

 
John Smith:

Leute, sagt mir, wie man diesen Algorithmus implementiert:

Es gibt eine Zeitreihe mit dem Volumen Volume

Ich möchte Volume[1] so vergleichen, dass es größer ist als jeder der vorherigen Volume[1]-Balken und ein Fenster (Anzahl) der vorherigen Balken mit einer externen Variablen (extern int) angeben


Schreiben Sie ein Codebeispiel, wenn es nicht schwierig ist

Das ist nicht schwer. Ich habe es auf meinen Knien aus dem Gedächtnis aufgeschrieben (vielleicht habe ich etwas vergessen)...

//+------------------------------------------------------------------+
bool IsLastVolumeTheLargest(const string symbol_name, const ENUM_TIMEFRAMES timeframe,const int start_pos,const int count)
  {
   long array[];  // Массив для хранения объёмов
   //--- если скопировалось меньше, чем нужно, вернём false
   if(CopyTickVolume(symbol_name,timeframe,start_pos,count,array)<count) return false;
   //--- вернём флаг того, что максимальный объём находится в последней ячейке массива (соответствует индексу start_pos)
   return ArrayMaximum(array)==count-1;
  }
//+------------------------------------------------------------------+
 

Hallo. Ich kann die Datei nicht freigeben. Die Aufgabe - Ich benötige die Datei einer älteren Periode (z.B. M20), die auf М1 während der manuellen Prüfung im МТ4 (MQL4) Tester erzeugt wird. Zu diesem Zweck habe ich einen Indikator geschrieben, der auf dem PeriodConverter-Skript basiert. Da es im Testmodus nicht möglich ist, die Datei (EURUSD20.csv) direkt im Ordner History zu speichern, wird die Datei in dem von allen Terminals gemeinsam genutzten Ordner \\MetaQuotes\Terminal\Common gespeichert. Dann kopiert das Skript in der Schleife, das auf einem Standard-M1-Chart arbeitet, Daten aus der Datei EURUSD20.csv in die Datei EURUSD20.hst, die sich im Ordner History befindet. Die Datei EURUSD20.csv kann im Skript nicht geöffnet werden, wenn sie gleichzeitig im Indikator im Tester geöffnet wird (5004 ERR_FILE_CANNOT_OPEN File open error). Wenn Sie den Indikator aus dem Prüfgerät entfernen, wird die Datei im Skript problemlos geöffnet und kopiert. Die Datei wird im Indikator wie folgt geöffnet: ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Die Datei im Skript wird wie folgt geöffnet: ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ);
Bitte weisen Sie auf meinen Fehler hin.

 
tvv:

Hallo. Ich kann die Datei nicht freigeben. Die Aufgabe - Ich benötige die Datei einer älteren Periode (z.B. M20), die auf М1 während der manuellen Prüfung im МТ4 (MQL4) Tester erzeugt wird. Zu diesem Zweck habe ich einen Indikator auf der Grundlage des PeriodConverter-Skripts geschrieben. Da es im Testmodus nicht möglich ist, die Datei (EURUSD20.csv) direkt im Ordner History zu speichern, wird die Datei in dem von allen Terminals gemeinsam genutzten Ordner \\MetaQuotes\Terminal\Common gespeichert. Dann kopiert das Skript in der Schleife, das auf einem Standard-M1-Chart arbeitet, Daten aus der Datei EURUSD20.csv in die Datei EURUSD20.hst, die sich im Ordner History befindet. Die Datei EURUSD20.csv kann im Skript nicht geöffnet werden, wenn sie gleichzeitig im Indikator im Tester geöffnet wird (5004 ERR_FILE_CANNOT_OPEN File open error). Wenn Sie den Indikator aus dem Prüfgerät entfernen, wird die Datei im Skript problemlos geöffnet und kopiert. Datei wird im Indikator wie folgt geöffnet: ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Datei wird im Script wie folgt geöffnet: ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Bitte weisen Sie mich auf meinen Fehler hin.

Haben Sie sie darauf hingewiesen?

 
Alexey Viktorov:

Haben Sie es angegeben?

Das verstehe ich nicht. Diese Option gibt den Speicherort der Datei - \MetaQuotes\Terminal\Common - an. Ohne diese Option kann ich die Datei, die im Tester erzeugt wurde, nicht abrufen. Ohne diese Option wird die Datei in MQL4-Files gesucht - und ich kann die Datei aus dem Tester nicht dort ablegen.

Grund der Beschwerde: