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

 
Roman:

Il est nécessaire de penser à l'avance comment le code est exécuté au niveau de la mémoire, de l'initialisation et du retour de la valeur.

Vous n'avez pas besoin d'y réfléchir, il existe des manuels pour ces choses, et il n'y a jamais eu de manuel pour l'allocation de mémoire dans MQL, seulement des messages des développeurs, et souvent avec une précision que l'implémentation peut changer...

Ok, la discussion se résume à qui lit quel livre sur la programmation, je le lis depuis le lycée et le fais encore depuis 30 ans.

 
Igor Makanu:

Vous n'avez pas besoin d'y réfléchir, il existe des manuels pour ces choses, et il n'y a jamais eu de manuel pour l'allocation de mémoire dans MQL, seulement des messages des développeurs, et souvent avec une précision que l'implémentation peut changer...

Ok, la discussion se résume à qui lit quel livre de programmation, je le lis depuis le lycée et je continue à le lire depuis 30 ans...

Bien sûr, vous n'avez pas à y réfléchir, pourquoi le feriez-vous... Le compilateur le fera tout seul. ))
C# n'est pas C

Et regardez la vidéo sur __inline.
Il y est expliqué comment les fonctions fonctionnent en mémoire pour ceux qui ne font pas de différence.

 
Vladimir Karputov:

Faites d'abord un dessin et précisez ce qu'est pour vous la "barre de zéro" d'un indicateur avec le paramètre shift.

Dessiné. La barre de zéro est mise en évidence par une ligne verticale.


 
RickD:

Dessiné. La barre de zéro est mise en évidence par une ligne verticale.


Exemple de code :

//+------------------------------------------------------------------+
//|                                        iMA Values on a Chart.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- input parameters
input int                  Inp_MA_ma_period     = 12;          // MA: averaging period
input int                  Inp_MA_ma_shift      = 5;           // MA: horizontal shift
input ENUM_MA_METHOD       Inp_MA_ma_method     = MODE_SMA;    // MA: smoothing type
input ENUM_APPLIED_PRICE   Inp_MA_applied_price = PRICE_CLOSE; // MA: type of price
//---
int    handle_iMA;                           // variable for storing the handle of the iMA indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iMA
   handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double array_ma[];
   ArraySetAsSeries(array_ma,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iMA,0,start_pos,count,array_ma))
      return;

   string text="";
   for(int i=0; i<count; i++)
      text=text+IntegerToString(i)+": "+DoubleToString(array_ma[i],Digits()+1)+"\n";

   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+

Résultat :


Comme vous pouvez le voir, il est copiable sans aucune modification.

Dossiers :
 
Vladimir Karputov:

Exemple de code :

Résultat :


Comme vous pouvez le voir, il est copié facilement, sans tambourin.

Exemple de code. Sur la base d'un indicateur. L'indicateur est occupé à allouer la mémoire tampon.

#property copyright "Copyright 2019"
#property link      ""
#property version   "1.00"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0

//---

input int                  MA_period = 12;
input int                  MA_shift = 5;
input ENUM_MA_METHOD       MA_method = MODE_SMA;
input ENUM_APPLIED_PRICE   MA_applied_price = PRICE_CLOSE;

int start_pos = 0;

//---

double MA_Calc_Buf[];

int hMA = INVALID_HANDLE;


int OnInit()
{
  SetIndexBuffer(0, MA_Calc_Buf, INDICATOR_CALCULATIONS); 
  ArraySetAsSeries(MA_Calc_Buf, true);
 
  hMA = iMA(NULL, 0, MA_period, MA_shift, MA_method, MA_applied_price);   
  if (hMA == INVALID_HANDLE)
  {
    int LErr = GetLastError();
    PrintFormat("iMA create failed (%d)", LErr);
    return (INIT_FAILED);
  }
 
  return (INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
  if (hMA != INVALID_HANDLE)
  {
    IndicatorRelease(hMA);
    hMA = INVALID_HANDLE;
  }
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{ 
  int copied;
  copied = CopyBuffer(hMA, 0, start_pos, rates_total, MA_Calc_Buf);
  if (copied == -1)
  {
    int LErr = GetLastError();
    PrintFormat("CopyBuffer(hMA) failed (%d)", LErr);
    return (prev_calculated);
  }
 
  if (copied == 0)
  {
    PrintFormat("CopyBuffer(hMA) copied 0 bars");
    return (prev_calculated);
  } 
 
  string text = "";
  for (int i=0; i<15; i++)
    text = text + IntegerToString(i) + ": " + DoubleToString(MA_Calc_Buf[i], Digits()+1) + "\n";
 
  Comment(text);

  return (rates_total);
}

Lorsque start_pos = 0, la valeur correspondant à la 0ème barre du graphique est sur la position 5. 1.017041 Il est sur la position 0 dans votre EA. Ok.


Mais j'ai besoin d'obtenir cette valeur à la position zéro.

J'ai réglé start_pos = 5. Je n'obtiens pas le résultat escompté. La valeur que je recherche se trouve à nouveau à la position 5.


J'ai réglé start_pos = -5. Je n'obtiens pas le résultat souhaité. Encore une fois, la valeur que je recherche se situe à la position 5.


J'ai réglé start_pos = -10. Et ce n'est que maintenant que j'obtiens le résultat souhaité.


 
RickD:

Exemple de code. Sur la base de l'indicateur. L'indicateur est occupé à allouer de la mémoire tampon.

Lorsque start_pos = 0, la valeur correspondant à la 0ème barre du graphique est affichée à la position 5. 1.017041 Dans votre EA il est sur la position 0. Ok.


Mais j'ai besoin d'obtenir cette valeur à la position zéro.

J'ai réglé start_pos = 5. Je n'obtiens pas le résultat souhaité. La valeur que je recherche se trouve à nouveau à la position 5.


J'ai réglé start_pos = -5. Je n'obtiens pas le résultat souhaité. Encore une fois, la valeur que je recherche se situe à la position 5.


J'ai réglé start_pos = -10. Et ce n'est que maintenant que j'obtiens le résultat souhaité.


Nous devons comprendre la différence entre le travail du conseiller expert et celui de l'indicateur. Pour le travail à partir de l'indicateur, utilisez l'exemple de l'aide(iMA).

Документация по 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:

Vous devez comprendre la différence entre opérer à partir d'un EA et d'un indicateur. Pour travailler à partir d'un indicateur, utilisez l'exemple de l'aide(iMA).

Vous prenez donc un exemple de l'aide iMA, ajoutez

   ArraySetAsSeries(iMABuffer, true);
   comm = (string)DoubleToString(iMABuffer[0], Digits());
   ArraySetAsSeries(iMABuffer, false);

   Comment(comm);   

et vérifiez que la valeur est différente de la valeur de sortie de votre EA d'exactement ma_chiffre de barres.

Moi, par contre, j'ai besoin d'obtenir dans l'indicateur dans iMABuffer[0] la valeur que vous avez dans votre Expert Advisor dans array_ma[0].

Au moins pour le moment, nous pouvons voir que le comportement de CopyBuffer pour les Expert Advisors et les indicateurs est différent. Si vous comprenez la différence de CopyBuffer lorsque vous travaillez avec un EA et un indicateur, veuillez indiquer la section appropriée de la documentation à étudier.

 

Je vais essayer de simplifier la question. Comment puis-je obtenir ces valeurs MA (à partir de la ligne verticale rouge et vers la gauche) dans le tampon de l'indicateur ? Pouvez-vous rédiger un exemple ?


 
RickD:

Je vais essayer de simplifier la question. Comment puis-je obtenir ces valeurs MA (à partir de la ligne verticale rouge et vers la gauche) dans le tampon de l'indicateur ? Pouvez-vous rédiger un exemple ?


Dans la capture d'écran, l'affichage du tampon est décalé de cinq barres vers la droite. Donc - pour obtenir la cinquième barre du tampon de l'indicateur (index 4), et plus à gauche dans la liste, où devons-nous les prendre ? Du tampon [4] et plus loin sur la gauche.

En théorie. En pratique - je n'ai pas ouvert le code de l'indicateur ni travaillé avec lui depuis longtemps - presque un an... Essayez-le.

 
Artyom Trishkin:


En théorie. En pratique - je n'ai pas ouvert le code de l'indicateur ni travaillé avec lui depuis longtemps - presque un an... Essayez-le.

Tu ne peux pas perdre une compétence.