Fragen von einem "Dummy" - Seite 63

 
masharov:

Der Expert Advisor verwendet den Indikator in einem anderen Zeitrahmen. Bei Tests im Expert Advisor erscheinen falsche Daten des Indikators.

Der EA selbst arbeitet auf M5, der Indikator auf H4. Indikatoren, die auf dem gleichen Zeitrahmen (M5) aufgerufen werden, geben die richtigen Werte zurück.

Die zurückgegebenen Werte ähneln den Indikatorwerten, unterscheiden sich aber von den tatsächlichen Werten, die sichtbar sind, wenn der Indikator auf das Preisdiagrammfenster angewendet wird.

Was ist das Problem?

Beispielcode für einen Indikatoraufruf:

Mögliche Ursachen:

- die Regel der ersten 14 Takte wird nicht beachtet: https://www.mql5.com/ru/articles/15 im Indikator;

- die Korrelation zwischen der aktuellen und der voreingestellten TF nicht eingehalten wird (z.B. wird die Seriennummer des Balkens mit dem erforderlichen Wert des Extremums auf einer anderen TF wahrscheinlich anders sein als auf der voreingestellten, und folglich werden das Hoch, das Tief usw. völlig anders sein) - all dies hängt von der spezifischen Realisierung des Indikators ab; Sie sollten genau verstehen, was genau korreliert werden muss, und die Formel unter Verwendung des Verhältnisses der verschiedenen Perioden neu berechnen;

- werden möglicherweise alte Indikatorwerte vom vorherigen Tick im Puffer belassen, und es kann notwendig sein, den Puffer mit leeren Werten neu zu initialisieren: ArrayInitialize(array,EMPTY_VALUE).

Индикатор от индикатора в MQL5
Индикатор от индикатора в MQL5
  • 2010.02.08
  • MetaQuotes Software Corp.
  • www.mql5.com
При написании индикатора, который использует краткую форму вызова функции OnCalculate(), можно упустить то обстоятельство, что индикатор может рассчитываться не только на ценовых данных, но и на данных другого индикатора (встроенного или пользовательского - не имеет значения). Вы хотите улучшить индикатор, чтобы он правильно считался не только на ценовых данных, но и значениях другого индикатора? В этой статье мы по шагам пройдем все необходимые этапы такой модификации и выведем дополнительные полезные правила для правильного написания индикатора.
 
x100intraday:

Mögliche Ursachen:

- die Regel der ersten 14 Balken wird nicht eingehalten: https://www.mql5.com/ru/articles/15 im Indikator;

- Die Korrelation zwischen dem aktuellen und dem voreingestellten TF wird nicht beachtet (z. B. muss die Seriennummer des Balkens mit dem erforderlichen Wert eines Extremums in einem anderen TF anders sein als im voreingestellten, und folglich werden das Hoch, das Tief usw. anders sein) - all dies hängt von der jeweiligen Implementierung des Indikators ab;

- werden möglicherweise alte Werte vom vorherigen Tick im Indikator belassen, und es kann notwendig sein, den Puffer mit leeren Werten neu zu initialisieren: ArrayInitialize(array,EMPTY_VALUE).

1. Der Indikator wird auf allen Balken des Preisdiagramms angezeigt.

2. Hier ist alles in Ordnung.

3. hat nicht geholfen

 

Die Referenz besagt, dass das Datum/die Uhrzeit wie folgt dargestellt werden darf:

D'12:00:00'

Ich weise einer Variablen vom Typ datetime einen Wert zu:

 datetime start = D'12:00:00'

Bei der Zusammenstellung wird eine Warnung eingeblendet:

Und warum?

 
Urain:
Da kein Datum angegeben ist, wird nur die Uhrzeit 12:00:00 angegeben. Das Datum wird mit einem Punkt und nicht mit einem Doppelpunkt geschrieben.

Die Referenz besagt, dass:

Es kann entweder das Datum (Jahr, Monat, Tag) oder die Uhrzeit (Stunden, Minuten, Sekunden) oder alles zusammen weggelassen werden. Die Spanne der Werte reicht vom 1. Januar 1970 bis zum 31. Dezember 3000.

Beispiele:

D'2004.01.01 00:00' // Neujahr
D'1980.07.19 12:30:27'
D'19.07.1980 12:30:27'
D'19.07.1980 12' //Neujahr d'1980.07.19 12:00:00'
D'01.01.2004' //äquivalent D'01.01.2004 00:00:00'
D'12:30:27' //äquivalent zu D'[Kompilierdatum] 12:30:27'
D' '//äquivalent zu D'[Kompilierdatum] 00:00:00''

...

Oder habe ich das falsch verstanden?

 
masharov:

Der EA selbst läuft auf M5 und der Indikator auf H4. Die Indikatoren, die auf demselben Zeitrahmen (M5) aufgerufen werden, liefern die richtigen Werte.

Ich bestehe weiterhin auf dem zweiten Punkt.

Sie schreiben selbst, dass auf derselben TF die richtigen Werte zurückgegeben werden. Bei anderen werden natürlich auch Werte zurückgegeben, die für die aktuelle TF nicht erwartet werden.

Mascharow:

Die zurückgegebenen Werte ähneln den Indikatorwerten, unterscheiden sich aber von den tatsächlichen Werten, die sichtbar sind, wenn der Indikator an ein Preisdiagrammfenster angehängt ist.

