MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 771

 
Igor Zakharov :

sadece takvim değil 30 günlük bar önce (Pazar, Cumartesi)

shift parametresi olmayan fonksiyona bakılırsa 5k'da yapıyorsunuz ama soru 4. dalda sorulmuş :)

Evet, 30 bar dünden 21 iş günüdür. (24.02.2019 - 25.01.2019)

Bende var

aylık ortalama mum boyutu : 598

haftalık ortalama mum boyutu: 519

Ve iATR() on basamaklı sayılar verir...

Bu yüzden hala nasıl kullanılacağını anlamıyorum.

 
Alexander Layzerevich :

Ve iATR() on basamaklı sayılar verir...

Genellikle ondalık kesirler (yani fiyat gibi. Puana dönüştürmek için _Puan'a bölmeniz gerekir).

Resme bakın: bugün euro/dolar - ayda 560 günlük puan.


 
Igor Zakharov :

Genellikle ondalık kesirler (yani fiyat gibi. Puana dönüştürmek için _Puan'a bölmeniz gerekir).

Resme bakın: bugün euro/dolar - ayda 560 günlük puan.


MQL4'te kontrol edildi. Bunu şöyle anlıyorum:

iATR

 
Igor Zakharov :

Genellikle ondalık kesirler (yani fiyat gibi. Puana dönüştürmek için _Puan'a bölmeniz gerekir).

Resme bakın: bugün euro/dolar - ayda 560 günlük puan.


MQL5'te kontrol edildi. Test etmek için aşağıdaki kodu yazdım:

 //************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = ( iATR ( Symbol (), PERIOD_D1 , 21 ));
   Print ( "Awerage30 = " , Awerage30);
   int Awerage7 = ( iATR ( Symbol (), PERIOD_D1 , 5 ));
   Print ( "Awerage7 = " , Awerage7);
   
   double iPointOrderStep = NormalizeDouble (((Awerage30+Awerage7)/ 2 ), 0 );
   Print ( "iPointOrderStep = " , iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

İşte çıktıları:

iATR

onlar. Görünüşe göre bir şey gösteriyor ama başka bir değer veriyor ...

 
Alexander Layzerevich :

MQL5'te kontrol edildi. Test etmek için aşağıdaki kodu yazdım:

İşte çıktıları:

onlar. Görünüşe göre bir şey gösteriyor ama başka bir değer veriyor ...

MQL5'te, bir gösterge ile çalışmanın bu yapısı uygun değildir.

   int Awerage30 = ( iATR ( Symbol (), PERIOD_D1 , 21 ));
   Print ( "Awerage30 = " , Awerage30);

İlk önce az önce yaptığınız bir tanıtıcı oluşturmanız gerekir ve bundan sonra CopyBuffer'dan zaten değerler alabilirsiniz.

 // этот код в Init()
      int handleATR= iATR (Symbol(), PERIOD_D1 ,21);
       if (handleATR== INVALID_HANDLE ) return ;

// это уже в сам советник/индикатор: OnTick()
       double hATR[];
       CopyBuffer (handleATR, 0 , 0 , 1 ,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko :

MQL5'te, bir gösterge ile çalışmanın bu yapısı uygun değildir.

İlk önce az önce yaptığınız bir tanıtıcı oluşturmanız gerekir ve bundan sonra CopyBuffer'dan zaten değerler alabilirsiniz.

Teşekkürler, bir göz atıp kodu yeniden yazacağım.

Sadece MT4'te yazıyorum ve MT5'te test etmek için #include <MT4Orders.mqh> kullanıyorum.

Belki de kütüphane Göstergeleri desteklemiyor.

 
Alexander Layzerevich :

Teşekkürler, bir göz atıp kodu yeniden yazacağım.

Sadece MT4'te yazıyorum ve MT5'te test etmek için #include <MT4Orders.mqh> kullanıyorum.

Belki de kütüphane Göstergeleri desteklemiyor.

Evet, yalnızca ticaret işlevleri .

 
Alexander Layzerevich :

Teşekkürler, bir göz atıp kodu yeniden yazacağım.

Sadece MT4'te yazıyorum ve MT5'te test etmek için #include <MT4Orders.mqh> kullanıyorum.

Belki de kütüphane Göstergeleri desteklemiyor.

Bu, iki platformu birleştirmek için çok hızlı bir seçenektir, işe yarar, ancak bunu mql5'te yapmamak daha iyidir

 double ATR( string symb, ENUM_TIMEFRAMES tf, int period, int index) {
 #ifdef __MQL4__
   return ( iATR (symb,tf,period,index));
 #else
   double buf[ 1 ];
   int handle= iATR (symb,tf,period);
   if (handle< 0 ) {
     PrintFormat ( "Failed to create handle ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
   } else {
     if ( CopyBuffer (handle, 0 ,index, 1 ,buf)< 0 ) {
     PrintFormat ( "Failed to copy data from the indicator ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
 #endif
 }

Peki, göstergeyi mql4'tekiyle aynı şekilde uygulayın

 double atr=ATR( Symbol (), PERIOD_D1 , 30 );
 
Vitaly Muzichenko :

Bu, iki platformu birleştirmek için çok hızlı bir seçenektir, işe yarar, ancak bunu mql5'te yapmamak daha iyidir

Peki, göstergeyi mql4'tekiyle aynı şekilde uygulayın

Kod için çok teşekkürler.

Şu şekilde çıktı:

 //************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = ( int )((ATR( Symbol (), PERIOD_D1 , 21 , 1 ))/ Point ());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = ( int )((ATR( Symbol (), PERIOD_D1 , 5 , 1 ))/ Point ());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble (((Awerage30+Awerage7)/ 2 / 6 ), 0 );
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR( string symb, ENUM_TIMEFRAMES tf, int period, int index) {
 #ifdef __MQL4__
   return ( iATR (symb,tf,period,index));
 #else
   double buf[ 1 ];
   int handle= iATR (symb,tf,period);
   if (handle< 0 ) {
     PrintFormat ( "Failed to create handle ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
   } else {
     if ( CopyBuffer (handle, 0 ,index, 1 ,buf)< 0 ) {
     PrintFormat ( "Failed to copy data from the indicator ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
 #endif
 }
//************************************************************************************************/

Artık Expert Advisor'ın başlangıcında ortalama verilerim var. Ve bu veriler, fonksiyon her çağrıldığında yeniden hesaplanır.

Dolaşımı sınırlamak için, anladığım kadarıyla, hesaplanan verilerle bir arabellek kaydı yapmanız gerekiyor.

Yeniden hesaplama için bir koşul belirlemeniz gerektiği ortaya çıktı. "Pazartesileri" ve arabellekte hiçbir şey yoksa. (Robot yeniden başlatma)

onlar. bir değişken bildir bufferStep = -1; ve OnTick() içinde bufferStep <0 veya "Pazartesi" ise yeniden hesaplama.

Burada yine bir fişim var, Robot bugünün "Pazartesi" olduğunu nasıl anons edebilir?

 
Alexander Layzerevich :

Kod için çok teşekkürler.

Şu şekilde çıktı:

Artık Expert Advisor'ın başlangıcında ortalama verilerim var. Ve bu veriler, fonksiyon her çağrıldığında yeniden hesaplanır.

Dolaşımı sınırlamak için, anladığım kadarıyla, hesaplanan verilerle bir arabellek kaydı yapmanız gerekiyor.

Yeniden hesaplama için bir koşul belirlemeniz gerektiği ortaya çıktı. "Pazartesileri" ve arabellekte hiçbir şey yoksa. (Robot yeniden başlatma)

onlar. bir değişken bildir bufferStep = -1; ve OnTick() içinde bufferStep <0 veya "Pazartesi" ise yeniden hesaplama.

Burada yine bir fişim var, Robot bugünün "Pazartesi" olduğunu nasıl anons edebilir?

Her nasılsa Pazartesiyi kullanmazdım, sadece günlerin sayısını kullanırdım. Ve her yeni çubukta değerler alınacaktı, böylece danışmana her kene üzerinde hesaplamalar yüklenmeyecekti.