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

 
MrBrooklin #:

Qu'est-ce que vous ne comprenez pas exactement ? Comment créer une fonction d'initialisation EA ? Alors essayez d'étudier cet article pour débutants.

Cordialement, Vladimir.

et que signifie initialiser))))) ce n'est pas clair pour une personne)))))

 
Valeriy Yastremskiy #:

et ce que vous entendez par initialisation))))) c'est un peu flou pour la personne)))))

Bonsoir, Valery ! Nous ouvrons l'article proposé à la personne et y trouvons d'abord une brève description :

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

et ensuite une description plus détaillée :

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

D'une manière générale, il devrait au moins commencer par lire cet article. ))

Cordialement, Vladimir.

 

Bonjour à tous !

Je poursuis mon auto-apprentissage et j'ai de nouveau rencontré une confusion. Voici le code du script :

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

Le script devait dessiner une ligne de tendance sous forme de segment. Pour ce faire, j'ai défini le point initial et le deuxième point pour dessiner ce segment. La documentation indique également qu'il faut deux points d'ancrage pour créer une ligne de tendance. Je pense avoir fait tout ce qu'il fallait. D'après ce que je comprends, le deuxième point est également un point extrême, mais pour une raison quelconque, il n'est pas dessiné comme un segment, mais comme un rayon.


Pourriez-vous me dire où je me suis trompé ?

Cordialement, Vladimir.

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

Merci Artyom, je n'avais pas assez d'intelligence pour comprendre une chose aussi simple et évidente. Que Dieu vous bénisse !

Bien à vous, Vladimir.

 

Bonjour et bonne humeur à tous !

Ça y est ! "J'arrive, ton toit !" C'est moi. Je lance le script :

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

et j'obtiens ceci :

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

et il devrait y avoir deux positions courtes. Pourriez-vous me dire où j'ai fait une erreur ?

Cordialement, Vladimir.

 
MrBrooklin #:

Bonjour et bonne humeur à tous !

Ça y est ! "J'arrive, ton toit !" C'est moi. C'est moi qui dirige le scénario :

et j'obtiens ceci :

et il devrait y avoir deux positions courtes. Pourriez-vous me dire où j'ai fait une erreur ?

Cordialement, Vladimir.

Les deux dernières impressions

affichent la valeur des variables

uint count_buy=0, count_sell=0;

qui sont initialisées, mais rien ne leur a été affecté par la suite.
En d'autres termes, tout fonctionne comme écrit - pas de miracle.

 
Alexander Sevastyanov #:

Les deux dernières impressions

donnent la valeur des variables

qui sont initialisées, mais rien ne leur a été affecté par la suite.
C'est-à-dire que tout fonctionne comme écrit - pas de miracle.

Bonjour, Alexander. C'est là que j'ai été déconcerté. Qu'est-ce qui doit être affecté ? Je pense que la fonction Calc_Pos(count_buy, countsell) devrait fonctionner, ou ai-je mal compris ?

Cordialement, Vladimir.

 
MrBrooklin #:

Bonjour, Alexander. C'est là que j'ai eu un problème. Qu'est-ce qui doit être assigné ? Je pense que la fonction Calc_Pos(count_buy, countsell) devrait fonctionner, ou ai-je mal compris ?

Cordialement, Vladimir.

1. Vous déclarez et initialisez deux variables.

uint count_buy=0, count_sell=0;

2. Vous transmettez leurs valeurs à la fonction.

Calc_Pos(count_buy,count_sell);

La raison de cette opération n'est pas très claire.
Vous affichez ensuite les valeurs de ces variables. Mais elles n'ont été modifiées nulle part,
respectivement, et des zéros sont imprimés. Tout fonctionne comme écrit.

P.S. J'essaie de comprendre votre plan : vous pouvez déclarer ces deux variables globales.
Par exemple, comme ceci :

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1. Vous déclarez et initialisez deux variables.

2. Vous transmettez leurs valeurs à la fonction.

La raison de cette opération n'est pas très claire.
Vous imprimez ensuite les valeurs de ces variables. Mais elles n'ont été modifiées nulle part,
respectivement et sont imprimées avec des zéros. Tout fonctionne comme écrit.

P.S. J'essaie de comprendre votre plan : vous pouvez déclarer ces deux variables globales.
Par exemple, comme ceci :

Merci beaucoup, Alexander. Votre correction a permis au code de fonctionner. Pour être honnête, je me suis rendu compte que j'étais moi-même confus sur trois points. Il faut que je réétudie le passage d'arguments à une fonction. Apparemment, je n'ai rien compris.

Cordialement, Vladimir.

Raison: