초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1018

 
Alexey Viktorov :

그러한 이름을 사용하면 무언가를 이해하기 어렵습니다. 지표를 리소스로 연결하는 데 문제가 없습니다.


소스 코드(.mq5)가 필요합니까?

알렉세이 빅토로프 :

그리고 여기 거래는 무엇입니까

그리고 리소스 연결에 영향을 줍니까?

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

소스 코드(.mq5)가 필요합니까?

확인이 더 빠릅니다 리소스를 통해 MT5에 연결했는데 문제가 보이지 않습니다

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

이 표시기를 리소스로 연결한 다음 이 표시기를 제거하여 호출이 실제로 리소스에서 오는지 확인하십시오.

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

확인이 더 빠릅니다 리소스를 통해 MT5에 연결했는데 문제가 보이지 않습니다

이 표시기를 리소스로 연결한 다음 이 표시기를 제거하여 호출이 실제로 리소스에서 오는지 확인하십시오.

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

시도하시겠습니까?

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

시도하시겠습니까?

일반적으로 코드를 수정하지 않아도 문제가 없습니다.


 
Igor Makanu :

아아, 이것은 나를 위한 것이 아닙니다. 저는 MT5에 그다지 친숙하지 않습니다. 하지만 제 예제를 사용하여 리소스가 연결되지 않은 이유를 찾고 close.mql5 표시기 소스를 삭제한 다음 close.ex5를 사용하여 기본 표시기를 컴파일해 볼 수 있습니다. .... 작동하지 않는 이유를 확인해야합니다. 어떤 이유로 마켓에서이 보호 기능으로 인해 리소스를 만들 수 없다고 생각합니다.

영형! 내 지표를 리소스로 연결하려고 합니다.

 
Alexey Viktorov :

일반적으로 코드를 수정하지 않아도 문제가 없습니다.


시원한... (((

나에게 뭐가 문제 니?....

 
Igor Makanu :

아아, 이것은 나를 위한 것이 아닙니다. 저는 MT5에 그다지 친숙하지 않습니다. 하지만 제 예제를 사용하여 리소스가 연결되지 않은 이유를 찾고 close.mql5 표시기 소스를 삭제한 다음 close.ex5를 사용하여 기본 표시기를 컴파일해 볼 수 있습니다. .... 작동하지 않는 이유를 확인해야합니다. 어떤 이유로 마켓에서이 보호 기능으로 인해 리소스를 만들 수 없다고 생각합니다.

시장에 대한 보호가 없기 때문에 리소스로 연결된 지표가 다른 터미널의 동일한 컴퓨터에서 작동하는 것을 방지할 수 있습니다. 위의 예.
 

효과가 있었던 것 같습니다. 고맙습니다.

그리고 지금 나는 또 다른 오류에 직면하고 있습니다.

범위를 벗어난 배열은 다음을 맹세합니다.

   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

표시기가 그려지는 동안 ...

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

효과가 있었던 것 같습니다. 고맙습니다.

그리고 지금 나는 또 다른 오류에 직면하고 있습니다.

범위를 벗어난 배열은 다음을 맹세합니다.

표시기가 그려지는 동안 ...

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

그리고 여기에 "2가지 방법"이 있습니다.

하나 .

 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 :

그리고 여기에 "2가지 방법"이 있습니다.

하나 .

2.       

첫 번째 방법이 도움이 되었습니다)))) 감사합니다.

질문 하나 더: 다른 시간대에서 데이터를 가져오기 위해 표시기에서 표시기의 3개 인스턴스를 엽니다. 그러나 차트에 첨부하면 다음과 같이 출력됩니다.

 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

그게 무슨 뜻이야?

사유: