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

 
Vladimir Karputov :

Burada:

Teşekkür ederim. Bilgisayarımın başında olacağım, belki bir bakarım.
 
Artyom Trishkin :
Teşekkür ederim. Bilgisayar başında olacağım, belki bir bakarım.

orada, çok, çok eski bir formatta, MQL4'ün göstergesi yazılı, onlara uzun zamandır dokunmadım, nasıl yazıldığını hatırladığımdan emin değilim

@zig2003 bir seçenek olarak, başlangıçtan(); IndicatorBuffers(6); öğesini kaldırmayı deneyin;

ve en üstte, #property Indicator_buffers 6'yı düzeltin

 
Igor Makanu ve hindiyi düzelttikten sonra, geri dönüşü programlamak için danışmanımdakiyle neyi karşılaştırmam gerekecek?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003 :
Igor Makanu ve hindiyi düzelttikten sonra, geri dönüşü programlamak için danışmanımdakiyle neyi karşılaştırmam gerekecek?

her gösterge birkaç gösterge tamponundan oluşur

iCustom() aracılığıyla bir EA'dan göstergeyi çağırırken, belirli bir çubukta bir arabelleğin değerini alırsınız, bu değerleri Ctrl+D veri penceresinde görebilirsiniz

neyin ve neyin karşılaştırılacağı aracınıza veya gösterge tamponlarının veya tamponun değerine ve fiyata bağlıdır - birçok seçenek vardır

Yeni başlayanlar için, Mashka hakkında bir danışman yapacaktınız ve sonra bunu anladığınızda MA yerine göstergenizi arayacaksınız.

genel olarak, her şey o kadar basit değil - birkaç komut yazdım ve danışman hazır


Not: göstergenin tersine çevrilmesi, gösterge arabelleklerinin birkaç değerinin bir karşılaştırmasıdır, 2 numaralı çubuktaki ekranınıza bakılırsa 1 numaralı arabellek fiyatına yakın değerler olmalıdır ve kalan arabellekler EMPTY_VALUE değerlerine sahip olacaktır. ve 1 numaralı çubukta, aksine, 1 numaralı arabellek EMPTY_VALUE değerine sahiptir ve 2 veya 3 arabelleğin bazılarının EMPTY_VALUE değerinden farklı bir değeri olacaktır - veriye genel bakış penceresinde bakmanız gereken tek şey bu ( fare okunu çubuklar üzerinde hareket ettirin ve arabelleklerin değerlerini görün)

 

Igor, teşekkürler, hindiyi düzeltti, ancak tampondaki değer görünmedi. Mashki uzun bir geçmiş aşamadır, orada her şey basittir, iki satır vardır - iki tampon. Ve burada bir satır ve öyle görünüyor ki, bir arabellek. Genellikle bir satırdan oluşan ancak farklı renk tamponlarına sahip bu tür göstergeler için kodu şöyle yazarım:

 //Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 0 , 1 );             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 1 , 1 );             //                                (sell)
   double AMAbuy_2  = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 0 , 2 );             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 = iCustom ( NULL , _Period , "AMA" , Range, FastMA,SlowMA,filter,normalizeDigits, 1 , 2 );             //                                (sell)                    
                         
   if (AMAbuy_1> 0 && AMAsell_2> 0 )                                                                                 //Вход в бай
       return ( 1 );                                                                                           
   if (AMAsell_1> 0 && AMAbuy_2> 0 )                                                                                 //Вход в селл
       return (- 1 );                                                                                          
        
   return ( 0 );
  } 

Ancak bu, yalnızca her renge gerçek bir arabellek atanırsa geçerlidir. İlk kapalı çubukta renk değiştiğinde, arabellek değeri sıfırdan büyük olurken, önceki çubukta ya sıfıra eşitti ya da farklı bir rengin arabelleği sıfırdan büyüktü. Ve bu hindiden ikinci, Renk Sat'ın değerini alamıyorum ve bir geri dönüşü yakalamak için neyle karşılaştırılacağım belli değil. Tüm arabellek numaralarını denedim. Ve bu üzücü, çünkü bu Mladenovsky hindisi, eski olmasına rağmen, manuel stratejilerde oldukça iyi bir eğilim gösteriyor .... Birisi ikinci tampondan değerin nasıl çekileceğini ve ters formülün nasıl yazılacağını tahmin edebilir mi?

 
zig2003 :

Igor, teşekkürler, hindiyi düzeltti, ancak tampondaki değer görünmedi. Mashki uzun bir geçmiş aşamadır, orada her şey basittir, iki satır vardır - iki tampon. Ve burada bir satır ve öyle görünüyor ki, bir arabellek. Genellikle bir satırdan oluşan ancak farklı renk tamponlarına sahip bu tür göstergeler için kodu şöyle yazarım:

