CopyTicks」のテスト - ページ 40

 
Copytixは既存のティックを取り出せない
struct MQLTICK
{
  uchar Data[sizeof(MqlTick)];
};

union UNION
{
  MQLTICK Tick1;
  MqlTick Tick2;  
  
  UNION()
  {
    ArrayInitialize(this.Tick1.Data, 1);
  }
};

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

void OnStart()
{  
  const string Name = "A1234";

  if (CustomSymbolCreate(Name) || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
  {    
    UNION Union;
    
    MqlTick Ticks[] = {{0}};
    Ticks[0] = Union.Tick2;
    
    Ticks[0].time = TimeCurrent();
    Ticks[0].time_msc = Ticks[0].time * 1000;
    
    Print(TOSTRING(CustomTicksReplace(Name, Ticks[0].time_msc, Ticks[0].time_msc, Ticks))); // Тик записали без проблем
    
    MqlTick Ticks2[];
    
    SymbolSelect(Name, true);            
    
    // Прочесть тик не можем
    Print(TOSTRING(CopyTicksRange(Name, Ticks2)));
    Print(TOSTRING(CopyTicks(Name, Ticks2)));
    
    SymbolSelect(Name, false);            
    CustomSymbolDelete(Name);    
  }
}

結果

CustomTicksReplace(Name,Ticks[0].time_msc,Ticks[0].time_msc,Ticks) = 1
CopyTicksRange(Name,Ticks2) = 0
CopyTicks(Name,Ticks2) = 0
 

Copytixは生データを変更する

struct MQLTICK
{
  uchar Data[sizeof(MqlTick)];
};

union UNION
{
  MQLTICK Tick1;
  MqlTick Tick2;  
  
  UNION()
  {
    ArrayInitialize(this.Tick1.Data, 1);
  }
};

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

void OnStart()
{  
  const string Name = "A1234";

  if (CustomSymbolCreate(Name) || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
  {    
    UNION Union;
    
    MqlTick Ticks[] = {{0}};
    Ticks[0] = Union.Tick2;
    
    Ticks[0].time = 0;
    Ticks[0].time_msc = 0;

    Print(TOSTRING(Ticks[0].ask));
    
    Print(TOSTRING(CustomTicksReplace(Name, Ticks[0].time_msc, Ticks[0].time_msc, Ticks)));
    
    MqlTick Ticks2[];
    
    SymbolSelect(Name, true);            
    
    // Прочесть тик не можем
    Print(TOSTRING(CopyTicksRange(Name, Ticks2)));

    Print(TOSTRING(Ticks2[0].ask));
    
    SymbolSelect(Name, false);            
    CustomSymbolDelete(Name);    
  }
}


結果

Ticks[0].ask = 7.748604185489348 e-304
CustomTicksReplace(Name,Ticks[0].time_msc,Ticks[0].time_msc,Ticks) = 1
CopyTicksRange(Name,Ticks2) = 1
Ticks2[0].ask = 0.0
 

なぜ不要なチックが発生するのか?


スクリプトが過剰な刻みを出力する

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)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

struct MQLTICK : public MqlTick
{
  bool operator ==( const MqlTick &Tick ) const
  {
    return((!Tick.ask || (Tick.ask == this.ask)) &&
           (!Tick.bid || (Tick.bid == this.bid)));
  }
  
  void operator =( const MqlTick &Tick )
  {
    this.ask = Tick.ask ? Tick.ask : this.ask;
    this.bid = Tick.bid ? Tick.bid : this.bid;
  }
};

void OnStart()
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 1 e4);

  MQLTICK Tick = {0};  
  
  for (int i = 0; i < Amount; i++)
    if (Tick == Ticks[i])
      Print(TickToString(Ticks[i]));
    else
      Tick = Ticks[i];
}


