Sehr merkwürdiges Verhalten des MT5

 

Hi,

folgendes Szenario:

Ich habe auf einem VPS zwei Instanzen des MT5 im portablen Modus installiert.

Jede Instanz läuft mit einem separaten (Live-)Konto mit in etwa der gleichen Kapitalisierung.

In beiden handle ich den gleichen Basiswert (DE30mini) mit dem gleichen EA (exakt gleiche Programmversion; von mir selbst programmiert) und den gleichen Einstellungen.

Soweit läuft das seit einigen Monaten auch problemlos. Marginale Unterschiede bei den Orderausführungen hin oder her.


Allerdings hatte ich nun innerhalb von acht Tagen zwei merkwürdige/ärgerliche (mir noch unerklärliche) Abweichungen:

Dazu muß man vorab wissen, daß mein EA die Bestimmung ob eine Long- oder Short-Order platziert wird, via zweier EMA's durchführt - und wie gesagt, in beiden EA's sind die Einstellungen exakt identisch!

Heute war der eine EA long- der andere EA short positioniert!!! Dies dürfte per se nicht vorkommen.

Heute vor einer Woche (ebenfalls Freitag) hat der EA auf dem einen Konto gehandelt, auf dem anderen nicht. Laut Kontohistorie hat der Eine keine Order platziert, der andere jedoch schon.


Nachtrag: die EMA's werden im EA mittels der Funktion iMA(...) berechnet.

Sind solche Probleme schon jemandem von euch aufgefallen?


VG

 
liju1970:

Hi,

folgendes Szenario:

Ich habe auf einem VPS zwei Instanzen des MT5 im portablen Modus installiert.

Jede Instanz läuft mit einem separaten (Live-)Konto mit in etwa der gleichen Kapitalisierung.

In beiden handle ich den gleichen Basiswert (DE30mini) mit dem gleichen EA (exakt gleiche Programmversion; von mir selbst programmiert) und den gleichen Einstellungen.

Soweit läuft das seit einigen Monaten auch problemlos. Marginale Unterschiede bei den Orderausführungen hin oder her.


Allerdings hatte ich nun innerhalb von acht Tagen zwei merkwürdige/ärgerliche (mir noch unerklärliche) Abweichungen:

Dazu muß man vorab wissen, daß mein EA die Bestimmung ob eine Long- oder Short-Order platziert wird, via zweier EMA's durchführt - und wie gesagt, in beiden EA's sind die Einstellungen exakt identisch!

Heute war der eine EA long- der andere EA short positioniert!!! Dies dürfte per se nicht vorkommen.

Heute vor einer Woche (ebenfalls Freitag) hat der EA auf dem einen Konto gehandelt, auf dem anderen nicht. Laut Kontohistorie hat der Eine keine Order platziert, der andere jedoch schon.


Nachtrag: die EMA's werden im EA mittels der Funktion iMA(...) berechnet.

Sind solche Probleme schon jemandem von euch aufgefallen?


VG

Ich würde sagen : Poste mal die Log-Dateien der betreffenden Zeitzräume.

Dort lässt sich eventuell lesen was die Ursache ist.

 
Christian:

Ich würde sagen : Poste mal die Log-Dateien der betreffenden Zeitzräume.

Dort lässt sich eventuell lesen was die Ursache ist.

Die Logdateien bin ich schon durchgegangen.

Das Problem letzte Woche scheint sich dadurch zu erklären, daß eine der MT5-Instanzen die Tickdaten mit zeitlichem Verzug bekam und deswegen keine Order abgesetzt wurde (ich habe dbzgl. ein Filterkriterium implementiert).

Aber das heutige Problem ist immer noch unklar. Die Logfiles geben darüber auch keine Auskunft. Keinerlei Fehler/Warnung ausgewiesen.

Ich vermute eine fehlerhafte Berechnung der EMA's in einer der Instanzen. In meinem Demo-Konto ist mir auch schon einmal aufgefallen, daß die EMA's (dort waren sie von Hand als Indikator eingefügt) selten und sporadisch falsch sein mussten, da sie sehr weit (bei Perioden < 200) vom Kursverlauf entfernt waren.

Nun stellt sich die Frage, ist der Fehler in der iMA zu suchen, oder ist dieses Phänomen die Folge einer unsachgemäßen, programmatischen Anwendung...

In der Doku heißt es, das Handle eines Indikatoren sollte im OnInit() erfolgen. Ich mache das allerdings in meinen jeweiligen EA-Funktionslibraries - je nach Bedarf.

Bei mehrmaligem Aufruf dieser Funkionen bleibt das Handle jedoch gleich. Somit habe ich unterstellt, daß der MT5 so intelligent ist, daß ein Handle zum identischen Indikator zur einmal erzeugt wird.

 
liju1970:

Die Logdateien bin ich schon durchgegangen.


Nun gut, wenn es nicht möglich ist, kann sich ein anderer drum kümmern und im Nebel stochern.

 
Christian:

Nun gut, wenn es nicht möglich ist, kann sich ein anderer drum kümmern und im Nebel stochern.

Sorry, ich erwarte hier keine allumfassende Analyse oder Problembehebung. Bin ja schließlich selbst Softwareentwickler.

Mich würde nur interessieren, ob schon Probleme bzgl. iMA(...) bekannt, oder aufgefallen sind. Oder ob bei Nutzung dieser Funktion Fallstricke zu beachten sind.

