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

 

Nach den letzten Antworten begann das Bild klarer zu werden und das offensichtlichste ist, dass ich nicht dazu bestimmt bin, Programmierer zu werden :-)

Bisher habe ich mit der einfachsten Auflistung begonnen, und das ist es, was dabei herauskam:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



In einigen Fällen überschreitet der Preis aus irgendeinem Grund die Dimension von zwei signifikanten Ziffern nach dem Punkt in beiden Richtungen.

Und dies geschieht ohne Berechnungsfehler, es ist nur die Ausgabe des Kurswertes aus der Chartbasis tmp1[i]=close[i];

Gibt es eine Möglichkeit, das Problem zu beheben oder es einfach zu ignorieren?



 

Sie können daraus alles herausnehmen, was für fünf relevant ist, und erhalten eine Vorlage für vier.


Dies kann von jemandem geschrieben werden, der den Unterschied zwischen einer Fünf und einer Vier kennt, und das bin definitiv nicht ich :-)


//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;


Woher kommt die Zahl 4, was ist ihre heilige Bedeutung?

 
psyman:


Dies kann von jemandem geschrieben werden, der den Unterschied zwischen einer Fünf und einer Vier kennt, und das bin definitiv nicht ich :-)



Woher kommt die Zahl 4, welche heilige Bedeutung hat sie?

Du hörst und liest sicher nicht... Das war ich:

Forum für Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von MQL4-Anfängern, Hilfe und Diskussion über Algorithmen und Codes

Artyom Trishkin, 2018.10.18 09:26

//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     }

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

 
psyman:

Nach den letzten Antworten wurde das Bild klarer und das offensichtlichste ist, dass ich nicht dazu bestimmt bin, Programmierer zu werden :-)

Bisher habe ich mit der einfachsten Auflistung begonnen, und das ist es, was dabei herauskam:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



In einigen Fällen überschreitet der Preis aus irgendeinem Grund die Dimension von zwei signifikanten Ziffern nach dem Punkt in beiden Richtungen.

Und dies geschieht ohne Berechnungsfehler, es ist nur die Ausgabe des Kurswertes aus der Chartbasis tmp1[i]=close[i];

Gibt es eine Möglichkeit, das Problem zu beheben oder es einfach zu ignorieren?



Das ist in Ordnung. Um Bruchzahlen zu drucken, verwenden Sie einfach DoubleToString() mit der erforderlichen Genauigkeit. In diesem Fall sollte die erforderliche Genauigkeit Digits() sein

 
psyman:

Nach den letzten Antworten wurde das Bild klarer und das offensichtlichste ist, dass ich nicht dazu bestimmt bin, Programmierer zu werden :-)

Bisher habe ich mit der einfachsten Auflistung begonnen, und das ist es, was dabei herauskam:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00


In einigen Fällen überschreitet der Preis aus irgendeinem Grund die Dimension von zwei signifikanten Ziffern nach dem Punkt in beiden Richtungen.

Und dies geschieht ohne Berechnungsfehler, es ist nur die Ausgabe des Kurswertes aus der Chartbasis tmp1[i]=close[i];

Kann man das irgendwie abstellen oder einfach ignorieren?

Das sind normale Werte für eine reelle Zahl. Sie können lernen, Programme zu schreiben, jeder fängt damit an, Sie müssen nur viel lesen und versuchen, Ihre eigenen Codes zu schreiben und zu schreiben.

Die Genauigkeit der reellen Zahl, die Mantisse, und wie sie im Speicher gespeichert wird, können Sie im Internet googeln, die Prinzipien der Speicherung sind überall gleich.

wenn Sie eine schöne Ausgabe wünschen, verwenden Sie DoubleToStr()

 
Igor Makanu:

das sind normale Werte für eine reelle Zahl, du kannst lernen, Programme zu schreiben, jeder fängt damit an - du musst nur viel lesen und versuchen, deine eigenen Codes zu schreiben

Die Genauigkeit der reellen Zahl, die Mantisse, und wie sie im Speicher gespeichert wird, können Sie im Internet googeln, die Prinzipien der Speicherung sind überall gleich.

wenn Sie eine schöne Ausgabe wünschen, verwenden Sie DoubleToStr()

Wenn es möglich ist, kompatible Funktionen zu verwenden, ist es besser, sie zur Nutzung anzubieten. Andernfalls wird dieses Epos wieder von vorne beginnen. In diesem Fall: DoubleToString()

 

Wie können Sie verhindern, dass der EA auf denselben Instrumenten läuft?

Zum Beispiel funktioniert der EA im eur/usd-Fenster, aber wenn er in anderen Fenstern auf eur/usd läuft, wird eine Warnmeldung angezeigt. Ich bin Ihnen für Ihre Hilfe sehr dankbar.

 
gans71:

Wie können Sie verhindern, dass der EA auf denselben Instrumenten läuft?

Zum Beispiel funktioniert der EA im eur/usd-Fenster, aber wenn er in anderen Fenstern auf eur/usd läuft, wird eine Warnmeldung angezeigt. Ich wäre für Hilfe sehr dankbar.

Sie müssen Daten von einem EA auf einen anderen übertragen, suchen Sie im Forum

oder verwenden Sie die globalen Variablen des Terminals (dies ist der einfachste Weg) - dort können Sie den Wert des ersten EA schreiben, und nachfolgende Kopien des EA lesen diesen Wert und werden nicht ausgeführthttps://www.mql5.com/ru/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu:

Sie müssen Daten von einem EA auf einen anderen übertragen, suchen Sie im Forum

oder verwenden Sie die globalen Variablen des Terminals (dies ist der einfachste Weg) - dort können Sie den Wert des ersten EA schreiben, und nachfolgende Kopien des EA lesen diesen Wert und werden nicht ausgeführthttps://www.mql5.com/ru/docs/globals

der EA ist derselbe, Sie müssen ihm verbieten, auf denselben Instrumenten zu laufen
 
gans71:
der EA ist derselbe, Sie sollten ihn deaktivieren, damit er auf denselben Symbolen läuft

und? Sie können die Hilfe nicht in 2 Minuten gelernt haben

Wenn Sie speziell über die Übergabe einer Zeichenfolge an eine globale Variable sprechen, besteht die einzige Möglichkeit darin, einen Namen für die globale Variable zu erstellen, d.h. in Ihrem Fall führen Sie einen EA auf EURUSD aus, prüfen Sie

if(GlobalVariableCheck(_Symbol)) .....

Wenn eine solche Variable nicht vorhanden ist, erstellen Sie eine übergroße Variable, etwa so

if(GlobalVariableSet(_Symbol,Magic)==0) Print("Fehler beim Schreiben in die globale Variable # ",GetLastError());

dann beim Beenden des Expert Advisors die globale Variable

Das Terminal ist ohnehin nicht sehr praktisch, und ich habe die Richtung der Suche sozusagen vorgegeben.