指标问题 - 页 3 12345678 新评论 Ian Venner 2011.10.02 16:27 #21 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); } //+------------------------------------------------------------------+ blackmore 2011.10.02 16:49 #22 WHRoeder: 究竟你是如何得出这个结论的,功能上有什么区别? 我得出了这个结论,因为我很可能是从OOP的角度来看的。是的,我记得MQL4的情况不是这样的。 虽然这可能是一个好的做法? Ian Venner 2011.10.02 16:58 #23 或者是像这样? 但你真的应该使用 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); } //+------------------------------------------------------------------+ William Roeder 2011.10.02 18:20 #24 diostar: 我得出这个结论,因为我可能是从OOP的角度来看的。是的,我现在想起来,MQL4的情况不是这样的。 尽管这可能是一个好的做法?在使用的地方定义变量/对象,并在那一刻初始化它们,这总是很好的做法。 在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个有价值的结构--通常更快。 不要担心优化,直到你能证明这个变化会带来不同。 blackmore 2011.10.02 18:26 #25 WHRoeder: 限制范围总是好的做法。在使用的地方定义变量/对象,并在那一刻初始化它们,总是好的做法。 在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个带值的结构--通常更快。 不要担心优化,直到你能证明这种改变会带来变化。 这也应该适用于其迭代器。 for (int i=0;.. . William Roeder 2011.10.02 18:36 #26 diostar: 这也应该适用于其迭代器。 for (int i=0;... 我同意,但我没有写这段代码。 Agent86 2011.10.03 02:48 #27 好吧,我现在似乎有了一些工作代码的变化,谢谢。 不过,我有点困惑的是,为什么在循环外声明变量(快的和慢的)是不好的,而在循环内却可以呢? 然而int i = Bars是在循环外还是在循环内工作? 不管怎么说,很高兴看到我的一些想法已经在这个线程中发布了,所以这是个好消息,意味着我离有朝一日能够自己编码的目标又近了一点。所以有一点进展总比没有好。谢谢 所以现在我可以努力比较一些指标时间了,我现在就试着把这个问题搞清楚。 比如说。 比较v1[i]和v2[i] 目前形成的指标时间 && / || if(v1[i]时间> v2[i]时间) 以及其他类似的比较。 谢谢大家的提示,这对我们有很大的帮助。 Agent86 2011.10.03 02:53 #28 WHRoeder: 限制范围总是好的做法。在使用的地方定义变量/对象,并在那一刻初始化它们,总是好的做法。 在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个带值的结构--通常更快。 不要担心优化,直到你能证明这种改变会带来变化。 我想这对所有的人来说都是如此,而不仅仅是指标/自定义指标? Ian Venner 2011.10.03 02:57 #29 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), 我希望这能帮助你把事情弄清楚。 Agent86 2011.10.03 02:58 #30 WHRoeder: 试试这个变化 为什么for(int i = Bars-1 ? 为什么这比for(int i = Bars)更好呢? 请指示,谢谢 12345678 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
.
总之,我想让高位分形只在其他条件发生时形成,如iMACD交叉,或EMA交叉或其他一些指标交叉。
这样,只有当所有的条件都满足时,分形才会显示在指标上。
我不确定你到底想做什么,但试试这个,注意外部输入。
究竟你是如何得出这个结论的,功能上有什么区别?
我得出了这个结论,因为我很可能是从OOP的角度来看的。是的,我记得MQL4的情况不是这样的。 虽然这可能是一个好的做法?
或者是像这样?
但你真的应该使用 IndicatorCounted(),因为如果你这样做,你的指标在每一个新的刻度线上都会重新绘制所有的对象,而不是一次性绘制所有对象,并在新的条形图形成时添加新的对象。
我得出这个结论,因为我可能是从OOP的角度来看的。是的,我现在想起来,MQL4的情况不是这样的。 尽管这可能是一个好的做法?
在使用的地方定义变量/对象,并在那一刻初始化它们,这总是很好的做法。
在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个有价值的结构--通常更快。
不要担心优化,直到你能证明这个变化会带来不同。
限制范围总是好的做法。在使用的地方定义变量/对象,并在那一刻初始化它们,总是好的做法。
在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个带值的结构--通常更快。
不要担心优化,直到你能证明这种改变会带来变化。
这也应该适用于其迭代器。 for (int i=0;...
不过,我有点困惑的是,为什么在循环外声明变量(快的和慢的)是不好的,而在循环内却可以呢?
然而int i = Bars是在循环外还是在循环内工作?
不管怎么说,很高兴看到我的一些想法已经在这个线程中发布了,所以这是个好消息,意味着我离有朝一日能够自己编码的目标又近了一点。所以有一点进展总比没有好。谢谢
所以现在我可以努力比较一些指标时间了,我现在就试着把这个问题搞清楚。
比如说。
比较v1[i]和v2[i] 目前形成的指标时间 && / || if(v1[i]时间> v2[i]时间) 以及其他类似的比较。
谢谢大家的提示,这对我们有很大的帮助。
限制范围总是好的做法。在使用的地方定义变量/对象,并在那一刻初始化它们,总是好的做法。
在循环外定义一个对象的结果是一个默认的结构加上N个赋值。在循环内定义的结果是N个带值的结构--通常更快。
不要担心优化,直到你能证明这种改变会带来变化。
好的,我现在似乎有了一些工作代码的变化,谢谢。不过,我有点困惑的是,为什么在循环外声明变量(快的和慢的)不好,而在循环内却可以呢
然而,int i = Bars是在循环外还是在循环内工作?
你必须考虑你在做什么,当你创建一个指标时,你将你的代码应用于图表上的每一个条形,这意味着你需要获得macd指标值,因为它是这些历史条形的。
在你的原始代码中,你做到了。
最后一个参数1是图表中Bar 1的macd值,也就是当前Bar的前一个Bar,其索引为Bar 0很明显,你不想在整个历史图表的条件运算中使用macd的单一值。
你需要将macd索引到与每个条形图相同的条形图索引上,例如,在条形图500上你需要这样做
最后一个参数必须改变,以匹配你的指标应用其算法的条数。
这就是为什么你需要它在循环内,所以你可以使用循环周期迭代器(i)的最后一个参数,因此你得到你的macd值,因为它是历史图表中的每个条形的。
我希望这能帮助你把事情弄清楚。
试试这个变化
为什么这比for(int i = Bars)更好呢?
请指示,谢谢