Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1018

[Eliminado]  
Alexey Viktorov:

Es difícil entender algo con estos nombres. No tengo problemas para conectar los indicadores como recursos.


¿Es necesaria la presencia de un código fuente (.mq5)?

Alexey Viktorov:

¿Qué tiene que ver con

¿Afecta a la conexión de un recurso?

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

¿Es obligatoria la disponibilidad del código fuente (.mq5)?

es más rápido de comprobar, aquí hice una conexión a través de un recurso en MT5, no veo ningún problema

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

y conecte este indicador como un recurso, entonces quité este indicador para comprobar si la llamada viene realmente de los recursos:

#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);
  }
[Eliminado]  
Igor Makanu:

es más rápido de comprobar, aquí hice una conexión en MT5 a través de un recurso, no veo ningún problema

y conecte este indicador como un recurso, entonces quité este indicador para comprobar si la llamada viene realmente de los recursos:

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

¿Lo vas a probar?

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

¿Lo vas a probar?

No hay ningún problema, incluso sin editar el código.


[Eliminado]  
Igor Makanu:

Por desgracia, esto no es para mí, no soy muy amigable con MT5, pero puede utilizar mis ejemplos para encontrar por qué su recurso no se conecta, eliminar el código fuente del indicador close.mql5 y luego tratar de compilar el indicador principal utilizando close.ex5.... Tienes que comprobar por qué no funciona, creo que la protección de Market te está impidiendo hacer la acción

¡О! Intentaré conectar mi indicador con el recurso.

[Eliminado]  
Alexey Viktorov:

No hay ningún problema, incluso sin editar el código.


Es curioso... (((

¿Qué me pasa? ....

 
Igor Makanu:

Por desgracia, esto no es para mí, no soy muy amigable con MT5, pero puede utilizar mis ejemplos para encontrar por qué su recurso no se conecta, eliminar el código fuente del indicador close.mql5 y luego tratar de compilar el indicador principal utilizando close.ex5.... tienes que comprobar por qué no funciona, creo que la protección del Mercado te está impidiendo hacer la acción

Ninguna protección del Mercado impide que el indicador conectado al recurso trabaje en un ordenador en diferentes terminales. Ejemplo anterior.
[Eliminado]  

Parece que funciona. Gracias.

Pero ahora me he encontrado con otro error.

El "conjunto fuera del alcance" frunce el ceño

   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

pero el indicador está dibujado...

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

Parece que funciona. Gracias.

Pero ahora me he encontrado con otro error.

El "conjunto fuera del alcance" frunce el ceño

pero el indicador está dibujado...

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

Y aquí tienes "dos salidas":

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];
[Eliminado]  
Oleg Peiko:

Y aquí tienes "dos caminos a seguir":

1 .

2.

La primera forma ayudó a )))) Gracias.

Una pregunta más: arranco 3 instancias del indicador para obtener datos de diferentes TFs. Pero cuando lo adjunto a un gráfico, obtengo el mismo diseño:

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é significa eso?