MT5和速度在行动 - 页 80

 
fxsaber:

ZS 摆脱几个月来的挂念会很好。在一台有无限内存的机器上运行这个脚本。例如,我不能从6月1日开始上传蜱虫,只是一次一个字符。它只是挂起了CopyTicks,资源消耗为零。

b2699 - 已修复,谢谢。

 
对显示刹车的代码的储蓄罐。这次是泰斯特
 

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

接受SL/TP订单

fxsaber, 2020.12.11 09:17

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

处理了100只蜱虫。服务器和终端之间的到达滞后从1到8毫秒不等。平均为4毫秒多一点。这正好等于TP订单触发的滞后,这也是这个分支的起点。


滞后本身是在MT5服务器内部。服务器->终端通道与此无关。


恳请开发商消除这种滞后。现在,在零ping的情况下,我们有一个持续的延迟ticks,不仅传入终端,而且传入服务器。特别是,订单的接受。

 
为了减少交易滞后,我建议将战斗终端转移到RAM-drive。
 

意外的是,我遇到了历史上缺少的一个刻度,尽管它出现在市场观察中:SymbolInfoTick



通过MQL打印出相同的刻度,显示出一个有趣的标志。

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [0] 2021.01.04 20:52:55 103.16300 103.16500 0.0000        0 1609793575267       4       0.00000
        [1] 2021.01.04 20:52:55 103.16300 103.16400 0.0000        0 1609793575788       4       0.00000
        [2] 2021.01.04 20:52:59 103.16400 103.16400 0.0000        0 1609793579367     130       0.00000
        [3] 2021.01.04 20:53:01 103.16400 103.16400 0.0000        0 1609793581817       2       0.00000
        [4] 2021.01.04 20:53:01 103.16300 103.16400 0.0000        0 1609793581969       2       0.00000

这个旗帜是在历史上失踪的 "市场观察 "刻度线之前形成的。也许这将告诉我们问题出在哪里。


遗憾的是,这种情况有系统地发生。蜱虫历史并不包含来到终端的所有蜱虫。

 
fxsaber:

意外的是,我遇到了历史上缺少的一个刻度,尽管它出现在市场观察中:SymbolInfoTick。



通过MQL打印出相同的刻度,显示出一个有趣的标志。

这个旗帜是在历史上失踪的 "市场观察 "刻度线之前形成的。也许这将告诉我们问题出在哪里。


遗憾的是,这种情况有系统地发生。蜱虫历史并不包含进入终端的所有蜱虫。

假设EA在真实账户上 做了一整天的交易,赚了钱。

第二天,我运行前一天的测试器,得到一个损失。

我不明白其中的原因,要么是经纪人给出了错误的点数,要么是其他原因......。

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

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

MT5和速度在行动

fxsaber, 2021.01.04 20:51

意外的是,我遇到了历史上缺乏刻度线的问题,尽管它来到了市场观察:SymbolInfoTick。


我已经启动了一个并行的终端,其中的kc不是由终端生成的,而是由服务器上传的。

在截图中,左边的这个终端--打勾是存在的。但在另一个终端(在右边)--它不是!它是。


事实证明,终端本身并没有将所有传入的ticks放入tick历史中。如果你想拥有没有遗漏的历史,你应该添加 tkc-文件并从服务器中提取。

令人不快的错误。

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.time_msc == Tick2.time_msc) &&
         !NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
         !NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
  bool Res = false;
  
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, Tick.time_msc, Tick.time_msc + 1);
  
  for (int i = 0; !Res && (i < Size); i++)
    Res = IsEqual(Tick, Ticks[i]);
    
  return(Res);
}

void OnTick()
{
  static MqlTick Ticks[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
  {
    const int Size = ArrayResize(Ticks, ArraySize(Ticks) + 1);
    
    Ticks[Size - 1] = Tick; // Дописали его в массив
    
    MqlTick HistoryTick[1];
    
    if (CopyTicks(_Symbol, HistoryTick, COPY_TICKS_ALL, 0, 1) > 0) // Взяли последний исторический тик
    {
      int i = 0;
      
      while ((i < Size) && (Ticks[i].time_msc < HistoryTick[0].time_msc)) // Если исторический тик пришел позже проверяемого
      {
        if (!IsHistory(Ticks[i]))                                    // Если в истории тиков нет проверяемого тика,
        {
          Alert("!IsHistory(Ticks[i]) == true");
          ArrayPrint(Ticks, _Digits, NULL, i, 1, ARRAYPRINT_HEADER); // выводим его.
        }
          
        i++;
      }
      
      ArrayRemove(Ticks, 0, i); // Удалили тики, что проверили.
    }
  }  
}

这样的EA不可能抓住历史上遗漏的ticks。战斗的那个人做到了。显而易见,这些蜱虫并没有启动OnTick。

漏掉的虱子本身可能是几十毫秒的实际情况。

 
fxsaber:
上面有一个带有源代码的帖子。它现在是空的。原因是什么?
这个帖子一定是在网站更新的时候(在英文部分有两个这样的帖子)。
 
fxsaber:

我运行了一个并行的终端,其中的kc不是由终端生成的,而是由服务器上传的。

在左边这个终端的截图上--打勾是存在的。但在另一个终端(右边),它不是这样的

我在两个终端机上都运行了这个脚本。

// Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
  string flag = " " + (string)tickflag;

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; \
                        tickflag -= tickflag & TICK_FLAG_##A;
 TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (tickflag)
    flag += " FLAG_UNKNOWN (" + (string)tickflag + ")";

  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
  return(TOSTRING(time) + "." + ::IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef  TOSTRING


void OnStart()
{  
  MqlTick Ticks[];
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2021.01.05 01:00' * 1000, D'2021.01.05 10:50' * 1000);
  
  string From = (string)Ticks[0].time;
  string To = (string)Ticks[Size - 1].time;
  
  StringReplace(From, ":", ".");
  StringReplace(To, ":", ".");
  
  const int handle = FileOpen(_Symbol + "_" + From + "-" + To + ".txt", FILE_WRITE | FILE_ANSI | FILE_TXT);

  if (handle != INVALID_HANDLE)
  {        
    for (int i = 0; i < Size; i++)
      FileWrite(handle, TickToString(Ticks[i], 0x7F)); // Фильтр флагов, иначе очень много различий.

    FileClose(handle);
  }
  
  Alert("Done.");
}


根据你要求的时间间隔,kc可能会改变(与服务器同步)。因此,一些在请求前缺失的标记可能开始出现了。

尽管如此,仍有可能在不同的人物身上发现一些。我不得不应用一个标志过滤器,因为在不同的终端机上,它们的刻度非常不同。

以下是差异的样子。


欧元兑日元。


USDCHF .


一般来说,在实时交易时,有些点位可能不会出现在历史点位中,因为它们是在终端中,可以在服务器上。

这个错误必须得到修复。