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

 
Igor Makanu :

Onları ne başlangıçta ne de başka bir yerde başlatmadın, sadece ilan ettin

Kullanmadan önce yazdım, yani. SredRazmax, SredRazmin, Sredn değişkenleriniz dizi değerlerinin toplamıysa, toplamı doğru bir şekilde hesaplamak için değişkeni sıfırlamanız ve ardından dizi öğelerini eklemeniz ve bunları bu değişkende saklamanız gerekir.

onlar.

Peki, hakkında bir sorunuz olacak ikinci şey, göstergede, OnCalculate() her tik olarak adlandırılacaktır , bu da her tikte ZigZag köşelerini sürekli olarak sayacağınız anlamına gelir, yani. saniyede yaklaşık 40-60 kez.

Teşekkürler ama onları sıfırlamaya çalıştım ve OnCalculate() yerine OnStart kullanmaya çalıştım , değerler hala zıplıyor ve ww=0 ise (dizi değeri sürekli görüntüleniyor), o zaman değerler neden bana net değil ​ortalama atla, nasıl yapılır, böylece her tik dikkate alınmaz ve sadece dizideki değerler dikkate alınır?  

 
Dmitry Belov :

Teşekkürler, ama onları sıfırlamayı denedim ve OnCalculate() yerine OnStart'ı kullanmaya çalıştım.

Bunun neden olduğunu size açıklayabileceğimi sanmıyorum, gerçek şu ki komut dosyalarında OnStart() ve göstergelerde OnCalculate() kullanılıyor, komut dosyalarının MQL'deki göstergelerden nasıl farklı olduğunu bulmanız gerekiyor.

Hangi görevin olduğu tam olarak belli değil mi? Neyin değerlerini görüntülemek istiyor musunuz? kodda, tüm grafikte ZigZag zirvelerinin olduğu fiyatları toplarsınız, çıktıda "Ortalama aralık" yazın ve değeri görüntüleyin ( SredRazmax-SredRazmin)/nn ve hesaplama tüm çubuklar için yapılır

çizim için gösterge arabellekleri kullanmıyorsanız neden bir göstergeye ihtiyacınız var? göstergedeki arabellekler çubuklara bağlıdır ve yeni bir çubuk göründüğünde değerleri değişecektir

 
Igor Makanu :

Bunun neden olduğunu size açıklayabileceğimi sanmıyorum, gerçek şu ki komut dosyalarında OnStart() ve göstergelerde OnCalculate() kullanılıyor, komut dosyalarının MQL'deki göstergelerden nasıl farklı olduğunu bulmanız gerekiyor.

Hangi görevin olduğu tam olarak belli değil mi? Neyin değerlerini görüntülemek istiyor musunuz? tüm grafikte ZigZag zirvelerinin olduğu fiyatları topladığınız kodda, çıktıya "Ortalama aralık" yazın ve değeri ( SredRazmax-SredRazmin)/nn görüntüleyin ve tüm çubuklar için hesaplayın

çizim için gösterge arabellekleri kullanmıyorsanız neden bir göstergeye ihtiyacınız var? göstergedeki arabellekler çubuklara bağlıdır ve yeni bir çubuk göründüğünde değerleri değişecektir

Dürüst olmak gerekirse, görevi basitleştirdim (başlangıçta formül biraz farklı görünüyor), dizideki sıfır değeri sabit kalırsa ortalama değerlerin neden zıpladığını anlamanın mümkün olacağını düşündüm. Biri diziyi doldurmak için, diğeri ortalamayı hesaplamak için iki döngüm var, ayrıca bir nn sınırı var, ancak aslında grafiği görüntülemek istedim ve grafik standart bir zikzak, ancak iCustom aracılığıyla cehennemi çiziyorum , ve ortalama ... Sıfır köşelerden, bir öncekinden büyükse, öncekini çıkarın ve öncekini bir öncekinden çıkarın (eksi işaretiyle olacaktır, bu nedenle eksi 1 ile çarpılmalıdır) ) ve tüm bunlar toplanır ve belirtilen nn köşe sayısına bölünür. Ortalama zirve aralığını elde ederiz. Gelecekte, başka zikzak ortalamaları almak istedim, ancak "atlama" değerleriyle ilgili bir engelim vardı.

