指标问题 - 页 3

 
Agent86:
.

总之,我想让高位分形只在其他条件发生时形成,如iMACD交叉,或EMA交叉或其他一些指标交叉。
这样,只有当所有的条件都满足时,分形才会显示在指标上。


我不确定你到底想做什么,但试试这个,注意外部输入。

#property indicator_chart_window      extern bool condition1 = true;
#property indicator_buffers 3         extern bool condition2 = true;
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");

   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int bars = Bars;
//----
  
   for(int i=bars; i>=0; i--)
    {
     if(condition1)
       {
        val1=iFractals(NULL, 0, MODE_UPPER,i);
        if (val1 > 0) v1[i]=High[i];       
       }   
     if(condition2)
       {      
        val2=iFractals(NULL, 0, MODE_LOWER,i);
        if (val2 > 0) v2[i]=Low[i];
       }
     }    
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
WHRoeder:
究竟你是如何得出这个结论的,功能上有什么区别?

我得出了这个结论,因为我很可能是从OOP的角度来看的。是的,我记得MQL4的情况不是这样的。 虽然这可能是一个好的做法?



 

或者是像这样?

但你真的应该使用 IndicatorCounted(),因为如果你这样做,你的指标在每一个新的刻度线上都会重新绘制所有的对象,而不是一次性绘制所有对象,并在新的条形图形成时添加新的对象。

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");

   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster=0;
   double   slower=0;         
   int      bars = Bars;
//----
  
   for(int i=bars; i>=0; i--)
    {
     faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i); //MODE_MAIN
     slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i); //MODE_SIGNAL
     val1=iFractals(NULL, 0, MODE_UPPER,i);
     val2=iFractals(NULL, 0, MODE_LOWER,i);
     
     if(faster > 0)
      {
       if (val1 > 0) v1[i]=High[i];
      }
      
     if(faster < 0)
      {
       if (val2 > 0) v2[i]=Low[i];
      }        
    }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
diostar:
我得出这个结论,因为我可能是从OOP的角度来看的。是的,我现在想起来,MQL4的情况不是这样的。 尽管这可能是一个好的做法?

在使用的地方定义变量/对象,并在那一刻初始化它们,这总是很好的做法。

在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个有价值的结构--通常更快。

不要担心优化,直到你能证明这个变化会带来不同。

 
WHRoeder:

限制范围总是好的做法。在使用的地方定义变量/对象,并在那一刻初始化它们,总是好的做法。

在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个带值的结构--通常更快。

不要担心优化,直到你能证明这种改变会带来变化。

这也应该适用于其迭代器。 for (int i=0;.. .
 
diostar:
这也应该适用于其迭代器。 for (int i=0;...
我同意,但我没有写这段代码。
 
好吧,我现在似乎有了一些工作代码的变化,谢谢。

不过,我有点困惑的是,为什么在循环外声明变量(快的和慢的)是不好的,而在循环内却可以呢?

然而int i = Bars是在循环外还是在循环内工作?


不管怎么说,很高兴看到我的一些想法已经在这个线程中发布了,所以这是个好消息,意味着我离有朝一日能够自己编码的目标又近了一点。所以有一点进展总比没有好。谢谢

所以现在我可以努力比较一些指标时间了,我现在就试着把这个问题搞清楚。

比如说。
比较v1[i]和v2[i] 目前形成的指标时间 && / || if(v1[i]时间> v2[i]时间) 以及其他类似的比较。

谢谢大家的提示,这对我们有很大的帮助。
 
WHRoeder:

限制范围总是好的做法。在使用的地方定义变量/对象,并在那一刻初始化它们,总是好的做法。

在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个带值的结构--通常更快。

不要担心优化,直到你能证明这种改变会带来变化。

我想这对所有的人来说都是如此,而不仅仅是指标/自定义指标
 
Agent86:
好的,我现在似乎有了一些工作代码的变化,谢谢。不过,我有点困惑的是,为什么在循环外声明变量(快的和慢的)不好,而在循环内却可以呢



然而,int i = Bars是在循环外还是在循环内工作?


你必须考虑你在做什么,当你创建一个指标时,你将你的代码应用于图表上的每一个条形,这意味着你需要获得macd指标值,因为它是这些历史条形的。

在你的原始代码中,你做到了。

double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), 
最后一个参数1是图表中Bar 1的macd值,也就是当前Bar的前一个Bar,其索引为Bar 0

很明显,你不想在整个历史图表的条件运算中使用macd的单一值。

你需要将macd索引到与每个条形图相同的条形图索引上,例如,在条形图500上你需要这样做

faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,500) 

最后一个参数必须改变,以匹配你的指标应用其算法的条数。

这就是为什么你需要它在循环内,所以你可以使用循环周期迭代器(i)的最后一个参数,因此你得到你的macd值,因为它是历史图表中的每个条形的。

faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i), 

我希望这能帮助你把事情弄清楚。

 
WHRoeder:
试试这个变化
为什么for(int i = Bars-1 ?

为什么这比for(int i = Bars)更好呢?

请指示,谢谢