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

 
Alexey Viktorov:

C'est difficile de comprendre quoi que ce soit avec ces noms. Je n'ai aucun problème à connecter des indicateurs en tant que ressources.


La présence d'un code source (.mq5) est-elle nécessaire ?

Alexey Viktorov:

Qu'est-ce que cela a à voir avec

Cela affecte-t-il la connexion d'une ressource ?

 
Сергей Таболин:

La disponibilité de la source (.mq5) est-elle obligatoire ?

c'est plus rapide à vérifier, ici j'ai fait une connexion via une ressource dans MT5, je ne vois pas de problèmes

// close.mql5
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double buff[];

int OnInit()
  {
   SetIndexBuffer(0,buff,INDICATOR_DATA);
   return(INIT_SUCCEEDED);
  }

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 i,limit;
   if(prev_calculated==0) limit=0; else limit=prev_calculated-1;
   for(i=limit;i<rates_total;i++) buff[i]=close[i];
   return(rates_total);
  }

et connecter cet indicateur comme une ressource, puis j'ai enlevé cet indicateur pour vérifier si l'appel vient vraiment des ressources :

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#resource "close.ex5"

//--- indicator buffers
double         Label1Buffer[];
int handle;

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   handle = iCustom(Symbol(),0,"::close.ex5");
   if(handle == INVALID_HANDLE)                                         // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_MA");             // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                 // завершаем работу с ошибкой
   }
//---
   return(INIT_SUCCEEDED);
  }

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 copy=CopyBuffer(handle,0,0,rates_total,Label1Buffer); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Igor Makanu:

c'est plus rapide à vérifier, ici j'ai fait une connexion dans MT5 via une ressource, je ne vois aucun problème

et connecter cet indicateur comme une ressource, ensuite j'ai enlevé cet indicateur pour vérifier si l'appel vient vraiment des ressources :

//+------------------------------------------------------------------+
//|                                                       myHMA5.mq5 |
//|                                          Copyright 2019.03, Test |
//|                                         /ru |
//+------------------------------------------------------------------+
#property   copyright               "Copyright 2019, Test"
#property   link                    "/ru"
#property   version                 "1.21"
//----------------------------------------------------------------------------------------------
#resource   "\\Indicators\\Market\\HMA5.ex5"
//----------------------------------------------------------------------------------------------
//#property   strict
#property   indicator_chart_window
#property   indicator_buffers       3
#property   indicator_plots         1

#property   indicator_label1        "myHMA5"
#property   indicator_type1         DRAW_COLOR_LINE
#property   indicator_color1        clrLime,clrRed
#property   indicator_style1        STYLE_SOLID
#property   indicator_width1        2 
//----------------------------------------------------------------------------------------------
//--- input parameters
input int      InpPeriodMA          = 45; // MA period
//--- indicator buffers
double         Buffer0[];
double         Buffer1_Color[];
int            handle_MA;                 // переменная для хранения хэндла индикатора HMA5
double         buffer_MA[];               // массив для хранения значений индикатора HMA5
int            ma_bars_calculated   = 0; 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buffer0         ,true);
   ArraySetAsSeries(Buffer1_Color   ,true);
   ArraySetAsSeries(buffer_MA       ,true);

   SetIndexBuffer(0,Buffer0         ,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer1_Color   ,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,buffer_MA       ,INDICATOR_CALCULATIONS);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,-1);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,-1);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,-1);
