Questions des débutants MQL5 MT5 MetaTrader 5 - page 1308

 
Bonjour ! Pouvez-vous me dire comment passer un type de données enum aux méthodes de classe? Disons que je veux passer un délai. Je crée un enum dans l'en-tête d'un conseiller.
   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };


Puis je déclare une méthode dans une classe.
public:
                     Signal_Line();
                    ~Signal_Line();
   double               Time_Frame(double &Trend_Line_Down[][], int Frame, int Down);

   int               Short_Proboy(double &Trend_Line_Down[][], string Name_Static, int Down, ENUM_TIMEFRAMES);
Et lorsque j'appelle une méthode depuis une EA, si je dois passer la troisième valeur de l'énumération - frame - PERIOD_M30, que dois-je écrire dans les questions de code ci-dessous ?
         Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, ???);     // Флаг пробоя трендовой нулевой свечой
 
Si vous y pensez, c'est un peu tentant d'écrire...
 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, frame1 3);     // Флаг пробоя трендовой нулевой свечой

Mais il écrit une erreur lors de la compilation. Quel pourrait être le piège ?

 
Kira27:
Bonjour ! Pouvez-vous me dire comment passer un type de données d'énumération dans les méthodes de classe? Disons que je veux passer un délai. Je crée dans l'en-tête de l'EA de l'énumération
Puis je déclare la méthode dans la classe.
Et lorsque j'appelle une méthode depuis une EA, si je dois passer la troisième valeur de l'énumération - frame - PERIOD_M30, que dois-je écrire dans les questions de code ci-dessous ?

Question 1 : Pourquoi créer votre propre énumération alors que vous disposez de la normeENUM_TIMEFRAMES

 

Question sur le coût d'une tique.

Pour quelle taille de contrat (taille de lot) cette valeur est-elle calculée ?

Par exemple, pour la paire de devises EURUSD, ce script donne les mêmes valeurs, mais pour les métaux, la différence est de 10 fois. Comment, pourquoi et comment puis-je le savoir ?

int OnStart()
  {
//---
    // цена тика для символа
    double symb_tick_price = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
    // рассчитаная цена символа (для Forex, CFD - формула из справки)
    // Profit  = (close_price - open_price) * Contract_Size * Lots
    // т.е. берем размер тика и считаем по этой формуле
    // -> TickPrice  = TickSize * Contract_Size * Lots
    double symb_lot_size = 1.0;
    double symb_tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
    double symb_contract_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_CONTRACT_SIZE);
    double calc_symb_tick_price = symb_tick_size * symb_contract_size * symb_lot_size;
    PrintFormat("Цена тика SYMBOL_TRADE_TICK_VALUE=%f, Цена тика ВЫЧИСЛЕННАЯ=%f", symb_tick_price, calc_symb_tick_price);
//---
   return(INIT_SUCCEEDED);
  }


NG      0       13:31:42.450    testTickPrice (EURUSD,H1)       Цена тика SYMBOL_TRADE_TICK_VALUE=1.000000, Цена тика ВЫЧИСЛЕННАЯ=1.000000
OE      0       13:31:56.924    testTickPrice (XAGUSD,H1)       Цена тика SYMBOL_TRADE_TICK_VALUE=0.500000, Цена тика ВЫЧИСЛЕННАЯ=5.000000
CE      0       13:40:00.848    testTickPrice (XAUUSD,H1)       Цена тика SYMBOL_TRADE_TICK_VALUE=0.100000, Цена тика ВЫЧИСЛЕННАЯ=1.000000
 
Kira27:
Si vous y réfléchissez, il semble que ce soit demander d'écrire

Mais il écrit une erreur lors de la compilation. Quel pourrait être le piège ?

Si vous faites cette énumération

enum frame1 // перечисление именованных констант
 {
  m1  = PERIOD_M1,
  m5  = PERIOD_M5,
  m15 = PERIOD_M15,
  m30 = PERIOD_M30,
  h1  = PERIOD_H1,
  h4  = PERIOD_H4,
  d1  = PERIOD_D1,
  W1  = PERIOD_W1,
  MN1 = PERIOD_MN1
 };

alors vous pouvez essayer de l'écrire comme ceci

 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, (ENUM_TIMEFRAMES)m30);     // Флаг пробоя трендовой нулевой свечой
 
Alexey Viktorov:

Si vous faites cette énumération

