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

 
Andrei Gerasimenko :

mql4 kullanarak böyle bir algoritmayı uygulamak için büyük bir istek var:

Farklı brokerlerden iki MT4 terminali vardır. Birinin (piyasadaki gibi) hiçbir şekilde başka bir terminale sürüklenemeyen "özel" bir göstergesi vardır.

İşte burada! "Özel" bir göstergenin arabelleklerinden okumalar almak ve bunları terminalinizdeki göstergenize uygulamak bir şekilde mümkün mü?

Kaynaklar bir şekilde başarısız olur.

Seçenek numarası 1 = Mikhalych ile bir hesap açın (doğru mu?)

Seçenek numarası 2 = gösterge verilerini bir dosyaya kaydedecek bir gösterge yazın ve kaydedin, ardından bu dosyayı başka bir terminaldeki başka bir gösterge ile okuyun ve onu kullanarak satırlar oluşturun.

 

Lütfen yardım edin - Göstergeyi daha hafif hale getirmeye çalışıyorum - RSI'dan bir remake, ancak gösterge değerlerinin neden farklı olduğunu anlayamıyorum?

//+------------------------------------------------------------------+
//|                                                       SVA_02.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link        "http://www.metaquotes.net/"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

//---- input parameters
extern int RSIPeriod= 14 ;
extern int Levl= 50 ;
extern int TF= 0 ;
//---- buffers
double MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   IndicatorBuffers ( 1 );
   SetIndexBuffer ( 0 ,MABuffer);

//---- indicator line
   SetIndexStyle ( 0 , DRAW_LINE );
//----
//---- name for DataWindow and indicator subwindow label
//   short_name="RSI("+IntegerToString(RSIPeriod)+")";
   short_name= "RSI(" +RSIPeriod+ ")" ;
   IndicatorShortName (short_name);
   SetIndexLabel ( 0 ,short_name);

   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int     i,counted_bars= IndicatorCounted ();
   double rel,negative,positive,sma,x,y,Pos,Neg;
//----
   if ( Bars <=RSIPeriod) return ( 0 );
   if (TF!= 0 )
     {
       string name= WindowExpertName ();
       for (i= 0 ; i< Bars -counted_bars+ 1 ; i++)
        {
         int barIndex= iBarShift ( NULL ,TF, Time [i], false );
         MABuffer[i]= iCustom ( Symbol (),TF,name,RSIPeriod,Levl, 0 , 0 ,barIndex);
        }
       return ( 0 );
     }

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {
       double sumn= 0.0 ,sump= 0.0 ;
       if (i== Bars -RSIPeriod- 1 )
        {
         int k= Bars - 2 ;
         //---- initial accumulation
         while (k>=i)
           {
            rel= Close [k]- Close [k+ 1 ];
             if (rel> 0 ) sump+=rel;
             else       sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
       else
        {
         //---- smoothed moving average
         rel= Close [i]- Close [i+ 1 ];
         if (rel> 0 ) sump=rel;
         else       sumn=-rel;
         positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
        }

      Pos=positive;
      Neg=negative;
      i--;
     }
   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {

      x=positive;
      y=negative;
       if (x> 0 )sma= Close [i+ 1 ]+x;
       else sma= Close [i+ 1 ]-y;
      MABuffer[i]=sma;
      i--;
     }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+


ve

//+------------------------------------------------------------------+
//|                                                       SVA_03.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link        "http://www.metaquotes.net/"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

//---- input parameters
extern int RSIPeriod= 14 ;
extern int Levl= 50 ;
extern int TF= 0 ;
//---- buffers
double MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   IndicatorBuffers ( 1 );
   SetIndexBuffer ( 0 ,MABuffer);

//---- indicator line
   SetIndexStyle ( 0 , DRAW_LINE );
//----
//---- name for DataWindow and indicator subwindow label
//   short_name="RSI("+IntegerToString(RSIPeriod)+")";
   short_name= "RSI(" +RSIPeriod+ ")" ;
   IndicatorShortName (short_name);
   SetIndexLabel ( 0 ,short_name);

   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int     i,counted_bars= IndicatorCounted ();
   double rel,negative,positive,sma,x,y,Pos,Neg;
//----
   if ( Bars <=RSIPeriod) return ( 0 );
   if (TF!= 0 )
     {
       string name= WindowExpertName ();
       for (i= 0 ; i< Bars -counted_bars+ 1 ; i++)
        {
         int barIndex= iBarShift ( NULL ,TF, Time [i], false );
         MABuffer[i]= iCustom ( Symbol (),TF,name,RSIPeriod,Levl, 0 , 0 ,barIndex);
        }
       return ( 0 );
     }

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {
       double sumn= 0.0 ,sump= 0.0 ;
       if (i== Bars -RSIPeriod- 1 )
        {
         int k= Bars - 2 ;
         //---- initial accumulation
         while (k>=i)
           {
            rel= Close [k]- Close [k+ 1 ];
             if (rel> 0 ) sump+=rel;
             else       sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
       else
        {
         //---- smoothed moving average
         rel= Close [i]- Close [i+ 1 ];
         if (rel> 0 ) sump=rel;
         else       sumn=-rel;
         positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
        }

      x=positive;
      y=negative;
      Pos=positive;
      Neg=negative;
       if (x> 0 )sma= Close [i+ 1 ]+x;
       else sma= Close [i+ 1 ]-y;
      MABuffer[i]=sma;

      i--;
     }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
Dosyalar:
SVA_02.mq4  4 kb
SVA_03.mq4  4 kb
 
-Aleks- :

Lütfen yardım edin - Göstergeyi daha hafif hale getirmeye çalışıyorum - RSI'dan bir remake, ancak gösterge değerlerinin neden farklı olduğunu anlayamıyorum?

...

ve

...

Ne yapmaya çalıştığınız, neyi yanlış yaptığınız ve sonunda ne elde etmek istediğiniz hiç de net değil.
 
-Aleks- :

Lütfen yardım edin - Göstergeyi daha hafif hale getirmeye çalışıyorum - RSI'dan bir remake, ancak gösterge değerlerinin neden farklı olduğunu anlayamıyorum?

03'te, çubuk için pozitif ve negatif hesaplandı ve bunları hemen ortalamayı hesaplamak için kullandı. 02'de, ortalamanın hesaplanması ayrı bir döngüde, pozitif ve negatif olarak ne? Bir şey var ama hesaplanan çubuk için değil.
 
Artyom Trishkin :
Ne yapmaya çalıştığınız, neyi yanlış yaptığınız ve sonunda ne elde etmek istediğiniz hiç de net değil.

Başlangıçta, RSI kısmını hesaplarken fazladan tamponlardan kurtulmaya çalışıyorum, fazladan tamponları teorik olarak kaldırmak şuydu:

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {
       double sumn= 0.0 ,sump= 0.0 ;
       if (i== Bars -RSIPeriod- 1 )
        {
         int k= Bars - 2 ;
         //---- initial accumulation
         while (k>=i)
           {
            rel= Close [k]- Close [k+ 1 ];
             if (rel> 0 ) sump+=rel;
             else       sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
       else
        {
         //---- smoothed moving average
         rel= Close [i]- Close [i+ 1 ];
         if (rel> 0 ) sump=rel;
         else       sumn=-rel;
         positive=(PosBuffer[i+ 1 ]*(RSIPeriod- 1 )+sump)/RSIPeriod;
         negative=(NegBuffer[i+ 1 ]*(RSIPeriod- 1 )+sumn)/RSIPeriod;
        }
      PosBuffer[i]=positive;
      NegBuffer[i]=negative;

      i--;
     }

PosBuffer[i] ve NegBuffer[i] aslında bir çubuktan daha derinde kullanılmayan, ancak belleği tüketen pozitif ve negatif geçmiş değerleridir:

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {
       double sumn= 0.0 ,sump= 0.0 ;
       if (i== Bars -RSIPeriod- 1 )
        {
         int k= Bars - 2 ;
         //---- initial accumulation
         while (k>=i)
           {
            rel= Close [k]- Close [k+ 1 ];
             if (rel> 0 ) sump+=rel;
             else       sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
       else
        {
         //---- smoothed moving average
         rel= Close [i]- Close [i+ 1 ];
         if (rel> 0 ) sump=rel;
         else       sumn=-rel;
         positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
        }

      Pos=positive;
      Neg=negative;
      i--;
     }

Ardından, aynı döngüde daha fazla SVA_02 hesaplaması yapan göstergem için kısmı kestim (kodun sorunlu kısmı sağlandı).

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {

      x=positive;
      y=negative;
       if (x> 0 )sma= Close [i+ 1 ]+x;
       else sma= Close [i+ 1 ]-y;
      MABuffer[i]=sma;
      i--;
     }

Ve sonra döngü aynı olduğu için hesaplamayı ilk döngüye koyabileceğinizi düşündüm - SVA_03 çıktı

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   while (i>= 0 )
     {
       double sumn= 0.0 ,sump= 0.0 ;
       if (i== Bars -RSIPeriod- 1 )
        {
         int k= Bars - 2 ;
         //---- initial accumulation
         while (k>=i)
           {
            rel= Close [k]- Close [k+ 1 ];
             if (rel> 0 ) sump+=rel;
             else       sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
       else
        {
         //---- smoothed moving average
         rel= Close [i]- Close [i+ 1 ];
         if (rel> 0 ) sump=rel;
         else       sumn=-rel;
         positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
        }

      x=positive;
      y=negative;
      Pos=positive;
      Neg=negative;
       if (x> 0 )sma= Close [i+ 1 ]+x;
       else sma= Close [i+ 1 ]-y;
      MABuffer[i]=sma;

      i--;
     }
//----
   return ( 0 );
  }

Son adımda, MABuffer[i] sonuçlarının SVA_02 ve SVA_03'te farklı olduğu ortaya çıkıyor - hatanın ne olduğunu mantıksal olarak anlayamıyorum.

 
Dmitry Fedoseev :
03'te, çubuk için pozitif ve negatif hesaplandı ve bunları hemen ortalamayı hesaplamak için kullandı. 02'de, ortalamanın hesaplanması ayrı bir döngüde, pozitif ve negatif olarak ne? Bir şey var ama hesaplanan çubuk için değil.
Evet, öyle, ama asıl fark nedir? Döngüler aynı - lütfen mantıksal hatanın ne olduğunu anlamama yardım edin.
 
-Aleks- :
Evet, öyle, ama asıl fark nedir? Döngüler aynı - lütfen mantıksal hatanın ne olduğunu anlamama yardım edin.
Bir şeyi nasıl açıklayabilirsin? Zaten burada açıklanmıştır. Bu açıklamanın neresi yanlış? Al böyle bir yaşam tarzı - bir aptalı sürmek ve bir aptal gibi biçmek mi? Bundan sonra bir şeyi nasıl açıklarsın? Kafasına balyoz mu? Peki, kaskını çıkar.
 
Dmitry Fedoseev :
Bir şeyi nasıl açıklayabilirsin? Zaten burada açıklanmıştır. Bu açıklamanın neresi yanlış? Al böyle bir yaşam tarzı - bir aptalı sürmek ve bir aptal gibi biçmek mi? Bundan sonra bir şeyi nasıl açıklarsın? Kafasına balyoz mu? Peki, kaskını çıkar.
Evet, çünkü " Bir şey var ama hesaplanan çubuk için değil. " ifadesi garip geliyor çünkü döngüde önceki pozitif ve negatif döngüden bir değer var.
 
-Aleks- :
Evet, çünkü " Bir şey var ama hesaplanan çubuk için değil. " ifadesi garip geliyor çünkü döngü önceki pozitif ve negatif döngüden bir değer içeriyor.
Bazı son çubuklar için son döngüden, içinde bir şey kalır ve bunu her çubuk için uygularsınız. Doğru sürümde, değişkenlerde hiçbir şey kalmaz, ancak her çubuk için hesaplanır ve hemen ortalamayı hesaplamak için kullanılır.
 
Dmitry Fedoseev :
Bazı son çubuklar için son döngüden, içinde bir şey kalır ve bunu her çubuk için uygularsınız. Doğru versiyonda, değişkenlerde hiçbir şey kalmaz, ancak her çubuk için hesaplanır ve hemen ortalamayı hesaplamak için kullanılır.

anlamaya çalışıyorum. Onlar. sizce doğru seçenek SVA_03 değil mi?