Init()和DeInit()执行顺序 - 页 18

 
Alexey Kozitsyn:
即使用拐杖?我可以给你举个例子吗?

你不能通过ChartIndicatorAdd()向有不同符号或TF的图表添加指标。将显示一个错误。

https://www.mql5.com/ru/docs/chart_operations/chartindicatoradd

图表指示器添加

在指定的图表窗口中添加一个具有指定句柄的指标。该指标和图表必须在同一符号和时间框架上绘制

这就是现在的限制。它不会出现在服务中。
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
一个小小的提示,几乎是关于subj的主题。

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

虫子,虫子,问题

fxsaber, 2016.09.23 10:48

  1. 我们用手在NONE图表上设置指标
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    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 (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. 用手将指标从图表中取出。
  3. 在日志中,我们看到该指标继续运行。你可以关闭终端中的所有图表,但它仍然在执行。当然,这也无济于事。
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. 重启终端会停止指标的执行。
  5. 有多少指标可以像这样在闲置状态下执行,而我们对它们一无所知!根本就没有控制。
没有向开发商提出任何投诉。
 
fxsaber:
现在这是一个限制。它不会出现在服务中。

我说的根本不是这个意思。不是从EA中添加一个指标,而是使用EA创建一个指标。

关于这一点。

比起服务或在一个图表上运行多个EA的能力,不能完全覆盖正在讨论的陷阱?

如果没有使用服务创建指标的可能性,用文件中的数据创建指标的问题就不会消失。如果OnDeinit()->OnInit()的序列不受控制。改变TF是一个用户行为,对这个行为的响应(OnDeit())将在没有必要时发生(在OnInit()之后,甚至可能在OnCalculate()之后?

也就是说,如果指标将数据记录到文件中,并根据这些数据绘制图形系列,而数据不是 "连续 "写入的,就不会出现所有数据的正确显示。

但是,如果该服务是一个全局程序(像GPT,但整个程序),它可以创建指标缓冲区,并且计算不会被用户的行动(如TFs变化/图表关闭)打断 - 那么问题就不会存在。但与此同时,指标被阉割了,像往常一样。

 
Alexey Kozitsyn:

我说的根本不是这个意思。不是从EA中添加一个指标,而是使用EA创建一个指标

我不明白这些术语。

 
fxsaber:

我不明白这些术语。

计算和显示数据与在指标缓冲区 中写入数据,而不仅仅是显示数据。
 
Slawa:

还没有解决OnChartEvent的问题

你是什么意思,没有解决办法?如果没有访问鼠标的能力,那将是什么样的服务?而且我也想处理用户事件
 
Alexey Kozitsyn:
计算和显示数据时要在指标缓冲区 中写入数据,而不仅仅是显示数据。

他们抱怨说,该指标计算出的数据在更换TF期间不能可靠地、合理地转移到该指标的另一个副本

如果服务将做计算部分,而指标将显示它,这很容易通过服务来完成。

在所有其他情况下,如果不属于黑体字突出显示的情况,你可以继续按照经典的指标来写。

 
fxsaber:

他们抱怨说,该指标计算出的数据在更换TF期间不能可靠地、合理地转移到该指标的另一个副本

这很容易通过服务来完成,如果服务将做计算部分,而指标将显示它。

在所有其他情况下,不属于黑体字突出显示的情况,你可以继续以传统方式编写指标。

好吧,我们将看看我们得到什么。什么时候进行测试?
 
Alexey Kozitsyn:
好吧,我们将看看会发生什么。什么时候进行测试?
如果我批准了,就在今晚。
 
Nikolai Semko:
你是什么意思,没有解决方案?如果没有访问鼠标的能力,那将是什么样的服务?而且我也想处理用户事件

无解是指 "还不知道如何解决",而不是 "不会"。

而且自定义事件也完全没有问题