CopyTicks」のテスト - ページ 17

 
fxsaber:
ティックバーボリュームは 初歩的なことなのでしょうか?取引所では原則的に何の意味もない指標。意識して使うことはできない。ゴミのようなものです。

まあ実際、証券取引所のティックボリュームはフリッパーの数なんですけどね。つまり、実際の取引数です。

 
Slawa:

まあ実際、証券取引所のティックボリュームはフリッパーの数なんですけどね。つまり、実際の取引数です。

そのため、前回と全く同じ取引が来てもバーは変わりません。
 
fxsaber:
そのため、前回と全く同じ取引が来てもバーは変わりません。
ティックとリアルボリュームの変化
 
Expert Advisorが新鮮な履歴ティックを書き込み、CopyTicksのN-thirdバグを明らかにする。
#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:
Expert Advisor は新しい履歴ティックの書き込みを完了し、CopyTicks の 9 番目のバグを発見しました。

今回は、詳細なコメントを書きましたので、結果は明らかでしょう

この問題は、COPY_TICKS_ALLだけでなく、他のモード(LAST, INFO)にも影響します。

From == 0 を介して目盛りを追加しようとしました。効かない!?- CopyTicksのバグ。

開発者の皆様、私はこの機能(新しい履歴データを追加する)をとても必要としています。とりあえず知恵遅れにしておけば、きっとうまく いく。動作確認済みバージョンをご記入ください。

CopyTicksのバグを長い間修正しなければならず、1つのビルドでは済まないでしょう。他の人がどのようにCopyTicksを使うのか - 私には理解できません。どうやら、まったく使っていないようです。想像力が足りないのです。

 

具体的に何をもってバグと判断しているのかを明記するのでしょう。

 
Renat Fatkhullin:

具体的に何をもってバグと判断しているのかを明記するのでしょう。

コードで非常にわかりやすく回答してくれた。サービスデスクに申請 書を作成し、さらに詳細を書き出した。
 
fxsaber:
この質問に対して、コードで非常に分かりやすく回答しています。サービスデスクに依頼 し、詳細を説明しました。

このエラーは、新しく取得したティック配列の最初のエントリが、bid、ask、またはlastのゼロを含むという事実に起因します。一方、以前の配列では、配列の末尾の同じティックはゼロを含まず、bid、ask、lastの現在の値を含む

CopyTicksのこのエラーは、ビルドのリリース後に修正されました。これで、CopyTicksの呼び出し後の最初のティックエントリには、ゼロではなく、要求された時点のbid、ask、lastの現在値が含まれるようになります。

残念ながら、この修正は現在のビルドには含まれていません。

 
Slawa:

このエラーは、新しく取得したティック配列の最初のエントリが、ビッド、アスク、またはラストのゼロ値を含んでいるのに対し、以前の配列では、配列の末尾の同じティックがゼロを含まず、ビッド、アスク、ラストの現在の値を含んでいるという事実で構成されています。

CopyTicksのこのバグは、ビルドがリリースされた後、すでに修正されています。これで、CopyTicksの呼び出し後の最初のticksの記録には、ゼロではなく、要求された時刻のbid、ask、lastの現在値が含まれるようになります。

私はあなたを理解していません。履歴を保存する独自の内部フォーマットを持っているということですね。そしてCopyTicksはリクエストごとにその一部を取り出し、独自のシーケンスであるMqlTickを 生成する?CopyTicksでも同じフラグが計算されますが、履歴には残らないのでしょうか?使いやすい形式に変換するだけでなく、計算もできるパッドもあります。

CopyTicksがなくても、リクエストの時間によって、そこに何かが満たされるんです。歪みのない歴史を知りたいんです。そして、問題なく追加してください。

残念ながら、現在のビルドでは修正されていません。

ベータ版ビルドをサーバーで公開してください。もっと矛盾を見つけることができると思います。このCopyTicksを舐めて、やっと信用できるようにしよう!」と。

 
fxsaber:
Expert Advisor は新しい履歴ティックを完了し、N 番目の CopyTicks バグを特定します。
リボン(COPY_TICKS_TRADE - time_msc、last、volume、flags)のみが必要な場合、このソリューションが完全に適しています(バグなし)。