Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1018

 
Alexey Viktorov :

Bu tür isimlerle bir şeyi anlamak zordur. Göstergeleri kaynak olarak bağlamakta sorun yaşamıyorum.


Kaynak kodu (.mq5) gerekli mi?

Alexey Viktorov :

Ve buradaki anlaşma ne

Ve kaynağın bağlantısını etkiler mi?

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

Kaynak kodu (.mq5) gerekli mi?

kontrol etmek daha hızlı, MT5'te bir kaynak aracılığıyla bağlantı kurdum, herhangi bir sorun görmüyorum

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

ve bu göstergeyi bir kaynak olarak bağlayın, ardından aramanın gerçekten kaynaklardan geldiğini kontrol etmek için bu göstergeyi kaldırın:

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

kontrol etmek daha hızlı, MT5'te bir kaynak aracılığıyla bağlantı kurdum, herhangi bir sorun görmüyorum

ve bu göstergeyi bir kaynak olarak bağlayın, ardından aramanın gerçekten kaynaklardan geldiğini kontrol etmek için bu göstergeyi kaldırın:

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

Deneyecek misin?

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

Deneyecek misin?

Genel olarak, kodunuzu düzenlemeden bile sorun yok.


 
Igor Makanu :

Ne yazık ki, bu benim için değil, MT5 ile pek arkadaş canlısı değilim, ancak kaynağınızın neden bağlanmadığını bulmak için örneklerimi kullanabilir, close.mql5 gösterge kaynağını silebilir ve ardından ana göstergeyi close.ex5 kullanarak derlemeye çalışabilirsiniz. .... neden işe yaramadığını kontrol etmeniz gerekiyor, bir nedenden dolayı Piyasadan bu korumanın bir kaynak yapmanıza izin vermediğini düşünüyorum.

Ö! Göstergemi bir kaynak olarak bağlamaya çalışacağım.

 
Alexey Viktorov :

Genel olarak, kodunuzu düzenlemeden bile sorun yok.


Güzel... (((

Benimle ilgili sorun ne?....

 
Igor Makanu :

Ne yazık ki, bu benim için değil, MT5 ile pek arkadaş canlısı değilim, ancak kaynağınızın neden bağlanmadığını bulmak için örneklerimi kullanabilir, close.mql5 gösterge kaynağını silebilir ve ardından ana göstergeyi close.ex5 kullanarak derlemeye çalışabilirsiniz. .... neden işe yaramadığını kontrol etmeniz gerekiyor, bir nedenden dolayı Piyasadan bu korumanın bir kaynak yapmanıza izin vermediğini düşünüyorum.

Piyasanın hiçbir koruması, kaynak tarafından bağlanan göstergenin farklı terminallerde aynı bilgisayar üzerinde çalışmasını engellemez. Yukarıdaki örnek.
 

İşe yaradı gibi görünüyor. Teşekkür ederim.

Ve şimdi başka bir hatayla karşı karşıyayım.

menzil dışı dizi yemin ediyor

   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

gösterge çizilirken...

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

İşe yaradı gibi görünüyor. Teşekkür ederim.

Ve şimdi başka bir hatayla karşı karşıyayım.

menzil dışı dizi yemin ediyor

gösterge çizilirken...

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

Ve burada "2 yolunuz" var:

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 :

Ve burada "2 yolunuz" var:

1 .

2.       

İlk yol yardımcı oldu)))) Teşekkürler.

Bir soru daha: Farklı zaman dilimlerinden veri almak için göstergede göstergenin 3 örneğini açıyorum. Ancak grafiğe eklediğimde aşağıdaki çıktıyı alıyorum:

 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

Bu ne anlama geliyor?