[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 481

 
midorum :
Bars-30'u deneyin
Hayır, doğru değil. Bu, mantıksal olarak solda 30 çubuk girintisi oluşturacak ve 0. çubuğa kadar çizecektir.
 
SetIndexDrawBegin ( 0 , Bars - 30 ); //первый бар отрисовки индикатора 

Mantığınız ne bilmiyorum bende göstergenin son 30 barını çizen öyle bir ayar var ki

Bir kez daha tekrarlıyorum, SetIndexDrawBegin() grafiğin sol ucundan çubukları sayar

tartışmadan önce kontrol et

 
merkulov.artem :

İyi. Ben sorunun özünü anlatmaya çalışacağım, belki birileri size anlatır ya da daha basit bir şekilde uygulamanıza yardımcı olur.

Dakika çizelgesi üzerinde çalışıyoruz. 10/29/12 saat 00:00'da grafikte bir dakika çubuğu (yüksek+düşük/2 - çubuğun ortalama değeri) alıyoruz - bu başlangıç noktası olacaktır.

Ardından, bu fiyattan 10 puan yukarı sapmayı kontrol ederiz (her doğru sapma +1 olacaktır).

Başlangıç noktasından 10 puanlık bir fiyat artışına ulaştığımızda - sayaç +1; ve sapmaları sadece 10 puan sapmaya ulaştığımız noktadan daha fazla kontrol etmeye başlayın ve bir sonraki fiyat artışını 10 puan bekleyin.

Örneğin, şunu elde ederiz:

If (başlangıç noktası) + 10 pip <= fiyatlar (başlangıç noktasından sonraki tüm çubuk fiyatlarını kullanırız.) Sayaç = sayaç +1 alırız; Ve başlangıç noktasına zaten bu yerden başlıyoruz - (başlangıç noktası + 10 puan).

Eğer ( başlangıç noktası + 10 puan ) + 1 0 puan <= fiyatlar (başlangıç noktasından sonraki tüm çubuk fiyatları kullanırız.) Sayaç = sayaç +1 alırız; Ve başlangıç noktasına zaten bu yerden başlıyoruz - ( başlangıç noktası + 10 puan ) + 10 puan .

if ( başlangıç noktası + 10 pip + 1 0 pip) + 10 pip <= fiyatlar (başlangıç noktasından sonraki tüm bar fiyatlarını kullanırız.) Counter= counter +1 alırız; Ve başlangıç noktasına zaten bu yerden başlıyoruz - ( başlangıç noktası + 10 puan + 10 puan) + 10 puan .  

vb...

10'a eşit bir sayaca ulaşana kadar ( sayaç == 10 ).

Ve oluşan her yeni dakika çubuğu (yüksek+düşük/2 - çubuğun ortalama değeri) bu koşul için kontrol edilir ve 10'a eşit sayaca ulaşana kadar bekleriz ( sayaç == 10 ). Diyelim ki iki gün geçti, her yeni oluşan çubuğu kontrol ettik ve koşullar doğruysa kaydırdık ....

Ve sayaca =10'a geldiğimizde - "Sayaç == 10" mesajını görüntülüyoruz. Başlangıç noktasını, kullanıcı tarafından orijinal olarak ayarlanandan 2 gün ileriye kaydırıyoruz, yani. 29/10/12 saat 00:00'dan 31/10/12 saat 00:00'a kadar ve döngüyü tekrarlayın.

Döngüyü tekrarlıyoruz ve böylece programa göre hareket ediyoruz.

Onlar. yeni şekillendirilmiş çubukları almanız gerekiyor, bunları dişe göre alın (yüksek+düşük/2 - çubuğun ortalama değeri). Ve koşulları kontrol edin ve koşullar doğruysa, yukarıda yazıldığı gibi kaydırın.

Bir dizi üzerinden uygulamaya çalıştım, çok kafa karıştırıcı çıkıyor ve yanlış değerler veriyor!! Bu algoritmanın nasıl uygulanacağına yardım edin!


Burada dizilere ihtiyaç yoktur. Nedir, bir danışman mı, bir senaryo mu, bir gösterge mi? Buradaki nokta, bu görevi uygulamak için EA kodunun gösterge kodundan farklı olacağıdır.

Ve burada önemli bir dezavantaj var. Bakın, başlangıç noktasını belirledik ve tam olarak yükseliş trendinin en yüksek mumunun üzerine düştü. Diyelim ki 10 puan için daha fazla balık avında bu mumun okumalarını dikkate almadık - buna başlangıç mumu diyelim. Böylece, bir sonraki mum aşağı indi ve onu seviye = başlangıç noktası + 10 puan olarak yakalamayacağız: fiyat daha sonra aşağı iner. Bu nedenle, tabiri caizse, uzun bir süre sıkışıp kaldık - fiyat düştü ve istediğiniz gibi aşağı ve yukarı sallanabilir - yine de başlangıç noktası seviyesine ulaşmayacak - ayılar onu zorladı. Ama diyelim ki, 5.000 mumdan sonra bile şanslıydık, fiyat başlangıç noktasındaki seviyeye döndü ve hatta artı 10 puan geçti. Çok zaman kaybettik ama artık bir diziye değil, başlangıç noktası + 10 pip'e eşit değişken bir fiyata girebilir ve şimdi fiyatın = değişken seviye + 10 pip seviyesine ulaşmasını bekleyebiliriz... Kısacası, tüm bunlar gerekli değil - açıklamanıza göre değerlendirirsek, seviyeyi yakalarız = başlangıç noktası + 10 * 10 = başlangıç noktası + 100 puan. Bu seviyeyi yakalamayı başarır yakalamaz başlangıç tarihini 2 gün ileri alıp yeni bir başlangıç noktası hesaplıyoruz. Hepsi sloeno - daha kolay bir yol var.

Kullanıcı değişkenlerinde başlangıç tarihini belirledik (kodda extern kelimesinden önce gelirler). Datetime türünde bir değişken tanımlıyoruz. Bunun dt_StartDate değişkeni (başlangıç tarihi) olmasına izin verin ve hemen başlatma bloğunda kullanıcı değişkeninde depolanan değeri atayın. Daha sonra bu tarihe denk gelen bir mum arıyoruz ve formülünüze göre başlangıç noktasını hesaplıyoruz. Sadece bu bir başlangıç noktası değil, bir başlangıç fiyat seviyesidir. Double türünde bir değişken, örneğin d_StartLevel (başlangıç düzeyi) bildiririz ve hesaplanan düzeyin değerini değişkene gireriz. Veya daha da basit olabilir - bir değişken bildirmek değil, hemen hesaplanan başlangıç fiyatı üzerinden yatay bir çizgi çizmek. Daha da iyisi - bu satırı StartLevel olarak adlandıralım. Şimdi çizelgedeki ikinci çizgiyi başlangıç seviyesinden = 100 puan yukarıda çizin - bu çizgiye "tuzak seviyesi" diyelim - OtlovLevel. İşte bu, başka dizilere gerek yok - aptalca her tike fiyatın OtlovLevel'den daha yüksek olup olmadığına bakarız. Olur olmaz dt_StartDate değişkeninin değerini 2 gün artırıp başlangıç seviyesini tekrar hesaplayıp başlangıç çizgisini oraya aktarıyoruz. Bundan sonra yine başlangıç çizgisinden yukarı doğru 100 puan ayırıp OtlovLevel çizgisini oraya sürükleriz. İşte bu, görev çözüldü. Her seferinde herhangi bir satırın ayarlandığı fiyatı talep edebilir ve mevcut fiyatla veya mevcut mumun Yüksek fiyatıyla karşılaştırabilirsiniz.

 
midorum :

Mantığınız ne bilmiyorum bende göstergenin son 30 barını çizen öyle bir ayar var ki

Bir kez daha tekrarlıyorum, SetIndexDrawBegin() grafiğin sol ucundan çubukları sayar

tartışmadan önce kontrol et

O yüzden tartışmıyorum. Bak. Standart CCI göstergesini alıyoruz. SetIndexDrawBegin işlevinde CCIPeriod'u ( Bars - CCIPeriod ) ile değiştirdim . Kodda sadece vurgulanan sarıyı değiştirdim ..

İşte kod:

 //+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14 ;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers ( 4 );
   SetIndexBuffer ( 1 , RelBuffer);
   SetIndexBuffer ( 2 , DevBuffer);
   SetIndexBuffer ( 3 , MovBuffer);
//---- indicator lines
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 , CCIBuffer);
//----
   if (CCIPeriod <= 0 )
       CCIPeriod = 14 ;
