Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 18

 
Dennis Kirichenko:
Und darf ich fragen, warum statisch?

Weil aus dem Zusammenhang gerissen - siehe Originalbeitrag.
 

undokumentiertes Merkmal der OnInit()-Funktion, kann diese Funktion in jedem Teil des Programms ausgeführt werden. Test-Code.

//+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

int test=0;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   test=5;
   Print(__FUNCTION__,": test = ",test);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newbar.bar(_Symbol,PERIOD_CURRENT))
     {
      test=10;
      Print(__FUNCTION__,": test = ",test);
      OnInit();
     }
  }
//+------------------------------------------------------------------+

Ergebnis

2017.03.10 19:26:02.977 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:27:03.041 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:27:03.042 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnInit: test = 5


...

 
Sergey Gritsay:

ein undokumentiertes Merkmal der Funktion OnInit(), kann diese Funktion in jedem Teil des Programms ausgeführt werden. Test-Code.


Alle On-Funktionen sind normale Funktionen und können daher jederzeit aufgerufen werden. OnCalculate oder OnTradeTransaction.
 
fxsaber:

Alle On-Funktionen sind normale Funktionen und können daher jederzeit aufgerufen werden. Entweder OnCalculate oder OnTradeTransaction.


Aber das steht nicht in der Dokumentation

OnInit

Die Funktion OnInit() ist der OnInit-Ereignishandler. Es kann vom Typvoid oderint sein und hat keine Parameter:

voidOnInit();

Das Init-Ereignis wird unmittelbar nach dem Laden eines Expert Advisors oder Indikators erzeugt, dieses Ereignis wird nicht für Skripte erzeugt. Die Funktion OnInit() wird zur Initialisierung verwendet. Wenn OnInit() den Rückgabewert int hat, bedeutet ein Rückgabewert ungleich Null, dass die Initialisierung nicht erfolgreich war, und es wird das EreignisDeinit mit dem Deinitialisierungsgrund codeREASON_INITFAILED erzeugt.

Um die Eingabeparameter eines Experten zu optimieren, empfiehlt es sich, die Werte aus der AufzählungENUM_INIT_RETCODE als Rückgabecodes zu verwenden. Anhand dieser Werte wird der Verlauf der Optimierung gesteuert, einschließlich der Auswahl der am besten geeignetenPrüfmittel. Während der Initialisierung eines Expert Advisors vor dem Start des Tests können Sie mit der FunktionTerminalInfoInteger() Informationen über die Konfiguration und die Ressourcen eines Agenten (die Anzahl der Kerne, die Menge des freien Speichers usw.) anfordern. Auf der Grundlage der erhaltenen Informationen können Sie entweder die Verwendung dieses Testagenten zulassen oder seine Verwendung während der Optimierung dieses Expert Advisors ablehnen.

ENUM_INIT_RETCODE

Kennung

Beschreibung

INIT_SUCCEEDED

Nach erfolgreicher Initialisierung kann das Testen des Expert Advisors fortgesetzt werden.

Dieser Code bedeutet das Gleiche wie Null - die Initialisierung des Expert Advisors im Testgerät war erfolgreich.

INIT_FAILED

Die Initialisierung ist fehlgeschlagen, die Prüfung ist aufgrund nicht behebbarer Fehler sinnlos. Zum Beispiel ist es nicht gelungen, einen Indikator zu erstellen, der für die Arbeit des Expert Advisors erforderlich ist.

Die Rückgabe dieses Wertes bedeutet dasselbe wie die Rückgabe eines Wertes ungleich Null - die Initialisierung des Expert Advisors im Testgerät ist fehlgeschlagen.

INIT_PARAMETERS_INCORRECT

Der Ergebnisstring, der diesen Rückgabecode enthält, wird in der allgemeinen Optimierungstabelle rot hervorgehoben.

Die Tests für diesen Parametersatz des Expert Advisors werden nicht ausgeführt und der Agent kann eine neue Aufgabe erhalten.

Nach Erhalt dieses Wertes ist gewährleistet, dass der Strategietester diesen Auftrag nicht an andere Bearbeiter zur wiederholten Ausführung weitergibt.

INIT_AGENT_NOT_SUITABLE

Keine Fehler bei der Initialisierung, aber aus irgendeinem Grund ist der angegebene Agent nicht zum Testen geeignet. Zum Beispiel unzureichender Arbeitsspeicher,OpenCL-Unterstützung und so weiter.

