初学者的问题 MQL5 MT5 MetaTrader 5 - 页 874

 

你好,请教一下,在下面的代码中,如果没有循环块(在CopyByffer之后),指标正常运行,但如果包括一个循环,比较一个蜡烛的价格和其中一个柱子的价格,开始后的柱子本身不显示,可能是什么问题?

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  Olive
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_type3   DRAW_LINE
#property indicator_color3  Olive

input int peroid = 20;        // период полос 1
input int bands_shift= 0;           // смещение полос 1 
input double deviation = 2.3;   // отклонение полос 1

input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены 

double      Base[];     // массив для BASE_LINE индикатора iBands
double      Upper[];    // массив для UPPER_BAND индикатора iBands
double      Lower[];    // массив для LOWER_BAND индикатора iBands

int iBands1_handle; //Указатель на первый индикатор 
int iBands2_handle; //Указатель на первый индикатор 

int g_i_Window;


int OnInit()
  {
   g_i_Window=ChartWindowFind();
   SetIndexBuffer(0,Base,INDICATOR_DATA);
   SetIndexBuffer(1,Upper,INDICATOR_DATA);
   SetIndexBuffer(2,Lower,INDICATOR_DATA);
           
   iBands1_handle=iBands(NULL,PERIOD_CURRENT,peroid,bands_shift,deviation,applied_price);

   if(iBands1_handle==INVALID_HANDLE){
         Alert("Неудалось загрузить индикатор, повторите попытку");
         return(-1);
         }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[])         // Spread 
  {
   int i;
   int shift = 0;
   int shift1;
   int shift2;
   int shift3;
   string alert;
   
   double O, O1, O2, C, C1, C2, L, L1, L2, H, H1, H2;
      shift1 = shift;
      shift2 = shift + 1;
      shift3 = shift + 2;   
      O = open[shift1];
      O1 = open[shift2];
      O2 = open[shift3];
      H = high[shift1];
      H1 = high[shift2];
      H2 = high[shift3];
      L = low[shift1];
      L1 = low[shift2];
      L2 = low[shift3];;
      C = close[shift1];
      C1 = close[shift2];
      C2 = close[shift3]; 
   
   i = (prev_calculated==0)?1: prev_calculated;
   i = (prev_calculated==rates_total)?rates_total-1: i;
   
   CopyBuffer(iBands1_handle,0,0,rates_total-1,Base);
   CopyBuffer(iBands1_handle,1,0,rates_total-1,Upper);
   CopyBuffer(iBands1_handle,2,0,rates_total-1,Lower);

   for (i = i; i < rates_total; i++)
   {
    if(H > L && O > Lower[i])
    {
     int time_waiting = (int)TimeLocal() + 1;
     while(TimeLocal() < time_waiting){}
     Comment("True");
     return(0);
    }
     else Comment("False"); 
   }
   
   
   if (prev_calculated==0) ChartRedraw();   
   return(rates_total);
  }

结果。


 
Aleksey Vyazmikin:

你不可以。

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

Alexey Viktorov, 2018.05.30 15:53

嗯,不完全是动态的,但一旦通过重新初始化,你可以。我做到了。


 
Alexey Viktorov:

如果你能详细说明,请描述

 
Andrii Djola:

如果你能更具体一点

详细到什么程度?

在一种情况下,我需要制作彩色棒或彩色烛台。它们使用4个值缓冲器 和1个颜色缓冲器。另一个,我需要显示一条彩色的线,其中有一个值缓冲区和一个颜色缓冲区。

调用和改变指标属性会导致指标的初始化。相应地,如果设置包含条形或烛台,那么初始化的一个选项。如果该行,则另一个选项的初始化。

不可能在指标中间改变缓冲区的数量,这就是阿列克谢-维亚兹米金所说的,而不知道其他选项。

 
Alexey Viktorov:

还有多少细节?

在一种情况下,我需要制作彩色棒或彩色烛台。它们使用4个值缓冲器 和1个颜色缓冲器。另外,我需要显示一条彩色的线,其中有1个值缓冲区和1个颜色缓冲区。

调用和改变指标属性会导致指标的初始化。相应地,如果设置包含条形或烛台,那么初始化的一个选项。如果是一行,则是另一个初始化选项。

不可能在指标中间改变缓冲区的数量,这就是阿列克谢-维亚兹米金所说的,而不知道其他选择。

如果你决定用俄语写我的姓,听起来像维亚兹米金。

关于我的怀疑--我认为所提出的问题的答案是正确的。没有对需求的解释,就没有必要说其他。重新初始化是对程序的重新启动,很明显,你可以改变设置中的任何东西。

 
Aleksey Vyazmikin:

如果你选择用俄语书写我的姓氏,听起来就像维亚兹米金。

关于我的怀疑--我相信对所提问题的回答是正确的。没有对需求的解释,就没有必要说其他。重新初始化是对程序的重新启动,很明显,你可以改变设置中的任何东西。

没有软体标志就那么得罪人吗?

我有没有谈及不正确,在我看来,我强调的正是答案的正确性。

 
alph:
你能告诉我这是否是一个现实的试验品数字?存款3000美元,一年的结果是好是坏?
真正的。
 
Alexey Viktorov:

没有软体标志就那么得罪人吗?

我的动力是启蒙,而不是冒犯。我为什么会被冒犯,难道你会拼写,想冒犯我?我甚至没有考虑过这个选项,难道是白费力气?

 
Aleksey Vyazmikin:

我的动机是启蒙,而不是怨恨。我为什么要被冒犯,难道你知道如何正确书写,想冒犯我?我甚至没有考虑过这个选项,难道是白费力气?

和平、友谊、口香糖。

 
Alexey Viktorov:

和平、友谊、口香糖。

那半升的呢?