Services, neue Funktionen in der MT5-Architektur, die Beerdigung von MT4 steht vor der Tür. - Seite 8

 

von Eng.

Daten

Futtermittel

datafeed -- Datenquelle (obwohl das Wort "Quelle" nicht ganz richtig ist)


Zubringer -- Zubringer, Zubringer, Zubringer

 

О датафидах. Сколько встречал этот термин, сложилось ощущение, что этим словом обозначают источник данных (котировок). Буквально "заполнитель данных". Когда речь идет о собственных инструментах, понимаю так, что мы сможем вычислять котировки, например, никем не котируемого MXNRUB по известным курсам MXNUSD и USDRUB, выгруженным из терминала в .csv формат, и легализовать для терминала новые котировки, указав файл .csv как новый датафид. Возможно, будет реализовано и более изящное решение, без выгрузки в файлы, путем онлайновых операций */ над тиками (MXNRUB =  MXNUSD * USDRUB). И это будет новый датафид.

Haben sie schon .csv-Kurse in Ticks für MT5 importiert?
 
Andrey Khatimlianskii:

Es gibt keinen Link zu einer Diskussion, einem Fehlerbericht oder ähnlichem? Oder haben Sie nur das Gefühl, dass es eine gab, aber Sie haben es nicht überprüft?

Soweit ich mich erinnere, stimmten die in OnCalculate gesammelten Ticks mit den über CopyTix angeforderten Ticks überein.

Jetzt speziell überprüft... wie ich vermutet, bekam einige Mist, aber nicht die, die ich erwartet hatte :)

2017.05.22 12:47:10.591 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.591 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.599 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.605 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.617 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.637 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.649 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.683 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.765 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.771 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.193 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.781 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.193 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.843 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.244 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 0
2017.05.22 12:47:10.843 (RTS-6.17,M1)   OnBookEvent: Время последнего OnCalculate = 2017.05.22 10:47:11.193 ms (88), время последнего OnBookEvent = 2017.05.22 10:47:11.244 ms (0)
2017.05.22 12:47:10.859 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.282 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.863 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.282 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88

OnBookEvent() fängt Ticks mit Flag 0 ab...

 

Und genau das habe ich erwartet zu sehen:

2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.704 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.697 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.704 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.697 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05.22 13:24:38.254 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.262 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.262 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.270 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.280 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.280 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.730 ms (TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.719 ms (TICK_FLAG_BID )
2017.05.22 13:24:38.282 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.283 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
Wie Sie sehen können, gibt es bei der Abfrage des letzten Ticks bei jedem Aufruf von OnCalculate() mit SymbolInfoTick() einen Sprung in einigen der Ticks, die CopyTicks() zurückgibt.
 

Zu prüfender Code:

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlTick _tick;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Подписываемся на стакан
   MarketBookAdd(_Symbol);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ResetLastError();
//--- Проверяем получение параметров тика
   if(!SymbolInfoTick(_Symbol,_tick))
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": параметры тика не получены!");
   else
      Print(__FUNCTION__,": "+GetMsToStringTime(_tick.time_msc)+" v = ",_tick.volume,", bid = "+DoubleToString(_tick.bid,_Digits)+
            ", ask = "+DoubleToString(_tick.ask,_Digits)+", last = "+DoubleToString(_tick.last,_Digits)+", flags = '"+GetStrFlags(_tick.flags)+"'");
//---
   ResetLastError();
