Bir kare veya dikdörtgen çizme. gerçekten yardıma ihtiyacım var... - sayfa 6

 
evillive :

Peki, nerede çalışıyor? Çizgiler TK'de değil, her çubukta çizilir. Veya yukarıdaki resimde TF=H1?

Döngülerin her yinelemesinde hangi limit ve i'nin eşit olacağını bir kağıt parçası üzerinde yeniden hesaplayın.

Yukarıda gösterilen örneğim anladığım kadarıyla dikkate alınmamıştır.

Ok onay kutuları, gösterge tamponları ve mum gölgelerini birbirine bağlayan çizgiler kullanılarak çizilebilir.

PERIOD_H;. H4 döneminin altında her şey iyi çizilir.

ben = 0;

Limit, harici bir değişken varsayılanıdır = 5;

harici int barlarToProcess = 5; //--- Görüntülenen nokta (satır) sayısı .

"Mum gölgelerini birbirine bağlayan çizgiler gibi, ok işaretleri de gösterge tamponları kullanılarak çizilebilir."

Ben bunu böyle anlıyorum.

[Limit] indeksli arabelleğe Diziden yüksek değerler atanır.

double Buf_High[Limit] = mqlRates [0].high ;

Her çubukta nasıl daire çizileceğini anlıyorum. Ancak, her H4 çubuğunda olduğu gibi, hiçbiri yoktur.

 
Alex_Profit :

PERIOD_H;. H4 döneminin altında her şey iyi çizilir.

ben = 0;

Limit, harici bir değişken varsayılanıdır = 5;

harici int barlarToProcess = 5; //--- Görüntülenen nokta (satır) sayısı .

"Mum gölgelerini birbirine bağlayan çizgiler gibi, ok işaretleri de gösterge tamponları kullanılarak çizilebilir."

Ben bunu böyle anlıyorum.

[Limit] indeksli arabelleğe Diziden yüksek değerler atanır.

double Buf_High[Limit] = mqlRates[0].high ;

Her çubukta nasıl daire çizileceğini anlıyorum. Ancak, her H4 çubuğunda olduğu gibi, hiçbiri yoktur.

Döngüleri kullanmadan önce nasıl çalıştığını anlayın. i = 0 sadece ilk seferde, sonra i++, limite kadar.

Göstergenin ilk açılışında limit=Bars-counted_bars= Bars-0=Bars.

For döngüsü teorik olarak 0'dan grafikteki çubuk sayısına kadar saymalıdır. ANCAK!!! Burası, hem i hem de limiti yeniden hesaplayan ikinci while döngüsünün devreye girdiği yerdir.

Neden böyle yapıldı, kim öğretti, anlamıyorum ...

Verilen parmaklar için örnek: barlar - 100, barlarToProcess = 5.

Göstergenin ilk başlatılışında, counted_bars=0, henüz sayılmadı, bu nedenle limit=100. Bu nedenle başlangıçtaki for döngüsü 0'dan 99'a kadar 100 kez çalışmalıdır.

döngü yinelemeleri için :

1. i=0, limit=barsToProcess=5, while (i<5) - iç döngü, her seferinde i++ , tamamlandıktan sonra 0'dan 4'e kadar 5 kez çizgiler ve onay işaretleri ile yürütülür while - i=5, limit =5 .

2. i=5=limit - for döngüsü sona erdi.

TÜMÜ! Ardından gösterge bir sonraki tik işaretine kadar hiçbir şey yapmaz. Bir onay işareti gelir, counted_bars=99, limit=Bars-counted_bars= 100-99=1.

for döngüsü 1 kez yürütülür, while döngüsü - asla (çünkü if(limit>barsToProcess) koşulu karşılanmaz). Ve böylece , gösterge tablodan kaldırılıncaya veya genel olarak TF değiştirilinceye kadar, gösterge yeniden başlatılıncaya kadar.

Yani, aslında, gösterge grafiğe yüklenirken onay işareti çizgilerini bir kez çizer ve ardından yeniden başlatılıncaya kadar boşta kalır. Ve neden böyle bir göstergeye ihtiyaç duyulduğunu soruyorsunuz? Tek bir işleme ile komut dosyası başa çıkacaktır.

 

Kodu yeniden yazdı. Döngü ile her şey doğru görünüyor.

Bir "tampon" çizgisi çizme sorunu vardı.

#property strict 

#property indicator_chart_window


extern int     Total_bars = 5;        //--- Кол-во отображаемых Элементов в истории


    //---  Глобальные переменные    

string Name_VLine;     //--- Имя Элементов

string Name_CHECK;     //--- Имя Элементов


MqlRates    mqlRates[1]; //Структура для хранения информации 


#property indicator_buffers 1

#property indicator_type1   DRAW_LINE   // тип графического построения - линия 

#property indicator_color1  clrRed      // цвет линии 

#property indicator_style1  STYLE_SOLID // стиль линии 

#property indicator_width1  1           // толщина линии 


double Buff_High[];

 

//+------------------------------------------------------------------+

int OnInit()

  {

     return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

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[])

{

  

     SetIndexBuffer(0,Buff_High);     

     SetIndexStyle(0,DRAW_LINE);     

     SetIndexStyle(0,DRAW_SECTION);

     

//+------------------------------------------------------------------+

int limit;                                //--- переменная  старт кол-во баров. Линии рисуем о по всем барам

int counted_bars = IndicatorCounted();     //--- перем counted_bars = функц.  Возвращает количество баров

   

if(counted_bars > 0) counted_bars --;      //--- последний посчитанный бар будет пересчитан 

  //--- основной цикл 

  limit = Bars - counted_bars;         

  for(int i = 0; i <= limit; i ++)

   {

     if(limit > Total_bars)              //--- Если кол-во баров на графике > Кол-ву выбранных элементов 

      {

       limit = Total_bars-1;              //--- тогда кол-во баров на графике = Кол-ву выбранных элементов

      }

      

   datetime t_Line = iTime(Symbol(),PERIOD_H4,i);         //--- В ПЕРЕМ t_Line Будет Присваиваться значение времени открытия бара

   CopyRates(_Symbol, PERIOD_H4, t_Line, 1, mqlRates);    //--- Структура для хранения информации 

         

   //+------------------------ Рисуем вертикальную линии -----------------------------------------------------+                 

   ObjectCreate (Name_VLine + " VLine" + DoubleToStr(i,0),OBJ_VLINE,0,t_Line,0);         //--- Создаём обьект вертикальную линию

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_STYLE,2);              //--- Со стилем

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_COLOR,DimGray);        //--- Со цветом  

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_WIDTH,0);              //--- С  толщиной

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_BACK,0);               //--- С типом отображения. Объект на заднем плане


   //--- кубики по хай (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].high, t_Line,mqlRates[0].high);

   ObjectSetInteger(0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 

   

   //--- кубики по лоу (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].low, t_Line,mqlRates[0].low);

   ObjectSetInteger(0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 


  // На ТФ Н4 линии рисуются по хайям,

  // При смене ТФ линия рисуется на растоянии параметра Total_bars. 

  

   //--- Заполнение буфера

   Buff_High[i] = mqlRates[0].high ;  

  

   }

    return(rates_total);

}

//+------------------------------------------------------------------+


 
evillive :

Neden böyle yapıldı, kim öğretti, anlamıyorum ...

Uygun bir gösterge buldum ve ihtiyacım olan parça kalana kadar "ayrıştırdım". Sonra kod parçalarını topladım ve ihtiyacım olanı aldım. Bunun gibi bir şey.

"Bıyıklarımı sarıyorum".

 
Alex_Profit :

Kodu yeniden yazdı. Döngü ile her şey doğru görünüyor.

Bir "tampon" çizgisi çizme sorunu vardı.

Kodu eklemek için, mesaj düzenleme penceresinin üst panelinde bir SRC düğmesi vardır, kodu güzel ve boş satırlar olmadan ekler.

Çizginin muhtemelen nesnelerle (trend) çizilmesi, önceki zamanı/fiyatı ayrı değişkenlerde hatırlaması ve ikinci noktanın koordinatları olarak kullanması gerekecektir.

Onay işaretini başka bir sembolle değiştirmek için - OBJ_ARROW ve ARROW_CODE.

 
evillive :

Kodu eklemek için, mesaj düzenleme penceresinin üst panelinde bir SRC düğmesi vardır, kodu güzel ve boş satırlar olmadan ekler.

Çizginin muhtemelen nesnelerle (trend) çizilmesi , önceki zamanı/fiyatı ayrı değişkenlerde hatırlaması ve ikinci noktanın koordinatları olarak kullanması gerekecektir.

Onay işaretini başka bir sembolle değiştirmek için - OBJ_ARROW ve ARROW_CODE.

hoşlanmayacak ne var

DRAW_SECTION

1

Boş olmayan satır değerleri arasındaki segmentler

 
AlexeyVik :

А чем не нравится

DRAW_SECTION

1

Отрезки между непустыми значениями линии

Nasıl uygulanacağını bilmiyorum.

 
AlexeyVik :

hoşlanmayacak ne var

DRAW_SECTION

1

Boş olmayan satır değerleri arasındaki segmentler

kötü canlı :

Çizginin muhtemelen nesnelerle (trend) çizilmesi, önceki zamanı/fiyatı ayrı değişkenlerde hatırlaması ve ikinci noktanın koordinatları olarak kullanması gerekecektir.

Fikir güzel. Çalışırsa deneyeceğim.

Aslında, çizilecek bir yelek yoktur. Olması gerektiği gibi çalıştığı sürece.

 

Alex_Profit :

Nasıl uygulanacağını bilmiyorum.

Bunun yerine sadece OnInit() içinde

SetIndexStyle(0, DRAW_LINE);

yazmak

SetIndexStyle(0, DRAW_SECTION);

 

Nedense değişiklik yok

 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[])
{
  
     SetIndexBuffer ( 0 ,Buff_High);     
     //SetIndexStyle(0,DRAW_LINE);     
     SetIndexStyle( 0 , DRAW_SECTION );
Neden: