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

 
Konstantin Nikitin :

Evet yaklaşık aynı. İyi ki atlamışlar. Ana şey, neyin ne olduğunu anlamasıdır ...

O kim? İşte tam da bununla başladım.

SymbolInfoInteger işlevi yalnızca int değerlerini değil, aynı zamanda long, bool ve enum değerlerini de döndürür.

Ve sonra, elbette, Rakamlar () veya _Digits'i kastettim ve yazdıklarımı yazdım. Ve cevabın son satırı, sorunun ikinci kısmıyla ilgiliydi. Rus atasözünü unutma "Akıllı söylemez, aptal tahmin etmez." tahmin etti ve söyledi, ne biri ne de diğeri anlamına geliyor, ama öyle ...
 
Alexey Viktorov :

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov :

Sonraki soru: Gösterge değerinin ne sıklıkla tam olarak 50'ye eşit olacağını düşünüyorsunuz?

Görevi anladığım kadarıyla bir renk > 50 ve diğer bir renk < 50 olmalı ama ben == 50 hiçbir yerde görmedim. Tabii ki == 50 ise kaybı ortadan kaldırmak için karşılaştırmalardan birine >=50 veya başka <=50 eklemeniz gerekir.Din böyle izin verir. Ne kadar güzel görünecek.

Ve ikinci soru: tamponların tüm indekslemesini değiştirme ihtiyacı ne kadardı? Yeniden indekslemeden sonra, koddaki her şeyin düzeltildiğinden emin misiniz? Sırasıyla indeks 4 ve yardımcı tamponlar 5 ve 6 ile bir renk arabelleği atamak daha kolay olabilir. Daha az düzenleme yapmak zorunda kalacak ve birkaç hata daha yapma olasılığı daha düşük olacaktı.

  • Cevap için teşekkürler. Başka birinin koduyla uğraşmayı sevseydiniz, büyük olasılıkla sizi bir uzman olarak kaybederdik, bu nedenle bu konuda aynı ŞANSLI.
  • about <= veya >= Katılıyorum, bir eksiklik, tabii ki biri geçer geçmez orada olmalı, ama şimdilik önemli değil.
  • Denedim, bir renk arabelleğini yeniden atadım, tüm grupları yeniden atadım, grupları yerlerde değiştirdim (daha yüksek / daha düşük) - hiçbir şey yardımcı olmuyor. Şimdi yazıyı bitireceğim ve çizgiler olmadan ayrı bir histogram göstergesi yapmaya çalışacağım. Eğer işe yararsa, onları tekrar birleştirmeye çalışacağım. Burada prensip meselesi. Arkamda anlaşılmazlığın beyaz lekelerini bırakmak istemiyorum.

 
Sergey Voytsekhovsky :

  • Cevap için teşekkürler. Başka birinin koduyla uğraşmayı sevseydiniz, büyük olasılıkla sizi bir uzman olarak kaybederdik, bu nedenle bu konuda aynı ŞANSLI.
  • about <= veya >= Katılıyorum, bir eksiklik, tabii ki biri geçer geçmez orada olmalı, ama şimdilik önemli değil.
  • Denedim, bir renk arabelleğini yeniden atadım, tüm grupları yeniden atadım, grupları yerlerde değiştirdim (daha yüksek / daha düşük) - hiçbir şey yardımcı olmuyor. Şimdi yazıyı bitireceğim ve çizgiler olmadan ayrı bir histogram göstergesi yapmaya çalışacağım. Eğer işe yararsa, onları tekrar birleştirmeye çalışacağım. Burada prensip meselesi. Arkamda anlaşılmaz beyaz lekeler bırakmak istemiyorum.

Tamponların indekslenmesini değiştirdiklerinde muhtemelen beyni çok zorladı.

Geri dönün, 8806 mesajındaki eski kodu alın ve orada sadece arabellek sırasını değiştirin.

   SetIndexBuffer ( 4 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 5 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );
Ardından, 0'ın renk arabelleğine ne zaman konması gerektiğini ve 1 olduğunda koşulları izleyin.
 
Alexey Viktorov :

Muhtemelen, tamponların indekslenmesini değiştirdiklerinde beyin çok gergindi.

Geri dönün, 8806 mesajındaki eski kodu alın ve orada sadece arabellek sırasını değiştirin.

Ardından, renk arabelleğine 0 koymanız gerektiğinde ve 1 olduğunda koşulları izleyin.

Bunu yaptım fayda etmedi, yanlışlıkla yaptığımı kabul ettim, sizin yazınızdan sonra tekrar yaptım. İşte kodda değiştirdiğim yerler. Eskisi yorumlanır.

 //+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots    3

