Tiki in Echtzeit - Seite 7

 
prostotrader:

Sie müssen Ihren Code veröffentlichen, um etwas zu beweisen oder zu widerlegen!

Sie haben es auf sich genommen, zu beweisen, dass es Datensätze zwischen benachbarten OnTick-Ereignissen gibt, die dann in die CopyTicks-Historie eingehen und in Echtzeit über OnBookEvent abgefangen werden können.

Leider geht dies aus den obigen Protokollen nicht hervor.

 
fxsaber:

Sie beweisen, dass es zwischen benachbarten OnTick-Ereignissen Datensätze gibt, die dann in die CopyTicks-Historie gelangen und in Echtzeit über OnBookEvent abgefangen werden können.

Leider geht dies aus den obigen Protokollen nicht hervor.

Ich habe es bewiesen, indem ich den funktionierenden Code veröffentlicht und erklärt habe, warum es schneller und in Echtzeit funktioniert,

Ich habe mich dabei auf die Hilfe der MQL5-Funktionen und persönliche Erfahrungen gestützt.

Möchten Sie es selbst überprüfen? Oder beweisen Sie das Gegenteil mit einem funktionierenden Code.

 
prostotrader:

Ich habe dies bewiesen, indem ich einen funktionierenden Code veröffentlicht und erklärt habe, warum er schneller und in Echtzeit funktioniert.

Wenn das wichtigste Beweisglied in Form von fehlenden OnTick-CopyTicks-Historieneinträgen fehlt, kann es leider nicht akzeptiert werden.

 
fxsaber:

Wenn das wichtigste Glied des Nachweises in Form von fehlenden OnTick CopyTicks-Historieneinträgen fehlt, kann er leider nicht akzeptiert werden.

Wo liegt also das Problem?

Überzeugen Sie sich selbst davon.

 
prostotrader:

Was ist es also?

Überzeugen Sie sich selbst davon.

Ich habe nur darauf hingewiesen, dass Ihr Beweis nicht allein aus logischen Gründen akzeptiert werden kann, und nicht, weil er einer anderen Sichtweise widerspricht.

 
fxsaber:

Ich habe nur darauf hingewiesen, dass Ihr Beweis allein aus logischen Gründen nicht akzeptiert werden kann, und nicht, weil er einer anderen Sichtweise widerspricht.

OK, ich verstehe, aber ich schlage trotzdem vor, die Hilfe zu OnBookEvent() zu lesen

Ich werde nichts beweisen, ich habe nur einige funktionierende Code in das Thema des The mas geschrieben, und erklärt (auf Wunsch der Forum-Nutzer)

Warum diese Methode besser ist als OnTick(), soll derjenige , der mir nicht glaubt, selbst überprüfen!

Oder stellen Sie einen funktionierenden Code ein, der meine Erklärung widerlegt.

Hinzugefügt von

Es gibt Tausende von FOREX-Leuten hier im Forum, die noch nie mit OnBookEvent() gearbeitet haben.

Und mit einem Tumblr.

Was soll ich für alle tun, die in diesem Thread posten werden?

 
prostotrader:

Zeitpunkt des ersten OnTick()2020.01.30 19:31:11.112

Zeit der Sekunde OnTick()2020.01.30 19:31:11.802

Das heißt, zwischen dem OnTick() dieser 690 ms sind inzwischen 690 ms vergangen

OnBookEvent() wurde 15 Mal ausgelöst

Glauben Sie, dass diese Klicks nichts mit Zecken zu tun haben?

Es sei denn, Sie rufen eine Änderung im Stapel auf, die sich nicht auf das Randband (Geld/Brief) oder den Flipper auswirkt, dann haben diese Auslöser nichts mit Ticks zu tun.


prostotrader:

Es gibt noch einen weiteren wichtigen Punkt, den viele Menschen vergessen.

Es ist die Geschwindigkeit, mit der der EA eine Entscheidung trifft, indem er die Eingabedaten analysiert.

Wenn Sie OnBookEvent() anstelle von OnTick() verwenden, wird mein EA schneller sein als Ihrer.

Sie irren sich, und das sage ich Ihnen jetzt zum tausendsten Mal.

Sie können diesen EA auf einem Terminal auf zwei Charts laufen lassen: einen im Modus "Use OnBookEvent", den zweiten - im Modus "Use OnTick" (das ist der Eingabeparameter). Der Code in den Ereignishandlern ist identisch (Sie können ihn in eine separate Funktion einfügen und von dort aus aufrufen, aber das ist nicht der Punkt):

//---
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;

