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

 
Igor Makanu :

bir soruyu farklı bir şekilde sormaya çalışın, sorunuz muhtemelen net değil

açıklamaya çalışacağım. Ama pratikte programlamada sıfır olduğumu unutmayın.

Teklif değerlerine dayalı bir eğri oluşturan bir onay göstergemiz var.

 #property   indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 1 );
   SetIndexStyle( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,x);
   SetIndexDrawBegin( 0 , 0 );
   SetIndexLabel( 0 , "x" );
   SetIndexShift( 0 , 0 );
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo( Symbol (),MODE_BID);
   x[ 0 ]=b;
   for ( int j= ArraySize (x)- 1 ;j>= 1 ;j--){x[j]=x[j- 1 ];}
   return ( 0 );
  }
//+------------------------------------------------------------------+

Şimdi ne yapmak istiyorum.

Göstergeyi tabloya asıyoruz . İlk onayda teklif1'in ilk değerini alırız. Hatırlıyoruz (Bunu yaptım: y[0] ikinci arabelleğine girdim ve değerini init () içine kaydettim.

İkinci tikte, bid2'nin ikinci değerini alırız.

Ardından, puan farkını almanız gerekir. delta=bid1-bid2 (Bunu yaptım: delta=x[0]-x[1]).

Şimdi önceden kaydedilen y[0] değerine delta ekliyoruz ve aslında bid2 değerine karşılık gelen y[1] değerini alıyoruz.

Gösterge eğrisi, istenen gösterge ile aynı olmalıdır, ancak inşaat, teklif farklarının hesaplanan değerlerine dayanmaktadır.

Bu gösterge, sonraki hesaplamalar için bir şablon olarak gereklidir.

Taş atmayın. Nasıl açıklayabilirdim.

Teşekkür ederim.

 
Oleg Bondarev :

açıklamaya çalışacağım. Ama pratikte programlamada sıfır olduğumu unutmayın.

Teklif değerlerine dayalı bir eğri oluşturan bir onay göstergemiz var.

Şimdi ne yapmak istiyorum.

Göstergeyi tabloya asıyoruz . İlk onayda teklif1'in ilk değerini alırız. Hatırlıyoruz (Bunu yaptım: y[0] ikinci arabelleğine girdim ve değerini init () içine kaydettim.

İkinci tikte, bid2'nin ikinci değerini alırız.

Ardından, puan farkını almanız gerekir. delta=bid1-bid2 (Bunu yaptım: delta=x[0]-x[1]).

Şimdi önceden kaydedilen y[0] değerine delta ekliyoruz ve aslında bid2 değerine karşılık gelen y[1] değerini alıyoruz.

Gösterge eğrisi, istenen gösterge ile aynı olmalıdır, ancak inşaat, teklif farklarının hesaplanan değerlerine dayanmaktadır.

Bu gösterge, sonraki hesaplamalar için bir şablon olarak gereklidir.

Taş atmayın. Nasıl açıklayabilirdim.

Teşekkür ederim.

ne yapmak istediğin belli değil

burada, genel olarak, tam sorun ne olacak - gösterge arabelleklerini keneleri (Teklif) depolamak için bir dizi olarak kullanırsınız, gösterge arabelleğinin boyutu terminalin kendisi tarafından değiştirilir ve ek olarak - terminalin kendisi gösterge arabelleklerini değiştirir yeni bir çubuk göründüğünde

bu nedenle, keneleri saklamak için bir dizi kullanmanız ve gösterge arabelleğini kullanarak çizim yapmanız yeterlidir.

