复盘软件--测试模式下的面板开单 新评论 Ao Shen 2018.10.19 10:29 引言正常情况下交易者编写的面板EA在测试模式下是不可用的帮助文档里也有相关的描述,但是我们发现有很多人传出来的面板是支持测试模式开单的,出于好奇我搜了一下国外交易者发布的相关文章,解决了这个问题,现向中文用户分享一下。言归正传,用正常的面板EA在测试模式下运行,你会发现如下规律:1.按钮可以对鼠标的点击产生按下和弹起的反应,但是按下后并没有执行相应的代码;2.很显然写在OnTick()里面的代码会被明确执行。你可以去查一下帮助文档,测试模式里OnChartEvent()是不可用的再来分析一下局面1.OnChartEvent()被屏蔽了;2.但是按钮状态并没有被屏蔽;3同时OnTick()又能实现开单。我们要通过按钮实现订单操作又不能通过OnChartEvent(),但是可以借用OnTick()。所以我们自然而然想到在OnTick()里面获取按钮状态实现订单操作,如此则可实现OnChartEvent()的借尸还魂。然后,我们编一个函数来模拟OnChartEvent()供OnTick()调用,这个函数应该实现如下功能:1.获取并处理按钮状态;2.根据对应功能的按钮的状态执行相应订单操作。//<<<<<<<<<<<<<<<<<<<<<<<<<<<<模拟事件函数<<<<<<<<<<<<<<<<<<<<<<<<<<<<void EmulatedChartEvent(){//单仓买入按钮状态bool singlbuy_state=ObjectGet("button1",OBJPROP_STATE);//单仓卖出按钮状态bool singlsell_state=ObjectGet("button2",OBJPROP_STATE);//双单买入按钮状态bool doublebuy_state=ObjectGet("button3",OBJPROP_STATE);//双单卖出按钮状态bool doublesell_state=ObjectGet("button4",OBJPROP_STATE);//一键清仓按钮状态bool closeall_state=ObjectGet("button5",OBJPROP_STATE);//订单修改按钮状态bool ordermodify_state=ObjectGet("button6",OBJPROP_STATE);//截图保存按钮状态bool sreenshoot_state=ObjectGet("button7",OBJPROP_STATE);//显示仓单按钮状态bool showorder_state=ObjectGet("button8",OBJPROP_STATE);//止损按钮纵坐标int stoplossbutton_top=ObjectGet("button9",OBJPROP_YDISTANCE);//止损按钮按钮状态bool stoplossbutton_state=ObjectGet("button9",OBJPROP_STATE);//止盈按钮纵坐标int takeprofitbutton_top=ObjectGet("button10",OBJPROP_YDISTANCE);//止盈按钮按钮状态bool takeprofitbutton_state=ObjectGet("button10",OBJPROP_STATE);//如果买入按钮被按下,则执行买入操作并将买入对应的按钮状态还原 if(singlbuy_state==true) { .... OrderSend... ObjectSet("button1",OBJPROP_STATE,false); }......}//>>>>>>>>>>>>>>>>>>>>>>>>>>>>模拟事件函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>最后在OnTick()里面调用就好:void OnTick(){ if(IsTesting()==true) { //模拟图表事件函数 EmulatedChartEvent(); }else { return; }}本人最终实现的效果截图:结论结论请看官自己总结。 Ao Shen 2018.10.19 11:01 #1 附加的文件: yvEA.ex4 143 kb Ao Shen 2019.04.03 13:55 #2 ObjectGet()可以换成ObjectGetInteger()... lisa1505736068 2023.07.10 05:21 #3 非常感谢您的分享 Ao Shen 2023.10.28 05:16 #4 lisa1505736068 #: 非常感谢您的分享🙏🙏🙏 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
引言
正常情况下交易者编写的面板EA在测试模式下是不可用的帮助文档里也有相关的描述,但是我们发现有很多人传出来的面板是支持测试模式开单的,出于好奇我搜了一下国外交易者发布的相关文章,解决了这个问题,现向中文用户分享一下。
言归正传,用正常的面板EA在测试模式下运行,你会发现如下规律:
1.按钮可以对鼠标的点击产生按下和弹起的反应,但是按下后并没有执行相应的代码;
2.很显然写在OnTick()里面的代码会被明确执行。
你可以去查一下帮助文档,测试模式里OnChartEvent()是不可用的
再来分析一下局面1.OnChartEvent()被屏蔽了;2.但是按钮状态并没有被屏蔽;3同时OnTick()又能实现开单。
我们要通过按钮实现订单操作又不能通过OnChartEvent(),但是可以借用OnTick()。所以我们自然而然想到在OnTick()里面获取按钮状态实现订单操作,如此则可实现OnChartEvent()的借尸还魂。
然后,我们编一个函数来模拟OnChartEvent()供OnTick()调用,这个函数应该实现如下功能:
1.获取并处理按钮状态;
2.根据对应功能的按钮的状态执行相应订单操作。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<模拟事件函数<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void EmulatedChartEvent()
{
//单仓买入按钮状态
bool singlbuy_state=ObjectGet("button1",OBJPROP_STATE);
//单仓卖出按钮状态
bool singlsell_state=ObjectGet("button2",OBJPROP_STATE);
//双单买入按钮状态
bool doublebuy_state=ObjectGet("button3",OBJPROP_STATE);
//双单卖出按钮状态
bool doublesell_state=ObjectGet("button4",OBJPROP_STATE);
//一键清仓按钮状态
bool closeall_state=ObjectGet("button5",OBJPROP_STATE);
//订单修改按钮状态
bool ordermodify_state=ObjectGet("button6",OBJPROP_STATE);
//截图保存按钮状态
bool sreenshoot_state=ObjectGet("button7",OBJPROP_STATE);
//显示仓单按钮状态
bool showorder_state=ObjectGet("button8",OBJPROP_STATE);
//止损按钮纵坐标
int stoplossbutton_top=ObjectGet("button9",OBJPROP_YDISTANCE);
//止损按钮按钮状态
bool stoplossbutton_state=ObjectGet("button9",OBJPROP_STATE);
//止盈按钮纵坐标
int takeprofitbutton_top=ObjectGet("button10",OBJPROP_YDISTANCE);
//止盈按钮按钮状态
bool takeprofitbutton_state=ObjectGet("button10",OBJPROP_STATE);
//如果买入按钮被按下,则执行买入操作并将买入对应的按钮状态还原
if(singlbuy_state==true)
{
....
OrderSend...
ObjectSet("button1",OBJPROP_STATE,false);
}
......
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>模拟事件函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>
最后在OnTick()里面调用就好:
void OnTick()
{
if(IsTesting()==true)
{
//模拟图表事件函数
EmulatedChartEvent();
}else
{
return;
}
}
本人最终实现的效果截图:
结论
结论请看官自己总结。