EA 奔溃了如何实现自动重启?

 

EA在正常运行过程中,万一程序某个BUG或极端数据导致EA奔溃了,但还有持仓,这种情况发生了其实非常严重,因为没有监控报警,更不可能一直在电脑前盯着,所以也不知道EA什么时候就挂了,会导致不可预估的风险。如何让EA在崩溃后能够快速自动重新加载到图表继续工作?或者有没有一种机制,像守护进程一样,一个实例挂了立即启动新的实例,确保EA一直在运行?求大神或官方能提供解决方案?非常重要!!!


补充1: 官方提供了移除EA的函数,不支持加载EA的函数

ExpertRemove

函数停止 EA交易 并从图表中卸载。


补充2:官方提供了一个叫服务的东东,其实到今天我也没搞懂这个服务怎么玩,官方明确指出服务中禁止的函数 ExpertRemove ,我想如果有加载的函数,服务也无法实现和解决守护问题


以下是官方文档提供对服务的介绍, 官网提供的这个示例,也完全看不懂,服务做了什么?


加载和卸载服务

如果服务在程序端关闭时启动,那么在启动程序端后立即加载这些服务。服务在完成工作后被立即卸载。

服务有一个OnStart()处理程序,在此程序中,您可以实现无休止的数据接收和处理循环,例如使用网络函数创建和更新自定义交易品种。

与EA交易、指标和脚本不同,服务并不绑定特定的图表,因此为其启动提供一个单独的机制。使用“添加服务”命令,在导航中创建一个新服务实例。可以使用对应的实例菜单启动、停止和移除服务实例。要管理所有实例,请使用服务菜单。

 

为了更好地理解EA交易的操作,我们推荐如下的EA交易编译代码,并执行装载/卸载,模板转变,样本转变,事件表转变等等:

示例:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass constructor"); }
   ~CTestClass() { Print("CTestClass destructor"); }
  };
CTestClass global;
//+------------------------------------------------------------------+
//| 专家初始化函数                                                     |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Initialisation");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 专家无法初始化函数                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("Deinitialisation with reason",reason);
  }
//+------------------------------------------------------------------+
//| 专家订单号函数                                                     |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+

 
Jiayou Hu:

EA在正常运行过程中,万一程序某个BUG或极端数据导致EA奔溃了,但还有持仓,这种情况发生了其实非常严重,因为没有监控报警,更不可能一直在电脑前盯着,所以也不知道EA什么时候就挂了,会导致不可预估的风险。如何让EA在崩溃后能够快速自动重新加载到图表继续工作?或者有没有一种机制,像守护进程一样,一个实例挂了立即启动新的实例,确保EA一直在运行?求大神或官方能提供解决方案?非常重要!!!


补充1: 官方提供了移除EA的函数,不支持加载EA的函数

ExpertRemove

函数停止 EA交易 并从图表中卸载。


补充2:官方提供了一个叫服务的东东,其实到今天我也没搞懂这个服务怎么玩,官方明确指出服务中禁止的函数 ExpertRemove ,我想如果有加载的函数,服务也无法实现和解决守护问题


以下是官方文档提供对服务的介绍, 官网提供的这个示例,也完全看不懂,服务做了什么?


加载和卸载服务

如果服务在程序端关闭时启动,那么在启动程序端后立即加载这些服务。服务在完成工作后被立即卸载。

服务有一个OnStart()处理程序,在此程序中,您可以实现无休止的数据接收和处理循环,例如使用网络函数创建和更新自定义交易品种。

与EA交易、指标和脚本不同,服务并不绑定特定的图表,因此为其启动提供一个单独的机制。使用“添加服务”命令,在导航中创建一个新服务实例。可以使用对应的实例菜单启动、停止和移除服务实例。要管理所有实例,请使用服务菜单。

 

为了更好地理解EA交易的操作,我们推荐如下的EA交易编译代码,并执行装载/卸载,模板转变,样本转变,事件表转变等等:

