1

我尝试将其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 );
}
4

1 回答 1

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
— 图表更改事件;· — 用户事件的 ID,其中 n 的范围是 0 到 65535。· — 自定义事件的最后一个可接受的 ID 。<<<<<<<<<<<<<<<<<<<<

CHARTEVENT_CUSTOM + n


CHARTEVENT_CUSTOM_LAST
== ( CHARTEVENT_CUSTOM +65535 )

更改交易品种周期是图表的主要任务,它使 [MetaTrader 终端 4] 丢弃图表中描绘的工具的所有当前状态,然后进入后台并获取所有历史数据保存的记录[HistoryCentre](尝试F2查看该设施的运行情况)并且它必须相应地重新绘制 GUI。

猜猜看,
1) 这需要一些时间
2)<ChartEVENT>再次触发OnChartEvent()处理程序。
3)搬回“1号广场”

它是否创建了一个鼠标陷阱轮布置,必须无限循环运行?
是的,它确实。


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

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

//+------------------------------------------------------------------+
    void ChangeSPClick( bool   ChartSetSymbolPeriod ) {
        bool ChangeSP_action = ChartSetSymbolPeriod( 0, "GBPUSD", 15 );
    }
于 2016-10-29T15:15:48.947 回答