Ancak bu, yalnızca her renge gerçek bir arabellek atanırsa geçerlidir. İlk kapalı çubukta renk değiştiğinde, arabellek değeri sıfırdan büyük olurken, önceki çubukta ya sıfıra eşitti ya da farklı bir rengin arabelleği sıfırdan büyüktü. Ve bu hindiden ikinci rengin değerini hiçbir şekilde alamıyorum ve bir geri dönüşü yakalamak için neyle karşılaştıracağım belli değil. Ve bu üzücü, çünkü bu Mladenovsky hindisi, eski olmasına rağmen, manuel stratejilerde oldukça iyi bir eğilim gösteriyor .... Belki birisi tersine çevirme formülünü nasıl yazacağını tahmin eder?

Göstergede herhangi bir değişiklik olmadan.

İki arabellekteki veriler ne anlama geliyor - 0 ve 1'de:

  • Tampon 0'da bir değer varsa ve arabellek 1'de değer yoksa bu yön uzundur ( gösterge çizgisinin mavi rengi (varsayılan ise))
  • Tampon 0'da bir değer varsa ve arabellek 1'de bir değer varsa, bu kısalma yönüdür (gösterge çizgisinin kırmızı rengi (varsayılan ise))

Çizginin yönünü (rengini) değiştirin:

  • Tampon 0 her zaman bir değere sahiptir ve bu arada, belirlemek için de kullanılabilir (üç çubuktaki değerleri karşılaştırın: 2<=1 && 1>0 --> down, 2>=1 && 1<0 - -> yukarı)
    ...
    Ancak yalnızca arabellek 1'i kullanabilirsiniz:
  • Çubuk 0'da arabellek 1'de değer yoksa ve çubuk 1'de bir değer varsa, bu, satırın yönünde uzun bir değişikliktir;
  • Çubuk 0'da arabellek 1'de bir değer varsa ve çubuk 1'de değer yoksa, bu, hattın yönünde bir değişikliktir;

Burada "Değer yok" EMPTY_VALUE . Peki, ya da DBL_MAX - önemli değil, aynı şey. Yani sıfır değil, yani EMPTY_VALUE .

 
zig2003 :

Birisi ikinci tampondan değerin nasıl alınacağını ve ters formülün nasıl yazılacağını tahmin edebilir mi?

tahmin etmeye gerek yok, önce göstergeyi MQL4 dilinin mevcut durumuna karşılık gelen normal bir biçimde yeniden yazmalısınız.

burada kodu biraz düzene koydum ama hata olmayacağından emin değilim, kaynağı beğenmedim ama ne yazık ki böyle oldu ve işe yaradı

 #property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int     Range           = 9 ;
input int     FastMA          = 3 ;
input int     SlowMA          = 30 ;
input int     filter          = 25 ;
input int     normalizeDigits = 4 ;