vous pourriez essayer de l'écrire comme ceci

... et dans un mois, tu essaieras de comprendre ce que ça veut dire ))))

Si vous devez écrire un tel code, écrivez-le au moins en int.

enum frame1 // перечисление именованных констант
 {
  m1  = (int)PERIOD_M1,
  m5  = (int)PERIOD_M5,
  m15 = (int)PERIOD_M15,
  m30 = (int)PERIOD_M30,
  h1  = (int)PERIOD_H1,
  h4  = (int)PERIOD_H4,
  d1  = (int)PERIOD_D1,
  W1  = (int)PERIOD_W1,
  MN1 = (int)PERIOD_MN1
 };

afin que vous puissiez au moins comprendre ce que l'auteur obtient en sortie.

...Bien que ce soit une perversion ))))

 
Igor Makanu:

... et un mois plus tard, tu essaieras de comprendre ce que cela signifie. ))))

Si vous devez écrire un tel code, écrivez-le au moins en int.

afin que vous puissiez au moins comprendre ce que l'auteur obtient en sortie.

...Bien que ce soit une perversion ))))

Pourquoi le convertir en int ? Parce que dans mql5, à partir de H1, la valeur de l'énumération n'est pas égale au nombre de minutes. Et au contraire, je pense que cela va causer beaucoup de confusion.

 
Alexey Viktorov:

Pourquoi convertir en int ? Parce que dans mql5, à partir de H1, la valeur de l'énumération n'est pas égale au nombre de minutes. Et à mon avis, au contraire, cela va provoquer beaucoup de confusion.

Parce que enum est une constante nommée de 4 octets = int

pas le nombre de minutes

 
Vladimir Karputov:

Question 1 : Pourquoi créer votre propre énumération s'il existe unENUM_TIMEFRAMES standard ?

Réponse)) Dessiner un objet graphique dans le nom de l'objet il y a une sous-chaîne M30 disant où cet objet a été créé, et quand j'écris les données de l'objet dans le tableau double, en utilisant la division du nom en sous-chaînes, je compare l'index 0 du tableau avec un nom brisé, par énumération brute avec un tableau

//____________________string Массив таймфреймов______________________________
   NameFrame_Trend_Line[1]="M1";
   NameFrame_Trend_Line[2]="M5";
   NameFrame_Trend_Line[3]="M15";
   NameFrame_Trend_Line[4]="M30";
   NameFrame_Trend_Line[5]="H1";
   NameFrame_Trend_Line[6]="H4";
   NameFrame_Trend_Line[7]="Daily";
   NameFrame_Trend_Line[8]="Weekly";
   NameFrame_Trend_Line[9]="Monthly"; 

Trouver l'index de la chaîne égale dans le tableau

NameFrame_Trend_Line

associe l'index au tableau d'int

//___________________int Массив таймфреймов__________________________________________
   TimeFrame[1]=1;
   TimeFrame[2]=5;
   TimeFrame[3]=15;
   TimeFrame[4]=30;
   TimeFrame[5]=60;
   TimeFrame[6]=240;
   TimeFrame[7]=1440;
   TimeFrame[8]=10080;
   TimeFrame[9]=43200;

obtenu, j'écris la valeur dans le tableau double, en stockant les caractéristiques des objets du graphique. Ensuite, pour suivre la ligne de rupture, de fixation et de test, j'utilise une méthode, dans laquelle je dois passer le paramètre timeframe du tableau double écrit ; parce que les lignes sont créées sur différents horizons temporels, le calcul de la rupture, de la fixation, du test doit être calculé selon l'horizon temporel des objets créés, indépendamment de la période qui est sur le graphique en ce moment. J'ai prévu d'associer la valeur du tableau

TimeFrame

écrit dans le tableau des caractéristiques des objets graphiques à extraire du tableau par l'index

   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };
et le transfert vers la méthode de calcul des pannes, des ancrages et des tests.
 
Igor Makanu:

car enum est une constante nommée de 4 octets = int

et non le nombre de minutes.

Et alors ? Ont-ils quelque chose de différent dans l'enum ENUM_TIMEFRAMES ? Ou bien la peur de manquer de mémoire? Je ne sais pas comment m'amuser comme ça...


ps ; Ah, comme je suis lent à taper...)))) Pendant que je tapais une seule ligne, Kira27 a tapé beaucoup de......... et quelque chose que je soupçonne d'être utilisé dans mql4.