Hatalar, hatalar, sorular - sayfa 1391

 
Ilya Malev :

"Güncelle" ye tıkladıktan sonra her şey hesaplandı. Yine de dilek olarak, İnternette oluşturulan göstergelerin verilerinin OnCalculate/OnTimer vb.'ye ilk çağrıdan önce hesaplanması daha uygun olacaktır.

Veya init'ten sonra gösterge içindeki döngüde hesaplanmalarını programlı olarak bekleyebilmek.

Göstergeyi hesaplamak için kullanıcının grafikte birkaç kez "yenile" düğmesine basması gerekecektir. Onun ihtiyacı var mı? Eski güzel MT4'ü hatırlayacak ve MT5'in bazı avantajlarına rağmen devam edecek.

Göstergelerdeki tüm hesaplamalar yalnızca OnCalculate() içinde YAPILMALIDIR .
 
Karputov Vladimir :
Göstergelerdeki tüm hesaplamalar yalnızca OnCalculate() içinde YAPILMALIDIR .
Bu durumda Ichimoku göstergesinin okumalarından bahsediyorum. Mevcutta, yani OnCalculate'de kullanılan göstergelerin okumalarından bahsediyoruz. Böylece, MT4'te olduğu gibi OnCalculate çağrılmadan önce hesaplanırlar. Veya OnCalculate'de hesaplamalarını bekleyebilirsiniz. Aksi takdirde, kullanıcıların göstergeyi oluşturmak için birkaç kez Yenile'yi tıklamaları gerekecektir. Tüm göstergeler 1 saniyede tüm geçmiş üzerine inşa edilmediğinden, hesaplanması daha uzun süren karmaşık göstergeler vardır. Bunca zaman, kullanıcının "Güncelle" düğmesini pişirmesi gerekecek ve MT4'te sadece işlemeyi beklemek gerekliydi.
 
Ilya Malev :
Bu durumda Ichimoku göstergesinin okumalarından bahsediyorum. Mevcutta, yani OnCalculate'de kullanılan göstergelerin okumalarından bahsediyoruz. Böylece, MT4'te olduğu gibi OnCalculate çağrılmadan önce hesaplanırlar.
OnInit(), gösterge için ticaret ortamını hazırlar. Ve yalnızca OnCalculate() içinde gösterge verilerini kullanmak zaten mümkündür.
 
Ilya Malev :
Bu durumda Ichimoku göstergesinin okumalarından bahsediyorum. Mevcutta, yani OnCalculate'de kullanılan göstergelerin okumalarından bahsediyoruz. Böylece, MT4'te olduğu gibi OnCalculate çağrılmadan önce hesaplanırlar. Veya OnCalculate'de hesaplamalarını bekleyebilirsiniz. Aksi takdirde, kullanıcıların göstergeyi oluşturmak için Yenile'yi birkaç kez tıklamaları gerekecektir. Tüm göstergeler 1 saniyede tüm geçmiş üzerine inşa edilmediğinden, hesaplanması daha uzun süren karmaşık göstergeler vardır. Bunca zaman, kullanıcının "Güncelle" düğmesini pişirmesi gerekecek ve MT4'te sadece işlemeyi beklemek gerekliydi.

Forumda zaman zaman bu sorun çıkıyor. Maalesef OnTimer () içinde OnCalculate () öğesini çağırmak sorunu çözmez.

Ama yine de deneyin. Bu makalede bir örnek bulunabilir: MQL5 Tarifleri - MQL5'te Çok Para Birimli Volatilite Göstergesinin Geliştirilmesi .

Sonra yaz, zor değilse çıktı ya da çıkmadı.

 
Karputov Vladimir :
OnInit(), gösterge için ticaret ortamını hazırlar. Ve yalnızca OnCalculate() içinde gösterge verilerini kullanmak zaten mümkündür .
Göstergenin diğer sembollerden ve/veya TF'den başka göstergeler kullanması durumunda, grafikteki "Yenile" düğmesine bir veya daha fazla kez basmadan (veya 1/birkaç tik bekledikten sonra) bunun imkansız olduğu ortaya çıkıyor.
 
Anatoli Kazharski :

Forumda zaman zaman bu sorun çıkıyor. Maalesef OnTimer () içinde OnCalculate () öğesini çağırmak sorunu çözmez.

Ama yine de deneyin. Bu makalede bir örnek bulunabilir: MQL5 Tarifleri - MQL5'te Çok Para Birimli Volatilite Göstergesinin Geliştirilmesi .