Nach Rückgabe dieses Codes erhält der Agent bis zum Ende dieserOptimierung keine Aufgaben mehr.

Die Funktion OnInit() vom Typ void bedeutet immer eine erfolgreiche Initialisierung.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Wenn ich am Wochenende Code schreibe, füge ich OnTick in OnInit ein. Und alles ist gut, auch wenn keine neuen Zecken hinzukommen
 
Sergey Gritsay:


Es steht aber nicht in der Dokumentation

OnInit

Die Funktion OnInit() ist der OnInit-Ereignishandler. Es kann vom Typvoid oderint sein und hat keine Parameter:

voidOnInit();

Das Init-Ereignis wird unmittelbar nach dem Laden eines Expert Advisors oder Indikators erzeugt

Hier steht, dass es eine Funktion ist.

Vor OnInit und nach OnDeinit gibt es Aufrufe von Konstruktoren/Destruktoren von globalen Objekten (Ungenauigkeit in der Hilfe). Deshalb können Sie zum Beispiel in Indikatoren Indikatorpuffer ohne OnInit deklarieren. Die Grundzüge sind wie folgt.

 
DieSuche nach FullOnCalculate führt sofort zu einer Menge völlig undokumentierter Features der Arbeit mit Indikatorpuffern in MT4/MT5 - sie unterscheiden sich teilweise gravierend.
 
Hier ist meine endgültige Vision für die Lösung des Problems:
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
Angenommen, ein Indikator hat diese Parameter:
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
dann sieht die Farbpalette dafür folgendermaßen aus:
color colors[] = {
   clrAquamarine, clrBeige, clrBurlyWood,  // 1 plot
   clrRed, clrGreen,                       // 2 plot
   clrBlack,                               // 3 plot
   clrWhite,                               // 4 plot
   clrGold, clrCrimson, clrCadetBlue,      // 5 plot
   clrBurlyWood, clrBlue                   // ignore
};

Wenn das Feld kleiner ist, wird nur ein Teil der Farben übertragen. Wenn das Feld größer ist, wird es beschnitten.

Für width- und style-Arrays gilt das gleiche Prinzip.

 
fxsaber:

In OrderSendSync wird die überladene (siehe oben) HistoryDealSelect aufgerufen.

Wie kann ich den Zeitpunkt des Öffnens der letzten Position und den Zeitpunkt des Schließens der letzten Position bestimmen?

Und ganz allgemein würde ich gerne die allgemeinen Grundsätze und Algorithmen kennen, um Informationen über offene/geschlossene Positionen auf mql5 zu erhalten.

Was ist zu beachten, welche Besonderheiten gibt es derzeit?

 
Artyom Trishkin:

Wie kann ich den Zeitpunkt des Öffnens der letzten Position und den Zeitpunkt des Schließens der letzten Position bestimmen?

Generell würde ich gerne die allgemeinen Prinzipien und Algorithmen kennen, um Informationen über offene/geschlossene Positionen in mql5 zu erhalten.

Was ist zu beachten, was sind die Besonderheiten im Moment?


Dies alles wird durch die Auswahl der Auftrags- und Handelshistorie und das anschließende Lesen der Eigenschaften der Aufträge ermittelt.

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

POSITIONSNUMMER

Die Positionskennung ist eine eindeutige Nummer, die jeder neu eröffneten Position zugewiesen wird und sich während ihrer gesamten Lebensdauer nicht ändert. Sie entspricht dem Ticket des Auftrags, mit dem die Position eröffnet wurde.

Die Positionskennung wird in jedem Auftrag (ORDER_POSITION_ID) und jedem Geschäft (DEAL_POSITION_ID) angegeben, mit dem er eröffnet, geändert oder geschlossen wurde. Verwenden Sie diese Eigenschaft, um nach Aufträgen und Geschäften zu suchen, die sich auf die Position beziehen.

Wenn eine Position im Netting-Modus storniert wird (ein einzelnes In/Out-Geschäft), wird die POSITION_IDENTIFIER-Kennung der Position nicht geändert. POSITION_TICKET wird jedoch in das Auftragsticket geändert, das zum Storno geführt hat. Im Absicherungsmodus gibt es keine Positionsumkehr.

lang


Und unter Verwendung der Eigenschaften aus der Aufzählung ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

Eintritt in den Markt

DEAL_ENTRY_OUT

Marktaustritt

DEAL_ENTRY_INOUT

Kehrtwende

DEAL_ENTRY_OUT_BY

Gegenposition schließen

Grund der Beschwerde: