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

 
Vladimir Karputov #:

在OnDeinit中,你应该做ObjectsDeleteAll- 按前缀删除(在你的例子中,前缀是 "Line")。

HLine "应该写 在哪一行

 
Green handsome #:

"HLine "应该写 在哪一行

什么是不清楚的?

关于交易、自动交易系统和策略测试的论坛

初学者的常见问题 MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2021.09.10 15:53

你必须在OnDeinit中做ObjectsDeleteAll-按前缀删除(在你的例子中,前缀是 "Line")。

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );


 
Vladimir Karputov #:

究竟是什么不清楚?


int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string      HLine,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   
   );

在这里我已经做了,它仍然不会删除它。

 
void OnDeinit(const int reason)
  {
     {
      ObjectsDeleteAll(0,prefix,0);
     }
//---
   //ChartRedraw();
  }

前缀包含图形标签的名称

你知道前缀是什么意思吗?

 
Fast235 #:

前缀包含图形标签的名称

你知道前缀是什么意思吗?

我根本就不知道MQL....我想我只需修改几行就可以了。

 
Green handsome #:

我对MQL一点都不了解....我想我只需修改几行就可以了。

上面的代码应该有帮助,否则可以看看创建对象的前缀是什么

 

左上角 的子窗口中不显示短名称的原因是什么?


另外,如果我在图表上加载一个指标,第二个副本就不再起作用了--OnInit()=没有触发,也不打印。但如果我把 "输入参数 "改为其他参数,就可以工作了。

#property indicator_separate_window

#property indicator_plots 0

input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА

//+------------------------------------------------------------------+
string prog_name,short_name;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
{
  prog_name=MQLInfoString(MQL_PROGRAM_NAME);
  short_name="=Set ("+(string)MASlow+"/"+(string)MAFast+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  Print("INIT_SUCCEEDED");
  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[])
{
//---

//--- return value of prev_calculated for next call
  return(rates_total);
}

---

怎么 了,在mt4中这个代码是有效的。

 
Vitaly Muzichenko #:

左上角 的子窗口中不显示短名称的原因是什么?


另外,如果我在图表上加载一个指标,第二个副本就不再起作用了--OnInit()=没有触发,也不打印。但如果我把 "输入参数 "改为其他参数,就可以工作了。

---

怎么 了,这段代码在mt4中是有效的。

也许这只是因为它太短了?没有映射,没有缓冲区......为什么要对这样一个指标进行第二次复制,这样终端就会变得很随意......

 
Vitaly Muzichenko #:

左上角 的子窗口中不显示短名称的原因是什么?


另外,如果我在图表上加载一个指标,第二个副本就不再起作用了--OnInit()=没有触发,也不打印。但如果我把 "输入参数 "改为其他参数,就可以工作了。

---

怎么 了,这段代码在mt4中是有效的。

我也有一个问题,但我建立了指标,一切都很好。

#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+

我可能会把它注释出来,找出它何时停止在子窗口中写入指标的名称......。但太懒了

 
Igor Makanu #:

缺少了一些东西--可能是某种属性,也面临着这个问题,但在这里我已经勾画出了指标,一切正常。

你可以对它进行注释,以寻找它停止在子窗口中写入指标名称的时间...但懒惰

数据显示出来了,但如果OnInit()函数没有工作,从哪里来?我们在图表上抛出一个副本,OnInit()可能会被意外触发,但如果是另一个副本,就这样了,甚至没有打印。但如果我们改变输入参数--那么它就能工作。

#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА

//+------------------------------------------------------------------+
int wndNum;
string short_name;
double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  short_name="Set ("+(string)MASlow+"/"+(string)MAFast+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  wndNum=ChartWindowFind();
  Print("INIT SUCCEEDED: "+(string)wndNum);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}

---

有什么办法,为什么OnInit 不起作用?