burada sizinkine benzer bir kod çizdim, burada keneleri bir diziye kaydettim

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1    "Label1"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       TickCount= 10 ;   //Размер массива тиков
//--- indicator buffers
double          Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
   ArrayResize (TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize (TickArr, SymbolInfoDouble ( _Symbol , SYMBOL_BID ));     // проинициализируем массив значением текущего Bid
//---
   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 ( int i= ArraySize (TickArr)- 1 ;i> 0 ;i--)
   {
      TickArr[i] = TickArr[i- 1 ]; // сдвинули массив
   }
   TickArr[ 0 ] = SymbolInfoDouble ( _Symbol , SYMBOL_BID ); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

şimdi hesaplamanızı bu koda eklemeniz ve Label1Buffer gösterge tamponu ile fikrinize göre çizmeniz gerekiyor.

 
Başka bir göstergenin özelliklerini programlı olarak değiştirme yeteneğini ekleseler iyi olurdu. Kabaca söylemek gerekirse, grafiğe (programlı olarak) başka bir gösterge ekledikten sonra rengini, stilini ve çizgi kalınlığını ayarlayabilirsiniz.
 
Igor Makanu :

ne yapmak istediğin belli değil

burada, genel olarak, tam sorun ne olacak - gösterge arabelleklerini keneleri (Teklif) depolamak için bir dizi olarak kullanırsınız, gösterge arabelleğinin boyutu terminalin kendisi tarafından değiştirilir ve ek olarak - terminalin kendisi gösterge arabelleklerini değiştirir yeni bir çubuk göründüğünde

bu nedenle, keneleri saklamak için bir dizi kullanmanız ve gösterge arabelleğini kullanarak çizim yapmanız yeterlidir.

burada sizinkine benzer bir kod çizdim, burada keneleri bir diziye kaydettim

şimdi hesaplamanızı bu koda eklemeniz ve Label1Buffer gösterge tamponu ile fikrinize göre çizmeniz gerekiyor.

Cevapladığınız için teşekkürler. Sana biraz daha eziyet edeceğim.

Hesaplama buraya eklenir mi?

 int OnCalculate ()

İşte benim hesaplamam.

   if (TickArr[ 0 ]>TickArr[ 1 ])
     {
      Label1Buffer[ 0 ]=Label1Buffer[ 1 ]+(TickArr[ 0 ]-TickArr[ 1 ]);
     }
   if (TickArr[ 0 ]<TickArr[ 1 ])
     {
      Label1Buffer[ 0 ]=Label1Buffer[ 1 ]-(TickArr[ 0 ]-TickArr[ 1 ]);
     }
   if (TickArr[ 0 ]==TickArr[ 1 ])
     {
      Label1Buffer[ 0 ]=Label1Buffer[ 1 ];
     }

Hiçbir şey eklemedim.

 
Yevhenii Levchenko :
Başka bir göstergenin özelliklerini programlı olarak değiştirme yeteneğini ekleseler iyi olurdu. Kabaca söylemek gerekirse, grafiğe (programlı olarak) başka bir gösterge ekledikten sonra rengini, stilini ve çizgi kalınlığını ayarlayabilirsiniz.

Canvas'ı kullanın ve en azından karikatür çizin.

 

resim ekleyeceğim.

ind

 
Oleg Bondarev :

Hiçbir şey eklemedim.

bu yüzden işe yaramayacak)))

MQL'de gösterge arabellekleriyle çizmek için, bunun anlamı, gösterge arabelleğinde - benim örneğimde, bu Label1Buffer bir değer koyun (bir değer atayın)

Örneğinizde, yalnızca koşul karşılandığında değerler atarsınız, ancak koşul karşılanmazsa ne olur? - yani hiçbir şey görüntülenmiyor


Peki, bir kez daha, TickArr dizisinin Bid tick değerleri içerdiği ve sizin koşullarınızda gösterge tamponunun önceki değerlerini kullandığınız - ve bu tamponlara kim hangi değerleri koyduğunu bir "boş" yaptım?


IMHO, hemen çalışmayacak, sadece gösterge arabelleği ile bir çizgi çizmeye çalışın, sonra keneleri karşılaştıracaksınız

 
Oleg Bondarev :

resim ekleyeceğim.


Köşe tersine dönerse ne olur? Hesaplama nasıl yapılacak?

 
Oleg Bondarev :

resim ekleyeceğim.


Programlamada pratikte sıfır olduğunuzu söylüyorsanız, neden bu kadar standart olmayan görevleri üstleniyorsunuz, belki basit olanlarla başlıyorsunuz? Peki, ya da temel bilgileri sıkılaştırın? Senin için burada yapmak daha kolay, evet.
 
Igor Makanu :

bu yüzden işe yaramayacak)))

MQL'de gösterge arabellekleriyle çizmek için, bunun anlamı, gösterge arabelleğinde - benim örneğimde, bu Label1Buffer bir değer koyun (bir değer atayın)

Örneğinizde, yalnızca koşul karşılandığında değerler atarsınız, ancak koşul karşılanmazsa ne olur? - yani hiçbir şey görüntülenmiyor


Peki, bir kez daha, TickArr dizisinin Bid tick değerleri içerdiği ve sizin koşullarınızda gösterge tamponunun önceki değerlerini kullandığınız - ve bu tamponlara kim hangi değerleri koyduğunu bir "boş" yaptım?


IMHO, hemen çalışmayacak, sadece gösterge arabelleği ile bir çizgi çizmeye çalışın, sonra keneleri karşılaştıracaksınız

"Kolektif çiftçi") uyardım

İşte böyle yaptı.

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1    "Label1"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       TickCount= 100000 ;   //Размер массива тиков
input int       TickCountb= 100000 ;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Label1Buffer);
   ArrayResize (TickArr,TickCount);
   ArrayResize (Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize (TickArr,MarketInfo( Symbol (),MODE_BID));     // проинициализируем массив значением текущего Bid

//---
   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 ( int i= ArraySize (TickArr)- 1 ;i> 0 ;i--)
   {
      TickArr[i] = TickArr[i- 1 ]; // сдвинули массив
   }
   TickArr[ 0 ] = MarketInfo( Symbol (),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for ( int j= ArraySize (TickArr)- 1 ;j> 0 ;j--)
   {
      Label1Buffer[j] = Label1Buffer[j- 1 ]; // сдвинули массив
   }
   
   Label1Buffer[ 0 ]= TickArr[ 0 ];   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

Şimdi bir tik grafiği çiziyor, ancak bazı satır sonları var.

4'te yapıyorum.