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

 
-Aleks- :

Lütfen yardım et! (MQL4)

Gösterge için her çubuğu dikkate alarak M15 tablosunda Günün açılış saatini almak gerekir.

Mevcut çubuğu (0) dikkate alarak saniyeler içinde hesaplamaya karar verdim, ancak bir hata yaptım, nerede olduğunu anlayamıyorum

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

Bir gösterge için ise, o zaman:

 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             temp_day;
   MqlDateTime     dt_struct;
   TimeToStruct (time[ 0 ],dt_struct);
   temp_day=dt_struct.day;

   for ( int i= 0 ;i<rates_total- 1 ;i++)
     {
       TimeToStruct (time[i],dt_struct);
       if (dt_struct.day<temp_day)
        {
         Print ( "Start day " ,time[i- 1 ]);
         break ;
        }
     }

//--- done
   return (rates_total);
  }

Ancak: Bu kod, OnCalculate()'ye her girdiğinizde çalıştırılacaktır - burada, ihtiyaçlarınıza bağlı olarak, ya bool bayrağını ekleyin ya da kodu ayrı bir işleve taşıyın.

 
Karputov Vladimir :

Bir gösterge için ise, o zaman:

Ama: bu kod OnCalculate()'e her girdiğinizde çalıştırılacaktır - burada, ihtiyaçlarınıza bağlı olarak, ya bool bayrağını ekleyin ya da kodu ayrı bir fonksiyona taşıyın.

Teşekkürler, ancak her tikte yeniden hesaplamak iyi değil - kodunuzu anlamanız gerekiyor, ancak kodumun neden çalışmadığını anlamak istiyorum, ancak günlüğe garip sayılar döndürülüyor

Open_timeTF 1454715900
Open_time 1454284800
Delta_1S 431100
Delta_M15 479

günün ilk barı ile mevcut bar arasında 479 barlık bir fark olduğu ortaya çıktı - bu neden?

 
-Aleks- :

Teşekkürler, ancak her tikte yeniden hesaplamak iyi değil - kodunuzu anlamanız gerekiyor, ancak kodumun neden çalışmadığını anlamak istiyorum, ancak günlüğe garip sayılar döndürülüyor

Open_timeTF 1454715900
Open_time 1454284800
Delta_1S 431100
Delta_M15 479

günün ilk barı ile mevcut bar arasında 479 barlık bir fark olduğu ortaya çıktı - bu neden?

Sonuçta, psişik olmadığımı belirttim ve bu nedenle:

Ama: bu kod OnCalculate()'i her girdiğinizde çalıştırılacaktır - burada, ihtiyaçlarınıza bağlı olarak, ya bool bayrağını ekleyin ya da kodu ayrı bir fonksiyona taşıyın .

 
Karputov Vladimir :

Sonuçta, psişik olmadığımı belirttim ve bu nedenle:

Ve neden burada psişik yetenek gerekli? Yukarıdaki kodda değişkenler var, bu değişkenlerin ne döndürdüğünü sayılarla gösterdim ve bunun neden böyle olduğunu sordum, aksi halde değil - koda göre.
 
Karputov Vladimir , kodunuzu anlamıyorum - bu işte acemi olduğum için OnCalculate işlevini daha önce hiç kullanmadım, bu yüzden orada oranların_toplamın ne olduğunu ve en önemlisi nerede hesaplandığını anlayamıyorum. daha sonra iade etmek için? Tüm bunları ayrı bir işleve nasıl dönüştüreceğimi hala anlamıyorum ... yorum yapmadan zor.
 
-Aleks- :
Karputov Vladimir , kodunuzu anlamıyorum - bu işte acemi olduğum için OnCalculate işlevini daha önce hiç kullanmadım, bu yüzden orada oranların_toplamın ne olduğunu ve en önemlisi nerede hesaplandığını anlayamıyorum. daha sonra iade etmek için? Tüm bunları ayrı bir işleve nasıl dönüştüreceğimi hala anlamıyorum ... yorum yapmadan zor.

İşte göstergenin tam MQL4 kodu:

 //+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int       timer= 10 ; // seconds
//--- parameter
bool            IsDefineTime= true ; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetTimer (timer);
//---
   IsDefineTime= true ;