//--- set shortname and change label
   string short_name="myHMA5("+
                              IntegerToString(InpPeriodMA)
                              +")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpPeriodMA);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpPeriodMA);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpPeriodMA);

   handle_MA = iCustom(Symbol(),0,"::Indicators\\Market\\HMA5.ex5",InpPeriodMA);
   if(handle_MA == INVALID_HANDLE)                                         // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_MA");             // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                 // завершаем работу с ошибкой
   }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 ma_values_to_copy; 
   int ma_calculated = BarsCalculated(handle_MA); 
   if(ma_calculated <= 0){ 
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",ma_calculated,GetLastError()); 
      return(0); 
     }  
   if(prev_calculated == 0 || ma_calculated != ma_bars_calculated || rates_total > prev_calculated + 1){ 
      if(ma_calculated > rates_total) ma_values_to_copy = rates_total; 
      else ma_values_to_copy = ma_calculated; 
     } else { 
      ma_values_to_copy = (rates_total - prev_calculated) + 1; 
     } 
     
   if(CopyBuffer(handle_MA,0,0,ma_values_to_copy,buffer_MA) < 0 ) // копируем данные из индикаторного массива в массив buffer_MA
   {                                                                                // если не скопировалось
      Print("Не удалось скопировать данные из индикаторного буфера в buffer_MA");   // то выводим сообщение об ошибке
      return(0);                                                                    // и выходим из функции
   }

   for(int i = 0; i < ma_values_to_copy; i++)
   {
      Buffer0[i]        = buffer_MA[i];
      
      Buffer1_Color[i]  = 0;
      if(NormalizeDouble(Buffer0[i],Digits()) == NormalizeDouble(Buffer0[i+1],Digits())) Buffer1_Color[i] = Buffer1_Color[i+1];
      else
      if(Buffer0[i] > Buffer0[i+1]) Buffer1_Color[i] = 0;
      else
      if(Buffer0[i] < Buffer0[i+1]) Buffer1_Color[i] = 1;
      else                          Buffer1_Color[i] = Buffer1_Color[i+1];
   }
   
   return(rates_total);
  }
//+------------------------------------------------------------------+

Allez-vous l'essayer ?

 
Сергей Таболин:

Allez-vous l'essayer ?

Aucun problème, même sans aucune modification de votre code.


 
Igor Makanu:

Hélas, ce n'est pas pour moi, je ne suis pas très ami avec MT5, mais vous pouvez utiliser mes exemples pour trouver pourquoi votre ressource ne se connecte pas, supprimez le code source de l'indicateur close.mql5 et essayez ensuite de compiler l'indicateur principal en utilisant close.ex5..... vous devez vérifier pourquoi cela ne fonctionne pas, je pense que la protection du marché vous empêche de faire le partage.

О ! Je vais essayer de connecter mon indicateur avec la ressource.

 
Alexey Viktorov:

Aucun problème, même sans aucune modification de votre code.


C'est drôle... (((

Qu'est-ce qui ne va pas chez moi ? ....

 
Igor Makanu:

Hélas, ce n'est pas pour moi, je ne suis pas très ami avec MT5, mais vous pouvez utiliser mes exemples pour trouver pourquoi votre ressource ne se connecte pas, supprimez le code source de l'indicateur close.mql5 et essayez ensuite de compiler l'indicateur principal en utilisant close.ex5..... vous devez vérifier pourquoi cela ne fonctionne pas, je pense que la protection du marché vous empêche de faire le partage.

Aucune protection par le Marché n'empêche l'indicateur connecté à la ressource de travailler sur un ordinateur dans différents terminaux. Exemple ci-dessus.
 

Cela semble fonctionner. Merci.

Mais maintenant, j'ai rencontré une autre erreur.

"tableau hors de portée" fronce les sourcils sur

   for(int i = 0; i < ma_values_to_copy; i++)
   {
      double   noise    = high[i]-low[i]+high[i+1]-low[i+1]+high[i+2]-low[i+2]; // array out of range

mais l'indicateur est tiré...

 
Сергей Таболин:

Cela semble fonctionner. Merci.

Mais maintenant, j'ai rencontré une autre erreur.

"tableau hors de portée" fronce les sourcils sur

mais l'indicateur est tiré...

high[i+1]
low[i+1]
high[i+2]
low[i+2] 
при значении i >=  ma_values_to_copy даст такую ошибку

Et là, vous avez "deux portes de sortie" :

1 .

for(int i = 0; i < (ma_values_to_copy-2); i++)
2.
for(int i = 2; i < ma_values_to_copy; i++)
{
        double   noise    = high[i-2]-low[i-2]+high[i-1]-low[i-1]+high[i]-low[i];
 
Oleg Peiko:

Et là, vous avez "deux voies à suivre" :

1 .

2.

Le premier moyen a aidé )))) Merci.

Une autre question : je déchire 3 instances d'indicateur dans l'indicateur pour obtenir des données de différentes TF. Mais lorsque je l'attache à un graphique, j'obtiens la même mise en page :

2019.03.23 20:59:05.531 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.23 20:59:05.531 my_HMA5_123 (USDCHF,M30)        Не удалось скопировать данные из индикаторного буфера в buffer_MA2
2019.03.23 20:59:05.703 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.23 20:59:05.704 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA2
2019.03.23 20:59:05.704 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA3

Qu'est-ce que ça veut dire ?