使用iClose/iOpen时间序列访问等工作时的MQL5错误。 - 页 5

 
Renat Fatkhullin:

请告诉我指标的参考代码,它总是保持市场观察中每个符号的最新 2000点。

否则,你会得到一边是猜测,另一边只是以文字形式的建议。

 
Renat Fatkhullin:

我必须看一下代码。

上面的代码显然有一堆的逻辑和资源问题。

我正在做这样的事情,如果有必要,请告诉我如何以及如何调整。

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
int OnCalculate (const int       rates_total,
                 const int       prev_calculated,
                 const datetime &time        [],
                 const double   &open        [],
                 const double   &high        [],
                 const double   &low         [],
                 const double   &close       [],
                 const long     &tick_volume [],
                 const long     &volume      [],
                 const int      &spread      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

我必须看一下代码。

上面的代码显然有一堆的逻辑和资源问题。

这段代码是否存在逻辑问题,或者我是否遗漏了什么?

关于交易、自动交易系统和策略测试的论坛

MQL5在iClose/iOpen时间序列访问等方面的错误。

Stanislav Dray, 2018.11.14 16:28

你对错误报告的态度很奇怪。我又不是拿钱来证明什么。我已经尽可能地阐述了这种情况。

我不是唯一有问题的人,问题出现在你的第30次更新之后,但你仍然影射我是个傻瓜,并指责一些弱智的指标。

在这之前,他们不是已经慢了一年了吗?

下面是一个代码的例子,它在M30上启动25分钟后挂起。

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

你在写指标时应该清楚地认识到,你不会一下子得到所有东西。

在OnInit中,你必须通过单次调用CopyXXX来刺激加载所需仪器的历史记录,但你必须等待OnCalculate中的完全初始化。

你的初始化阶段似乎有一个错误--你在错误地等待数据,并且阻塞了。

我将努力这样做。

现在我向OnCalculate提出请求,并在那里等待(当然不是每一个tick,而是只在第一次计算时)。

 
fxsaber:

请告诉我指标的参考代码,它总是保持市场观察中每个符号的最新 2000点。

我不知道如何使用它,但我确信我有权利使用它。

我同意!这甚至不是针对蜱虫,而是针对酒吧。

你需要一个批准的真实多货币代码的例子。

否则,我们将继续处于黑暗之中......。

 

我将尝试定位错误,并在发现后汇报。

 
transcendreamer:

我同意!最好连虱子都没有,而是酒吧。

我们需要一个被批准的真实多货币代码的例子。

否则,我们仍然会被蒙在鼓里......。

条形图和刻度图是独立存在于MT5中的不同表征。
 
Vladimir Karputov:

我们也一直建议,如果你在使用别人的时间框架--你应该每分钟从该时间框架获得一次OHLC(任何CopyXXXX功能)。这种情况一直存在。

我已经想吐槽这里的一切了,但不幸的是,我已经在MQ产品上花了大约10年时间。

现在都是生意。Vladimir你关于使用CopyXXXX函数的建议被我采用了,因为从我的非专业编写的代码来看,这没有任何困难。

老实说,我希望问题只出在我那双弯曲的手上,但问题不只出在手上。我在下面有一张截图,预计技术支持会有奇怪的解释,说我的编码不正确,还有100500个其他指标,所以你想要什么,会有问题。我没有100500个其他指标,也没有专家,我在终端中只打开了两个工具,指标测试在欧元兑美元1M上运行,指标调用的是同一工具的M15时间框架的数据,我没有试图加载其他符号数据,在市场回顾中只有少数符号。

对于终端来说,这是一个理想的装载情况,当然,在工作条件下不会有这种情况,但即使在这种情况下,也有一个问题,在我看来,这个问题叫做 "BAG"。

在指标中,iClose和iBars函数被调用只是为了反映Commet()中的状态。在截图创建时的市场回顾中,iClose和iBars函数调用的当前状态在终端窗口中,进一步说,指标的计算部分使用CopyXXXX函数。

BAG

如你所见,指标在16:31重新加载并成功运行(我甚至得到了快乐),但iClose数据更新在00:15后停止,分别是CopyXXXX函数也没有返回更新的数据,即错误发生在MT深处的某个地方。

在我看来,从服务器上读取数据时出现了故障,原因可能是大众化的(没有网络,服务器很忙等),但为什么消除了通信原因后恢复工作却没有发生,所以我的结论是,你可以尽情地测试用户的源代码,但如果你有一个隔壁的服务器,这个问题你永远也不会发现,它的存在并不只是因为手脚不好的编码员而发生。

 

昨天还决定测试一下Stanislav的代码。几个小时后,时间更新停止了。我没有切换时间框架,我只是通过图表的上下文菜单 进行了更新,时间继续进行。

今天我对代码进行了一些修改,以观察当前时间框架的时间。

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

15分钟后,它在 "非本地 "的时间范围内停止了更新,但在当前的时间范围内,它在正常更新。刷新图表后,时间又开始了。

终端在便携模式下运行。系统和终端本身位于一个SSD磁盘上。


 

我不知道发生了什么,但当我在MQL5中为最新的MQ锦标赛编写机器人时,它是多货币的,我没有注意到从其他工具加载数据的问题。

它可能消耗了大量的资源,但它给出了预期的结果,而不是像现在这样的轮盘游戏。

这个问题,例如作为MQL5商业产品的开发者,将不会给我带来很好的印象,如果有人为从市场上购买的产品付款,而它只是因为这样的 "BOGS "而看起来有问题,这将是加倍不愉快的。