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

 
Pineapple88:

Bonjour !

J'essaie de comprendre les tableaux et j'ai la question suivante.

Pourquoi utiliserArraySetAsSeries dans cet exemple et mettre le drapeau vrai, si dansCopyRates le comptage est fait du présent au passé ?

Je comprends que la fonctionArraySetAsSeries est nécessaire pour rechercher le tableau du présent au passé.

Je veux comprendre l'utilité de cette fonction dans cet exemple.

Après

ArraySetAsSeries(rates,true); 

rates[0] correspondra à la BARRE DROITE dans le graphique. C'est l'explication la plus simple, sans les termes confus de "présent" et "futur".

 
Vladimir Karputov:

Après

Les taux [0] correspondront à la BARRE DROITE sur le graphique. C'est l'explication la plus simple, sans les termes confus de "présent" et "futur".

Merci pour la réponse !

Mais si nous n'utilisons pasArraySetAsSeries,CopyRates affectera également les taux[0] à la barre la plus à droite du graphique.

J'essaie juste de comprendre à quoi sert la fonctionArraySetAsSeries alors qu'elle fonctionne de la même manière sans elle ?

Ou c'est juste une forme acceptée d'écriture de code?

 
Pineapple88:

Merci pour la réponse !

Mais si nous n'utilisons pasArraySetAsSeries,CopyRates affectera également les taux[0] à la barre la plus à droite du graphique.

J'essaie juste de comprendre pourquoi la fonctionArraySetAsSeriesest nécessaire alors qu'elle fonctionne de la même manière sans elle ?

Ou c'est juste une forme acceptée d'écriture de code?

vous avez tort, CopyRates attribue le taux [0] à la valeur la plus ancienne en raison de la taille du tableau rate[].
 
Anatolii Zainchkovskii:
vous avez tort, CopyRates assigne rate[0] à la valeur la plus ancienne en raison de la taille du tableau rate[].

Merci !

Maintenant je comprends, j'avais tort)

 

Bonjour !

Une fois de plus, je demande de l'aide !

J'ai écrit un code avec la condition "acheter" quand MA(20) croise MA(50) de bas en haut.

input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(BigMovingAverageArray[1] < SmallMovingAverageArray[1])
   if(BigMovingAverageArray[2] > SmallMovingAverageArray[2])
        {
         Print("buy");
        }
  }

Mais en fait, il s'exécute comme ceci

Dossiers :
n2b3h1.png  140 kb
 
Pineapple88:

Bonjour !

Une fois de plus, je demande de l'aide !

J'ai écrit un code avec la condition "acheter" quand MA(20) croise MA(50) de bas en haut.

Mais en fait, cela se passe comme suit

Erreur grossière : vous créez deux poignées d'indicateur sur chaque tick. La manière correcte de procéder est la suivante

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

déplacer vers OnInit, ajouter une vérification de l'exactitude de la poignée.


De même, les tableaux qui prennent des valeurs de l'IMA doivent être faits

ArraySetAsSeries(SmallMovingAverageArray,true);  
ArraySetAsSeries(BigMovingAverage,true)
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 

Merci beaucoup pour votre réponse rapide !

J'ai compris pourArraySetAsSeries.

Je vais essayer de trouver comment déplacer l'indicateur vers OnInit, et vérifier le handle.

***

 
Pineapple88:

Merci beaucoup pour votre réponse rapide !

J'ai compris pourArraySetAsSeries.

Je vais essayer de trouver comment déplacer l'indicateur vers OnInit, et vérifier le handle.

***

Tout est là depuis le début

  • dans la documentation :iMA
  • MetaEditor - Expert Advisor [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

Tout est là depuis le début.

  • dans la documentation :iMA
  • dans MetaEditor - EA [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Merci, je vais étudier

 

Je l'ai corrigé, tout semble fonctionner).

J'ai transféré deux indicateurs MA à la fonction OnInit.

Je comprends que nous créons seulement le handle de l'indicateur dans la fonction OnInit et que nous effectuons toutes les autres manipulations avec les tableaux dans la fonction OnTick et que nous le vérifions à chaque tick ?

int SmallMovingAverageDefinition = 0;
int BigMovingAverageDefinition   = 0;
input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


int OnInit()
  {
//---
   SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   if(SmallMovingAverageDefinition==INVALID_HANDLE  || BigMovingAverageDefinition==INVALID_HANDLE)
     {
      Print("Ошибка создания хендла");
     }
//---
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
//---

  }


void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   ArraySetAsSeries(SmallMovingAverageArray,true);
   ArraySetAsSeries(BigMovingAverageArray, true);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(SmallMovingAverageArray[1] > BigMovingAverageArray[1])
      if(SmallMovingAverageArray[2] < BigMovingAverageArray[2])
        {
         Print("buy");
        }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...