Ähnliche Werte kommen wahrscheinlich nicht von der Decke, sondern von einer der TFs, die nicht gleich M5 sind. Wenn die aktuelle TF H4 ist, dann kommen die Werte wahrscheinlich von dort, während Werte von M5 erwartet werden. Wenn wir den Code von M5 auf H4 umstellen, wird es höchstwahrscheinlich möglich sein, bei der Suche nach Werten auf H4 genau die richtigen Werte für H4 zu finden (für andere TF werden sie falsch aussehen).

Wenn der Indikator in der Lage ist, die richtigen Werte in Übereinstimmung mit der einen oder anderen TF zu liefern, aber nicht in der Lage ist, z.B. auf M5 das anzuzeigen, was er auf H4 tut, was können wir dann von den gelieferten Werten erwarten, wenn wir mit dem Expert Advisor zusammenarbeiten, der nicht auf der gleichen TF ist?

 
tol64:

Die Referenz besagt, dass:

Es kann entweder das Datum (Jahr, Monat, Tag) oder die Uhrzeit (Stunden, Minuten, Sekunden) oder alles zusammen weggelassen werden. Die Spanne der Werte reicht vom 1. Januar 1970 bis zum 31. Dezember 3000.

Beispiele:

D'2004.01.01 00:00' // Silvester
D'1980.07.19 12:30:27'
D'19.07.1980 12:30:27'
D'19.07.1980 12' //Neujahr d'1980.07.19 12:00:00'
D'01.01.2004' //äquivalent D'01.01.2004 00:00:00'
D'12:30:27' //äquivalent zu D'[Kompilierdatum] 12:30:27'
D' '//äquivalent zu D'[Kompilierdatum] 00:00:00''

...

Oder habe ich das falsch verstanden?

Ja, ja, du hast recht, ich habe in der Eile nicht aufgepasst.

Anscheinend war es ursprünglich so, und dann wurde es annulliert und die Bescheinigung wurde nicht korrigiert.

Trotzdem stellt sich die Frage, ob es sich um eine Ungenauigkeit in der Hilfe oder um einen Fehler handelt.

 

Urain:

...

Trotzdem stellt sich die Frage, ob es sich um eine Ungenauigkeit in der Hilfe oder um einen Fehler handelt.

Ein Beispiel für ein Skript:

void Set_Start_And_End_TradeSession()
{
 datetime start = D'00:45:00';
 datetime array[];
 int s = 0, e = 0, i = 0;
 long chart_ID = ChartID();
 long count_bars = Bars(Symbol(),0);
 
 CopyTime(Symbol(),0,0,(int)count_bars,array);
 
 ArraySetAsSeries(array,true);
 
 for(s = 0; s < count_bars; s++)
   {
    ObjectCreate(chart_ID,"start_date",OBJ_VLINE,0,array[s],0); ChartRedraw();
    Sleep(50);
    if(array[s]==start) { Comment("Ok!!!"); break; }
    if(i==1441) { Comment("Error!!!"); break; }
    i++;
   }
}
So funktioniert es. Ich mag nur die Warnungen nach dem Kompilieren nicht)). Vielleicht wird sich einer der Entwickler dazu äußern.
 
Urain:

In jedem Fall stellt sich die Frage, ob es sich um eine Ungenauigkeit in der Hilfe oder um einen Fehler handelt.

Compiler-Warnungen bedeuten noch nicht, dass ein Fehler vorliegt. Drucken Sie es aus: Alles wird gemäß der Hilfe wiedergegeben.
 
masharov:

Der Expert Advisor verwendet den Indikator in einem anderen Zeitrahmen. Bei Tests zeigt der EA falsche Daten des Indikators an.

Der EA selbst arbeitet auf M5, der Indikator auf H4. Indikatoren, die auf dem gleichen Zeitrahmen (M5) aufgerufen werden, geben die richtigen Werte zurück.

Die zurückgegebenen Werte ähneln den Indikatorwerten, unterscheiden sich aber von den tatsächlichen Werten, die sichtbar sind, wenn der Indikator auf das Preisdiagrammfenster angewendet wird.

Was ist das Problem?

Beispielcode für einen Indikatoraufruf:

Das AS_SERIES-Flag kann in mehrdimensionalen Arrays und in statischen Arrays nicht gesetzt werden.

Versuchen Sie

void OnNewBar() // моя функция
{
 double wave[];
 ArraySetAsSeries(wave, true);
 CopyBuffer(W_handle,0,(int)0,2,wave);
 if (wave[1] > 0) Buy(); 
}

oder wie folgt

void OnNewBar() // моя функция
{
 double wave[1];
 if(CopyBuffer(W_handle,0,(int)1,1,wave)<1) return;
 if (wave[0] > 0) Buy(); 
}
 
  string Symb="EURUSD";
  for(i=0;i<OrdersTotal()+PositionsTotal();i++)
     {
      if(Symb==PositionGetSymbol(i)) Orders_Total++;
     }
     Alert(Orders_Total);
Könnten Sie mir bitte sagen, warum die Meldung Orders_Total=1 anzeigt, obwohl es eigentlich nur eine Position und einen Auftrag gibt, d.h. theoretisch sollte sie 2 und nicht 1 anzeigen.