//---
   MqlTick t[1];
   if(CopyTicks(_Symbol,t,COPY_TICKS_ALL,0,1)!=1)
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Последний тик не получен!");
   else
     {
      if(t[0].time_msc!=_tick.time_msc)
        {
         Print(__FUNCTION__,": Время последнего STick = "+GetMsToStringTime(_tick.time_msc)+" ("+GetStrFlags(_tick.flags)+")"+
               ", время последнего CopyTicks = "+GetMsToStringTime(t[0].time_msc)+" ("+GetStrFlags(t[0].flags)+")");
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
   if(symbol!=_Symbol)
      return;
//--- Структура - приемник последнего тика
   MqlTick tick;
//---
   ResetLastError();
//--- Проверяем получение параметров тика
   if(!SymbolInfoTick(_Symbol,tick))
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": параметры тика не получены!");
   else
      Print(__FUNCTION__,": "+GetMsToStringTime(tick.time_msc)+" v = ",tick.volume,", bid = "+DoubleToString(tick.bid,_Digits)+
            ", ask = "+DoubleToString(tick.ask,_Digits)+", last = "+DoubleToString(tick.last,_Digits)+", flags = '"+GetStrFlags(tick.flags)+"'");
//--- Сравниваем последний тик OnCalculate с последним тиком OnBookEvent
   if(tick.time_msc!=_tick.time_msc)
     {
      Print( __FUNCTION__,": Время последнего OnCalculate = "+GetMsToStringTime( _tick.time_msc )+" ("+GetStrFlags( _tick.flags )+")"+
            ", время последнего OnBookEvent = "+GetMsToStringTime( tick.time_msc )+" ("+GetStrFlags( tick.flags )+")" );
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Отписываемся от стакана
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Получаем строку времени из миллисекунд                                                                      |
//+------------------------------------------------------------------+
string GetMsToStringTime(const ulong ms)
  {
   const int MS_KOEF=1000;               // Коэффициент перевода секунд в миллисекунды
   return( TimeToString( ms/MS_KOEF, TIME_DATE|TIME_SECONDS )+"."+string( ms%MS_KOEF )+" ms" );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string GetStrFlags(const uint flags)
  {
   string s="";
//---
   if(( flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      s+="TICK_FLAG_ASK ";
   if(( flags&TICK_FLAG_BID)==TICK_FLAG_BID)
      s+="TICK_FLAG_BID ";
   if(( flags&TICK_FLAG_BUY)==TICK_FLAG_BUY)
      s+="TICK_FLAG_BUY ";
   if(( flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      s+="TICK_FLAG_SELL ";
   if(( flags&TICK_FLAG_LAST)==TICK_FLAG_LAST)
      s+="TICK_FLAG_LAST ";
   if(( flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME)
      s+="TICK_FLAG_VOLUME ";
//---
   return( s );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn:

Code zum Testen:

Ich würde nur Ticks in die Datei schreiben lassen, wenn OnCalculate aufgerufen wird (um OnBookEvent und CopyTicks zu testen, aberOnCalculate, wie es beabsichtigt war).

Und dann hätte das Skript dieselbe Datei erzeugt und die Ticks über CopyTicks erhalten. Der Unterschied wäre deutlicher und würde entweder auf fehlende Ticks in OnCalculate oder auf eine fehlerhafte Arbeit von CopyTicks hinweisen.

 
Andrey Khatimlianskii:

Um sicher zu gehen (nicht um OnBookEvent und CopyTicks zu testen, sondern OnCalculate, wie beabsichtigt), würde ich nur Ticks in die Datei schreiben lassen, wenn OnCalculate aufgerufen wird.

Und dann hätte das Skript dieselbe Datei erzeugt und die Ticks über CopyTicks erhalten. Der Unterschied wäre deutlicher und würde entweder auf das Überspringen von Ticks in OnCalculate oder auf eine falsche Arbeit von CopyTicks hinweisen.

Bei einer so einfachen Berechnung sehe ich keinen Sinn darin, sich die Mühe zu machen. Es gibt einen spezifischen Vergleich von zwei Aufrufen: SymbolInfoTick() und CopyTicks(). Und alle Aufrufe von SymbolInfoTick() werden deutlich angezeigt. Und es ist deutlich zu sehen, dass CopyTicks() den Tick zurückgibt, der nicht im Aufruf SymbolInfoTick() von OnCalculate() empfangen wurde. Und hier kann es zwei Gründe für den Fehler geben: 1. Entweder verpasst OnCalculate() einen Tick, oder 2. SymbolInfoTick() gibt irgendwo den falschen Wert zurück.

Ja, dies ist ein Teil des Protokolls, das etwa 30 Sekunden lang gesammelt wurde... Stellen Sie sich also die Anzahl der fehlenden Zecken vor.

 
Alexey Kozitsyn:

Unser Dialog mit dem Service Desk:

Tick-Skipping in OnCalculate
Eröffnet, Gestartet: 2017.05.22 14:52, #1751442

Schauen Sie, um nicht verloren zu gehen:https://www.mql5.com/ru/forum/190129/page8#comment_5081300 und die nächsten 2 Stellen.

CopyTicks vom Indikator gibt einen Tick, den der Indikator nicht in OnCalculate erhält (weder vorher noch nachher).

Support Team2017.05.23 09:44
Status:UnbearbeitetEröffnet
Ihre Bewerbung wurde zur Prüfung angenommen.
Support-Team2017.05.23 09:46

OnCalculate wird bei jedem Tick aufgerufen.

Ticks werden in einem separaten Thread zur Datenbank hinzugefügt. Das heißt, asynchron. Nicht die Tatsache, dass Sie mit CopyTicks denselben Tick erhalten, der OnCalculate aufgerufen hat.

Andrey Khatimlianskii 2017.05.23 14:08

Darum geht es nicht.

Mit CopyTicks ist es möglich, einen Tick zu erhalten, der nicht in OnCalculate enthalten war (wir erfahren es in OnCalculate bei einem Tick, dessen Zeit länger ist als die verpasste).

Schauen Sie sich die Protokolle an.

Support-Team2017.05.23 14:13

Das ist genau das, worüber wir hier sprechen.

Eine Ladung Zecken ist eingetroffen. Zwei Threads beginnen mit der Verarbeitung dieses Pakets - ein Thread in der Schleife führt OnCalculate bei jedem Tick im Paket aus; ein anderer Thread speichert das gesamte Paket in einer Tick-Datenbank. Diese beiden Threads sind in keiner Weise miteinander synchronisiert, und es ist nicht bekannt, welcher Thread ein Paket von Ticks schneller verarbeiten wird

Andrey Khatimlianskii 2017.05.23 14:26

Aber jedes Häkchen aus dem Paket sollte von OnCalculate verarbeitet werden. Und das ist nicht der Fall.

Es gibt keinen Tick mit dieser Zeit. Es gibt ein Häkchen mit weniger Zeit und ein Häkchen mit mehr Zeit. Und es gibt keinen OnCalculate-Aufruf dazwischen.

Support-Team2017.05.23 14:33

Komposter

Aber jedes Häkchen im Paket muss von OnCalculate behandelt werden. Und das ist nicht der Fall.

Es gibt keinen Tick mit dieser Zeit. Es gibt ein Häkchen mit weniger Zeit und ein Häkchen mit mehr Zeit. Und es gibt keinen Aufruf von OnCalculate zwischen ihnen.

Jedes Häkchen im Paket wird bei OnCalculate verarbeitet. Dort gibt es keine Auslassungen. So wird die Schleife geschrieben.

Um herauszufinden, welcher Tick in OnCalculate verarbeitet wird, verwenden SieSymbolInfoTick- hier ist alles klar. Das Häkchen wird auf die Symbolinformation angewandt und dann werden alle Indikatoren dieses Symbols aufgerufen, alles in einem Thread

Andrey Khatimlianskii 2017.05.23 14:36

Bitte sehen Sie sich das Protokoll unter diesem Link an.

SymbolInfoTick von OnCalculate sieht den Tick nicht, der von CopyTicks bezogen werden kann.

Deshalb habe ich geschrieben

Support-Team2017.05.23 14:40

Wir müssen genau das tun, was Sie inhttps://www.mql5.com/ru/forum/190129/page8#comment_5082755 vorgeschlagen haben.

Ich würde, um sicher zu sein (um OnCalculate anstelle von OnBookEvent und CopyTicks zu testen, wie beabsichtigt), nur das Schreiben von Ticks in die Datei lassen, wenn OnCalculate aufgerufen wird.

Und dann hätte das Skript dieselbe Datei erzeugt und die Ticks über CopyTicks erhalten. Der Unterschied wäre viel deutlicher und würde entweder auf das Überspringen von Ticks in OnCalculate oder auf eine falsche Arbeit von CopyTicks hinweisen.

Und genau auf diese Weise haben wir schon einmal die Korrektheit von CopyTicks überprüft. Die Testskripte und Indikatoren sind noch vorhanden, wir werden sie noch einmal überprüfen.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.02.07 13:41

SymbolInfoTick in Indikatoren funktioniert ganz anders als in EAs.

In einem Indikator wird immer der Tick zurückgegeben, der den OnCalculate-Aufruf 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.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2017.03.29 22:32

Das Ereignis Berechnen wird bei JEDEM Tick erzeugt. Daher gibt es eine Tick-Warteschlange für Indikatoren. Erreicht sie eine bestimmte Zahl, erscheint im Protokoll eine Warnung, dass der Indikator zu langsam ist.

Die Balken selbst sind von Natur aus Indikatoren und werden durch Calculate-Events erzeugt. Wenn also TF M1 10:15:00.020 ist und ein 50ms-Paket kommt, hat der erste Tick darin noch die Zeit 10:14:59.970. Und alle Indikatoren werden zuerst bei diesem Calculate-Ereignis aufgerufen - zuerst der Zeitreihenindikator und dann die benutzerdefinierten Indikatoren mit diesen Zeitreihen. D.h. in diesem Layout ist der 10:15-Takt noch nicht als Null-Takt ausgebildet. Und der Null-Balken ist 10:14.


Wenn das Paket dann beginnt, sich über Calculate Events abzuwickeln, wird auch der 10:15-Balken erscheinen. Ich glaube, ich habe es ausführlich beschrieben.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2017.03.29 22:41

Folglich ist es ganz normal, dass ein EA einen Tick von einem Balken erhält, der sich noch nicht gebildet hat. Aber das ist ein so subtiler Punkt, dass man sich schon anstrengen muss, um ihn absichtlich zu reproduzieren. Im Allgemeinen ist sie eher theoretisch als praktisch.


Wenn wir wegen der Geschwindigkeit paranoid sind, ist die Verwendung von Blinkern (und natürlich Balken) keine Option. Alles ist in der EA.

 
Andrey Khatimlianskii:

Unser Dialog mit dem Service Desk:

Service Desk gehört leider zu ihrem Repertoire. Sie müssen keinen Link einfügen, wenn es um die Diskussion geht. Aber um ein konkretes Beispiel zu geben, auf ihre Finger. Das ist nicht das, worüber sie reden. Sie sagen nämlich, dass SymbolInfoTick() den aktuellen zu prüfenden Tick zurückgibt, und da OnCalculate() jeden Tick behandelt, sollte die Ausgabe für jeden Tick erfolgen. Und CopyTicks() sagt uns etwas anderes. Nun... Und es heißt, man solle nicht auf CopyTicks() schauen :). Über zwei Threads haben sie mich auch aufgeklärt, als sie CopyTicks() am Ende des Jahres reparierten. Nur ist das hier nicht das Thema (obwohl, vielleicht auch darin, ich weiß es nicht).

Haben Sie sie nicht nach Ticks mit 0-Flag gefragt, wenn sie von OnBookEvent() empfangen werden?

Grund der Beschwerde: