为什么选择MT4 - ChartSetSymbolPeriod() - 会降低平台的速度?

时间:2016-10-25 18:00:18

标签: indicator algorithmic-trading mql4 metatrader4 mt4

我尝试使用 ChartSetSymbolPeriod() 作为我的[自定义指标],但当我尝试将其用于另一个[EA交易]时,此指标会减慢我的MT4平台。

特别是' 订单市场深度' [Expert Advisors]的类型。

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

string    ChangeSP = "Where I go?";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
    ObjectCreate     ( 0, ChangeSP, OBJ_BUTTON,           0, 0, 0            );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_XDISTANCE,    15                 );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_YDISTANCE,    100                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_XSIZE,        200                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_YSIZE,        40                 );
    ObjectSetString  ( 0, ChangeSP, OBJPROP_TEXT,         "Go to GBPUSD M15" );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_COLOR,        White              );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BGCOLOR,      Red                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BORDER_COLOR, Red                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BORDER_TYPE,  BORDER_FLAT        );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BACK,         false              );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_HIDDEN,       true               );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_STATE,        false              );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_FONTSIZE,     12                 );
//---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start(){
    return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit(){
    return(0);
}
//+------------------------------------------------------------------+
void OnChartEvent( const int     id,
                   const long   &lparam,
                   const double &dparam,
                   const string &sparam
                   ) {
    if (  sparam == ChangeSP ) {
       ChangeSPClick( ChangeSP );
       ObjectSetInteger( 0, ChangeSP, OBJPROP_STATE, false );
    }
}
//+------------------------------------------------------------------+
void ChangeSPClick( bool   ChartSetSymbolPeriod ) {
    bool ChangeSP_action = ChartSetSymbolPeriod( 0, "GBPUSD", 15 );
}

1 个答案:

答案 0 :(得分:1)

性能?
第一:所有[自定义指标]分享一条单线!

- MQL4.56789 架构功能对[自定义指标]中的非阻塞,以性能为中心的代码采取应有的谨慎态度提出了更高的要求

MQL4文档接下来指出,对 ChartSetSymbolPeriod() 的调用不是同步的,只是在TaskQueue中再添加一张票。

  

ChartSetSymbolPeriod()

更改指定图表的符号和期间。该函数是异步的,即它发送命令而不等待其执行完成。该命令将添加到图表消息队列中,仅在处理完所有先前的命令后执行。

队列中还有什么其他内容?
MQL4识别以下类型的 <ChartEVENT> -s:

  

OnChartEvent() 是一组ChartEvent事件的处理程序:   

·CHARTEVENT_KEYDOWN - 图表窗口聚焦时击键事件;
  
·CHARTEVENT_MOUSE_MOVE - 鼠标移动事件和鼠标点击事件(如果为图表设置CHART_EVENT_MOUSE_MOVE = true);

  
·CHARTEVENT_OBJECT_CREATE
- 创建图形对象的事件(如果为图表设置了CHART_EVENT_OBJECT_CREATE = true);
  
·CHARTEVENT_OBJECT_CHANGE
- 通过属性对话框更改对象属性的事件;
  
·CHARTEVENT_OBJECT_DELETE
- 删除图形对象的事件(如果为图表设置CHART_EVENT_OBJECT_DELETE = true);

  
·CHARTEVENT_OBJECT_CLICK
- 在属于图表的图形对象中单击鼠标的事件;
  
·CHARTEVENT_OBJECT_DRAG
- 使用鼠标移动图形对象的事件;
  
·CHARTEVENT_OBJECT_ENDEDIT
- 在LabelEdit图形对象的输入框中完成文本编辑的事件;
  
·CHARTEVENT_CLICK
- 鼠标在图表上点击的事件;
  
·CHARTEVENT_CHART_CHANGE
- 图表更改事件;的 <<<<<<<<<<<<<<<<<<<<
  
·CHARTEVENT_CUSTOM + n
- 用户事件的ID,其中n的范围是0到65535.
  
·CHARTEVENT_CUSTOM_LAST
- 自定义事件== ( CHARTEVENT_CUSTOM +65535 )的最后一个可接受的ID。

更改符号期间是一项重要的图表事宜,它使[MetaTrader Terminal 4]丢弃图表中描绘的所有当前状态的工具,接下来进入Back-of-the-House并从 [HistoryCentre] 获取所有历史保存的记录(尝试 F2 看到该设施在运行中)并且必须相应地重新绘制GUI。

猜猜是什么,
1)一段时间
2)使<ChartEVENT>再次触发 OnChartEvent() 处理程序。
3)回到“1号广场”

它是否会创建一个鼠标陷阱轮安排,必须在循环中无限运行?
是的,确实如此。

此外,人们可能已经注意到副作用

函数调用签名中的名称掩盖了MQL4函数的名称

//+------------------------------------------------------------------+
    void ChangeSPClick( bool   ChartSetSymbolPeriod ) {
        bool ChangeSP_action = ChartSetSymbolPeriod( 0, "GBPUSD", 15 );
    }