示例:


可以通过加载模板的函数加载EA。
 
Nianfu Li:
可以通过加载模板的函数加载EA。

谢谢,这是一个解决方案

 
Jiayou Hu:

EA在正常运行过程中,万一程序某个BUG或极端数据导致EA奔溃了,但还有持仓,这种情况发生了其实非常严重,因为没有监控报警,更不可能一直在电脑前盯着,所以也不知道EA什么时候就挂了,会导致不可预估的风险。如何让EA在崩溃后能够快速自动重新加载到图表继续工作?或者有没有一种机制,像守护进程一样,一个实例挂了立即启动新的实例,确保EA一直在运行?求大神或官方能提供解决方案?非常重要!!!


补充1: 官方提供了移除EA的函数,不支持加载EA的函数

ExpertRemove

函数停止 EA交易 并从图表中卸载。


补充2:官方提供了一个叫服务的东东,其实到今天我也没搞懂这个服务怎么玩,官方明确指出服务中禁止的函数 ExpertRemove ,我想如果有加载的函数,服务也无法实现和解决守护问题


以下是官方文档提供对服务的介绍, 官网提供的这个示例,也完全看不懂,服务做了什么?


加载和卸载服务

如果服务在程序端关闭时启动,那么在启动程序端后立即加载这些服务。服务在完成工作后被立即卸载。

服务有一个OnStart()处理程序,在此程序中,您可以实现无休止的数据接收和处理循环,例如使用网络函数创建和更新自定义交易品种。

与EA交易、指标和脚本不同,服务并不绑定特定的图表,因此为其启动提供一个单独的机制。使用“添加服务”命令,在导航中创建一个新服务实例。可以使用对应的实例菜单启动、停止和移除服务实例。要管理所有实例,请使用服务菜单。

 

为了更好地理解EA交易的操作,我们推荐如下的EA交易编译代码,并执行装载/卸载,模板转变,样本转变,事件表转变等等:

示例:


如果你的EA设计缜密,通过了回测测试,并且测试日志没有错误,理论上出现崩溃的概率为0,EA奔溃的原因一般都是逻辑错误,或特例情况没有考虑周全,但这并不是EA的错,是编程人员的错误,所以设计一个自动加载EA函数没有意义,可以通过其它间接方式解决

 

同意樓上的說法 如果邏輯上沒問題原則上是不會出現崩潰的

提供兩個我常犯的錯誤 在編譯或回測時通常沒問題 但是上了實盤或模擬就會出現崩潰

1/. 計算式除數為零 

      Ex. z=a+b/c;

            X=y/z; 

      z為變量 沒考慮到計算後會成為零

2/. 暫存器超出範圍

     Ex  for(int i=OrdersTotal();i>=0;i--)

             z=Close[i-1];

        z超出了計算範圍

 

看你的意思你所谓的崩溃就是“EA自己从图表卸载了”,这种情况除非是你的程序有问题,否则不会发生。

EA如果出现了运行时的严重错误,比如数组越界,做除法时分母是0,还有就是堆上new出来的对象没有释放导致内存泄漏,将会导致EA从图表自动卸载。

我的EA挂了大半年,没有出现任何问题, 只要注意这几点,就不会发生崩溃。

 
谢谢大神们的回复,我也知道正常情况下不会出现Crush的情况,但从程序的稳定性和健壮性来说,有实时的系统监控,并且能在很短时间内自动恢复重启等机制是必不可少的,再好的系统都不可能100%保证,当然最好不出任何问题。
 

我的程序 占用内存一直在涨 有没有好的办法

有没单位时间重新载入EA的函数


 
my15605613828 #:

我的程序 占用内存一直在涨 有没有好的办法

有没单位时间重新载入EA的函数


浏览程序,看看问题出在哪里。

 

稀奇,EA还能崩溃。

肯定是EA里哪段代码有问题,不具严谨性。