Başlangıçta böyleydi:

 //+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;
extern int nn= 30 ;

int shift, ww= 0 ;
double zz, SredRazmax= 0.0 ; 
double HZZ[];


int OnInit ()
  {
//--- indicator buffers mapping
     SetIndexBuffer ( 0 ,HZZ);
   SetIndexStyle ( 0 , DRAW_SECTION );
//---
   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[])
  {
//---
   for (shift = 0 ; shift <= Bars - 1 ; shift++){
      zz = iCustom ( NULL , 0 , "ZigZag" , ExtDepth, ExtDeviation, ExtBackstep, 0 , shift);
           if (zz > 0.0 )   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue ;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
   for (ww= 0 ;ww<=nn;ww++){
       if (HZZ[ww]>HZZ[ww+ 1 ]){
          SredRazmax += (HZZ[ww]- HZZ[ww+ 1 ]);      
         }     
         else if (HZZ[ww]<HZZ[ww+ 1 ]){
         SredRazmax += (HZZ[ww]- HZZ[ww+ 1 ])*(- 1 );
        }
         else {
         continue ;
           }
     }  
        
   if (SredRazmax> 0 ){    
   
       Comment ( "Средний размах = " , SredRazmax/nn, "," ,HZZ[ 0 ], "," ,HZZ[ 1 ], "," ,HZZ[ 2 ], "," ,HZZ[ 3 ], "," ,HZZ[ 4 ]);      
        }
   
       
//--- return value of prev_calculated for next call
 return ( 0 );

  
 
  }
 
Dmitry Belov :

Dürüst olmak gerekirse, görevi basitleştirdim (başlangıçta formül biraz farklı görünüyor), dizideki sıfır değeri sabit kalırsa ortalama değerlerin neden zıpladığını anlamanın mümkün olacağını düşündüm. Biri diziyi doldurmak için, diğeri ortalamayı hesaplamak için iki döngüm var, ayrıca bir nn sınırı var, ancak aslında grafiği görüntülemek istedim ve grafik standart bir zikzak, ancak iCustom aracılığıyla cehennemi çiziyorum , ve ortalama ... Sıfır köşelerden, bir öncekinden büyükse, öncekini çıkarın ve öncekini bir öncekinden çıkarın (eksi işaretiyle olacaktır, bu nedenle eksi 1 ile çarpılmalıdır) ) ve tüm bunlar toplanır ve belirtilen nn köşe sayısına bölünür. Ortalama zirve aralığını elde ederiz. Gelecekte, diğer zikzak ortalamalarını almak istedim, ancak "atlama" değerleriyle ilgili bir engelim vardı.

Başlangıçta böyleydi:

görev, prensipte, tam olarak anlamadım, çok geç, uyumak için çok geç, vizyonuma göre düzelttim, sanırım göstergenin sıfır çubuğunda nasıl davranacağı konusunda şüphelerim var (yapmadı) kontrol etmeyin), ancak formülünüze göre bir yorum çizer ve görüntüler.

 //+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;
extern int nn= 30 ;

int   ww= 0 ;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,HZZ);
   SetIndexStyle ( 0 , DRAW_SECTION );
   SetIndexEmptyValue ( 0 , 0.0 );
   up = false ;
   dn = false ;
   lastzz= 0.0 ;
   SredRazmax= 0.0 ;
