リアルタイムで見るTiki - ページ 3

 
Aleksey Mavrin:

正直、ECNについてこのリンクで何を読んでほしいのか、特に今まで知られていなかったことが理解できなかった)

私が?何かを求めていたのは、あなただったんですね。)))

外国為替市場と取引所の違いを理解されていないので、リンクを貼っておきました。

為替欄はFXでポイ捨てしないでください。

 
Sergey Chalyshev:

そうしたかったのだろうか?何かを求めていたのは、あなただったんですね。)))

FXとExchangeの違いが分からないからリンクを貼ったんだよ。

為替欄はFXでポイ捨てしないでください。

でも、それは無理な話なので、今あるもので満足するしかないんです。

そして、あなたも何かを理解していないかもしれない、そう思ったことはありませんか?例えば、あなたがリンクを貼った理由)

そしてもうひとつ、そもそも私はFXに言及した人間ではなく、すでに始まっている議論に踏み込んでいるのです。まず第一に。

B 2 - 為替のセクションで、異なる市場と株式市場を比較する議論を誰かが禁じたのでしょうか?

そして、3「スキーヤー対スノーボーダーのような句読点はやめましょう、それとも反対ですか?

 

チック分析に関する実験を交えた小さなまとめ。

1. OnTick ハンドラで相当数のティックをスキップしている。
ですから、入ってくるティックを通して取引の帯を分析したいのであれば、意味がありません。
この方法では、テスターでのアルゴリズムの結果と実際の取引結果が異なることになります。

別の方法として、CopyTicks() または CopyTicksRange() 関数を使用して履歴のティックを取得することにより、選択した期間または一定量の最後のディールのストリップを分析することが可能です。
この場合、テスターでアルゴリズムをテストした結果と実際の取引結果は同じになります。
デメリットは、アルゴリズムの性能が低いことです。

2.OnBookEventのイベント数は、過去のティックの数よりもはるかに多くなっていますが、これはティックに加えてこのイベントがティックの変化を処理するためであり、理解できることです。
そのため、このイベントを使えば、すべての受信ティックを分析できるように思えるかもしれません。
しかし、これはすべてのトレードがティックを通過するわけではありません。
成行注文はスライダーを通過しない場合がありますが、取引フィードに反映されます。
これは、マーケットスライダーが実際には注文の帳簿であり、必要な条件が満たされれば実行されるのを待っているからである。

例:ある取引がOnEventBookハンドラを経由しなかった(これは5ティックにも及ぶ)。

MT5

この場合も、最初のバリエーションと同様、ヒストリカル・ティックの分析が解決策となる。
このソリューションのマイナスは、テスターでのテストが不可能なことです。テスターの刻みの変化のイベントは発生しない。

3.tickフラグの8ビットが未記載なのは、答えが出なかった。別のフォーラムのスレッドで同じ質問をしました。

トレードのフィードを分析する方法は、すでに決めています。生産性は落ちますが、歴史を通じてです。
これによって、テスターでアルゴリズムをテストするときに、信頼できる結果を得ることができるようになりました。

皆さん、アイデアやディスカッションをありがとうございました。

 
Vladimir Mikhailov:

チック分析に関する実験を交えた小さなまとめ。

1.OnTickハンドラで相当数のtickをスキップしている。
ですから、入ってくるティックを通して取引の帯を分析したいのであれば、意味がありません。
この方法では、テスターでのアルゴリズムの結果と実際の取引結果が異なることになります。

別の方法として、CopyTicks() または CopyTicksRange() 関数を使用して履歴のティックを取得することにより、選択した期間または一定量の最後のディールのストリップを分析することができます。
この場合、テスターでアルゴリズムをテストした結果と実際の取引結果は同じになります。
デメリットは、アルゴリズムの性能が低いことです。

2.OnBookEventのイベントには意味がある......。
しかし、これは真実ではなく、すべての案件が本を通過するわけではありません。

例-ある取引がOnEventBookハンドラを経由しなかった(しかも5ティックも)。

3.tickフラグの8ビットが未記載なのは、答えが出なかった。別のフォーラムのスレッドで同じ質問をしました。


2.tick builderのコードを投稿してください(何か間違っているのでは)。

3.プリンターで、EnumToString(flags)を実行します。

 
prostotrader:

2.ティックビルダーコードを投稿する(何か間違っているのでは?)

3.プリンタでEnumToString(flags)を実行する。

コードはいつもの、最小限のものです。OnBookEventは最後の既知のtickを取得し、それを表示 する。

//+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
MqlTick tick[1];
int counter=0;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MarketBookAdd(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string&  symbol)
  {
   CopyTicks(_Symbol,tick,COPY_TICKS_ALL,0,1);
   counter++;
   if((tick[0].flags&TICK_FLAG_BID)==TICK_FLAG_BID || (tick[0].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      {
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, DoubleToString(tick[0].ask,_Digits), DoubleToString(tick[0].bid,_Digits));
      }
   else if((tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY || (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      {
       type=(tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY? "Buy": (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL? "Sell": "";
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, tick[0].volume_real, type, DoubleToString(tick[0].last,_Digits));
      }  
  }
//+------------------------------------------------------------------+

3点目ですが、ティックフラグは列挙型ではないので、EnumToString関数は適用できません。

 
Vladimir Mikhailov:

コードはいつもの、最小限のものです。OnBookEventイベントは、最後の既知のティックを取得し、それをプリントアウトします。

3点目ですが、ティックフラグは列挙型ではないので、EnumToString関数は適用できません。

1ティックをコピーして、スキップがない ようにしたい :)

OnBookEvent()はtickに何らかの変化があった場合に発生しますが、ある時点では

は、いくつかのダニがいる可能性があります。端末は1つのティックではなく、ティックのPACKAGEを受け取ります。

私が推奨するインジケーター(Tape of all deals)には、説明文があります。

ロシア語でダラダラしてないで読めよ。

 
prostotrader:

1ティックをコピーして、スキップしない ようにする :)

OnBookEvent()は、グラスに何らかの変化があった場合に起動されますが、ある時点から

は、いくつかの刻みがあることがあります。端末は1つのティックではなく、ティックのPACKAGEを受け取ります。

私が推奨するインジケーター(Tape of all deals)には、説明文があります。

ロシア語で読むのを怠ってはいけない。

複数のティックを見るのは、歴史の逆転現象です。

 
Vladimir Mikhailov:

複数のティックを見ることは、歴史へのアピールにもなります。

端末の仕組みを全く理解していない。

インジケーターの コメントを読む!!!

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
    }  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
       int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
       if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         last_time = ticks[0].time_msc + 1;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.121 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.194 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:50.903 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.235 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.399 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:05.174 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST
2020.01.29 10:52:28.027 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST

追加

上記の例では、新しく到着したダニのパケットを すべて「捕獲」しているわけではありません

は、以前の時刻を持つ目盛りが含まれている場合があります。

コード「Ribbon of all trades」(コメント付き)をよく研究してください。

 

もし、インジケーターのコードを理解するのが難しい(もしくは怠け者)と感じるのであれば

すべてのティックをリアルタイムに収集 する簡単なコードを見る。

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          for(int i= 0; i<result; i++)
          {
            if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
            if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
            if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
            if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
            if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
            if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
            Print("Unknown flag is ", ticks[i].flags);
          }
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader:

すべてのティックをリアルタイムに収集 するための、よりシンプルなコードを参照してください。

どうせCopyTicksが使われるなら、なぜ「リアルタイム」で収集するのか?

好きなタイミングで、正しい深さに刻みをコピーすることができます。