//---
bool is_book;
long last_tick_time = 0;
MqlTick cur_ticks[], last_tick;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
        if ( Mode == USE_BOOK )
        {
                is_book = MarketBookAdd(Symbol());
                if ( !is_book ) Alert( "MarketBookAdd failed with error #", GetLastError(), "!" );
        }

        last_tick_time = 0;

        return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        if(is_book == true) MarketBookRelease(Symbol());
}

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
        if ( Mode != USE_BOOK || symbol != _Symbol ) return;

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
                {
                        last_tick_time = cur_ticks[0].time_msc;
                        last_tick = cur_ticks[0];
                }
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );
                for ( int i = 0; i < new_ticks; i ++ )
                {
                        PrintTick( "OnBook", cur_ticks[i] );
                }
                if ( new_ticks > 0 )
                {
                        last_tick_time = cur_ticks[new_ticks-1].time_msc;
                        last_tick = cur_ticks[new_ticks-1];
                }
        }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
        if ( Mode != USE_TICK ) return;

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
                {
                        last_tick_time = cur_ticks[0].time_msc;
                        last_tick = cur_ticks[0];
                }
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );
                for ( int i = 0; i < new_ticks; i ++ )
                {
                        PrintTick( "OnTick", cur_ticks[i] );
                }
                if ( new_ticks > 0 )
                {
                        last_tick_time = cur_ticks[new_ticks-1].time_msc;
                        last_tick = cur_ticks[new_ticks-1];
                }
        }
}

void PrintTick( string func_name, MqlTick &tick )
{
        if ( tick.time_msc == last_tick.time_msc &&
                        tick.bid == last_tick.bid &&
                        tick.ask == last_tick.ask &&
                        tick.last == last_tick.last ) return;
        Print( GetTickCount64(), ": tick received from ", func_name, ": ",
                        tick.time, "   ", tick.time_msc, "  ",
                        DoubleToString( tick.bid, _Digits ), " / ",
                        DoubleToString( tick.ask, _Digits ), " / ",
                        DoubleToString( tick.last, _Digits ) );
};

Schauen Sie dann in das EA-Protokoll und analysieren Sie den Zeitpunkt des Tick-Empfangs:


Wenn Sie etwas Interessantes herausfinden (z.B. die Zeit für das Abrufen eines Ticks(GetTickCount64) von OnTick ist länger als die gleiche Zeit (für den gleichen Tick) von OnBook), posten Sie es hier.

 
Andrey Khatimlianskii:

Wenn Sie keine Änderung in der Tasse nennen, die sich nicht auf das Randband (Geld/Brief) oder den Flipper auswirkt, dann haben diese Auslöser nichts mit Ticks zu tun.


Sie irren sich, und das sage ich Ihnen jetzt zum tausendsten Mal.

Führen Sie diesen EA auf einem Terminal auf zwei Charts aus: einen im Modus "Use OnBookEvent", den anderen im Modus "Use OnTick" (dies ist der Eingabeparameter). Der Code innerhalb der Ereignisbehandlungsroutinen ist identisch (Sie können ihn in eine separate Funktion einfügen und von dort aus aufrufen, aber das ist nicht der Punkt):

Schauen Sie dann in das EA-Protokoll und analysieren Sie den Zeitpunkt des Tick-Empfangs:


Wenn Sie etwas Interessantes herausfinden (z.B. die Zeit für das Abrufen eines Ticks (GetTickCount64) von OnTick ist länger als die analoge Zeit (für denselben Tick) von OnBook), posten Sie es hier.

Es ist genau wie ich gesagt habe!

In der ersten Zeile des Protokolls (Gemeinschaftsarbeit) findet sich eine direkte Bestätigung meiner Ausführungen

OnTick() wird zu spät ausgelöst und erhält daher veraltete Daten


Dateien:
20200131.log  220 kb
 
prostotrader:

Es ist genau wie ich gesagt habe!

In der ersten Zeile des Protokolls (Gemeinschaftsarbeit) eine direkte Bestätigung meiner Erklärung

OnTick() wird zu spät ausgelöst, so dass es veraltete Daten erhält

Zeigen Sie einige Informationen vor diesem Teil des Protokolls an.

War es gleich nach dem Start (die allerersten Einträge)? In welcher Reihenfolge haben Sie die EAs ausgeführt?

ps: siehe beigefügtes Protokoll, werde es mir jetzt ansehen

 
Andrey Khatimlianskii:

Zeigen Sie einige Informationen vor diesem Teil des Protokolls an.

War es gleich nach dem Start (die allerersten Einträge)? In welcher Reihenfolge haben Sie die EAs ausgeführt?

Erst Onbook, dann Ontic, Protokoll oben beigefügt