Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 196

 
Vitaly Muzichenko :

Bu bir düzen, 4 ile 5 arasında fark yok

Tutamaç, her adımda değil, OnInit() içinde bir kez oluşturulmalıdır. Bunu hala bilmiyor musun?

 
silindi, çözmen gerek
 
Vitaly Muzichenko :

Ve bu yüzden?

Ve böylece yine de her onay işareti için bir tutamaç yaratırsınız . Styler'ı kullanın ve mantık oluşturma hataları hemen görünecektir:

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA( string symb, ENUM_TIMEFRAMES tf, int period, int ma_shift,
           ENUM_MA_METHOD method, ENUM_APPLIED_PRICE price, int index)
  {
#ifdef __MQL4__
   return ( iMA (symb,tf,period,ma_shift,method,price,index));
#else
   double buf[ 1 ];
   static int hMA=- 1 ;
   int handle= iMA (symb,tf,period,ma_shift,method,price);
   if (handle<hMA)
     {
       PrintFormat ( "Failed to create handle MA %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 MA %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
         return ( WRONG_VALUE );
        }
     }
   hMA=handle;
   return (buf[ 0 ]);
#endif
   }
 
Vladimir Karputov :

Ve böylece yine de her onay işareti için bir tutamaç yaratırsınız . Styler'ı kullanın ve mantık oluşturma hataları hemen görünecektir:

öyle gibi

 double MA( string symb, ENUM_TIMEFRAMES tf, int period, int ma_shift,
                                       ENUM_MA_METHOD method, ENUM_APPLIED_PRICE price, int index) {
 #ifdef __MQL4__
   return ( iMA (symb,tf,period,ma_shift,method,price,index));
 #else
   double buf[ 1 ];
   static int handle=- 1 ;
   if (handle< 0 ) {
    handle= iMA (symb,tf,period,ma_shift,method,price);
   }
   if (handle< 0 ) {
     PrintFormat ( "Failed to create handle MA %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 MA %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
 #endif
 }
Ayrıca, en yüksek değer arama kodunun geri kalanını çapraz platform yazıyoruz
 
Vitaly Muzichenko :

öyle gibi

Ayrıca, en yüksek değer arama kodunun geri kalanını çapraz platform yazıyoruz

Evet şimdi

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA( string symb, ENUM_TIMEFRAMES tf, int period, int ma_shift,
           ENUM_MA_METHOD method, ENUM_APPLIED_PRICE price, int index)
  {
#ifdef __MQL4__
   return ( iMA (symb,tf,period,ma_shift,method,price,index));
#else
   double buf[ 1 ];
   static int handle=- 1 ;
   if (handle< 0 )
     {
       handle= iMA (symb,tf,period,ma_shift,method,price);
     }
   if (handle< 0 )
     {
       PrintFormat ( "Failed to create handle MA %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 MA %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
         return ( WRONG_VALUE );
        }
     }
   return (buf[ 0 ]);
#endif
   }

açıkçası daha iyi. Ancak bu blok yerinde değil - tanıtıcı oluşturulduktan hemen sonra yerleştirilmelidir.

 
Vladimir Karputov :

Evet şimdi

açıkçası daha iyi. Ancak bu blok yerinde değil - tanıtıcı oluşturulduktan hemen sonra yerleştirilmelidir.

Optimal olarak, büyük olasılıkla böyle, peki, bir kez oluşturma hatası yazdırır, ancak daha sonra if (...) için daha az kontrol vardır.

 double MA( string symb, ENUM_TIMEFRAMES tf, int period, int ma_shift,
                                       ENUM_MA_METHOD method, ENUM_APPLIED_PRICE price, int index) {
 #ifdef __MQL4__
   return ( iMA (symb,tf,period,ma_shift,method,price,index));
 #else
   double buf[ 1 ];
   static int handle=- 1 ;
   if (handle< 0 ) {
    handle= iMA (symb,tf,period,ma_shift,method,price);
     PrintFormat ( "Failed to create handle MA %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 MA %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
 #endif
 }
 
Vitaly Muzichenko :

Optimal olarak, büyük olasılıkla böyle, peki, bir kez oluşturma hatası yazdırır, ancak daha sonra if (...) için daha az kontrol vardır.

Yulaf lapasında hiçbir şey göremiyorum - her şey birleşiyor.

Styler'ı kullanın.
 
Vladimir Karputov :

Yulaf lapasında hiçbir şey göremiyorum - her şey birleşiyor.

Styler'ı kullanın.

Bir şey varsa, o zaman stilistte tarzımı görmedim, ama ah, kaç tane

Dosyalar:
cc.PNG  100 kb
 

Ne yazık ki, göstergem MQL4'e dayanıyor ve bu işlev bunun sadece küçük bir parçası.

Bu nedenle, MQL5'i orada uygulamak o kadar verimli değil, tamamen yeniden yazmak, uzun ve sorunlu.

 
GlaVredFX :

Ne yazık ki, göstergem MQL4'e dayanıyor ve bu işlev bunun sadece küçük bir parçası.

Bu nedenle, MQL5'i orada uygulamak o kadar verimli değil, tamamen yeniden yazmak, uzun ve sorunlu.

Gösterge, ortalama olarak yarım saat içinde MQL5'e yeniden yazılır. Bir fincan kahve ile.