错误、漏洞、问题 - 页 2859

 
fxsaber:

总的来说,你对可能的实施方案有什么想法?

有许多可能的实现方式

但这一切都归结为EA之间的数据交换 任务。

最简单的方法是检查初始化的权限,并在OnTick()中执行初始化本身--这将允许避免恢复图表,然后在上面运行EA,并且在关闭前保存EA将有可能在OnDeinit()中完成

谁来管理这个动物园并 重要--要么是主要的EA,要么是一个服务机构。

 

在测试员日志中

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

它是什么意思?

 
Aleksey Vyazmikin:

在测试员日志中

它是什么意思?

这意味着,当收到m1 ohlc的下一个值时(或通过开盘价 测试时的bar状态),时间字段包含0

未定义函数意味着问题发生在预定义函数(OnTick、OnTimer等)之外,即在测试器的主循环中。

 
Slava:

这意味着,当获得下一个m1 ohlc值(或通过开盘价 测试时的bar状态)时,时间字段包含0

未定义函数意味着问题发生在预定义函数(OnTick、OnTimer等)之外,即在测试器的主循环中。

一整天一切都在正常工作,然后就开始了。作为一个用户,我可以做什么?

 
Slava:

这意味着,当获得下一个m1 ohlc值(或通过开盘价 测试时的bar状态)时,时间字段包含0

未定义函数意味着问题发生在预定义函数(OnTick、OnTimer等)之外,即在测试器的主循环中。

我不明白,是我的代码有错误还是终端有错误?抹掉了所有的历史记录--没有帮助。

已添加。

在我的代码中发现了一个函数,禁用它可以避免错误,但在另一个EA中,这个函数可以正常工作!怎么说呢?我可以把它放在我的私人信息中。

即使启用了这个有缺陷的函数,OnTick() 也是完全运行在第一条杠上,然后就出现了这个错误

在不同的终端上,该错误被确认。

在蜱虫上运行 - 没有错误...

但奇怪的是在日志中。

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

关于刻度线,如果看一下工具,第一个刻度线正好是在10:00,而交易时段在这个时候仍然关闭。这是在视觉模式下,如果不打勾,第一个印刷品就在10点钟方向。

 
Igor Makanu:

最简单的方法是在每个EA的开始时在OnTick()中检查初始化权限

这是问题的主要症结所在。
 
fxsaber:
这是该任务的主要问题。

尽量注意图表中的ID,并按资历运行。但这并不否定EA的互动。或者做一个文件,或者可能是一个SQLite数据库,里面有发射序列中的图表ID。

类似于,在第一次初始化时,如果列表中没有Chart_ID(),那么它就被输入到列表中。如果它由于终端关闭 而没有被关闭,那么它就会从列表中删除。通过这种方式,将有可能配置EA的互动。

 
fxsaber:
这是问题的主要症结所在。

勾勒出我的看法......用这个代码创建了2个EA。

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

和一个控制EA,它以定时器方式工作(5秒)。

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


检查了一下,一切正常,唯一的问题是,它没有与GlobalVariableSetOnCondition()一起工作,以在全局变量 中做记录。

 
fxsaber:
这是该任务的主要问题。

GlobalVariableSetOnCondition 是解决这个问题的全部条件。

只有当GlobalVariableSetOnCondition返回true时才允许操作。
初始化成功并释放资源后,将主变量返回到原始状态,另一个EA开始。

在DeInit中--无条件删除变量,这样就不会在完全没有EA的情况下跑到终端(如果之前的加载没有正确完成)。

 
Alexey Viktorov:
伊戈尔-马卡努
安德烈-哈蒂姆连斯基

谢谢你的推荐。我将查看GlobalVariableSetOnCondition

原因: