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

 
Vladimir Mikhailov:

ダニ解析による実験を少しまとめてみました。

1. OnTick ハンドラで相当数のティックをスキップしている。
したがって、受信ティックを通してディールのストリップを分析しようと思ったら、それは意味がないのです。
この方法では、テスターでのアルゴリズムの結果と実際の取引結果が異なることになります。

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

はい、Expert Advisorはティックを見逃すことがあります。したがって、インジケータかCopyTicksのどちらかである。

そして、何による性能劣化なのか?必要なセグメント(最後にデータ検索に成功した後に現れたもの)だけをコピーする。

 
Andrey Khatimlianskii:

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

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

アンドリュー、トピックのタイトルを 読む

追加

CopyTicks()で正しい深さにするのは無理です!2000ティックしかありません。

 
prostotrader:

アンドレイ、トピックのタイトルを 読む

もともとタスクの設定が間違っているというのはどうなんでしょう?

リアルタイムでティックの分析が可能ですが、隙間ができないようにインジケーターやCopyTicksを使用する必要があります。


プロストトレーダー

CopyTicks()では必要な深さが得られず、2000ティックしか得られないのです

そのような制限はありません。ドキュメントに ある例を参照してください。

Пример вывода
Si-12.16: received 11048387  ticks in 4937 ms
Last tick time = 2016.09.26 18:32:59.775 
First tick time = 2015.06.18 09:45:01.000 
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 
Andrey Khatimlianskii:

もともとタスクの設定が間違っているというのはどうなんでしょう?

リアルタイムのティック分析も可能ですが、インジケーターやCopyTicksを使用して、抜けがないようにする必要があります。


そのような制限はありません。ドキュメントに ある例を参照してください。

1.必ずしも指標にはならない!

というヘルプのことであれば

Expert Advisorやスクリプトでは、CopyTicks()関数は最大45秒まで待つことができます...。

最後まで読むと、こう書いてあります。

出力速度:端末は各文字ごとに4096個の最後のティックをキャッシュに保存し、素早くアクセスできます(スタックが動作している 文字の場合は65536個のティック)、このデータに対するクエリーは最速 です。

OnBookEvent()イベントは、ティックの新しいパックが端末に到着したときに発生するため

Expert Advisorからティックを収集することが可能です。一例を挙げて確認してみましょう。

//+------------------------------------------------------------------+
//|                                                   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());
   
  }
void PrintResult(const int cnt)
{
  if(cnt > 0)
  {
    for(int i= 0; i<cnt; 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);
    }
  }
}  
//+------------------------------------------------------------------+
//| 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)
       {
         PrintResult(result);
         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:");
          PrintResult(result);
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+


2.このような制限がありますので、ご自身でご確認ください(CopyTicksRange() には制限はありません)。


 
prostotrader:

1.必ずしも指標にはならない!

OnBookEvent()イベントは、ティックの新しいパッケージがターミナルに到着したときに発生するため

Expert Advisorからティックを収集することが可能です。一例を挙げて、確認してみましょう。

OnBookEventは、ティックが外れないことを保証するものではありません。そこに重い計算があると、OnTickと同じようにスキップが発生します。

また、CopyTicksを介して必要な深さのティックをどこからコピーするかは問題ではありません。


プロストトレーダー

2.このような制限がありますので、ご自身でご確認ください。

パラメータ0, 0に対してだけ存在し、ヘルプに明示されています。

Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000.
 
Andrey Khatimlianskii:

OnBookEventは、ティックが外れないことを保証するものではない。

繰り返す

OnBookEvent()はまさに、新しいティックのバッチが 到着したことを保証してくれるのです!

参考文献より

発行率 です。 端末は1文字あたり4096ティック(スタックが 動作している文字では65536ティック)分の最後のデータをクイックアクセスキャッシュに格納、このデータに対するクエリーが最も高速 になる

引用終わり------。

OnBookEventがトリガーされなかったら、MT5での取引(為替)はすべてゴミ箱に捨てられてしまうかもしれませんね。

新しいティックのパックが到着 - 100%でOnBookEventがトリガーされ、CopyTicks()でティックの到着数が表示されます。

キャッシュに保存されているデータで、最速の アクセスです

そのため、ティックのコレクターはインジケーターやEAにリアルタイムで実装することができます(相場が動いている時)。

によって追加されました。

上のコードを持って行って、それをチェックして、議論するよりも...

 

ティックコレクタのコードは正しいのですが、いくつかの実装ミスがあります。

を、後で投稿してください。

追加

Expert Advisorからリアルタイムで全ティック収集

をご利用ください。

//+------------------------------------------------------------------+
//|                                                   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_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    last_time = ulong(ticks[0].time_msc);
    is_first = true;
  }
  else
  {
    is_first = false;
    Alert("No start time!");
    return(INIT_FAILED);
  }   
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
//void OnTick()
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    if(is_first == true)
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        Print("First packet of ticks:");
        t_cnt = 0;
        for(int i= 0; i<result; i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
          Print(GetTickDescription(ticks[i]));
        }
        is_first = false;
        last_time = ulong(ticks[0].time_msc);
      } 
    }
    else
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        if(result > t_cnt)
        {
          mem_cnt = t_cnt;
          t_cnt = 0;
          for(int i= 0; i<(result - int(mem_cnt)); i++)
          {
            if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
            Print(GetTickDescription(ticks[i]));
          } 
          if(last_time == ulong(ticks[0].time_msc))
          {
            t_cnt += int(mem_cnt);
          }
          else last_time = ulong(ticks[0].time_msc + 1);
        }
        else
        {
          t_cnt = 0;
          last_time++;
        }
      }
      else
      {
        t_cnt = 0;
        last_time++;
      }
    }
  }
}
//+------------------------------------------------------------------+
 

ティックコレクターの動作を 比較するために、ある時点でそこから全取引のリボンを作ることができます

(COPY_TICKS_ALLをCOPY_TICKS_TRADEに2箇所置き換えて)トレードのリボンとの比較をしてみてください。

を楽器ガラスに埋め込んだ。

流動性の高い商品の場合、印刷に時間がかかることがあります。

 
prostotrader:
 if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) {Print("Tick is ", "TICK_FLAG_ASK", " Tick time: ", ticks[i].time, ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) {Print("Tick is ", "TICK_FLAG_BID", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) {Print("Tick is ", "TICK_FLAG_BUY", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) {Print("Tick is ", "TICK_FLAG_LAST", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) {Print("Tick is ", "TICK_FLAG_SELL", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) {Print("Tick is ", "TICK_FLAG_VOLUME", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else

ダニは一度に複数のフラグを持つことはできないのですか?

 
prostotrader:

繰り返し

OnBookEvent()は、まさに 新しいティックのバッチが 到着したことを保証 するものなのです


しかし、だからといって、すべてのOnBookEventイベントを処理する保証はあるのでしょうか?