//---
   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 shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if (prev_calculated== 0 )
     {
      limit=rates_total- 1 ;
      up = false ;
      dn = false ;
      lastzz= 0.0 ;
      SredRazmax= 0.0 ;
       ArrayInitialize (HZZ, 0.0 );
     }
   else limit=rates_total-prev_calculated+ 1 ;
   for (shift=limit; shift>= 0 ; shift--)
     {
      zz= iCustom ( NULL , 0 , "ZigZag" ,ExtDepth,ExtDeviation,ExtBackstep, 0 ,shift);
       if (zz> 0.0 )
        {
         HZZ[shift]=zz;
         if (lastzz>zz) {up= true ;  dn= false ;}
         if (lastzz<zz) {up= false ; dn= true ;}
         if (up) SredRazmax+=zz-lastzz;
         if (dn) SredRazmax+=(zz- lastzz)*(- 1 );
         lastzz=zz;
        }
       else HZZ[shift]= 0.0 ;
     }
   Comment ( "Средний размах = " ,SredRazmax/nn, "," ,HZZ[ 0 ], "," ,HZZ[ 1 ], "," ,HZZ[ 2 ], "," ,HZZ[ 3 ], "," ,HZZ[ 4 ]);
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

Bu sorunu çözmeye yardım et? (Mümkünse.)

Belirli koşullar altında, danışman bir Uyarı verir. Onu çağıran pencerenin Alert ile birlikte aktif hale gelmesi mümkün müdür?

 
Vatal :

Bu sorunu çözmeye yardım et? (Mümkünse.)

Belirli koşullar altında danışman bir Uyarı verir. Alert ile birlikte onu çağıran pencerenin aktif hale gelmesi mümkün mü?

Belgelerde bir örnek var. Danışmanın üzerinde çalıştığı çizelgenin kimliğini alıp gitmeniz gerekiyor...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu :

görev, prensipte, tam olarak anlamadım, çok geç, uyumak için çok geç, vizyonuma göre düzelttim, sanırım göstergenin sıfır çubuğunda nasıl davranacağı konusunda şüphelerim var (yapmadı) kontrol etmeyin), ancak formülünüze göre bir yorum çizer ve görüntüler.

Evet, bana zaman ayırdığınız için teşekkür ederim, gerçekten çiziyorsunuz, muhtemelen yanlış bir şey yaptım. Ama burada yorumda bir dizi göstermiyor (çünkü orada sadece köşeler olmalı?) Ve bir eksi ve bir sayı ile yanlış sayıyor ..., zikzak köşeleri arasındaki aralık aynı değil. Buradaki fikir, önceki küçük tepe noktasını son (az önce oluşmuş) tepe noktasından çıkarmak ve öncekini daha büyük olan ve sayı eksi işaretiyle olacak olan önceki daha küçük olandan çıkarmaktır, onu (- ile çarparız) 1) ve benzeri, ve tüm bunlar nn kez eklenir ve nn'ye bölünür, ortalama çıkıntıyı elde ederiz. Yaklaşık 4 saatte bu USDJPY'de 1.69(to) olacaktır. Gelecekte, tepe noktaları arasındaki ortalama çubuk sayısını hesaplamak istedim. Şimdi kodunuzu, neyi yanlış yaptığımı, neden çizmediğimi ve neden yanlış saydığını anlamaya çalışacağım, işe yarayabilir ...

 
Dmitry Belov :
Evet, bana zaman ayırdığınız için teşekkür ederim, gerçekten çiziyorsunuz, muhtemelen yanlış bir şey yaptım. Ama burada yorumda bir dizi göstermiyor (sonuçta orada sadece köşeler mi olmalı?) Ve bir eksi ve bir sayı ile yanlış sayıyor ..., zikzak köşeleri arasındaki aralık aynı değil. Buradaki fikir, önceki daha küçük olanı son (yeni oluşan) tepe noktasından çıkarmak ve öncekini daha büyük olan ve sayı eksi işaretiyle olacak olan önceki daha küçük olandan çıkarmaktır, onu (- ile çarparız) 1) ve benzeri, ve tüm bunlar nn kez eklenir ve nn'ye bölünür, ortalama çıkıntıyı elde ederiz. Yaklaşık 4 saatte bu USDJPY'de 1.69(to) olacaktır. Gelecekte, tepe noktaları arasındaki ortalama çubuk sayısını hesaplamak istedim. Şimdi kodunuzu, neyi yanlış yaptığımı, neden çizmediğimi ve neden yanlış saydığını anlamaya çalışacağım, işe yarayabilir ...

