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

 
Aleksey Vyazmikin:

我怎样才能找到这条信息的原因?

剖析器

 
Artyom Trishkin:

你不知道如何检查返回值是否为零?而且不知道如何在OnCalculate()中退出,返回值为0?你从未尝试过在网站上搜索信息吗?

  1. 从函数中获得所需的值
  2. 检查它是否为零
    1. 如果它是零,则返回0。
    2. 如果不为零,则进入第三步
  3. 用这个值工作
我从来没有想过,我会在这个资源上向一个评分超过13000分的人讲述逻辑的基本知识......。

这不是一个指标。

我故意指定我是否应该在每次调用时做检查,还是在OnTick开始时做一次检查就够了......

我不能接受退货......而且在测试器中循环等待是不可能的,而在实际中应该工作(或不工作)。

我的评级不是为了编程,我不是一个程序员,我在学习这个复杂的业务,只是感谢像你这样的人,我真的很感谢有知识的人的反馈。

谢谢你的理解。

 
Artyom Trishkin:

剖析器

如果它每天发生一次或更少呢?

 
你好。由于某些原因,Handel只有在设置为所有时期时才会传送,但我设置为特定时期时却什么也没有。我不知道问题出在哪里。试着直接输入handel而不是从全局变量 中输入,结果是一样的。怎么了?我需要的是一个时期的值。
//+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars="2018.11.19 00:00";            //Дата начала отсчета
input bool DataBars=false;                        //Считать по дате (true)
input int InpMAShift=1;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes=PERIOD_D1;       //Таймфрейм скользящей
input ENUM_MA_METHOD  Method=MODE_EMA;            //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle=STYLE_DASH;         //Стиль всех скользящих линий
input int InpMAPeriod1=5;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE);         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);      // БЕЗ ПРОБЛЕМЫ
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectDelete(0,"Proba");
   Comment("");
  }
//+------------------------------------------------------------------+
//| 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<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
if(DataBars==false)
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm=iTime(NULL,Timeframes,shift);
 
 Comment(NormalizeDouble(BufferPrice[shift],_Digits),"    ",shift);
 
 
   HLine("Proba","",tm,ma1,MAStyle,1,Red);

//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+
void HLine(string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if(ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
      ObjectSetInteger(0,name,OBJPROP_TIME, tm);
      ObjectSetString(0,name,OBJPROP_TEXT,text); 
      ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman"); 
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10); 
      ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
      ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
      ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); 
     }
  }

 
kopeyka2:
你好。由于某些原因,handel只有在设置为所有时期时才会转移,但我把它放到某个时期,却什么也没有。我不知道问题出在哪里。我试着把不是来自全局变量 的数据直接输入handel,结果是一样的。怎么了?
      ResetLastError();
   if(CopyBuffer(handle_ma,0,0,count,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);

研究错误,Artem说的对,你应该把所有东西都检查10遍......

2019.01.25 20:12:26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

err_invalid_array

4006

阵列的类型不合适,大小不合适或动态阵列对象被破坏


误差指示器数据未找到

4806

未找到所需的数据


 
kopeyka2:
你好。我注意到,只有当它被设置为所有时期时,才会转移,但当我把它设置为某个时期时,什么也不会发生。我不明白问题出在哪里。试着直接输入handel而不是从全局变量 中输入,结果是一样的。怎么了?我需要的是同一时期的数值。

你从Scriptor的指标中抽取了CodeBase的例子,对吗?对吗?然后在他的代码(最近发表的)中寻找名字中带有MTF,但没有MCP的例子。

MTF = MultiTimeFrame, MCP = MultiCurrencyPair.也就是说,如果你想获得当前符号的数据,但是从图表周期以外的另一个时间框架获得的,那么你需要一个多时间框架指标的例子。在MCP中,你还不应该介入--在那里使用标准类的OOP。你会感到困惑。

例如,这种计算。

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;

它只适用于在当前周期和符号上工作的MA。对于在不同时期的工作,计算方法会有所不同。查一查--一切都很近,还有我给你的方向。

 
Artyom Trishkin:

你从Scriptor的指标中抽取了CodeBase的例子,对吗?对吗?然后在他的代码(最近发表的)中寻找名字中带有MTF,但没有MCP的例子。

MTF = MultiTimeFrame, MCP = MultiCurrencyPair.也就是说,如果你想获得当前符号的数据,但是从图表周期以外的另一个时间框架获得的,那么你需要一个多时间框架指标的例子。在MCP中,你还不应该介入--在那里使用标准类的OOP。你会感到困惑。

例如,这种计算。

它只适用于在当前周期和符号上工作的MA。对于不同时期的工作,计算方法会有所不同。搜索--一切都很近,我给你指明了方向。

谢谢你...
 
Aleksey Vyazmikin:

研究错误,Artem说的对,你应该把所有东西都检查10遍......

err_invalid_array

4006

阵列的类型不合适,大小不合适或动态阵列对象被损坏

谢谢你
 
kopeyka2:
谢谢你

拜托,但我复制了错误的错误,应该是

误差指示器数据未找到

4806

没有找到所要求的数据

问题是,不同的TFs的条数是不同的,这一点应该被考虑到。

 
Aleksey Vyazmikin:

拜托,但我复制了错误的错误,应该是

误差指示器数据未找到

4806

没有找到所要求的数据

问题是,不同的TFs的条数是不同的,这一点应该被考虑到。

我只是在检查它。但问题是,在将handel设定为一个恒定的周期后,在

CopyBuffer 在其他时间段的值不是永久性的。在设定的手柄期,该值是,但在较小的时间段,该值为0.0(零)。在寻找缓冲区的过程中移动了...零。为什么不把它传给CopyBuffer?