//---
   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[])
  {
//---
   int             temp_day;
   MqlDateTime     dt_struct;
   TimeToStruct (time[ 0 ],dt_struct);
   temp_day=dt_struct.day;

   if (IsDefineTime)
     {
       for ( int i= 0 ;i<rates_total- 1 ;i++)
        {
         TimeToStruct (time[i],dt_struct);
         if (dt_struct.day<temp_day)
           {
             Print ( "Start day " ,time[i- 1 ]);
            IsDefineTime= false ;
             break ;
           }
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   IsDefineTime= true ; // true -> you can define time
  }
//+------------------------------------------------------------------+

Çalışma algoritması: gösterge başladığında, zamanlayıcının zaman aralığını ayarlarsınız (örneğin, 10 saniye) - bu, zamanlayıcının her 10 saniyede bir patlayacağı anlamına gelir:

 //+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   IsDefineTime= true ; // true -> you can define time
  }

ve IsDefineTime değişkeni true olarak ayarlanır. Bu ne için? IsDefineTime=true olduğunda, OnCalculate() içinde günün başlangıç saatini belirlemek için döngüye girebiliriz:

   if (IsDefineTime)
     {
       for ( int i= 0 ;i<rates_total- 1 ;i++)
        {
         TimeToStruct (time[i],dt_struct);
         if (dt_struct.day<temp_day)
           {
             Print ( "Start day " ,time[i- 1 ]);
            IsDefineTime= false ;
             break ;
           }
        }
     }

Bu döngüde time[] dizisini (bu dizi açılış zamanının değerlerini saklar) en sağdaki çubuktan (dizini "0"a eşittir) geçmeye başlıyoruz. Günün başlangıcı bulunduğunda, değerini yazdırır ve IsDefineTime değişkenini false olarak ayarlarız - bu şekilde, zamanlayıcı tekrar etkinleşene kadar kendimizi günün başlangıcı döngüsüne girmekten koruruz.

Dosyalar:
Start_day.mq4  3 kb
 

Karputov Vladimir , açıklama için teşekkürler, ancak bu sorunu nasıl çözüyor?

Kabaca söylemek gerekirse, günün başlangıcı çubuğuna karşılık gelen mevcut TF'nin çubuğunu bulmak gerekir. Her çubukta öğrenin ve buna göre göstergenin hesaplanmasını ve çizimini yapın.

 
-Aleks- :

Karputov Vladimir , açıklama için teşekkürler, ancak bu sorunu nasıl çözüyor?

Kabaca söylemek gerekirse, günün başlangıcı çubuğuna karşılık gelen mevcut TF'nin çubuğunu bulmak gerekir. Her çubukta öğrenin ve buna göre göstergenin hesaplanmasını ve çizimini yapın.

Sorulduğu gibi, size cevap verdiler :). Ve bu gün için ilk çubuğun saatine değil, bu çubuğun indeksine ihtiyacınız varsa, günün başlangıcını yazdırdığınızda işte burada:

.
.
.
Print ( "Start day " ,time[i- 1 ]);
.
.
.

[i-1] indeksini kullanıyorsunuz - bu, günün ilk çubuğunun numarasıdır.

 
Karputov Vladimir :

Sorulduğu gibi, size cevap verdiler :). Ve bu gün için ilk çubuğun saatine değil, bu çubuğun indeksine ihtiyacınız varsa, günün başlangıcını yazdırdığınızda işte burada:

[i-1] indeksini kullanıyorsunuz - bu, günün ilk çubuğunun numarasıdır.

Katılıyorum - kafa karıştırıcı bir şekilde sordu.

Uygulamada benim yaptığım bir gösterge var ama doğru sayılmıyor. Çok aptalım ve anlamıyorum, sizin tarafınızdan yapılan açıklamalara rağmen, günün başlangıcındaki ilk çubuğa karşılık gelen endeksi doğru bir şekilde belirlemesini nasıl sağlayabilirim.

Küstahlık ettiğim için özür dilerim, ama bana kendi kodumu nasıl birleştireceğimi gösterebilir misin?

 

-Aleks- :

gün başındaki ilk çubuğa karşılık gelen indeksi doğru bir şekilde belirlemesini nasıl sağlayabilirim.

bir şekilde FSE çalışıyor) Bunun gibi bir şey:

 datetime Day00= 86400 *( TimeCurrent ()/ 86400 ); //начало дня
int bar_shift= iBarShift ( _Symbol , PERIOD_CURRENT ,Day00); //индекс первого бара текущего дня