指标中的OnDeinit - 页 7

 

开发人员,你在某处有一个错误。

void OnDeinit(const int reason)
{
 //Comment("");
 Comment(ArrayInitialize(body_down,EMPTY_VALUE),"  ",body_down[0],"  ",body_down[1],"  ",body_down[2],"  ",body_down[3]);
}

请看关闭终端后的评论截图,1分钟后再打开它。

初始化元素的数量,并且缓冲区的第一、第二、第三和第四元素是空的。

指示器只对第0个缓冲区进行计数。那么,为什么是2支蜡烛?


 
哦,是的。英文帮助中也说ArrayInitialize 不返回任何东西。

 
eevviill:

开发人员,你在某处有一个错误。

请看关闭终端后的评论截图,1分钟后再打开它。

初始化元素的数量,并且缓冲区的第一、第二、第三和第四元素是空的。

指示器只对第0个缓冲区进行计数。那么,为什么是2支蜡烛?


因为当你分析一个新的柱子时,你不检查柱子的数量,而只检查时间。当你在操作过程中启动终端或中断与服务器的连接时,在缺失的(到完整的历史)条形图到达之前,会出现一个勾。在这个刻度线上,一个新的蜡烛被创造出来,但是它和终端的历史记录之间有一个缺口(缺失的历史记录),这个历史记录将从服务器下载并插入到系统中,由于你不分析条数,你会认为在接下来的计算中没有新的条数,这时第二个蜡烛就出现了。打开一个新的酒吧后,它将消失。
 
mql5:
因为当你分析一个新的小节时,你不检查小节的数量,而只限于检查时间。当你在操作过程中启动终端或中断与服务器的连接时,在缺失的(到完整的历史)条形图到达之前会出现一个勾。在这个刻度线上,一个新的蜡烛被创造出来,但是它和终端的历史记录之间有一个缺口(缺失的历史记录),这个历史记录将从服务器下载并插入到系统中,由于你不分析条数,你会认为在接下来的计算中没有新的条数,这时第二个蜡烛就出现了。打开一个新的酒吧后,它将消失。

在deinit中,终端关闭 时发生归零,这并不重要?

 

Vasily,运行一个测试指标,打印出条数

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int      rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   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
   if(NewBar(PERIOD_CURRENT, lb))
    {
     Print("rates_total = ", rates_total);
     rates_ = rates_total;
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//if(reason == REASON_CLOSE)
Print("OnDeinit сработал ", rates_);
}

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|

这是它在日志中打印的内容。

0       22:52:04.765    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:52:04.795    test EURUSD.z,M1: initialized
0       22:52:04.795    test EURUSD.z,M1: rates_total = 75183
0       22:52:11.902    test EURUSD.z,M1: rates_total = 75184
0       22:52:28.712    test EURUSD.z,M1: uninit reason 9
0       22:52:28.712    test EURUSD.z,M1: OnDeinit сработал 75184
0       22:52:28.832    Custom indicator test EURUSD.z,M1: removed
0       22:57:10.366    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:57:10.396    test EURUSD.z,M1: initialized
0       22:57:10.396    test EURUSD.z,M1: rates_total = 75184
0       22:57:14.972    test EURUSD.z,M1: rates_total = 75185
0       22:57:59.167    test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0       22:58:34.237    test EURUSD.z,M1: uninit reason 1
0       22:58:34.237    test EURUSD.z,M1: OnDeinit сработал 75190
0       22:58:34.247    Custom indicator test EURUSD.z,M1: removed


也许这将告诉你问题来自哪里......

 
eevviill:

请向开发商询问一个简单的答案。

当终端关闭时,DeInit()函数是否在附于图表的程序中执行?

严格说来,不是。

OnDeinit被执行。DeInit只有在你从OnDeinit中明确调用它时才会被执行。

如果你指的是旧的deinit函数,还要记住,函数名是区分大小写的。也就是说,deInit是一个未知的函数,deinit是一个关于去初始化的标准入口点(如OnDeinit)。

 
eevviill:

在deinit中,归零是在终端关闭时进行的,这并不重要?

谁在乎呢?当你关闭终端时,这些缓冲区就不再需要了,因为当程序被卸载时,它们将立即被释放,这在OnDeinit之后立即发生。

试着只改变时间框架。OnDeinit会起作用,缓冲区会保留(因为在这种情况下程序没有被卸载),但没有人保证它们的内容来自 "过去的生活"

终于读到了文件!https://docs.mql4.com/ru/runtime/runninghttps://docs.mql4.com/ru/runtime/event_fire#deinit

 
stringo:

谁在乎呢?当终端关闭时,不再需要这些缓冲区,因为当程序被卸载时,它们将立即被释放,这在OnDeinit之后立即发生。

试着只改变时间框架。OnDeinit会起作用,缓冲区会保留(因为在这种情况下程序没有被卸载),但没有人保证它们的内容来自 "前世"。

终于读到了文件!https://docs.mql4.com/ru/runtime/runninghttps://docs.mql4.com/ru/runtime/event_fire#deinit

那么,在我的案例中,当图表被重新打开时,缓冲区已经被分割了?
 
eevviill:
那么在我的情况下,当图形被重新打开时,缓冲区被分叉了?

你没有缓冲区分叉的问题。

这就是你自己填充缓冲区的方式。第一次,当你画的时候;第二次,当你得到一部分数据的时候。两次都是用相同的Time[0]值操作。

 
stringo:

你不是在进行缓冲区分割。

这就是你自己填补缓冲区的方法。第一次是在渲染时,第二次是在数据到达时。两次都是用相同的Time[0]值操作。

好的。

请纠正英语的帮助,就这样了。

另外,英文帮助说ArrayInitialize 没有返回任何东西。