Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1018

 
Alexey Viktorov:

Es ist schwer, bei diesen Namen etwas zu verstehen. Ich habe keine Probleme mit der Verbindung von Indikatoren als Ressourcen.


Ist das Vorhandensein eines Quellcodes (.mq5) erforderlich?

Alexey Viktorov:

Was hat das zu tun mit

Beeinträchtigt sie die Verbindung einer Ressource?

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

Ist die Verfügbarkeit des Quellcodes (.mq5) obligatorisch?

es ist schneller zu überprüfen, hier habe ich eine Verbindung durch eine Ressource in MT5, ich sehe keine Probleme

// 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);
  }

und diesen Indikator als Ressource verbinden, dann habe ich diesen Indikator entfernt, um zu prüfen, ob der Aufruf wirklich von den Ressourcen kommt:

#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:

es ist schneller zu überprüfen, hier habe ich eine Verbindung in MT5 über eine Ressource, ich sehe keine Probleme

und diesen Indikator als Ressource verbinden, dann habe ich diesen Indikator entfernt, um zu prüfen, ob der Aufruf wirklich von Ressourcen kommt:

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+

Werden Sie es versuchen?

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

Werden Sie es versuchen?

Das ist kein Problem, auch ohne Änderungen an Ihrem Code.


 
Igor Makanu:

Leider ist dies nicht für mich, ich bin nicht sehr freundlich mit MT5, aber Sie können meine Beispiele verwenden, um herauszufinden, warum Ihre Ressource nicht verbindet, löschen Sie den Quellcode von close.mql5 Indikator und dann versuchen, den Hauptindikator mit close.ex5.... kompilieren Sie müssen prüfen, warum es nicht funktioniert. Ich denke, dass der Schutz von Market Sie daran hindert, die Freigabe zu machen.

О! Ich werde versuchen, meinen Indikator mit der Ressource zu verknüpfen.

 
Alexey Viktorov:

Das ist kein Problem, auch ohne Änderungen an Ihrem Code.


Komisch... (((

Was ist los mit mir? ....

 
Igor Makanu:

Leider ist dies nicht für mich, ich bin nicht sehr freundlich mit MT5, aber Sie können meine Beispiele verwenden, um herauszufinden, warum Ihre Ressource nicht verbindet, löschen Sie den Quellcode von close.mql5 Indikator und dann versuchen, den Hauptindikator mit close.ex5.... kompilieren Sie müssen prüfen, warum es nicht funktioniert. Ich denke, dass der Schutz des Marktes Sie daran hindert, die Freigabe zu machen.

Kein Schutz durch den Marktplatz verhindert, dass der an die Ressource angeschlossene Indikator an einem Computer in verschiedenen Terminals arbeitet. Beispiel oben.
 

Es scheint zu funktionieren. Ich danke Ihnen.

Aber jetzt bin ich auf einen anderen Fehler gestoßen.

"Array außerhalb der Reichweite" missbilligt

   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

aber der Indikator ist gezeichnet...

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

Es scheint zu funktionieren. Ich danke Ihnen.

Aber jetzt bin ich auf einen anderen Fehler gestoßen.

"Array außerhalb der Reichweite" missbilligt

aber der Indikator ist gezeichnet...

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

Und hier haben Sie "zwei Auswege":

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:

Und hier gibt es "zwei Wege zu gehen":

1 .

2.

Der erste Weg half )))) Danke.

Eine weitere Frage: Ich reiße 3 Indikatorinstanzen im Indikator ab, um Daten von verschiedenen TFs zu erhalten. Wenn ich sie jedoch an ein Diagramm anhänge, erhalte ich das gleiche Layout:

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

Was würde das bedeuten?

Grund der Beschwerde: