Fehler, Irrtümer, Fragen - Seite 1786

 
fxsaber:
Wenn OnCalculate durch OnTick ersetzt wird, treten keine Fehler auf. Das Problem liegt nicht an SymbolInfoTick, sondern daran, dass die Indikatoren nicht richtig auf "No Skips" eingestellt sind.
Wie lange haben Sie Messungen durchgeführt? Und was hat die Indikatoreinstellung damit zu tun? Die Ankunftszeit des aktuellen Ticks ist 10, die Ankunftszeit des vorherigen Ticks ist 11. Es liegt ein Fehler in der Funktion vor, die den Wert zurückgibt, der nicht der aktuelle Wert ist. Sie stimmen zu, dass der aktuelle Zeitwert nicht kleiner sein kann als der vorherige, oder?
 
Alexey Kozitsyn:
Wie lange haben die Messungen gedauert? Und was hat das mit der Festlegung der Indikatoren zu tun? Die Ankunftszeit des aktuellen Ticks ist 10, die Ankunftszeit des vorherigen Ticks ist 11. Dies ist ein Fehler der Funktion, die nicht den aktuellen Wert zurückgibt. Sie stimmen zu, dass der aktuelle Zeitwert nicht kleiner sein kann als der vorherige, oder?

SymbolInfoTick funktioniert in Indikatoren anders als in EAs.

In einem Indikator gibt er immer den Tick zurück, der den Aufruf von OnCalculate ausgelöst hat. Und diese Initiator-Ticks im Indikator sollten nicht übersprungen werden - das ist die Ideologie der Entwickler. Das Problem liegt in der Bildung der Warteschlange für diese Zecken.

Im EA gibt der SymbolInfoTick in OnTick nicht den Tick zurück, der den Aufruf von OnTick ausgelöst hat, sondern er fragt den aktuellen Status vollständig ab.

Gemessen zehn Minuten auf Si.

 
fxsaber:

SymbolInfoTick funktioniert in Indikatoren anders als in EAs.

In einem Indikator gibt er immer den Tick zurück, der den Aufruf von OnCalculate ausgelöst hat. Und diese Initiator-Ticks im Indikator sollten nicht übersprungen werden - das ist die Ideologie der Entwickler. Das Problem liegt in der Bildung der Warteschlange für diese Zecken.

Im Expert Advisor gibt SymbolInfoTick in OnTick nicht den Tick zurück, der den Aufruf von OnTick ausgelöst hat, sondern stellt eine vollständige Anfrage nach dem aktuellen Status.

Die Zeckenschlange ist also schief. Auf jeden Fall müssen wir die Arbeit in Indikatoren ordnen. Es scheint, dass das Hauptaugenmerk auf dem Testen von Funktionen für die Arbeit mit Expert Advisors liegt. Dies ist die erste. Zweitens, sind Sie sicher, dass SymbolInfoTick() eine synchrone Funktion ist? Drittens, selbst wenn SymbolInfoTick() in Ordnung ist, funktioniert es immer noch besser als CopyTicks(), weil es oft mehr aktuelle Werte zurückgibt. Wie ich schon sagte, gibt es eine Menge Fehler bei den Zecken. Und die Entwickler schweigen...
 
fxsaber:

Gemessen zehn Minuten auf Si.

Das ist sehr wenig. Mehrere Stunden lang messen. Auf mehreren Instrumenten.
 
Alexey Kozitsyn:
Drittens, auch wenn SymbolInfoTick() in Ordnung ist - es funktioniert immer noch besser als CopyTicks(), weil es oft aktuellere Werte liefert.
Ich habe Situationen erlebt, in denen CopyTicks aktuellere Daten zurückgegeben hat als SymbolInfoTick, das LATER aufgerufen wurde. Deshalb führe ich die Abfrage mit zwei Funktionen gleichzeitig durch und wähle das jüngste Häkchen aus.
 
fxsaber:
Situationen, in denen CopyTicks aktuellere Daten lieferte als SymbolInfoTick LATER, wurden behoben. Deshalb mache ich eine Abfrage mit zwei Funktionen auf einmal und wähle das letzte Häkchen aus.
Ich habe meinen Test durchgeführt , indem ich zuerst SymbolInfoTick() und erst dann CopyTicks() aufgerufen habe. Sind Sie auf jeden Fall der Meinung, dass dieses Verhalten korrekt ist und nichts geändert werden muss?
 
