我尝试使用 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 );
}
答案 0 :(得分:1)
此新 - MQL4.56789
架构功能对[自定义指标]中的非阻塞,以性能为中心的代码采取应有的谨慎态度提出了更高的要求
MQL4文档接下来指出,对 ChartSetSymbolPeriod()
的调用不是同步的,只是在TaskQueue中再添加一张票。
ChartSetSymbolPeriod()
更改指定图表的符号和期间。该函数是异步的,即它发送命令而不等待其执行完成。该命令将添加到图表消息队列中,仅在处理完所有先前的命令后执行。
<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号广场”
它是否会创建一个鼠标陷阱轮安排,必须在循环中无限运行?
是的,确实如此。
此外,人们可能已经注意到副作用
//+------------------------------------------------------------------+
void ChangeSPClick( bool ChartSetSymbolPeriod ) {
bool ChangeSP_action = ChartSetSymbolPeriod( 0, "GBPUSD", 15 );
}