//----
   SetIndexDrawBegin ( 0 , Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name= "CCI(" + CCIPeriod + ")" ;
   IndicatorShortName (short_name);
   SetIndexLabel ( 0 , short_name);
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int     i, k, counted_bars = IndicatorCounted ();
   double price, sum, mul; 
   if (CCIPeriod <= 1 )
       return ( 0 );
   if ( Bars <= CCIPeriod) 
       return ( 0 );
//---- initial zero
   if (counted_bars < 1 )
     {
       for (i = 1 ; i <= CCIPeriod; i++) 
           CCIBuffer[ Bars -i] = 0.0 ;
       for (i = 1 ; i <= CCIPeriod; i++) 
           DevBuffer[ Bars -i] = 0.0 ;
       for (i = 1 ; i <= CCIPeriod; i++) 
           MovBuffer[ Bars -i] = 0.0 ;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if (counted_bars > 0 ) 
       limit++;
//---- moving average
   for (i = 0 ; i < limit; i++)
       MovBuffer[i] = iMA ( NULL , 0 , CCIPeriod, 0 , MODE_SMA , PRICE_TYPICAL , i);
//---- standard deviations
   i = Bars - CCIPeriod + 1 ;
   if (counted_bars > CCIPeriod - 1 ) 
       i = Bars - counted_bars - 1 ;
   mul = 0.015 / CCIPeriod;
   while (i >= 0 )
     {
       sum = 0.0 ;
       k = i + CCIPeriod - 1 ;
       while (k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3 ;
          sum += MathAbs (price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1 ;
   if (counted_bars > CCIPeriod - 1 ) 
       i = Bars - counted_bars - 1 ;
   while (i >= 0 )
     {
       price = (High[i] + Low[i] + Close[i]) / 3 ;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1 ;
   if (counted_bars > CCIPeriod - 1 ) 
       i = Bars - counted_bars - 1 ;
   while (i >= 0 )
     {
       if (DevBuffer[i] == 0.0 ) 
           CCIBuffer[i] = 0.0 ;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

Mantıksal olarak, CCIPerod 14'e eşitse. O zaman SetIndexDrawBegin ( 0 , Barlar - CCIPeriod) ile sadece son 14 çubuk çizilmelidir. (Bar - 14) değerinden başlayarak . Ama ekranda gördüğüm bu

 
hoz :

O yüzden tartışmıyorum. Bak. Standart CCI göstergesini alıyoruz. SetIndexDrawBegin işlevinde CCIPeriod'u ( Bars - CCIPeriod ) ile değiştirdim . Kodda sadece vurgulanan sarıyı değiştirdim ..

İşte kod:

Mantıksal olarak, CCIPerod 14'e eşitse. O zaman SetIndexDrawBegin ( 0 , Barlar - CCIPeriod) ile sadece son 14 çubuk çizilmelidir. (Bar - 14) değerinden başlayarak . Ama ekranda gördüğüm bu

ekranda gördüğüm bu

en üstteki yerel gösterge, aşağıda SetIndexDrawBegin(0, Bars-CCIPerod) olarak değiştirildi;

 
Midorum , üzgünüm. Benim künt. MetaEditor başka bir terminal açtı... Artık her şey çalışıyor. Teşekkür ederim!
 
hoz :
Midorum , üzgünüm. Benim künt. MetaEditor başka bir terminal açtı... Artık her şey çalışıyor. Teşekkür ederim!
evet, ben de sürekli bu sorundan muzdaripim - 3 terminal ve Editör klasörleri karıştırıyor. Terminaldeki düğmeden başlatmak ve içindeki .
 

Güzel gün! Nazik insanlar lütfen bir cevap verin, 15 dakikalık bir mumun açıldığı nasıl belirlenir, nefes kesici bir çizgi kullandım ama ortaya çıktı ki, mum her zaman zamanında açılmıyor... Sanırım daha kolay bir yolu var bir mumun açıldığını öğrenmek için ... ama bir şekilde anlamıyorum. ..

if ((TimeMinute( TimeCurrent() )==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute (TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0))

 
stater :

Güzel gün! Nazik insanlar lütfen bir cevap verin, 15 dakikalık bir mumun açıldığı nasıl belirlenir, nefes kesici bir çizgi kullandım ama ortaya çıktı ki, mum her zaman zamanında açılmıyor... Sanırım daha kolay bir yolu var bir mumun açıldığını öğrenmek için ... ama bir şekilde anlamıyorum. ..

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute (TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0))


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater :

Güzel gün! Nazik insanlar lütfen bir cevap verin, 15 dakikalık bir mumun açıldığı nasıl belirlenir, nefes kesici bir çizgi kullandım ama ortaya çıktı ki, mum her zaman zamanında açılmıyor... Sanırım daha kolay bir yolu var bir mumun açıldığını öğrenmek için ... ama bir şekilde anlamıyorum. ..

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute (TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0))


 bool CheckOpenM15()
{
   static int PrevTime= 0 ;
   if (PrevTime== iTime ( NULL , PERIOD_M15 , 0 )) return (false);
   PrevTime= iTime ( NULL , PERIOD_M15 , 0 );
   return (true);
}
М15'te yeni bir çubuk göründüğünde işlev true değerini döndürür