fxsaber:

SymbolInfoTick funktioniert in Indikatoren anders als in EAs.

In einem Indikator gibt er immer den Tick zurück, der den Aufruf von OnCalculate ausgelöst hat. Und diese Initiator-Ticks im Indikator sollten nicht übersprungen werden - das ist die Ideologie der Entwickler. Das Problem liegt in der Bildung der Warteschlange für diese Zecken.

Im Expert Advisor gibt der SymbolInfoTick in OnTick nicht den Tick zurück, der den Aufruf von OnTick ausgelöst hat, sondern fragt vollständig nach dem aktuellen Status.

Dann wäre es logisch, sie durch die

OnCalculate( ..., const MqlTick& tick );

mit der Zecke, die sie verursacht hat, vor allem, weil es nichts kostet.

Und die Funktion SymbolInfoTick() sollte vollständig in Indicator und Expert Advisor implementiert werden (sie gibt die aktuellen Preise zurück, nicht die Preise zum Zeitpunkt des Aufrufs vonOnCalculate)

 

MT4 verblüfft weiterhin mit Unberechenbarkeit )) Wer schreibt die Implementierung der Handelsfunktionen? MT4 Version 1045

Beginnen wir mit der witzigen Info, die an Zadornov geschickt werden sollte, weil er sich immer über die dummen Amerikaner aufregt.

SYMBOL_TRADE_TICK_VALUE

Wert SYMBOL_TRADE_TICK_VALUE_PROFIT

doppelt

SYMBOL_TRADE_TICK_VALUE_PROFIT

Nicht unterstützt

doppelt

SYMBOL_TRADE_TICK_VALUE_LOSS

Nicht unterstützt

doppelt


In der Zwischenzeit erzeugt SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue) einen Wert. BUT!!!!! Wenn Sie den Indikator auf das Diagramm werfen, ist er beim Start in Ordnung. Und wenn Sie das Terminal neu starten, wird diese Funktion beim ersten Aufruf true und null tickValue zurückgeben! Entspannen Sie sich also nicht, Mr. Expert Advisor-Entwickler, alles muss mit eigenen Händen überprüft werden.

//переводит котировку в цену/1_лот в валюте депозита, например 0.00015 для EURUSD будет равно $15/лот
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
  {
   int dig=(int)MarketInfo(symbol,MODE_DIGITS);
   if(dig == 0)
      return(false); // symbol is none
   double tickSize = MarketInfo(symbol, MODE_TICKSIZE);   // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
   //double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
   double tickValue;
   if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
      Print(__FUNCTION__, "  SymbolInfoDouble(...) returns false"); // всегда возвращается true!!
   Print("tickSize= ", tickSize, "  tickValue= ", tickValue);
   if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль...
      return false;
   double price=diff/(tickSize/tickValue); // а то завалимся c  tickValue == 0
   price4lot=NormalizeDouble(price,2);
   return (true);
  }

Ausstieg:

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0

2017.02.07 16:08:24.515 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: initialisiert

2017.02.07 16:08:23.002 Custom indicator ShowImportantParams EURUSD.e,M15: erfolgreich geladen


 
A100:

Dann wäre es logisch, die

OnCalculate( ..., const MqlTick& tick );

mit der Zecke, die sie gerufen hat, zumal sie nichts kostet

Und die Funktion SymbolInfoTick() sollte in Indicator und Expert Advisor voll funktionsfähig sein (aktuelle Preise zurückgeben, nicht die Preise zum Zeitpunkt desOnCalculate-Aufrufs)

Es wäre sogar logisch, die Anzahl der Ticks in der aktuellen Warteschlange hinzuzufügen.
 
fxsaber:
Es ist sogar sinnvoll, der aktuellen Warteschlange eine Tick-Nummer hinzuzufügen.
Warum brauchen Sie eine Tickernummer? Man braucht nur einen korrekten Fluss, der richtig gegeben ist und richtig empfangen werden kann.