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

 
Karputov Vladimir :
Bir göstergede mi yoksa bir EA/komut dosyasında mı?
göstergede.
 

Yuri Evseenkov :

fromme2you :

Başka bir soru: MT4 geliştiricisini ve MQL kod yürütme ortamını nasıl zorlayabilir, böylece (onlar) aklını ve ellerini benim örneğimdeki veya benzer anlamdaki gibi istisna işleme için bir dil geliştirmeye verir?


Servis masasına başvurun, forumda bir konu/anket oluşturun.

Çok uzun zaman önce, MT4 genellikle gömüldü. Şimdi eğilim, tersine dönmediyse, en azından son zamanlarda platform ve dil önemli ölçüde modernize edildi.

Renata'nın bugünkü yazısına bakın:

Renat Fatkhullin'in fotoğrafı.

...

MT4'ün gelişimi durduruldu ve bunun için yalnızca kozmetiklerle düzeltmeler yapılacak.

 
Alex :

Merhaba. Bu sorunu nasıl çözeceğim konusunda bilgisi olan yardımcı olabilir mi? Barların açılış fiyatlarını belirli bir saatte, örneğin 01:00'de, örneğin son 50 barı analiz ederek bulmanız gerekiyor. Göreve mql5'te nasıl daha iyi yaklaşacağımı bilmiyorum.


Ya mevcut tarihin hesaplanması + buna gerekli sürenin eklenmesi ve ardından zaten günlerin eklenmesi yoluyla, bu yöntem mql4'te çalıştı.

mql5'te anladığım kadarıyla zamanın çıktısı olan özel yapılar var ama nedense onların içinden geçmiyor.

Cevabınız için şimdiden teşekkür ederiz.

Birisi düşünme yönünü anlamak için bir kod parçası atarsa çok minnettar olurum.
Alex :
göstergede.

Burada daha sonra daha iyi anlayabilmeniz için öncelikle çubukların numaralandırılmasına bakmanızı tavsiye ederim. Yani, önce MQL5 göstergesinde en sağdaki çubuğun nasıl numaralandırıldığını tam olarak anlamanız gerekir.

Bunu yapmak için, göstergede, OnCalculate'de aşağıdaki yorum çıktısını koyun:

 //+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );
//---
   ArrayInitialize (Buffer, 1 );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   Comment ( "rates_total=" , IntegerToString (rates_total),
           ", time[rates_total-1]=" , TimeToString (time[rates_total- 1 ], TIME_DATE | TIME_MINUTES | TIME_SECONDS ));

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

Bu kod aşağıdaki sonucu verecektir:

Varsayılan olarak MQL5 gösterge dizilerinde numaralandırma

Yani, varsayılan olarak, MQL5 gösterge dizilerinde en sağdaki çubuk, "rates_total-1" değerine eşit bir dizine sahiptir.

Sorunuza dönersek - son 50 çubuğu almanız ve geçmeniz gerekir. Ayrıca, çubuğun açılma zamanını (time[] dizisi) analiz edin, eğer çubuk zamanı belirtilene eşitse, bu çubuğun indeksini hatırlayın. Ardından, bu dizini kullanarak open[] dizisinden açılış fiyatını alın.

Şuna benziyor:

 //+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots    0
