Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 508

 
J'ai toutes sortes d'absurdités comme des paramètres d'indicateurs etc. comme paramètres dans ma classe. En général, les choses qui seront statiques et identiques. Alors pourquoi devrais-je passer ces valeurs à chaque fois que je crée un objet?
 
STARIJ:

Est-ce plus court ? bool barup=... WindowRedraw() ; s'exécutera toujours - tiré de if

il peut aussi être plus court ... voir mon dossier

Merci. Comment définir correctement l'intervalle auquel les niveaux de Fibo sont tracés ? S'il est (heure) 9h00, il devrait tirer des niveaux de 8h00 à 8h59 sur М1.
 
Juer:

Un peu comme l'énoncé de la question est clair, n'est-ce pas. Le but est d'initialiser la même chose.

Comment allez-vous initialiser quelque chose qui n'existe pas encore ? Une fois l'objet créé, il commence à exister, et c'est à ce moment-là qu'il peut être initialisé.

Je vous l'ai dit tout de suite - faites d'un objet un constructeur paramétrique, et passez-lui les paramètres requis, qui seront utilisés pour initialiser l'objet nouvellement créé.

Vous pouvez passer des paramètres par le biais d'une structure, que vous remplissez avec les données requises (constantes pour tous ces objets) dans OnInit() du programme. Ensuite, dans OnTick(), par exemple, ou dans tout autre handler standard, vous créez vos objets, mais lors de la création, vous écrivez ce qui suit :
CMyObject object = new CMyObject(a_here_structure_with_set_parameters) ;

Ou, si les données de l'objet ne changent pas d'un programme à l'autre et ont toujours les mêmes valeurs, alors il faut les initialiser explicitement avec les paramètres requis dans le constructeur par le biais de la liste d'initialisation, comme Igor l'a dit plus haut :

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

Toutes les questions des débutants sur MQL4, aide et discussion sur les algorithmes et les codes

Ihor Herasko, 2018.03.28 17:31

Cela se fait dans la liste d'initialisation, qui se trouve dans le constructeur de la classe :

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

Comment allez-vous initialiser quelque chose qui n'existe pas encore ? Une fois l'objet créé, il commence à exister, et c'est à ce moment-là qu'il peut être initialisé.

Je vous l'ai dit tout de suite - faites d'un objet un constructeur paramétrique, et passez-lui les paramètres requis, qui seront utilisés pour initialiser l'objet nouvellement créé.

Vous pouvez passer des paramètres à travers une structure, que vous remplirez avec les données requises (constantes pour tous ces objets) dans OnInit() du programme. Ensuite, dans OnTick(), par exemple, ou dans tout autre handler standard, vous créez vos objets, mais à la création vous écrivez ce qui suit :
CMyObject object = new CMyObject(a_here_structure_with_set_parameters) ;

Oui, je vois. Merci. J'ai pensé qu'il existait une solution pour que, lorsqu'un objet est créé, il dispose immédiatement de paramètres prédéfinis sans avoir à les passer au constructeur ou autre. Par le biais d'une classe de parents ou autre.

 
Juer:
Dans ma classe, j'ai toutes sortes de choses comme des paramètres d'indicateurs etc. comme paramètres. En général, les choses qui seront statiques et identiques. Alors pourquoi devrais-je passer ces valeurs à chaque fois que je crée un objet?

Alors ne le transmettez pas. Initialiser dans la liste d'initialisation, comme je l'ai montré. Au moment de créer une instance de la classe, le constructeur de la classe sera automatiquement appelé, ce qui initialisera tous les membres de la classe, spécifiés dans la liste d'initialisation. Placez la fonction Print dans la méthode CCandle et vous verrez comment le constructeur est appelé sans aucune référence à celui-ci.

 
Juer:

Oui, je vois. Merci. J'ai pensé qu'il existait une solution pour que, lorsqu'un objet est créé, il ait immédiatement des paramètres prédéfinis sans avoir à les passer au constructeur ou autre. Via une classe parentale ou autre.

Encore une fois. Vous pouvez le faire sans transférer les données au constructeur.

 
Ihor Herasko:

Alors ne le transmettez pas. Initialiser dans la liste d'initialisation, comme je l'ai montré. Au moment de créer une instance de la classe, le constructeur de la classe sera automatiquement appelé, ce qui initialisera tous les membres de la classe, spécifiés dans la liste d'initialisation. Placez la fonction Print dans la méthode CCandle et vous verrez comment le constructeur est appelé sans aucune référence à celui-ci.

Je ne comprends pas, quelle différence cela fait-il de les passer par le constructeur ou par la fonction d'initialisation ?

 
Ihor Herasko:

Alors ne le transmettez pas. Initialiser dans la liste d'initialisation, comme je l'ai montré. Au moment de créer une instance de la classe, le constructeur de la classe sera automatiquement appelé, ce qui initialisera tous les membres de la classe, spécifiés dans la liste d'initialisation. Placez la fonction Print dans la méthode CCandle et voyez comment le constructeur est appelé sans aucune référence à cette fonction.

Avec quoi seront-ils initialisés ? Avec quelles valeurs ? Je ne comprends pas.

Supposons que j'ai des valeurs initiales dans les paramètres d'entrée de l'Expert Advisor. Je dois donc les passer à chaque objet de la classe. Mais pas pour les passer à chaque objet nouvellement créé.

 

comment se fait-il que dans ce cycle mon ordre limite ne soit supprimé que si après avoir placé un ordre limite sur la barre suivante, un autre ordre limite n'a pas été placé, c'est-à-dire qu'un ordre limite n'est supprimé que s'il est placé puis suivi de deux barres sans ordre limite.

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

Avec quoi seront-ils initialisés ? Avec quelles valeurs ? Pas clair

Ceux que vous écrivez dans la liste d'initialisation.

Supposons que j'ai initialisé des valeurs dans les paramètres d'entrée du conseiller expert. Donc, je dois les passer à chaque objet de cette classe. Mais pas pour les passer à chaque objet nouvellement créé.

C'est ici :

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

Si on l'exécute, on obtient :

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed
Raison: