【问题标题】:Why MT4 - ChartSetSymbolPeriod() - slows down the platform?为什么 MT4 - ChartSetSymbolPeriod() - 减慢平台速度?
【发布时间】:2016-10-25 18:00:17
【问题描述】:

我尝试将 ChartSetSymbolPeriod() 用于我的 [ 自定义指标 ],但是当我尝试将它与另一个 [ 智能交易系统 ] 一起使用时,该指标会减慢我的 MT4 平台。

特别是“订单、市场深度”类型的 [EA 交易]。

//+------------------------------------------------------------------+
//|                                       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 );
}

【问题讨论】:

    标签: indicator algorithmic-trading mql4 metatrader4 mt4


    【解决方案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
    — 鼠标点击图表的事件;

    ·@987654338 @
    — c 的事件哈特变化; <<<<<<<<<<<<<<<<<<<<

    ·CHARTEVENT_CUSTOM + n
    — 用户事件的 ID,其中 n 的范围是 0 到 65535。

    ·CHARTEVENT_CUSTOM_LAST
    — 自定义事件的最后一个可接受的 ID == ( CHARTEVENT_CUSTOM +65535 )。

    Symbol 和 Period 的变化是一个主要的图表任务,它使 [MetaTrader 终端 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 );
        }
    

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2016-12-04
      • 2018-03-11
      • 2018-12-27
      相关资源
      最近更新 更多