//--- input parameters
input datetime time_open= D'01:00' ;     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                           // время искомого бара (минуты)
bool first_start= false ;                 // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   MqlDateTime str1;
   TimeToStruct (time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start= false ;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if (!first_start)
     {
       int index=- 1 ;
       for ( int i=rates_total- 1 ;i>rates_total- 1 - 50 ;i--)
        {
         MqlDateTime str2;
         TimeToStruct (time[i],str2);
         if (str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start= true ;
             Print ( "Бар " , IntegerToString (i), " имеет время открытия " , TimeToString (time[i], TIME_DATE | TIME_MINUTES | TIME_SECONDS ),
                   " и цену открытия " , DoubleToString (open[i], Digits ()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir :

Burada daha sonra daha iyi anlayabilmeniz için öncelikle çubukların numaralandırılmasına bakmanızı tavsiye ederim. Yani, önce MQL5 göstergesinde en sağdaki çubuğun nasıl numaralandırıldığını tam olarak anlamanız gerekir.

Bunu yapmak için, göstergede, OnCalculate'de aşağıdaki yorum çıktısını koyun:

Bu kod aşağıdaki sonucu verecektir:


Yani, varsayılan olarak, MQL5 gösterge dizilerinde en sağdaki çubuk, "rates_total-1" değerine eşit bir dizine sahiptir.

Sorunuza dönersek - son 50 çubuğu almanız ve geçmeniz gerekir. Ayrıca, çubuğun açılma zamanını (time[] dizisi) analiz edin, eğer çubuk zamanı belirtilene eşitse, bu çubuğun indeksini hatırlayın. Ardından, bu dizini kullanarak open[] dizisinden açılış fiyatını alın.

Şuna benziyor:

Karputov Vladimir, sana çok teşekkürler. Bunu halledeceğim. Mql5'te, zaman serilerine erişimi daha esnek hale getirmiş görünüyorlar, ancak bence "Amatör-yeni başlayanlar" programcıları için her şey bir şekilde daha karmaşık hale geldi. :))
 
Alex :
Karputov Vladimir, sana çok teşekkürler. Bunu halledeceğim. Mql5'te, zaman serilerine erişimi daha esnek hale getirmiş görünüyorlar, ancak bence "Amatör-yeni başlayanlar" programcıları için her şey bir şekilde daha karmaşık hale geldi. :))
Alışkanlık meselesi. O zaman her şeyin yapılandırılmış, kolay ve doğru olduğunu anlayacaksınız.
 
Karputov Vladimir :
Alışkanlık meselesi. O zaman her şeyin yapılandırılmış, kolay ve doğru olduğunu anlayacaksınız.

Böyle bir soru daha. Seçenekler

 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])


Anladığım kadarıyla göstergenin uygulandığı çiftten sorumlular. Ve onları başka bir döviz çifti hakkında aynı bilgiyi çıkarmak için kullanmak imkansız mı? Yani, aynı OCHL dizilerini yalnızca Kopyala ... işlevleri aracılığıyla yapmak için daha evrensel bir çözüm elde edilir?
 
Alex :

Böyle bir soru daha. Seçenekler

Anladığım kadarıyla göstergenin uygulandığı çiftten sorumlular. Ve onların yardımıyla başka bir döviz çifti hakkında aynı bilgiyi çıkaramıyor musunuz? Yani, aynı OCHL dizilerini yalnızca Kopyala ... işlevleri aracılığıyla yapmak için daha evrensel bir çözüm elde edilir?
Yabancı sembollere erişirken anlamanız ve bilmeniz gereken nüanslar vardır: Verilere erişimin organizasyonu . Yani başka bir sembolün zaman serisi verilerini talep ediyorsanız, öncelikle bu verilerin hazırlandığından ve var olduğundan emin olmanız gerekir. Başka birinin karakterinden istenen verilerin doğruluğundan emin olmanın tek yolu budur.
 
Karputov Vladimir :
Yabancı sembollere erişirken anlamanız ve bilmeniz gereken nüanslar vardır: Verilere erişimin organizasyonu . Yani başka bir sembolün zaman serisi verilerini talep ediyorsanız, öncelikle bu verilerin hazırlandığından ve var olduğundan emin olmanız gerekir. Başka birinin karakterinden istenen verilerin doğruluğundan emin olmanın tek yolu budur.

Anladım. Teşekkür ederim.

Başka bir soru: Print() işlevinde değerleri her zaman dize türüne dönüştürürsünüz. Bu hangi amaçla yapılıyor? Çeviri olmadan, int, double, vb. türleri Print()'te aynı şekilde görüntülenir.

 
Alex :

Anladım. Teşekkür ederim.

Başka bir soru: Print() işlevinde değerleri her zaman dize türüne dönüştürürsünüz. Bu hangi amaçla yapılıyor? Çeviri olmadan, int, double, vb. türleri Print()'te aynı şekilde görüntülenir.

Bir sayının bilgisayarın belleğinde nasıl saklandığı ve nasıl görüntülendiği çok farklı iki şeydir. Özellikle kayan nokta sayıları için, ondalık basamak sayısını sınırlamak her zaman daha iyidir.

Bu nedenle, sayıların çıktısını her zaman print - use IntegerToString ve DoubleToString aracılığıyla doğru şekilde biçimlendirmeye çalışırım.

 
Karputov Vladimir :

Bir sayının bilgisayarın belleğinde nasıl saklandığı ve nasıl görüntülendiği çok farklı iki şeydir. Özellikle kayan nokta sayıları için, ondalık basamak sayısını sınırlamak her zaman daha iyidir.

Bu nedenle, sayıların çıktısını her zaman print - use IntegerToString ve DoubleToString aracılığıyla doğru şekilde biçimlendirmeye çalışırım.

Cevaplar ve sabır için teşekkürler.


Vladimir, muhtemelen sana zaten işkence ettim :) Ama temellerin temelleri boyunca ilerlemek çok zor bir şey. Kopyalama işlevleriyle bir test görevi yapmaya çalıştım... Printe'de rakamlar olmasına rağmen gösterge çizilmiyor... Hiçbir şey anlamıyorum.


 //+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link        ""
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot UpBar
#property indicator_label1   "UpBar"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1   clrGreen
#property indicator_style1   STYLE_SOLID
#property indicator_width1   6
//--- plot DnBar
#property indicator_label2   "DnBar"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2   clrRed
#property indicator_style2   STYLE_SOLID
#property indicator_width2   6
//--- input parameters
input int    Histori= 30 ;
input ENUM_TIMEFRAMES TimeFrame= 0 ; 
input string   Simvol= "EURUSD" ;
//--- indicator buffers
double          UpBar[];
double          DnBar[];
double          O_Price[];
double          C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,UpBar, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,UpBar, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,O_Price, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 3 ,C_Price, INDICATOR_CALCULATIONS );



   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
 {
ArraySetAsSeries (O_Price, true );
ArraySetAsSeries (C_Price, true );
CopyOpen (Simvol,TimeFrame, 0 ,Histori,O_Price);
CopyClose (Simvol,TimeFrame, 0 ,Histori,C_Price);

     for ( int t= 3 ; t<Histori; t++) 
       {
          UpBar[t]= MathAbs ( NormalizeDouble ((O_Price[t]-C_Price[t]), Digits ()));   
           Print ( DoubleToString (UpBar[t], Digits ()));
       }

   return (rates_total);
  }