绘制一个正方形或长方形。真的需要帮助... - 页 6

 
evillive:

那么,它在哪里工作?它在每个柱子上画线,而不是在TF上画线。或者在上图中是TF=H1?

在一张纸上计算出每个周期迭代时的极限和 i 会是多少。

根据我的理解,上面显示的我的例子从来没有交代过。

可以使用指标缓冲区来绘制刻度线箭头,也可以使用连接烛台阴影的线条。

PERIOD_H;。在H4时期以下,一切都画得很好。

i = 0;

限制是外部变量,默认=5。

extern int barsToProcess = 5; //--- 要显示的周期(行)数。

"滴答 "箭头可以使用指标缓冲区绘制,也可以使用连接蜡烛图阴影的线条。"

我是这样理解的。

在索引为[Limit]的缓冲区中,数组中的高值被分配。

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

我明白如何在每条杠上打圈。但我不明白如何在每一个H4柱上都这样做。

 
Alex_Profit:

PERIOD_H;。在H4时期以下,一切都画得很好。

i = 0;

限制是一个外部变量,默认=5。

extern int barsToProcess = 5; //--- 显示的周期数(行)。

"滴答 "箭头可以使用指标缓冲区绘制,也可以使用连接蜡烛图阴影的线条。"

我是这样理解的。

在索引为[Limit]的缓冲区中,数组中的高值被分配。

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

我明白如何在每条杠上打圈。但我不明白如何在每一个H4柱上都这样做。

在使用循环之前要弄清楚它的工作原理。i = 0只是第一次,然后i++,直到极限

第一次运行指标时,limit=Bars-counted_bars=Bars-0=Bars。

在这种情况下,for 循环理论上应该从0算到图表上的条数。但是!!!。第二个while 循环在这里干扰了,它重新计算了i和limit。

我不明白为什么我应该这样做,谁教我这样做的......。

下面是一个例子,我们设置:bar - 100,barToProcess = 5。

在第一个指标运行期间,counted_bars=0,还没有被计算,因此limit=100。这意味着开头 循环应该被执行100次,从0到99。

for 循环的迭代。

i=0, limit=barsToProcess=5,while(i<5) - 画有线条和刻度的内部循环被执行5次,从0到4,每次i++,在完成while- i=5, limit=5

2. i=5=limit -for 循环完成。

这就是了!该指标在下一个tick之前不做任何进一步的工作。一个刻度线来了,counted_bars=99,limit=Bars-counted_bars=100-99=1。

for 循环被执行一次,while 循环根本没有被执行(因为条件if(limit>barsToProcess) 没有被满足)。我们将继续下去,直到指标 从图表中卸载 或时间框架被改变,一般来说,直到重新初始化指标。

事实上,当指标被加载到图表上时,它只画一次刻度线,在重新初始化之前,它一直处于空闲状态。问题是我们为什么需要这样一个指标?脚本可以处理单个响应。

 

我已经重写了代码。循环的一切似乎都是正确的。

仍然存在着划定 "缓冲 "线的问题。

#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:

我为什么要这样做,谁教我的,我不明白......。

我找到了一个合适的指示器,并将其 "分解",直到剩下我需要的片段。然后我把这些代码片段组合起来,得到了我需要的东西。它是这样的。

"我正在学习。"

 
Alex_Profit:

我已经重写了代码。循环的一切似乎都是正确的。

仍然存在着划定 "缓冲 "线的问题。

要粘贴代码,在信息编辑窗口的顶部面板上有一个SRC按钮,它可以很好地插入代码,而且没有空行。

线条可能也要由对象来画(趋势),将之前的时间/价格存储在单独的变量中,并作为第二点坐标使用。

要用另一个符号来替换一个刻度线 -OBJ_ARROW 和ARROW_CODE。

 
evillive:

为了插入代码,在信息编辑窗口的顶部面板上有一个SRC按钮,可以很好地插入代码,而且没有空行。

线条可能也要由对象来画(趋势),将之前的时间/价格存储在单独的变量中,并作为第二点坐标使用。

要用另一个符号来替换一个刻度线 -OBJ_ARROW和ARROW_CODE

什么是不喜欢的

DRAW_SECTION

1

非空线值之间的线段

 
AlexeyVik:

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

DRAW_SECTION

1

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

我不知道如何应用它。

 
AlexeyVik:

有什么理由不喜欢

DRAW_SECTION

1

线段的非空值之间的线段

埃维利夫

这条线可能也要由对象来画(趋势),将之前的时间/价格存储在单独的变量中,并作为第二点坐标使用。

这个想法是好的。如果成功的话,我可以试一试。

事实上,没有必要画它。只要它能正常工作就好。

 

Alex_Profit:

我不知道如何应用它。

只需在OnInit()中,而不是在

SetIndexStyle(0, DRAW_LINE);


SetIndexStyle(0,DRAW_SECTION)。

 

不知为何没有变化

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);