新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1445 1...143814391440144114421443144414451446144714481449145014511452...1953 新评论 Artyom Trishkin 2021.04.14 23:02 #14441 Vitaly Muzichenko:谢谢你!试了一下,得到一个错误,我做错了什么。 缓冲区[]是分布式的吗?我看到了声明,但我没有看到尺寸设置 Vitaly Muzichenko 2021.04.15 01:08 #14442 Artyom Trishkin:缓冲区[]是分布式的吗?我看到了声明,但我没有看到尺寸设置 设置大小,在其他地方出错,不工作。 Artyom Trishkin 2021.04.15 05:29 #14443 Vitaly Muzichenko:设置大小,在其他地方出错,不工作。 你在传输什么? Vitaly Muzichenko 2021.04.15 08:40 #14444 Artyom Trishkin:你在传递什么? double Array_1[]; double Array_2[]; ArraySetAsSeries(close, true); int count = rates_total-1; if(count < 0) return (-1); int i = 1; int period = (int)MathFloor(MathSqrt(a)); int val_1 = (int)MathFloor(a / 1.9); int counter = Bars(_Symbol,_Period) - count + a + 1; if(counter > Bars(_Symbol,_Period)) counter = Bars(_Symbol,_Period); // ArraySetAsSeries(Array_1, true); ArrayResize(Array_1, counter); // ArraySetAsSeries(Array_2, true); ArrayResize(Array_2, counter); double d_close = close[1]; double buff[]; ArrayResize(buff, counter); for(i = 0; i < counter; i++) Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a); for(i = 0; i < counter - a; i++) { // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i); // buf_3[i] = iMA(NULL, 0, period, 0, MODE_SMMA, PRICE_LOW); // CopyBuffer(10,0,i,1,buff); SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff); buf_3[i] = buff[0]; } ..... //+------------------------------------------------------------------+ int SmoothedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[]) { //--- check period if(period<=1 || period>(rates_total-begin)) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int start_position; if(prev_calculated==0) { // first calculation or number of bars was changed //--- set empty value for first bars start_position=period+begin; for(int i=0; i<start_position-1; i++) buffer[i]=0.0; //--- calculate first visible value double first_value=0; for(int i=begin; i<start_position; i++) first_value+=price[i]; buffer[start_position-1]=first_value/period; } else start_position=prev_calculated-1; //--- main loop for(int i=start_position; i<rates_total; i++) buffer[i]=(buffer[i-1]*(period-1)+price[i])/period; //--- restore as_series flags ArraySetAsSeries(price,as_series_price); ArraySetAsSeries(buffer,as_series_buffer); //--- return(rates_total); } Alexey Viktorov 2021.04.15 08:52 #14445 Vitaly Muzichenko: 维塔利,为什么要把功能复制到输入器上?插入一个图书馆不是更容易吗? #include <MovingAverages.mqh> Artyom Trishkin 2021.04.15 09:09 #14446 Vitaly Muzichenko: 一般来说,从循环中删除对该函数的调用。这个函数中已经有一个完整的循环。在开始时,你需要传递数组中重要数据的开头,在此基础上进行平滑处理。对于某些类型 的平滑,你需要一个预计算。对于SMMA来说,大约是两个计算期。 Alexey Viktorov 2021.04.15 09:23 #14447 Artyom Trishkin:一般来说,从循环中删除 对该函数的调用。这个函数中已经有一个完整的循环。在开始时,你需要传递数组中重要数据的开头,在此基础上进行平滑处理。对于某些类型 的平滑,你需要一个预计算。对于SMMA来说,大约是两个计算期。 但是当一个新的条形图被添加时,整个数组不会被重新计算吗?而当数组中的当前值发生变化时,缓冲区也需要重新计算。在这种情况下,我们如何才能避免循环? 在指标开始时一次,通过整个缓冲区,然后只在每个刻度上的最后一个索引?这是个即兴表演。我还没有这样做......我必须要检查一下。 Artyom Trishkin 2021.04.15 09:38 #14448 Alexey Viktorov:而在这种情况下,当一个新的柱子被添加时,整个数组不会被重新计算吗?当缓冲区阵列中的当前值发生变化时,重新计算也无妨。在这种情况下,我们如何才能避免循环? 在指标开始时一次,通过整个缓冲区,然后只在每个刻度上的最后一个索引?这是个即兴表演。我还没有这样做......我必须要检查一下。 好吧,看一下代码--维塔利已经直接把它摆出来了 Vitaly Muzichenko 2021.04.15 10:12 #14449 Artyom Trishkin:好吧,看看代码--维塔利直接发布了它 现在我想调试一下mt4中的 "SmoothedMAOnBuffer() "结构。 怎么了,我一点都不明白 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[]) { double Array_1[]; double Array_2[]; int count = IndicatorCounted(); if(count < 0) return (-1); int i = 1; int period = (int)MathFloor(MathSqrt(a)); int val_1 = (int)MathFloor(a / 1.9); int counter = Bars - count + a + 1; if(counter > Bars) counter = Bars; ArraySetAsSeries(Array_1, TRUE); ArrayResize(Array_1, counter); ArraySetAsSeries(Array_2, TRUE); ArrayResize(Array_2, counter); double d_close = close[1]; double buff[]; ArrayResize(buff, counter); for(i = 0; i < counter; i++) Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a); for(i = 0; i < counter - a; i++) { // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i); // Так индикатор работает SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff); Совсем не работает, но и ошибок в журнале нет buf_3[i] = buff[0]; ??? } for(i = counter - a; i > 0; i--) { Array_2[i] = Array_2[i + 1]; if(buf_3[i] > buf_3[i + 1]) Array_2[i] = 1; if(buf_3[i] < buf_3[i + 1]) Array_2[i] = -1; if(Array_2[i] > 0.0) { buf_1[i] = buf_3[i]; if(Array_2[i + 1] < 0.0) buf_1[i + 1] = buf_3[i + 1]; if(Array_2[i + 1] < 0.0) { } buf_2[i] = EMPTY_VALUE; } else { if(Array_2[i] < 0.0) { buf_2[i] = buf_3[i]; if(Array_2[i + 1] > 0.0) buf_2[i + 1] = buf_3[i + 1]; if(Array_2[i + 1] > 0.0) { } buf_1[i] = EMPTY_VALUE; } } } for(i = 0; i < counter-1; i++) { if(buf_2[i + 1] == EMPTY_VALUE && buf_2[i] != EMPTY_VALUE) buf_4[i] = buf_2[i]; if(buf_1[i + 1] == EMPTY_VALUE && buf_1[i] != EMPTY_VALUE) buf_5[i] = buf_1[i]; } return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int SmoothedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[]) { //--- check period if(period<=1 || period>(rates_total-begin)) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_buffer=ArrayGetAsSeries(buffer); ArraySetAsSeries(price,false); ArraySetAsSeries(buffer,false); //--- calculate start position int start_position; int i=0; if(prev_calculated==0) { // first calculation or number of bars was changed //--- set empty value for first bars start_position=period+begin; for(i=0; i<start_position-1; i++) buffer[i]=0.0; //--- calculate first visible value double first_value=0; for(i=begin; i<start_position; i++) first_value+=price[i]; buffer[start_position-1]=first_value/period; } else start_position=prev_calculated-1; //--- main loop for(i=start_position; i<rates_total; i++) buffer[i]=(buffer[i-1]*(period-1)+price[i])/period; //--- restore as_series flags ArraySetAsSeries(price,as_series_price); ArraySetAsSeries(buffer,as_series_buffer); //--- return(rates_total); } Artyom Trishkin 2021.04.15 10:14 #14450 Vitaly Muzichenko:现在我来到了调试mt4中的 "SmoothedMAOnBuffer() "结构。怎么了,我一点都不明白 从循环中删除 1...143814391440144114421443144414451446144714481449145014511452...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
谢谢你!
试了一下,得到一个错误,我做错了什么。
缓冲区[]是分布式的吗?我看到了声明,但我没有看到尺寸设置
缓冲区[]是分布式的吗?我看到了声明,但我没有看到尺寸设置
设置大小,在其他地方出错,不工作。
设置大小,在其他地方出错,不工作。
你在传输什么?
你在传递什么?
维塔利,为什么要把功能复制到输入器上?插入一个图书馆不是更容易吗?
#include <MovingAverages.mqh>
一般来说,从循环中删除对该函数的调用。这个函数中已经有一个完整的循环。在开始时,你需要传递数组中重要数据的开头,在此基础上进行平滑处理。对于某些类型 的平滑,你需要一个预计算。对于SMMA来说,大约是两个计算期。
一般来说,从循环中删除 对该函数的调用。这个函数中已经有一个完整的循环。在开始时,你需要传递数组中重要数据的开头,在此基础上进行平滑处理。对于某些类型 的平滑,你需要一个预计算。对于SMMA来说,大约是两个计算期。
但是当一个新的条形图被添加时,整个数组不会被重新计算吗?而当数组中的当前值发生变化时,缓冲区也需要重新计算。在这种情况下,我们如何才能避免循环?
在指标开始时一次,通过整个缓冲区,然后只在每个刻度上的最后一个索引?这是个即兴表演。我还没有这样做......我必须要检查一下。
而在这种情况下,当一个新的柱子被添加时,整个数组不会被重新计算吗?当缓冲区阵列中的当前值发生变化时,重新计算也无妨。在这种情况下,我们如何才能避免循环?
在指标开始时一次,通过整个缓冲区,然后只在每个刻度上的最后一个索引?这是个即兴表演。我还没有这样做......我必须要检查一下。
好吧,看一下代码--维塔利已经直接把它摆出来了
好吧,看看代码--维塔利直接发布了它
现在我想调试一下mt4中的 "SmoothedMAOnBuffer() "结构。
怎么了,我一点都不明白
现在我来到了调试mt4中的 "SmoothedMAOnBuffer() "结构。
怎么了,我一点都不明白