计算M1时期与D1时期开盘价交叉的条形图的指标

 

问候!我需要帮助。我需要关于这个指标的帮助。我一直在尝试不同的方法来计算M1时段的条数,这些条数 遇到了D1时段的公开价格水平。我附上了我尝试的代码,但无法成功运行。我一直在努力尝试,但我遇到了困难,所以现在我向这里的好心人寻求帮助!

以下是我对这个指标的需求。

1.当M1时期的一个柱子的价格遇到D1时期的开盘价时,它将被计算在内。每个D1时段在M1时段有1440个柱子,所以每1440个柱子都将被测试。

2.2.每个D1时段的总计数/D1时段将被加总,并按一定的数值取平均值。 比如说平均数是30,这个30就是D1条的数量。

//+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link      "XXX"
#property version   "1.00"
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;  // Bar index
extern int Aver_Bars=30;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                          // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer(0,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Line style
//--------------------------------------------------------------------
   SetIndexBuffer(1,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }

3.3.然后,平均值将作为指标被绘制出来。

 
请大家帮帮忙!这到底有没有可能?
 

我无法从你的代码中看出你想做什么,但在两个地方你没有给变量i一个值。你需要解决这个问题。

int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }
 

抱歉我直言不讳,但你的代码显示,你试图实现的东西远远超出了你的能力。

例子

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);

例如,我们假设i = 1

double O=iOpen(NULL,PERIOD_D1,1);

这将返回昨天的开盘价

   double H=iHigh(NULL,PERIOD_M1,1);
   double L=iLow(NULL,PERIOD_M1,1);

这2个将返回最后一个关闭的1分钟条形图的值。


所以你是在比较1分钟前的数值和昨天的开盘价。

如果i = 2,你将比较2分钟前的数值和2天前的开盘价

你必须看到,这不可能是你想要的结果。

 
GumRai:

抱歉我直言不讳,但你的代码显示,你试图实现的东西远远超出了你的能力。

例子

例如,我们假设i = 1

这将返回昨天的开盘价

这2个将返回最后一个关闭的1分钟条形图的值。


所以你是在比较1分钟前的数值和昨天的开盘价。

如果i = 2,你将比较2分钟前的数值和2天前的开盘价

你必须看到,这不可能是你想要的结果。


嗨,GumRai。

谢谢你花时间帮助我。你是对的,我只是一个初学者,正在努力学习编码EA。以下是我想做的事情。

1.将PERIOD_D1开盘与每分钟的PERIOD_M1条比较,所以有1440个M1条与D1条比较。然后计算满足条件的M1条,如果 (O>L &&O<H)

2.2.将计数的条形存储在一个数组中,然后再次进入下一个D1条形,再次重复循环。

3.3.计数的条形图将由指标在日线图上绘制。因此,如果满足声明的M1条数是5,那么5将被绘制成日线Bar1的值。然后说下一个日线的M1条数是10,那么它将被再次绘制在Bar1上,因为前一个条数被移至Bar2。

请告诉我如何最好地编码这个看似简单的语句,我很难做到。如果你需要进一步的解释,请告诉我,非常感谢。

 
Zaldy:


嗨,GumRai。

谢谢你花时间帮助我。你是对的,我只是一个初学者,并急切地想学习编码EA。以下是我想做的事情。

1.将PERIOD_D1开盘与每分钟的PERIOD_M1条比较,所以有1440个M1条与D1条比较。然后计算满足条件的M1条,如果 (O>L &&O<H)

2.2.将计数的条形存储在一个数组中,然后再次进入下一个D1条形,再次重复循环。

3.3.计数的条形图将由指标在日线图上绘制。因此,如果满足声明的M1条数是5,那么5将被绘制成日线Bar1的值。然后说下一个日线的M1条数是10,那么它将被再次绘制在Bar1上,因为前一个条数被移至Bar2。

请告诉我如何最好地编码这个看似简单的语句,我很难做到。如果你需要进一步的解释,请告诉我,非常感谢。


我很乐意帮助你,但我不会写代码,因为这对你的征信没有帮助。

首先,你必须认识到,1440个M1条并不总是对应于1天的时间。如果在一个条形图中没有刻度,该条形图就会从历史中消失,而且可能比你预期的少。

所以你需要D1蜡烛的开盘日期值。你能做到这一点吗?试试吧,然后公布你的代码

 

不要那么快

我知道你想做什么,但你的代码(如果 (O > L && O < H))并不能让你得到你想要的东西。

请看附件中的图表



朝上箭头 是今天的开盘价

朝右的箭头 是与你的代码(如果 (O > L & & O < H))相匹配的第一条杠,所以计数=1

但是 如果你注意到,这根柱子的收盘价高于今天的开盘价,所以,实际上计数应该是=2(至少(可能还有几个交叉点,你不能只在tick图表中看到))

但是在你的代码中,计数 = 只有 1

 
qjol:

不要那么快

我知道你想做什么,但你的代码(如果 (O > L && O < H))并不能让你得到你想要的东西。

请看附件中的图表



朝上箭头 是今天的开盘价

朝右的箭头 是与你的代码(如果 (O > L & & O < H))相匹配的第一条杠,所以计数=1

但是 如果你注意到,这根柱子的收盘价高于今天的开盘价,所以,实际上计数应该是=2(至少(可能还有几个交叉点,你不能只在tick chart中看到))

但是在你的代码中,计数 = 只有 1


根据我的理解,他想计算横跨开盘价 的柱子--但我可能是错的 :)
 
  1. Zaldy: 请大家帮帮忙!这到底有没有可能?
    不要对我们大喊大叫。这当然是可能的。
  2. 整数和布尔运算是可以转换的。假==0,真==非零。
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. 你还在处理三个时间框架,D1,图表,M1。你必须转换。
    没有经过编译或测试。
       Counted_bars=IndicatorCounted(); // Number of counted bars
       for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
          int      iD1    = iBarShift(NULL, PERIOD_D1, Time[iCht];
          double   openD1 = iOpen(NULL, PERIOD_D1, iD1);
          int      iM1Beg = iBarShift(NULL, PERIOD_M1, Time[iCht],
                   iM1End = -1;
          if(iCht > 0) iM1End = iBarShift(NULL, PERIOD_M1, Time[iCht-1];
          for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh(NULL, PERIOD_M1, iM1Beg),
                    lM1 =  iLow(NULL, PERIOD_M1, iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    没有编译或测试。
 
qjol:

不要那么快

我知道你想做什么,但你的代码(如果 (O > L && O < H))并不能让你得到你想要的东西。

请看附件中的图表



朝上箭头 是今天的开盘价

朝右的箭头 是与你的代码(如果 (O > L & & O < H))相匹配的第一条杠,所以计数=1

但是 如果你注意到,这根柱子的收盘价高于今天的开盘价,所以,实际上计数应该是=2(至少(可能还有几个交叉点,你不能只在tick图表中看到))

但是在你的代码中,计数 = 只有 1


嗨,Qjol,是的,朝向右边的箭头是我想要的第一个计数。只计算那些纵横交错的D1开口。再次感谢您的努力。
 
WHRoeder:
  1. 扎尔迪 请帮助任何人!这可能吗?这到底有没有可能?
    不要对我们大喊大叫。当然这是有可能的。
  2. 整数和布尔运算是可以转换的。假==0,真==非零。
  3. 你也在处理三个时间框架,D1,图表,M1。你必须转换。
    未编译或测试。
    没有编译或测试。

谢谢WHRoeder,对不起,我在这里使用了大写字母!我将尝试你的建议,并在这里回来看看结果。
原因: