测试 "CopyTicks"。 - 页 17

 
fxsaber:
勾股量 是一种粗略的说法吗?一个原则上对交易所来说毫无意义的指标。你不能有意识地使用它。它是垃圾。

嗯,实际上,证券交易所的勾股量就是炒家的数量。也就是说,实际的交易数量。

 
Slawa:

嗯,实际上,证券交易所的勾股量就是炒家的数量。也就是说,实际的交易数量。

因此,当有一笔与前一笔交易完全相同的交易出现时,栏位不会改变。
 
fxsaber:
因此,当有一笔与前一笔交易完全相同的交易出现时,栏位不会改变。
勾股和实际量的变化
 
专家顾问写下新鲜的历史记录,并揭示了CopyTicks中的第N个错误
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

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

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " 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 (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

#define  TOSTRING2(A) #A + " = " + (string)A

int AddFreshTicks( MqlTick &Ticks[], const string Symb = NULL, const uint flags = COPY_TICKS_ALL )
{
  int Res = 0;
  const int Amount = ArraySize(Ticks);
  
  MqlTick NewTicks[];  
  const int NewAmount = (Amount == 0) ? CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags) :
                                        CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags, Ticks[Amount - 1].time_msc);
  
  if (NewAmount > 0)
  {
    if (Amount > 0)
    {
      // Взяли крайнее время из предыдущей истории
      const long LastTime = Ticks[Amount - 1].time_msc;
      
      int Count = 1;
      
      // Находим (Count) в предыдушей истории количество тиков со временем LastTime
      for (int i = Amount - 2; i >= 0; i--)
      {
        if (Ticks[i].time_msc < LastTime)
          break;
          
        Count++;
      }

      if ((Count < Amount) && (Count < NewAmount))      
      {
        // Если Count-тик c LastTime-временем в новой истории не равен самому последнего тику в старой истории, выводим в журнал
        if (_R(Ticks[Amount - 1]) != NewTicks[Count - 1]) // https://www.mql5.com/ru/code/16280
          Print(TOSTRING2(TickToString(Ticks[Amount - 1])) + "\n" +
                TOSTRING2(TickToString(NewTicks[Count - 1])) + "\n" + TOSTRING2(TickToString(NewTicks[Count])) + "\n");              

        Res = ArrayCopy(Ticks, NewTicks, Amount, Count);
      }
    }
    else
      Res = ArrayCopy(Ticks, NewTicks);
  }
  
  return(Res);
}

void OnTick( void )
{
  static MqlTick PrevTicks[];
  
  // Дописываем свежие тики
  AddFreshTicks(PrevTicks);
}

这一次我写了详细的评论,所以结果应该很清楚

2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:53.233 bid = 0.0 ask = 0.0 last = 98560.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.968 bid = 0.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 0.0 last = 0.0 volume = 0 TICK_FLAG_BID
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 98560.0 last = 0.0 volume = 0 TICK_FLAG_BID
这个问题不仅出现在COPY_TICKS_ALL上,也出现在其他模式(LAST,INFO)上。
 
fxsaber:
专家顾问已经完成了新的历史刻度的编写,并发现了CopyTicks中的第九个错误。

这一次我写了详细的评论,所以结果应该很清楚

这个问题不仅影响到COPY_TICKS_ALL,而且还影响到其他模式(LAST、INFO)。

试图通过From == 0来增加刻度线。不起作用!- CopyTicks中的错误。

亲爱的开发者,我非常需要这个功能(增加一个新的历史数据)。暂时让它变得迟钝,但它会发挥作用。请在这里写下它的工作版本。

你将不得不在很长一段时间内修复CopyTicks的bug,而不是一个构建。其他人如何使用CopyTicks - 我不明白。显然,他们根本不使用它们。他们缺乏想象力。

 

你会清楚地说明你认为的错误到底是什么。

 
Renat Fatkhullin:

你会清楚地说明你认为的错误到底是什么。

用代码非常清楚地回应了。向服务台 创建了一个申请,在那里我写出了更多的细节。
 
fxsaber:
通过代码非常清楚地回答了这个问题。我已经向服务台提出了请求,在那里我详细描述了一切。

错误在于,在新获得的tick数组中,第一个条目包含零的bid、ask或last,而在之前的数组中,数组末端的相同tick不包含零,而是包含当时的bid、ask和last的值。

CopyTicks中的这个错误在构建发布后得到了修复。现在,调用CopyTicks后的初始ticks条目将不包含零,而是包含要求的时间点上的bid、ask和last的当前值。

不幸的是,这些修正没有包括在当前的构建中。

 
Slawa:

错误在于,在新获得的tick数组中,第一个条目包含零的买入、卖出或最后一个值,而在之前的数组中,数组末尾的相同tick不包含零,而是包含买入、卖出和最后一个的当前值。

CopyTicks的这个错误在发布后已经被修复。现在,调用CopyTicks后的初始ticks记录将不包含零,而包含请求时间的bid、ask和last的当前值。

我不理解你。你是说,你有自己的内部历史存储格式。而CopyTicks在每次请求时都会抽取一块,并生成自己的MqlTick 序列?同样的标志是由CopyTicks计算的,而它们并没有存储在历史中?一些垫子,也可以计算一些东西,而不仅仅是将其转换为用户友好的格式。

我不需要CopyTicks来填补那里的东西,取决于请求的时间。我只想得到没有任何歪曲的历史。并在没有任何问题的情况下添加它。

不幸的是,目前的版本中没有修复。

请在你的服务器上发布测试版。我肯定会发现更多不一致的地方。让我们来舔舔这个CopyTicks,这样它终于可以被信任了

 
fxsaber:
专家顾问完成了新的历史刻度,并确定了第N个CopyTicks错误。
如果你只需要色带(COPY_TICKS_TRADE - time_msc, last, volume and flags),那么这个解决方案是完全合适的 - 没有发现任何错误。