Caractéristiques du langage mql5, subtilités et techniques - page 18

 
Dennis Kirichenko:
Et puis-je demander pourquoi statique?

Parce que sorti de son contexte - voir le message original.
 

une caractéristique non documentée de la fonction OnInit(), cette fonction peut être exécutée dans n'importe quelle partie du programme. Code de test.

//+------------------------------------------------------------------+
//|                                                       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();
     }
  }
//+------------------------------------------------------------------+

Résultat

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:

caractéristique non documentée de la fonction OnInit(), cette fonction peut être exécutée dans n'importe quelle partie du programme. Code de test.


Toutes les On-fonctions sont des fonctions normales et peuvent donc être appelées quand vous le souhaitez. OnCalculate ou OnTradeTransaction.
 
fxsaber:

Toutes les On-fonctions sont des fonctions normales, et par conséquent, elles peuvent être appelées quand vous le souhaitez. Soit OnCalculate, soit OnTradeTransaction.


Mais ce n'est pas écrit dans la documentation

OnInit

La fonction OnInit() est le gestionnaire de l'événement OnInit. Il peut être de typevoid ouint, et n'a pas de paramètres:

voidOnInit() ;

L'événement Init est généré immédiatement après le chargement d'un Expert Advisor ou d'un indicateur, cet événement n'est pas généré pour les scripts. La fonction OnInit() est utilisée pour l'initialisation. Si OnInit() a une valeur de retour int, le code de retour non nul signifie que l'initialisation n'a pas réussi, et il génère l'événementDeinit avec le code de raison de désinitialisationREASON_INITFAILED.

Afin d'optimiser les paramètres d'entrée d'un expert, il est recommandé d'utiliser les valeurs de l'énumérationENUM_INIT_RETCODE comme codes de retour. Ces valeurs sont utilisées pour contrôler le déroulement de l'optimisation, notamment la sélection des agents detest les plus appropriés. Pendant l'initialisation d'un Expert Advisor, avant le début des tests, vous pouvez demander des informations sur la configuration et les ressources d'un agent (le nombre de cœurs, la quantité de mémoire libre, etc.) en utilisant la fonctionTerminalInfoInteger(). Sur la base des informations obtenues, vous pouvez soit autoriser l'utilisation de cet agent de test, soit refuser de l'utiliser pendant l'optimisation de ce conseiller expert.

ENUM_INIT_RETCODE

Identifiant

Description

INIT_SUCCEEDED

Une fois l'initialisation réussie, le test du conseiller expert peut être poursuivi.

Ce code a la même signification que zéro - l'initialisation du conseiller expert dans le testeur a réussi.

INIT_FAILED

L'initialisation a échoué, les tests sont inutiles en raison d'erreurs irrécupérables. Par exemple, vous n'avez pas réussi à créer un indicateur qui est nécessaire pour le travail du conseiller expert.

Le retour de cette valeur a la même signification que le retour d'une valeur différente de zéro - l'initialisation du conseiller expert dans le testeur a échoué.

INIT_PARAMETERS_INCORRECT

Conçu pour indiquer au programmeur un jeu incorrect de paramètres d'entrée. La chaîne de résultats contenant ce code de retour sera mise en évidence en rouge dans le tableau d'optimisation générale.

Le test de cet ensemble de paramètres du conseiller expert ne sera pas exécuté et l'agent est libre de recevoir une nouvelle tâche.

À la réception de cette valeur, le testeur de stratégie est assuré de ne pas transmettre cette tâche à d'autres agents pour une exécution répétée.

INIT_AGENT_NOT_SUITABLE

Pas d'erreur pendant l'initialisation, mais pour une raison quelconque, l'agent donné ne convient pas pour les tests. Par exemple, une mémoire vive insuffisante, la prise en charge d'OpenCL, etc.

Après le retour de ce code, l'agent ne recevra pas de tâches jusqu'à la fin de cetteoptimisation.

La fonction OnInit() de type void signifie toujours une initialisation réussie.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quand j'écris du code le week-end, j'insère OnTick dans OnInit. Et tout va bien, même s'il n'y a pas de nouvelles tiques qui arrivent.
 
Sergey Gritsay:


Mais ce n'est pas écrit dans la documentation

OnInit

Lafonction OnInit() est le gestionnaire de l'événement OnInit. Il peut être de typevoid ouint, et n'a pas de paramètres:

voidOnInit() ;

L'événement Init est généré immédiatement après le chargement d'un conseiller expert ou d'un indicateur.

Il est dit que c'est une fonction.

Avant OnInit et après OnDeinit il y a des appels de constructeurs/destructeurs d'objets globaux (imprécision dans l'aide). C'est pourquoi, par exemple dans les indicateurs, vous pouvez déclarer des tampons d'indicateurs sans OnInit. Les rudiments sont les suivants.

 
Larecherche de FullOnCalculate conduit immédiatement à un grand nombre de caractéristiques complètement non documentées du travail avec les tampons d'indicateurs dans MT4/MT5 - par endroits, ils diffèrent sérieusement.
 
Voici ma vision finale de la solution au problème :
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
Disons qu'un indicateur a ces paramètres :
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
alors le tableau de couleurs sera le suivant :
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
};

Si le tableau est plus petit, seule une partie des couleurs est transférée. Si le tableau est plus grand, il est rogné.

Pour les tableaux de largeur et de style, le principe est le même.

 
fxsaber:

Dans OrderSendSync, la fonction surchargée (voir ci-dessus) HistoryDealSelect est appelée.

Comment puis-je déterminer l'heure d'ouverture de la dernière position et l'heure de fermeture de la dernière position ?

Et de manière générale, j'aimerais connaître les principes généraux et les algorithmes permettant d'obtenir des informations sur les positions ouvertes/fermées sur mql5.

Qu'est-ce qui doit être pris en compte, quelles sont les spécificités du moment ?

 
Artyom Trishkin:

Comment puis-je déterminer l'heure d'ouverture de la dernière position et l'heure de fermeture de la dernière position ?

En général, j'aimerais connaître les principes généraux et les algorithmes permettant d'obtenir des informations sur les positions ouvertes/fermées dans mql5.

Que faut-il prendre en considération, quelles sont les particularités du moment ?


Tout cela est déterminé en sélectionnant l'historique des ordres et des transactions, puis en lisant les propriétés des ordres.

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

IDENTIFICATEUR DE POSITION

L'identifiant du poste est un numéro unique, qui est attribué à chaque poste nouvellement ouvert et ne change pas pendant toute sa durée de vie. Il correspond au ticket de l'ordre avec lequel la position a été ouverte.

L'identifiant de la position est spécifié dans chaque ordre (ORDER_POSITION_ID) et dans chaque transaction (DEAL_POSITION_ID) qui l'a ouvert, modifié ou fermé. Utilisez cette propriété pour rechercher les ordres et les transactions liés à la position.

Lorsqu'une position est inversée en mode compensation (une seule opération d'entrée/sortie), l'identifiant POSITION_IDENTIFIER de la position n'est pas modifié. Cependant, POSITION_TICKET est changé en ticket d'ordre qui a entraîné l'annulation. En mode couverture, il n'y a pas d'inversion de position.

long


Et en utilisant les propriétés de l'énumération ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

Entrée sur le marché

DEAL_ENTRY_OUT

Sortie du marché

DEAL_ENTRY_INOUT

Demi-tour

DEAL_ENTRY_OUT_BY

Fermer le comptoir