Sonra yaz, zor değilse çıktı ya da çıkmadı.

Bağlantı için teşekkürler. Deneyeceğim ve sana söyleyeceğim.
 
Ilya Malev :
Gösterge diğer sembollerden ve/veya TF'den başka göstergeler kullanıyorsa, grafikteki "Yenile" düğmesine bir veya daha fazla kez basmadan (veya 1/birkaç tik bekledikten sonra) imkansız olduğu ortaya çıkıyor.

Ve verdiğim kodun çalışmasına daha yakından bakarsanız? Ve özellikle, "Uzmanlar"? Hafta sonu terminali yeniden başlattıktan sonra:

 2015.10 . 11 14 : 44 : 01.672 test (USDCAD,M5)         0
2015.10 . 11 14 : 44 : 01.681 test (USDCAD,M5)         1
2015.10 . 11 14 : 44 : 01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10 . 11 14 : 44 : 01.705 test (USDCAD,M5)         2
2015.10 . 11 14 : 44 : 01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

Hesaplamanın yalnızca OnCaalculate()'e yapılan ikinci çağrıda tamamlandığı açıkça görülmektedir. Bu nedenle, hiç kimse programcıyı kontroller için sorumluluktan kurtaramaz: OncalCulate() içindeki CopyBuffer() sonucunu kontrol edin - eğer fonksiyon herhangi bir şey döndürmediyse, OnCalculate() içindeki bir sonraki girişte kontrol etmeniz gerekir.

 
Anatoli Kazharski :

Forumda zaman zaman bu sorun çıkıyor. Maalesef OnTimer () içinde OnCalculate () öğesini çağırmak sorunu çözmez.

Ama yine de deneyin. Bu makalede bir örnek bulunabilir: MQL5 Tarifleri - MQL5'te Çok Para Birimli Volatilite Göstergesinin Geliştirilmesi .

Sonra yaz, zor değilse çıktı ya da çıkmadı.

Makaleyi henüz okumadım, ancak OnTimer ile resepsiyon iyi çalışıyor

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    0
int i_ich= INVALID_HANDLE ;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   EventSetTimer ( 1 );
   i_ich= iIchimoku ( Symbol (), PERIOD_H4 , 9 , 26 , 52 );
   if (i_ich== INVALID_HANDLE )
     {
       Print ( "Невозможно создать индиктор Ишимоку!" );
       return ( INIT_FAILED );
     }
   SetIndexBuffer ( 0 ,ind_buf, INDICATOR_DATA );
   ArraySetAsSeries (ind_buf, true );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer (){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate ( 0 , 0 , Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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[])
  {
   static int count= 0 ;
   static datetime now= 0 ;
   if (now== 0 )  now= TimeLocal ();
   if (count>= 0 ){
       Print (count);
       double temp[];
       int copied= CopyBuffer (i_ich, 0 , 0 , 1 ,temp);
       if (copied> 0 ){
         Print ( "Расчитано " , BarsCalculated (i_ich), " баров за " , int ( TimeLocal ()-now), " секунд" );
         EventKillTimer (); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=- 1 ;
      } else
         count++;
   }
   if (rates_total== 0 )   return ( 0 ); // Если это вызов из OnTimer, то возврат
   
   // ...
   return (rates_total);
}

Genel olarak, burada OnTimer'dan OnCalculate'e yapılan çağrının çalıştığı bir eğride gösterilmektedir) Doğru değerlerin transferini zaman serilerinde eklemeniz gerekir.

 
Ilya Malev :

Makaleyi henüz okumadım, ancak OnTimer ile alım iyi çalışıyor

Basit göstergelerde oldukça normaldir. Ancak daha karmaşık olanlarda, nedense bazen durur. )
 
Ilya Malev :

Makaleyi henüz okumadım, ancak OnTimer ile alım iyi çalışıyor

Styler'ı kullanın - hataları tespit etmek daha iyidir.

   if (count>= 0 )
     {
       Print (count);
       double temp[];
       int copied= CopyBuffer (i_ich, 0 , 0 , 1 ,temp);
       if (copied> 0 )
        {
         Print ( "Расчитано " , BarsCalculated (i_ich), " баров за " , int ( TimeLocal ()-now), " секунд" );
         EventKillTimer (); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=- 1 ;
        }
       else
         count++;
     }
Sayma değişkeni, OnCalculate()'den çıkmadan önce artırılmalıdır - bu durumda, bu değişken OnCalculate'deki tüm girişleri doğru bir şekilde sayacaktır.