Yorumdaki köşeler görüntülenmeyecek, çünkü HZZ[] gösterge arabelleği, ZigZag gösterge arabelleğinin kopyalanmış değerlerini içerir, aksi takdirde çizim yapamayız, tepe algılamasını kasıtlı olarak yukarı ve aşağı 2 koşula ayırdım:

 if (up) SredRazmax+=zz-lastzz;
if (dn) SredRazmax+=(zz- lastzz)*(- 1 );

Artık hesaplamaları orada kendiniz yapabilirsiniz, 3Z'nin mevcut tepe noktası zz değişkenidir, önceki tepe değişkeni lastzz , eğer 3Z'nin birkaç köşesini bilmeniz gerekiyorsa, o zaman saklamak için başka bir dizi oluşturmanız gerekir. bu veriler, yeni gösterge arabelleği büyük olasılıkla sizin için her şeyi karmaşıklaştıracaktır, t .to. yeni bir çubuk göründüğünde, gösterge arabelleklerine eklenen tüm diziler grafikle birlikte "kayar"

Not: kod benim örneğim ve sanırım orada 1. çubuğa geçmeniz gerekiyor ve 0'a değil, sürekli olarak SredRazmax değerlerini yeniden hesaplayacak, şimdi kontrol edemiyorum, PC'de terminal yok

 
Igor Makanu :

Yorumdaki köşeler görüntülenmeyecek, çünkü HZZ[] gösterge arabelleği, ZigZag gösterge arabelleğinin kopyalanmış değerlerini içerir, aksi takdirde çizim yapamayız, tepe algılamasını kasıtlı olarak yukarı ve aşağı 2 koşula ayırdım:

Artık hesaplamaları orada kendiniz yapabilirsiniz, 3Z'nin mevcut tepe noktası zz değişkenidir, önceki tepe değişkeni lastzz , eğer 3Z'nin birkaç köşesini bilmeniz gerekiyorsa, o zaman saklamak için başka bir dizi oluşturmanız gerekir. bu veriler, yeni gösterge arabelleği büyük olasılıkla sizin için her şeyi karmaşıklaştıracaktır, t .to. yeni bir çubuk göründüğünde, gösterge arabelleklerine eklenen tüm diziler grafikle birlikte "kayar"

Not: kod benim örneğim ve sanırım orada 1. çubuğa geçmeniz gerekiyor ve 0'a değil, sürekli olarak SredRazmax değerlerini yeniden hesaplayacak, şimdi kontrol edemiyorum, PC'de terminal yok

Göstergem yükler yüklenmez doğru değerleri gösteriyor, ardından her tik ile ortalama değeri artırıyor, zikzak dizisinin çıkış değerlerinde herhangi bir değişiklik olmamasına rağmen üstleri tutuyor. Anlamadığım şey neden böyle? Dil konusunda deneyim ve bilgi eksikliği. Çizmeyi reddedeceğim - bu, iCustum tarafından alınan olağan zikzaktır (şimdi dizinin grafikte üst üste getirilemeyeceğini anlıyorum, bu yüzden şeytan ne çiziyor.). Dizi "kayacak", ancak değerler basitçe yeniden hesaplanacak, değil mi? Anladım Teşekkürler ... Deneyeceğim ... Öğrenin ...
 
Bir danışmana (standart ma) neyin satın alınacağını (satılacağını) nasıl açıklanacağı, yalnızca ortalamaları geçtiği anda gereklidir ve genel olarak ma_1>ma_2 olduğunda değil. Ve sürekli satın alıyor, duramıyor