初学者的问题 MQL5 MT5 MetaTrader 5 - 页 990 1...983984985986987988989990991992993994995996997...1503 新评论 kopeyka2 2019.01.25 19:35 #9891 问题:为什么设置为一个周期的Handel不能在其他时间段 向CopyBuffer 传递数值。那该怎么做呢? 如果问题出在不同时间段的阵列缓冲区元素 的移动上,我会解决这个问题。因此,这一点也不清楚。 Artyom Trishkin 2019.01.25 19:39 #9892 kopeyka2:问题:为什么设置为一个周期的Handel不能在其他时间段 向CopyBuffer 传递数值。那该怎么做呢? 如果问题出在不同时间段的阵列缓冲区元素 的移动上,我会解决这个问题。因此,这一点也不清楚。如果句柄被成功创建,它就会带着你在创建时传递给它的参数被创建。而且它将在任何时间范围内给出指标数据。然而,它将给出你在创建过程中指定的时间框架的数据。而为了正确地在工作时间框架上显示它们,你需要将收到的数据从指标手柄转换成你的指标工作的时间框架。 Aleksey Vyazmikin 2019.01.25 19:48 #9893 kopeyka2:正在检查这个。但问题是,通过将手稿设定为一个永久的时期,在 其他时间段的CopyBuffer值是不可转移的。该值在设定的亨德尔周期上,在较小的时间范围内为0.0(零)。在缓冲区内移动它,寻找它......。零。为什么不把它传给CopyBuffer?我已经把它复制了... //--- Подготовка данных int count=(limit>1 ? rates_total : 2),copied=0; ResetLastError(); if(CopyBuffer(handle_ma,0,0,1,BufferPrice)<0) { PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError()); return(0.0); } // copied=CopyBuffer(handle_ma,0,0,count,BufferPrice); Print(BufferPrice[0]); 另一个问题是什么被复制 :)最有可能的是,你要求复制的条数比该TF上的条数要多,请打印 Print("count=",count," Bars=",Bars(Symbol(),Timeframes)); kopeyka2 2019.01.25 19:57 #9894 Artyom Trishkin:如果句柄被成功创建,它是用你在创建时传递给它的参数创建的。而且它将在任何时间范围内给出指标数据。但它会给出创建时设置的时间框架的数据。而为了在工作时间框架上正确显示它们,你需要将从指标句柄获得的数据转换成你的指标工作的时间框架。 我的实验做得对吗?1)我为D1期间创建了一个手柄。2) 然后我们根据指令将数值放入CopyBuffer(从哪里到哪里)。我从零写到第N条。理论上讲,处理值应该写在这个区间内。即使转移到另一个时间框架,其数值也应该是来自设定的D1。我没有看到它。还是出了什么问题?在设置手柄时,我还应该添加什么内容吗?由于没有缓冲区转移。 Artyom Trishkin 2019.01.25 20:07 #9895 kopeyka2: 我的实验做得对吗?1)我在D1期间创建了一个手柄。2)接下来,在CopyBuffer中,我们根据指令放入数值(从哪里到哪里)。我从零写到第N条。理论上讲,处理值应该写在这个区间内。即使转移到另一个时间框架,其数值也应来自设定的D1。我没有看到它。还是出了什么问题?在设置手柄时,我还应该添加什么内容吗?因为没有缓冲区转移。我给了你一个方向... 研究它。 //+------------------------------------------------------------------+ //| MTF_LRMA.mq5 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://mql5.com" #property version "1.00" #property description "Multi Timeframe Linear Regression Moving Average with signal line" #property indicator_chart_window #property indicator_buffers 6 #property indicator_plots 2 //--- plot LWMA #property indicator_label1 "LRMA" #property indicator_type1 DRAW_LINE #property indicator_color1 clrLimeGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Signal #property indicator_label2 "Signal" #property indicator_type2 DRAW_LINE #property indicator_color2 clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- enums enum ENUM_DRAW_MODE { DRAW_MODE_STEPS, // Steps DRAW_MODE_SLOPE // Slope }; //--- input parameters input uint InpPeriod = 34; // LRMA period input uint InpSignal = 5; // Signal period input ENUM_TIMEFRAMES InpTimeframe = PERIOD_H1; // LRMA timeframe input ENUM_DRAW_MODE InpDrawMode = DRAW_MODE_STEPS; // Drawing mode //--- indicator buffers double BufferLRMA[]; double BufferSignal[]; double BufferLRMATmp[]; double BufferSignalTmp[]; double BufferLWMA[]; double BufferSMA[]; //--- global variables ENUM_TIMEFRAMES timeframe1; int period_lrma; int signal; int handle_lwma; int handle_sma; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- timer EventSetTimer(90); //--- set global variables period_lrma=int(InpPeriod<1 ? 1 : InpPeriod); signal=int(InpSignal<1 ? 1 : InpSignal); timeframe1=(InpTimeframe>Period() ? InpTimeframe : Period()); //--- indicator buffers mapping SetIndexBuffer(0,BufferLRMA,INDICATOR_DATA); SetIndexBuffer(1,BufferSignal,INDICATOR_DATA); SetIndexBuffer(2,BufferLRMATmp,INDICATOR_CALCULATIONS); SetIndexBuffer(3,BufferSignalTmp,INDICATOR_CALCULATIONS); SetIndexBuffer(4,BufferLWMA,INDICATOR_CALCULATIONS); SetIndexBuffer(5,BufferSMA,INDICATOR_CALCULATIONS); //--- setting indicator parameters string label=TimeframeToString(timeframe1)+" LRMA("+(string)period_lrma+","+(string)signal+")"; IndicatorSetString(INDICATOR_SHORTNAME,label); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); //--- setting plot buffer parameters PlotIndexSetString(0,PLOT_LABEL,TimeframeToString(timeframe1)+" LRMA("+(string)period_lrma+")"); PlotIndexSetString(1,PLOT_LABEL,TimeframeToString(timeframe1)+" Signal("+(string)signal+")"); //--- setting buffer arrays as timeseries ArraySetAsSeries(BufferLRMA,true); ArraySetAsSeries(BufferSignal,true); ArraySetAsSeries(BufferLRMATmp,true); ArraySetAsSeries(BufferSignalTmp,true); ArraySetAsSeries(BufferLWMA,true); ArraySetAsSeries(BufferSMA,true); //--- create handles ResetLastError(); handle_lwma=iMA(NULL,timeframe1,period_lrma,0,MODE_LWMA,PRICE_CLOSE); if(handle_lwma==INVALID_HANDLE) { Print(__LINE__,": The ",TimeframeToString(timeframe1)," iMA(",(string)period_lrma,") object was not created: Error ",GetLastError()); return INIT_FAILED; } handle_sma=iMA(NULL,timeframe1,period_lrma,0,MODE_SMA,PRICE_CLOSE); if(handle_sma==INVALID_HANDLE) { Print(__LINE__,": The ",TimeframeToString(timeframe1)," iMA(",(string)period_lrma,") object was not created: Error ",GetLastError()); return INIT_FAILED; } //--- get timeframe Time(NULL,timeframe1,1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //--- Проверка количества доступных баров if(rates_total<fmax(signal,4)) return 0; //--- Проверка и расчёт количества просчитываемых баров int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-signal-2; ArrayInitialize(BufferLRMA,0); ArrayInitialize(BufferSignal,0); ArrayInitialize(BufferLRMATmp,0); ArrayInitialize(BufferSignalTmp,0); ArrayInitialize(BufferLWMA,0); ArrayInitialize(BufferSMA,0); } //--- Подготовка данных if(Time(NULL,timeframe1,1)==0) return 0; int bars=(timeframe1==Period() ? rates_total : Bars(NULL,timeframe1)); int count=(limit>1 ? fmin(bars,rates_total) : 1),copied=0; copied=CopyBuffer(handle_lwma,0,0,count,BufferLWMA); if(copied!=count) return 0; copied=CopyBuffer(handle_sma,0,0,count,BufferSMA); if(copied!=count) return 0; //--- Расчёт индикатора for(int i=limit; i>=0 && !IsStopped(); i--) { BufferLRMATmp[i]=3.0*BufferLWMA[i]-2.0*BufferSMA[i]; BufferSignalTmp[i]=GetSMA(bars,i,signal,BufferLRMATmp); } for(int i=limit; i>=0 && !IsStopped(); i--) { DataConversion(rates_total,NULL,timeframe1,i,BufferLRMATmp,BufferLRMA,InpDrawMode); DataConversion(rates_total,NULL,timeframe1,i,BufferSignalTmp,BufferSignal,InpDrawMode); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Custom indicator timer function | //+------------------------------------------------------------------+ void OnTimer() { Time(NULL,timeframe1,1); } //+------------------------------------------------------------------+ //| Transfering data from the source timeframe to current timeframe | //+------------------------------------------------------------------+ void DataConversion(const int rates_total, const string symbol_name, const ENUM_TIMEFRAMES timeframe_src, const int shift, const double &buffer_src[], double &buffer_dest[], ENUM_DRAW_MODE mode=DRAW_MODE_STEPS ) { if(timeframe_src==Period()) { buffer_dest[shift]=buffer_src[shift]; return; } int bar_curr=BarToCurrent(symbol_name,timeframe_src,shift); if(bar_curr>rates_total-1) return; int bar_prev=BarToCurrent(symbol_name,timeframe_src,shift+1); int bar_next=(shift>0 ? BarToCurrent(symbol_name,timeframe_src,shift-1) : 0); if(bar_prev==WRONG_VALUE || bar_curr==WRONG_VALUE || bar_next==WRONG_VALUE) return; buffer_dest[bar_curr]=buffer_src[shift]; if(mode==DRAW_MODE_STEPS) for(int j=bar_curr; j>=bar_next; j--) buffer_dest[j]=buffer_dest[bar_curr]; else { if(bar_prev>rates_total-1) return; for(int j=bar_prev; j>=bar_curr; j--) buffer_dest[j]=EquationDirect(bar_prev,buffer_dest[bar_prev],bar_curr,buffer_dest[bar_curr],j); if(shift==0) for(int j=bar_curr; j>=0; j--) buffer_dest[j]=buffer_dest[bar_curr]; } } //+------------------------------------------------------------------+ //| Возвращает бар заданного таймфрейма как бар текущего таймфрейма | //+------------------------------------------------------------------+ int BarToCurrent(const string symbol_name,const ENUM_TIMEFRAMES timeframe_src,const int shift,bool exact=false) { datetime time=Time(symbol_name,timeframe_src,shift); return(time!=0 ? BarShift(symbol_name,Period(),time,exact) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Возвращает смещение бара по времени | //| https://www.mql5.com/ru/forum/743/page11#comment_7010041 | //+------------------------------------------------------------------+ int BarShift(const string symbol_name,const ENUM_TIMEFRAMES timeframe,const datetime time,bool exact=false) { int res=Bars(symbol_name,timeframe,time+1,UINT_MAX); if(exact) if((timeframe!=PERIOD_MN1 || time>TimeCurrent()) && res==Bars(symbol_name,timeframe,time-PeriodSeconds(timeframe)+1,UINT_MAX)) return(WRONG_VALUE); return res; } //+------------------------------------------------------------------+ //| Возвращает Time | //+------------------------------------------------------------------+ datetime Time(const string symbol_name,const ENUM_TIMEFRAMES timeframe,const int shift) { datetime array[]; ArraySetAsSeries(array,true); return(CopyTime(symbol_name,timeframe,shift,1,array)==1 ? array[0] : 0); } //+------------------------------------------------------------------+ //| Уравнение прямой | //+------------------------------------------------------------------+ double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) { return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price); } //+------------------------------------------------------------------+ //| Timeframe to string | //+------------------------------------------------------------------+ string TimeframeToString(const ENUM_TIMEFRAMES timeframe) { return StringSubstr(EnumToString(timeframe),7); } //+------------------------------------------------------------------+ //| Simple Moving Average | //+------------------------------------------------------------------+ double GetSMA(const int rates_total,const int index,const int period,const double &price[],const bool as_series=true) { //--- double result=0.0; //--- check position bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1); if(period<1 || !check_index) return 0; //--- calculate value for(int i=0; i<period; i++) result+=(as_series ? price[index+i]: price[index-i]); //--- return(result/period); } //+------------------------------------------------------------------+ kopeyka2 2019.01.25 20:12 #9896 Aleksey Vyazmikin:我已经把它复制了... 另一个问题是什么是抄袭 :)最有可能的是,你要求复制的条数要比该TF上的条数多,打印 一切都更加谦虚。他们不放一束。在D1上只有1-2个小节。更确切地说,是int lm=IBarShift(NULL,PERIOD_D1, iTime(NULL,PERIOD_CURRENT, limit))。int bars=PeriodSeconds(PERIOD_D1/PeriodSecond(_Period);int startbar=lm-(lm-bars);我试着在CopyBuffer中做计数,但没有限制和rate_total。简单地说,用CopyBuffer做实验,在里面放什么,那应该是。但没有。 Artyom Trishkin 2019.01.25 20:17 #9897 kopeyka2: Верно ли я провел эксперемент.? ... ...即使切换到另一个时间框架,其数值也应来自设定的D1。这正是我所看不到的。还是出了什么问题?在设置手柄时,我还应该添加什么内容吗?由于没有缓冲区转移。 简单地说,用CopyByffer做实验,放什么应该是。但它不在那里。 你还没有检查数据的可用性,但你正试图复制。请看上面的代码--在第二个计时器中,每隔一分半钟就会访问非本地的时间框架--以保持数据的更新。而代码中的第一件事是检查所请求的数据是否可用。如果它们还没有准备好,那么它就会为下一个tick和指标的完整计算返回0。而当所有的数据都被接收和计算,并显示出来后,计算的数据量 会在最后被返回--为了不在下一个tick上做完全的重新计算。 kopeyka2 2019.01.25 20:17 #9898 谢谢你。我都读过了。我将继续寻找。 Artyom Trishkin 2019.01.25 20:21 #9899 kopeyka2: 谢谢你。我都看了。我将继续寻找。你在寻找什么?上面的代码是完全有效的。你可以随心所欲地剖析它。我指出了你的错误--你没有检查数据的可用性。 甚至在这里的这条线路上。 int lm=IBarShift(NULL,PERIOD_D1, iTime(NULL, PERIOD_CURRENT, limit)); 对iTime()返回的内容的检查在哪里?没有检查。但是你把一个未知的结果直接塞给了iBarShift()。你确定你给的是你所期望的功能吗? kopeyka2 2019.01.26 07:05 #9900 Artyom Trishkin:如果句柄被成功创建,它就会用 你在创建时给它的参数来创建。而且它将在任何时间范围内通过指标数据。然而,它将给出创建时设置的时间框架的数据。而为了正确地在工作时间框架上显示它们,你需要将收到的数据从指标手柄转换成你的指标工作的时间框架。这正是我所想的。误解的问题是 "参数 "这个词。所以我开始查看所有涉及到句柄的变量 --> CopyBuffer 1) 我的问题从一开始就是要切换时间框架SCREEN来保存手柄数据。正如在MT4中一样。 而事实上,结果也是如此。 handle_ma=iMA(NULL,PERIOD_H1,period,0,MODE_SMA,PRICE_CLOSE); Comment(handle_ma); // ВСЕГДА 10 总是在所有的时间框架上 给出相同的数值10。 在这里一无所获后,我继续前进。 2)我引用一下。"将指定指标的指定缓冲区的数据以指定的数量获取到缓冲区阵列中"。 CopyBuffer(handle_ma,0,0,count,BufferPrice); // 也就是说,通过 手工 设置计数,我们应该有一个INTERVAL的数值 。 他们就在那里!BUT!!!!!!只有当处理周期对应于 监视器屏幕上的PERIOD_H1时间框架。 所有的价值都被清晰地传送。但移到另一个时间框架,屏幕上没有数据。 它们不会以任何方式传播,!!!! 而我的问题正是如此。如果不是有!!!!,条数在这里并不那么重要。 我看了建议的指标MTF_LRMA.mq5 ,但它是一样的。 它在屏幕上切换到另一个时间框架,数据按屏幕上的时间框架进行。我需要它在手持设备上。 例如:iClose(NULL, PERIOD_H1, 5); 在所有的时间框架上,它将给出相同的值:在H1的5个柱子上关闭。 到目前为止,所有的例子都是关于 CopyBuffer 计数的修正。 但数组是空的。 1...983984985986987988989990991992993994995996997...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
问题:为什么设置为一个周期的Handel不能在其他时间段 向CopyBuffer 传递数值。那该怎么做呢?
如果问题出在不同时间段的阵列缓冲区元素 的移动上,我会解决这个问题。因此,这一点也不清楚。
问题:为什么设置为一个周期的Handel不能在其他时间段 向CopyBuffer 传递数值。那该怎么做呢?
如果问题出在不同时间段的阵列缓冲区元素 的移动上,我会解决这个问题。因此,这一点也不清楚。
如果句柄被成功创建,它就会带着你在创建时传递给它的参数被创建。而且它将在任何时间范围内给出指标数据。然而,它将给出你在创建过程中指定的时间框架的数据。而为了正确地在工作时间框架上显示它们,你需要将收到的数据从指标手柄转换成你的指标工作的时间框架。
正在检查这个。但问题是,通过将手稿设定为一个永久的时期,在
其他时间段的CopyBuffer值是不可转移的。该值在设定的亨德尔周期上,在较小的时间范围内为0.0(零)。在缓冲区内移动它,寻找它......。零。为什么不把它传给CopyBuffer?
我已经把它复制了...
另一个问题是什么被复制 :)最有可能的是,你要求复制的条数比该TF上的条数要多,请打印
如果句柄被成功创建,它是用你在创建时传递给它的参数创建的。而且它将在任何时间范围内给出指标数据。但它会给出创建时设置的时间框架的数据。而为了在工作时间框架上正确显示它们,你需要将从指标句柄获得的数据转换成你的指标工作的时间框架。
我的实验做得对吗?
我给了你一个方向...
研究它。
我已经把它复制了...
另一个问题是什么是抄袭 :)最有可能的是,你要求复制的条数要比该TF上的条数多,打印
kopeyka2:
Верно ли я провел эксперемент.?
...
...即使切换到另一个时间框架,其数值也应来自设定的D1。这正是我所看不到的。还是出了什么问题?在设置手柄时,我还应该添加什么内容吗?由于没有缓冲区转移。
简单地说,用CopyByffer做实验,放什么应该是。但它不在那里。
你还没有检查数据的可用性,但你正试图复制。请看上面的代码--在第二个计时器中,每隔一分半钟就会访问非本地的时间框架--以保持数据的更新。而代码中的第一件事是检查所请求的数据是否可用。如果它们还没有准备好,那么它就会为下一个tick和指标的完整计算返回0。而当所有的数据都被接收和计算,并显示出来后,计算的数据量 会在最后被返回--为了不在下一个tick上做完全的重新计算。
谢谢你。我都看了。我将继续寻找。
你在寻找什么?上面的代码是完全有效的。你可以随心所欲地剖析它。我指出了你的错误--你没有检查数据的可用性。
甚至在这里的这条线路上。
int lm=IBarShift(NULL,PERIOD_D1, iTime(NULL, PERIOD_CURRENT, limit));
对iTime()返回的内容的检查在哪里?没有检查。但是你把一个未知的结果直接塞给了iBarShift()。你确定你给的是你所期望的功能吗?
如果句柄被成功创建,它就会用 你在创建时给它的参数来创建。而且它将在任何时间范围内通过指标数据。然而,它将给出创建时设置的时间框架的数据。而为了正确地在工作时间框架上显示它们,你需要将收到的数据从指标手柄转换成你的指标工作的时间框架。
这正是我所想的。误解的问题是 "参数 "这个词。所以我开始查看所有涉及到句柄的变量 --> CopyBuffer
1) 我的问题从一开始就是要切换时间框架SCREEN来保存手柄数据。正如在MT4中一样。
而事实上,结果也是如此。
总是在所有的时间框架上 给出相同的数值10。
在这里一无所获后,我继续前进。
2)我引用一下。"将指定指标的指定缓冲区的数据以指定的数量获取到缓冲区阵列中"。
也就是说,通过 手工 设置计数,我们应该有一个INTERVAL的数值 。 他们就在那里!BUT!!!!!!只有当处理周期对应于
监视器屏幕上的PERIOD_H1时间框架。 所有的价值都被清晰地传送。但移到另一个时间框架,屏幕上没有数据。
它们不会以任何方式传播,!!!! 而我的问题正是如此。如果不是有!!!!,条数在这里并不那么重要。
我看了建议的指标MTF_LRMA.mq5 ,但它是一样的。 它在屏幕上切换到另一个时间框架,数据按屏幕上的时间框架进行。我需要它在手持设备上。
例如:iClose(NULL, PERIOD_H1, 5); 在所有的时间框架上,它将给出相同的值:在H1的5个柱子上关闭。
到目前为止,所有的例子都是关于 CopyBuffer 计数的修正。 但数组是空的。