Die MQL5-Doku ist teilweise nicht besonders aussagekräftig.

 
liju1970:

Sorry, ich erwarte hier keine allumfassende Analyse oder Problembehebung. Bin ja schließlich selbst Softwareentwickler.

Mich würde nur interessieren, ob schon Probleme bzgl. iMA(...) bekannt, oder aufgefallen sind. Oder ob bei Nutzung dieser Funktion Fallstricke zu beachten sind.

Die MQL5-Doku ist teilweise nicht besonders aussagekräftig.

Wenn du doch selber Entwickler bist weißt du doch das es ohne ein Fizzel an Code oder Log-Dateien schwer ist ein Problem zu besprechen.

Dann wird das immer ein aufgeblähter Thread ohne Nutzen.


Zeige doch wenigstens wie du die iMA nutzt. Vielleicht sieht da ja jemand was falsch sein könnte.

 
Christian:

Wenn du doch selber Entwickler bist weißt du doch das es ohne ein Fizzel an Code oder Log-Dateien schwer ist ein Problem zu besprechen.

Dann wird das immer ein aufgeblähter Thread ohne Nutzen.


Zeige doch wenigstens wie du die iMA nutzt. Vielleicht sieht da ja jemand was falsch sein könnte.

    double myBufferFast[];
    double myBufferSlow[];
    SetIndexBuffer(0, myBufferFast, INDICATOR_DATA);
    SetIndexBuffer(1, myBufferSlow, INDICATOR_DATA);

    int myHandleFast = iMA(
        _Symbol,                        // Symbolname
        PERIOD_CURRENT,                 // Periode
        myPeriodFast,                   // Mittelungsperiode
        0,                              // horizontale Verschiebung des Indikators
        ENUM_MA_METHOD::MODE_EMA,       // Glaettungstyp
        inpEmaPriceType == eEmaPriceTypes::Close ? ENUM_APPLIED_PRICE::PRICE_CLOSE : ENUM_APPLIED_PRICE::PRICE_OPEN // Preistyp oder handle
    );

    int myHandleSlow = iMA(
        _Symbol,                        // Symbolname
        PERIOD_CURRENT,                 // Periode
        myPeriodSlow,                   // Mittelungsperiode
        0,                              // horizontale Verschiebung des Indikators
        ENUM_MA_METHOD::MODE_EMA,       // Glaettungstyp
        inpEmaPriceType == eEmaPriceTypes::Close ? ENUM_APPLIED_PRICE::PRICE_CLOSE : ENUM_APPLIED_PRICE::PRICE_OPEN // Preistyp oder handle
    );

    //Wurden die Handles für die beiden EMA's erzeugt?
    if (myHandleFast == INVALID_HANDLE ||
        myHandleSlow == INVALID_HANDLE)
    {
        return true;
    }

    ResetLastError();
    int count = CopyBuffer(
        myHandleFast,
        0,
        StructToTime(structDateTimeBegin),
        StructToTime(structDateTimeEnd),
        myBufferFast);

    if (count <= 0)
    {
        PrintFormat("Daten konnte nicht aus dem Indikator iMA (Fast) kopiert werden, Fehlercode ist %d", GetLastError());
        return true;
    }

    count = CopyBuffer(
        myHandleSlow,
        0,
        StructToTime(structDateTimeBegin),
        StructToTime(structDateTimeEnd),
        myBufferSlow);

    if (count <= 0)
    {
        PrintFormat("Daten konnte nicht aus dem Indikator iMA (Slow) kopiert werden, Fehlercode ist %d", GetLastError());
        return true;
    }

Hier besagter Codeausschnitt...

Und wie gesagt, der Aufruf erfolgt mehrmals bei Bedarf.

 
Mir schwant Unbheil! Wo bzw. in welcher Funktion werden Deine Indikatorhandles erzeugt?
 
Carl Schreiber:
Mir schwant Unbheil! Wo bzw. in welcher Funktion werden Deine Indikatorhandles erzeugt?

Es muss ja in der OnTick() sein, und nun fängt es an.


Die Doku zu CopyBuffer() zeigt es ja...

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Prameter AsSeries =",AsSeries);
   Print("Indikatorpuffer nach SetIndexBuffer() ist eine Zeitreihe = ",
         ArrayGetAsSeries(MABuffer));
//--- set short indicator name
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- set AsSeries(dependes from input parameter)
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("Indikatorpuffer nach ArraySetAsSeries(MABuffer,true); ist eine Zeitreihe = ",
         ArrayGetAsSeries(MABuffer));
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   return(INIT_SUCCEEDED);
  }
Was in die OnInit() gehört.
 

Richtig, OnTick().

Aber genau das meinte ich ja weiter oben, daß laut Doku von der OnInit() gesprochen wird - allerdings in Indikatoren.

Ich habe den Code in einem EA, nicht in einem Indikator.

Ihr seid also der Meinung, daß das ungeahnte Effekte haben kann?

Komisch nur, daß in einer Vielzahl an Backtests die Ergebnisse reproduzierbar gleich sind. "Nur" im heutigen Livebetrieb gab es dbzgl. ein Problem...

Aber gut, ich mache mir Gedanken, wie ich es vernünftig umdesignen kann.

 
Und ArraySetAsSeries fehlt komplett