初学者的问题 MQL5 MT5 MetaTrader 5 - 页 990

 

问题:为什么设置为一个周期的Handel不能在其他时间段CopyBuffer 传递数值。那该怎么做呢?

如果问题出在不同时间段的阵列缓冲区元素 的移动上,我会解决这个问题。因此,这一点也不清楚。

 
kopeyka2:

问题:为什么设置为一个周期的Handel不能在其他时间段CopyBuffer 传递数值。那该怎么做呢?

如果问题出在不同时间段的阵列缓冲区元素 的移动上,我会解决这个问题。因此,这一点也不清楚。

如果句柄被成功创建,它就会带着你在创建时传递给它的参数被创建。而且它将在任何时间范围内给出指标数据。然而,它将给出你在创建过程中指定的时间框架的数据。而为了正确地在工作时间框架上显示它们,你需要将收到的数据从指标手柄转换成你的指标工作的时间框架。

 
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));
 
Artyom Trishkin:

如果句柄被成功创建,它是用你在创建时传递给它的参数创建的。而且它将在任何时间范围内给出指标数据。但它会给出创建时设置的时间框架的数据。而为了在工作时间框架上正确显示它们,你需要将从指标句柄获得的数据转换成你的指标工作的时间框架。

我的实验做得对吗?

1)我为D1期间创建了一个手柄。
2) 然后我们根据指令将数值放入CopyBuffer(从哪里到哪里)。
我从零写到第N条。
理论上讲,处理值应该写在这个区间内。即使转移到另一个时间框架,其数值也应该是来自设定的D1。我没有看到它。还是出了什么问题?在设置手柄时,我还应该添加什么内容吗?由于没有缓冲区转移。
 
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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
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做实验,在里面放什么,那应该是。但没有。
 

kopeyka2:
Верно ли я провел эксперемент.?

...

...即使切换到另一个时间框架,其数值也应来自设定的D1。这正是我所看不到的。还是出了什么问题?在设置手柄时,我还应该添加什么内容吗?由于没有缓冲区转移。

简单地说,用CopyByffer做实验,放什么应该是但它不在那里

你还没有检查数据的可用性,但你正试图复制。请看上面的代码--在第二个计时器中,每隔一分半钟就会访问非本地的时间框架--以保持数据的更新。而代码中的第一件事是检查所请求的数据是否可用。如果它们还没有准备好,那么它就会为下一个tick和指标的完整计算返回0。而当所有的数据都被接收和计算,并显示出来后,计算的数据量 会在最后被返回--为了不在下一个tick上做完全的重新计算。

 
谢谢你。我都读过了。我将继续寻找。
 
kopeyka2:
谢谢你。我都看了。我将继续寻找。

你在寻找什么?上面的代码是完全有效的。你可以随心所欲地剖析它。我指出了你的错误--你没有检查数据的可用性。

甚至在这里的这条线路上。

int lm=IBarShift(NULL,PERIOD_D1, iTime(NULL, PERIOD_CURRENT, limit));

对iTime()返回的内容的检查在哪里?没有检查。但是你把一个未知的结果直接塞给了iBarShift()。你确定你给的是你所期望的功能吗?

 
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 计数的修正。 但数组是空的。