input bool    alertsOn        = false ;
input bool    alertsOnCurrent = false ;
input bool    alertsMessage   = true ;
input bool    alertsSound     = true ;
input bool    alertsEmail     = false ;
input string soundfile       = "alert2.wav" ;


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
{
   SetIndexBuffer ( 0 , fAMA);
   SetIndexLabel( 0 , "fAMA" );
   SetIndexBuffer ( 1 , Downa);
   SetIndexLabel( 1 , "Downa" );
   SetIndexBuffer ( 2 , Downb);
   SetIndexLabel( 2 , "Downb" );
   SetIndexBuffer ( 3 , trend);
   SetIndexLabel( 3 , "trend" );
   SetIndexBuffer ( 4 , mAMA);
   SetIndexLabel( 4 , "mAMA" );
   SetIndexBuffer ( 5 , AMA);
   SetIndexLabel( 5 , "AMA" );
   for ( int i= 0 ; i< indicator_buffers ; i++) {
      SetIndexStyle(i, DRAW_LINE );
   }
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       // размер входных таймсерий
                 const int prev_calculated,   // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],         // Low
                 const double &close[],       // Close
                 const long &tick_volume[],   // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if (prev_calculated== 0 ) limit=rates_total- 1 ;
   else limit=rates_total-prev_calculated+ 1 ;
   if (trend[limit] == - 1 ) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1 );
   double k2 = 2.0 / (FastMA + 1 ) - k1;
   for ( int i = limit; i>= 0 ; i--) {
       double sdAMA = 0 ;
       double Noise = 0 ;
       for ( int k= 0 ; k<Range; k++) Noise += MathAbs (Close[i+k] - Close[i+k+ 1 ]);
       double ER    = 0 ;
       if (Noise != 0 ) ER = MathAbs (Close[i] - Close[i+Range]) / Noise;
       double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+ 1 ] + NormalizeDouble (SSC*SSC*(Close[i] - AMA[i+ 1 ]), normalizeDigits);
      mAMA[i] = AMA[i];

       if (filter < 1 ) fAMA[i] = mAMA[i];
       else {
         for (k = i; k <= i + SlowMA - 1 ; k++)  sdAMA = sdAMA + MathAbs (mAMA[k] - mAMA[k+ 1 ]);
         double dAMA  = mAMA[i] - mAMA[i+ 1 ];
         if (dAMA >= 0 )
             if (dAMA < NormalizeDouble (filter*sdAMA/( 100 *SlowMA), 4 ) &&  High[i] <= High[Highest( NULL , 0 , MODE_HIGH , 4 , i)]+ 10 * Point )
               fAMA[i] = fAMA[i+ 1 ];
             else    fAMA[i] = mAMA[i];
         else if ( MathAbs (dAMA) < NormalizeDouble (filter*sdAMA/( 100 *SlowMA), 4 ) && Low[i] > Low[Lowest( NULL , 0 , MODE_LOW , 4 , i)]- 10 * Point )
            fAMA[i] = fAMA[i+ 1 ];
         else   fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE ;
      Downb[i] = EMPTY_VALUE ;
      trend[i] = trend[i+ 1 ];
       if (fAMA[i]> fAMA[i+ 1 ]) trend[i] = 1 ;
       if (fAMA[i]< fAMA[i+ 1 ]) trend[i] =- 1 ;
       if (trend[i]==- 1 ) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
       if (alertsOnCurrent)
         int whichBar = 0 ;
       else      whichBar = 1 ;
       if (trend[whichBar] != trend[whichBar+ 1 ])
         if (trend[whichBar] == 1 )
            doAlert( "buy" );
         else   doAlert( "sell" );
   }
   return (rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert( string doWhat)
{
   static string    previousAlert= "nothing" ;
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[ 0 ]) {
      previousAlert  = doWhat;
      previousTime   = Time[ 0 ];

       //
       //


      message =   StringConcatenate ( Symbol (), " at " , TimeToStr( TimeLocal (), TIME_SECONDS ), " AMA STL_Color " , doWhat);
       if (alertsMessage) Alert (message);
       if (alertsEmail)   SendMail ( StringConcatenate ( Symbol (), " AMA STL_Color " ), message);
       if (alertsSound)   PlaySound (soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint( int i, double & first[], double & second[])
{
   if ((second[i]  != EMPTY_VALUE ) && (second[i+ 1 ] != EMPTY_VALUE ))
      second[i+ 1 ] = EMPTY_VALUE ;
   else if ((first[i] != EMPTY_VALUE ) && (first[i+ 1 ] != EMPTY_VALUE ) && (first[i+ 2 ] == EMPTY_VALUE ))
      first[i+ 1 ] = EMPTY_VALUE ;
}
void PlotPoint( int i, double & first[], double & second[], double & from[])
{
   if (first[i+ 1 ] == EMPTY_VALUE )
       if (first[i+ 2 ] == EMPTY_VALUE ) {
         first[i]  = from[i];
         first[i+ 1 ]  = from[i+ 1 ];
         second[i] = EMPTY_VALUE ;
      }
       else   {
         second[i] = from[i];
         second[i+ 1 ] = from[i+ 1 ];
         first[i]  = EMPTY_VALUE ;
      }
   else      {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE ;
   }
}
//+------------------------------------------------------------------+

Burada bu göstergenin gösterge tamponlarının değerlerini görüyorum:


 
Çocuklar, ipuçları için teşekkürler. Özellikle Igor Makanu'yu . Evet, gerçekten de, varsayılan 3 yerine 6 arabellek yaptım ve 1 ve -1 değerleri arabelleklerden birinde göründü, ancak orijinal olanlarda hiç görünmedi. Bu nedenle değerleri çıkaramadı. Ve asla tahmin edemezdim. Şimdi her şey yerine oturdu. Her şey çalışıyor. Igor, hindiyi yeni bir formatta damıttığın için de teşekkürler. Bilginiz için bir kez daha alçak yay!!!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu :

tahmin etmeye gerek yok, önce göstergeyi MQL4 dilinin mevcut durumuna karşılık gelen normal bir biçimde yeniden yazmalısınız.

burada kodu biraz düzene koydum ama hata olmayacağından emin değilim, kaynağı beğenmedim ama ne yazık ki böyle oldu ve işe yaradı

Burada bu göstergenin gösterge tamponlarının değerlerini görüyorum:

Yeniden yazmadan çalışır ve çok basit bir şekilde verilerinizi almanızı sağlar. Yukarıda her şeyi açıkladım - veri penceresindeki (Ctrl + D) arabelleklerinin okumalarına bakmanız yeterliydi.

 
Artyom Trishkin :

Yeniden yazmadan çalışır ve çok basit bir şekilde verilerinizi almanızı sağlar. Yukarıda her şeyi açıkladım - veri penceresindeki (Ctrl + D) arabelleklerinin okumalarına bakmanız yeterliydi.

Yukarıda, IndicatorCounted() işlevlerinin eski göstergelerde nasıl çalıştığını hatırlamadığımı yazdım, OnCalculate() ile yeni gösterge biçimi bir şekilde daha anlaşılır

Eh, sorun çözülmüş gibi görünüyor, peki, tamam;)