EURUSD Metaquotes-Demoでの結果。

 time = 2017.11.14 02:27:14.352 bid = 1.16679 ask = 1.16682 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 02:29:11.325 bid = 1.16685 ask = 1.16687 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:04:02.402 bid = 1.16715 ask = 1.16717 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:41:09.453 bid = 1.16707 ask = 1.1671 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:42:53.101 bid = 1.16718 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 04:51:22.072 bid = 1.16719 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 04:53:55.649 bid = 1.16714 ask = 1.16717 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 04:56:12.254 bid = 1.16713 ask = 1.16716 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 04:57:12.497 bid = 1.16713 ask = 1.16716 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 04:58:28.934 bid = 1.16719 ask = 1.16722 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:18:44.717 bid = 1.16728 ask = 1.16731 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:25:39.559 bid = 1.16725 ask = 1.16728 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:27:54.243 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 05:29:38.909 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:31:40.868 bid = 1.16719 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:38:29.393 bid = 1.16709 ask = 1.16712 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:39:29.429 bid = 1.16709 ask = 1.16712 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:47:36.539 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:19:44.287 bid = 1.16726 ask = 1.16729 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:21:11.941 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:22:22.686 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:23:11.019 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:23:24.926 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:24:22.060 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:24:26.871 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:25:26.704 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:25:27.401 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:42:16.087 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:44:00.557 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:44:36.362 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:45:00.577 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:51:36.472 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:52:37.091 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:53:38.025 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:56:11.389 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:03:22.022 bid = 1.16708 ask = 1.16711 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:08:35.305 bid = 1.16718 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:24:15.039 bid = 1.16755 ask = 1.16758 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:27:16.339 bid = 1.16751 ask = 1.16754 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:39:26.342 bid = 1.16739 ask = 1.16742 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 07:43:33.909 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:45:25.462 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:47:05.824 bid = 1.16741 ask = 1.16744 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 07:48:19.985 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:49:57.642 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:52:39.036 bid = 1.16738 ask = 1.16741 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 08:04:47.750 bid = 1.16739 ask = 1.16741 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 08:23:23.778 bid = 1.16705 ask = 1.16707 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 08:28:22.233 bid = 1.16706 ask = 1.16708 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 08:28:37.245 bid = 1.16706 ask = 1.16708 last = 0.0 volume = 0 TICK_FLAG_ASK
 

COPY_TICKS_ALLモードのCopitixは、Bid/Askフィールドがゼロで素人が記入したものです。

void OnStart()
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(_Symbol, Ticks);
  
  ArrayPrint(Ticks);
}
[1986] 2017.11.14 10:12:11 1.16873 1.16873 0.0000        0 1510654331879       6
[1987] 2017.11.14 10:12:12 1.16871 1.16873 0.0000        0 1510654332026       2
[1988] 2017.11.14 10:12:12 1.16871 1.16871 0.0000        0 1510654332947       4
[1989] 2017.11.14 10:12:16 1.16869 1.16870 0.0000        0 1510654336930       6
[1990] 2017.11.14 10:12:17 1.16867 1.16868 0.0000        0 1510654337028       6
[1991] 2017.11.14 10:12:20 1.16866 1.16868 0.0000        0 1510654340943       2
[1992] 2017.11.14 10:12:22 1.16868 1.16869 0.0000        0 1510654342728       6
[1993] 2017.11.14 10:12:22 1.16868 1.16870 0.0000        0 1510654342834       4
[1994] 2017.11.14 10:12:22 1.16868 1.16869 0.0000        0 1510654342954       4
[1995] 2017.11.14 10:12:23 1.16867 1.16869 0.0000        0 1510654343339       2
[1996] 2017.11.14 10:12:27 1.16867 1.16868 0.0000        0 1510654347042       4
[1997] 2017.11.14 10:12:31 1.16867 1.16869 0.0000        0 1510654351428       4
[1998] 2017.11.14 10:12:31 1.16868 1.16869 0.0000        0 1510654351832       2
[1999] 2017.11.14 10:12:31 1.16869 1.16871 0.0000        0 1510654351942       6


これは何のため?INFO-modeではこの動作は便利ですが、ALLでは生データの取得を待ち、GUIにのみ表示されます。



価格が変化していない場合は、nullとなる。このままでは、国旗が 不要な存在に見えてしまいます。null価格を表示する代わりに、このフラグでMqlTick-structureを増やしました。

tkcは(NULL価格なしで)旗だけを格納し、(旗なしで)価格だけを格納し、あるいはそこに旗と価格の両方を持つことは非合理的なのでしょうか?


また、なぜフラッグが導入されるのでしょうか?

  • TICK_FLAG_VOLUME – тик изменил объем

音量が変わったかどうかは全く関係ありません。それとも、私が何か勘違いしているのでしょうか?


ZS Raw ALLデータは、カスタム文字を通じたデータ交換経路の問題に直結するため、特にカスタム文字に必要です。

 
fxsaber:

COPY_TICKS_ALLモードのCopitixは、Bid/Askフィールドがゼロで素人が記入したものです。


何のために行うのか?INFO-modeではこの動作は便利ですが、ALL-modeでは生データを待ちますが、GUIにしか表示されないのです。