#property indicator_type1    DRAW_LINE        // основная
#property indicator_color1    clrLightSeaGreen
#property indicator_style1    STYLE_SOLID

#property indicator_type2    DRAW_LINE        // сигнальная
#property indicator_color2    clrYellow
#property indicator_style2    STYLE_SOLID

#property indicator_type3    DRAW_COLOR_HISTOGRAM2
#property indicator_color3    clrGreen , clrRed
#property indicator_style3    STYLE_SOLID

#property indicator_width1    3 
#property indicator_width2    2 
#property indicator_width3    1 
//--- input parameters
input int InpKPeriod= 5 ;   // K period
input int InpDPeriod= 3 ;   // D period
input int InpSlowing= 3 ;   // Slowing
//--- indicator buffers
double     ExtMainBuffer[];
double     ExtSignalBuffer[];
double     ColorHistogram_2Buffer1[]; 
double     ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double     ColorHistogram_2Colors[];
double     ExtHighesBuffer[];
double     ExtLowesBuffer[];
color      colors[]={ clrRed , clrGreen };
int        cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtMainBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ExtSignalBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ColorHistogram_2Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,ColorHistogram_2Buffer2, INDICATOR_DATA );
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer ( 4 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 5 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );
   PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0 );
//--- set accuracy
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
//--- set levels
   IndicatorSetInteger ( INDICATOR_LEVELS , 3 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 0 , 20 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 1 , 50 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 2 , 80 );
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble ( INDICATOR_MINIMUM , 0 );
   IndicatorSetDouble ( INDICATOR_MAXIMUM , 100 );
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString ( INDICATOR_SHORTNAME , "Stoch_HISTOGRAM(" +( string )InpKPeriod+ "," +( string )InpDPeriod+ "," +( string )InpSlowing+ ")" );
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString ( 0 , PLOT_LABEL , "Main" );
   PlotIndexSetString ( 1 , PLOT_LABEL , "Signal" );
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger ( 2 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 3 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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 i,k,start;
//--- check for bars count
   if (rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
       return ( 0 );
//---
   start=InpKPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++)
        {
         ExtLowesBuffer[i]= 0.0 ;
         ExtHighesBuffer[i]= 0.0 ;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double dmin= 1000000.0 ;
       double dmax=- 1000000.0 ;
       for (k=i-InpKPeriod+ 1 ;k<=i;k++)
        {
         if (dmin>low[k])  dmin=low[k];
         if (dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod- 1 +InpSlowing- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtMainBuffer[i]= 0.0 ;
     }
//--- main cycle
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sumlow= 0.0 ;
       double sumhigh= 0.0 ;
       for (k=(i-InpSlowing+ 1 );k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
       if (sumhigh== 0.0 ) ExtMainBuffer[i]= 100.0 ;
         else ExtMainBuffer[i]=sumlow/sumhigh* 100 ;
       if (ExtMainBuffer[i]>= 50 ){
         cl= 1 ;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
       if (ExtMainBuffer[i]< 50 ){
         cl= 0 ;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtSignalBuffer[i]= 0.0 ;
     }
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sum= 0.0 ;
       for (k= 0 ;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return (rates_total);
  }
//+------------------------------------------------------------------+ 

Bu değişiklikten önce böyleydi. Bir histogram var, ancak istenen bir renk yok.

İşte böyle oldu. Histogram kayboldu, görüntülenmiyor.

Görünüşe göre yine kafamı kaşıyorum.


 
Sergey Voytsekhovsky :

Bunu yaptım fayda etmedi, yanlışlıkla yaptığımı kabul ettim, sizin yazınızdan sonra tekrar yaptım. İşte kodda değiştirdiğim yerler. Eskisi yorumlanır.

Bu değişiklikten önce böyleydi. Bir histogram var, ancak istenen bir renk yok.

İşte böyle oldu. Histogram kayboldu, görüntülenmiyor.

Görünüşe göre yine kafamı kaşıyorum.


Burada tam bir mantık çöküşü var. Sıra şu şekilde olmalıdır: Histogramın değerini belirleyin , gösterge arabelleğinin i-inci indeksini doldurun. Ardından, bu değerin >=50 olup olmadığını ayrı bir kontrol edin, renk arabelleğini 0, aksi takdirde 1 ile doldurun. Bu, direktifteki renklerin sırasına göre belirlenir.

 #property indicator_color3    clrGreen , clrRed

0 ise clrGreen rengi alınır ve 1 ise clrRed rengi alınır

Ve bu satır kesinlikle gereksizdir ve dizi birincisinin tam tersidir.

 color      colors[]={ clrRed , clrGreen };

Ve bu

 int        cl;

eklemekteki amaç ne? Doğrudan doldurmak daha kolay

ColorHistogram_2Colors[i]= 0 ;
// или 
ColorHistogram_2Colors[i]= 1 ;

Renk arabelleğini doldurmak için bu yapıyı kullanırdım

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1 ; 
Operatör ?: if else ile eşdeğer ancak uygulaması daha kolay
 
Alexey Viktorov :

Burada tam bir mantık çöküşü var. Sıra şu şekilde olmalıdır: Histogramın değerini belirleyin , gösterge arabelleğinin i-inci indeksini doldurun. Ardından, bu değerin >=50 olup olmadığını ayrı bir kontrol edin, renk arabelleğini 0, aksi takdirde 1 ile doldurun. Bu, direktifteki renklerin sırasına göre belirlenir.

0 ise clrGreen rengi alınır ve 1 ise clrRed rengi alınır

Ve bu satır kesinlikle gereksizdir ve dizi birincisinin tam tersidir.

Ve bu

eklemekteki amaç ne? Doğrudan doldurmak daha kolay

Renk arabelleğini doldurmak için bu yapıyı kullanırdım

Operatör ?: if else ile eşdeğer ancak uygulaması daha kolay

UURRAA ve ruh şarkı söyledi. Alexey, çok teşekkür ederim!

Her şey çalıştı, dizi olmadan nasıl ortaya çıktığını tam olarak anlamadım

 color      colors[]={ clrRed , clrGreen };

açıklaması kaldırıldı. Yani burada fazladan bir dizi olmadan yapabilirsiniz?


 
Sergey Voytsekhovsky :

  • Cevap için teşekkürler. Başka birinin koduyla uğraşmayı sevseydiniz, büyük olasılıkla sizi bir uzman olarak kaybederdik, bu nedenle bu konuda aynı ŞANSLI.
  • about <= veya >= Katılıyorum, bir eksiklik, tabii ki biri geçer geçmez orada olmalı, ama şimdilik önemli değil.
  • Denedim, bir renk arabelleğini yeniden atadım, tüm grupları yeniden atadım, grupları yerlerde değiştirdim (daha yüksek / daha düşük) - hiçbir şey yardımcı olmuyor. Şimdi yazıyı bitireceğim ve çizgiler olmadan ayrı bir histogram göstergesi yapmaya çalışacağım. Eğer işe yararsa, onları tekrar birleştirmeye çalışacağım. Burada prensip meselesi. Arkamda anlaşılmazlığın beyaz lekelerini bırakmak istemiyorum.

Danışmanım için açma-kapama düğmesi için Sergey'e çok teşekkürler. Çalışma bir yıl sürdü ve şimdi hazır, test sonuçlarını ilk gören sizsiniz, hazırlıksız yakaladınız, farklı para birimlerinde, farklı spreadlerle ve farklı oranlarda test ettiniz. genel olarak sonuç her yerde aynı, kusura bakmayın bir kafiye buldum... benim Piskun'um bir mucize, her şeyi her yere götürüyor.

ps Hala nasıl düzgün bir şekilde resim ekleyeceğimi öğrenemedim, kusura bakmayın, dış görünümleri ekrandan göndereceğim.

Dosyalar:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov :

Renk arabelleğini doldurmak için bu yapıyı kullanırdım

Operatör ?: if else ile eşdeğer ancak uygulaması daha kolay

Gelecek için harika tavsiyeler ve harika bilim!!! Hatta biraz daha ileri gitti. Sonuç aşağıdadır.

Öyleydi:

 if (ExtMainBuffer[i]>= 50 ){
         //cl=1;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]= 0 ;
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=" ,ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
if (ExtMainBuffer[i]< 50 ){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]= 1 ;
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=" ,ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 

Böylece, yaklaşımın etkinliği aşikar hale geldi !!! Teşekkür ederim.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50 ; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1 ;
         Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
             " # ExtSignalBuffer[i]=" ,ExtSignalBuffer[i],
             " # ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
             " # ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
             " # ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky :

Gelecek için harika tavsiyeler ve harika bilim!!! Hatta biraz daha ileri gitti. Sonuç aşağıdadır.

Öyleydi:

Böylece, yaklaşımın etkinliği aşikar hale geldi !!! Teşekkür ederim.

Burada verimlilik yoktur - bir yerine if-else koşulunun üç katı. Burası daha kötü...

 
Artyom Trishkin :

Burada verimlilik yoktur - bir yerine if-else koşulunun üç katı. Burası daha kötü...

Evet kesinlikle. buna dikkat etmedi. Ve daha iyi görünüyor, yine daha az harf var.

Ancak bir operatörün altına koymak imkansız ?: aynı anda üç infaz (nasıl söyleyeceğimi bilmiyorum)?