価格が変化していない場合は、NULLとなる。このままでは、国旗が 不要な存在に見えてしまいます。null価格を表示する代わりに、このフラグでMqlTick-structureを増やしました。

tkcは(NULL価格なしで)旗だけを格納し、(旗なしで)価格だけを格納し、あるいはそこに旗と価格の両方を持つことは非合理的なのでしょうか?


また、なぜフラッグが導入されるのでしょうか?

音量が変わったかどうかは全く関係ない。それとも、私が何か誤解しているのでしょうか?


SZY Raw ALLデータは、カスタム文字を介したデータ交換経路の問題に直接対処するため、特にカスタム文字に必要なデータです。


指摘された欠点について、サービデックに書いているのですか?

すべてが無駄になる気がします。


そして、なぜ旗なのか?

  • TICK_FLAG_VOLUME - 刻み目の変化量です。

これは非常に重要な指標だと思います。取引は実行され、変更されただけでなく、入札依頼を移動したことを他にどのように知ることができますか?

 
Sergey Chalyshev:

指摘された不備について、サービスデスクに手紙を出していますか?

SDは、すべてのリクエストに迅速に対応します。そこでさらに議論を重ねます。

これは非常に重要な指標だと思います。ビッドとアスクが変わっただけでなく、取引が成立したことを他にどうやって知ることができるのでしょうか?

フラッグだけで十分です。

  • TICK_FLAG_LAST - 刻み目によって最後の取引の価格が変更されました。
貿易が成立した」と変更することで前回の価格が変わった こと......誰も気にしていない。全く同じ価格と数量の案件が何件か連続している場合があります。したがって、フラグは1つだけであるべきです - 契約です。
 

TICK_FLAG_VOLUME - 刻み目の変化量

ヘルプに書いてあることを今までなんとなく考えていた。

何を変えたのか、そのボリュームは?

上に書いてあることはどういう意味なんだろう(笑)。

 
fxsaber:

SRは、すべてのリクエストに迅速に対応します。そこでさらに議論を重ねます。

必要なのは、フラッグだけです。

貿易が成立した」と変更することで価格が変わったことは、誰にも関係ないことです。全く同じ価格と数量の案件が何件か連続している場合があります。したがって、フラグは1つだけであるべきです。

レスポンシブであれば、それはそれでいいのです。

国旗については

また、Expert Advisorで状況を分析し、マッチングトレードを組み合わせることで、なんだか十分な気がしてきたのです。

この状況 - 交換時間、サーバー時間、コンピューター 時間が一致しない。MarketClosedで、最後の価格でも取引があれば、取引中ということになりますが、どうすればいいのでしょうか?

また、すべての取引を1つのレベルにまとめると、そのレベルが何時取引されたのかが分からなくなるのでは?

追伸:余分なフラグは、フラグの送信量に影響を与えません。

 
Sergey Chalyshev:

反応すれば、それはそれでいいのです。

フラッグについて

私も、状況分析用のEAで、偶然のトレードを組み合わせるという発想があったのですが、なんだか物足りないですね。

このような状況では、交換時間、サーバー時間、コンピューター時間が一致しません。MarketClosedで、最終価格でも取引があれば、取引中ということになりますが、どうすればいいのでしょうか?

また、1つのレベルですべての取引をまとめると、そのレベルがいつまで取引されていたのかがわからなくなるのでは?

なぜ1つのレベルで組み合わせるのか?私なら統合せず、リボンは今のまま、つまり交換で出てきたものをそのままにします。

追伸:不要なフラグは、フラグの送信量に影響を与えません。
MQは生データを返さないので、フラグは強制的に計測されます。CopyTicksの内部で修正するのです。
 

tkcファイルは月別に分かれています。このため質問

  1. ターミナルにまだティックデータがアップロードされていない場合、CopyTicks を呼び出すと、ターミナルはどの tkc ファイルをプルするのか知ることができますか?
  2. CopyTicksRangeはCopyTicksに基づいて実装されているのか、それとも独立して実装されているのか?
  3. 例えば、9月のティックを取得する場合、CopyTicksよりもCopyTicksRangeの方が常に高速になるという理解で合っていますか?CopyTicksは入力パラメータを通して、どの月のデータを取得すべきかを知らないからです。
  4. 一刻も早くインジケーターに履歴を残す必要があります。CopyTicksRangeで問い合わせると、すべてがダウンロードされるまで、-1としてバウンスを取得することが可能です。また、当月、前月と月別に依頼する場合は、当月、前月、前々月となります。遅くなることはありませんが、少なくともある程度の履歴がある状態でインジケータが動作するようになります。そうだろ?