long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова int GetFreshTicks( MqlTick &Ticks[], constuint flags = COPY_TICKS_INFO, constuint count = 2000 ) { int Res = 0;
if ((NewAmount > 0) && (Count < NewAmount)) { Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории LastTime = NewTicks[NewAmount - 1].time_msc; Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime for (int i = NewAmount - 2; i >= 0; i--) { if (NewTicks[i].time_msc < LastTime) break;
いいえ、残念ながら。レナートは、ガラスはマーケットウォッチ全体に恒久的に流されるものだと主張した。しかし、これはほとんどの場面で好都合な(無駄な)解決策ではありません。
それしかないでしょう。ストリーミングステークは、ティックのネイティブで切っても切れない流れです。
プラットフォームのすべてが相互接続され、グローバルなデータ同期が必要です。そして、そのために重要な役割を果たすのが、ティックストリームです。
これしかないでしょう。ストリーミングレートは、ティックのネイティブで切っても切れない流れです。
プラットフォームのすべてが相互接続され、グローバルなデータ同期が必要です。そして、そのために重要な役割を果たすのが、ティックストリームです。
では、BookEventを購読しているEAがいない場合はどうでしょうか?
パフォーマンスを向上させるために、MarketWatchをカットすることをお勧めしますか?
しかし、最も重要なことは、上記のサンプルレートの計算は無関係であるということです。あまりに不器用に作られているので(CopyTicksの時間以外を測って)、驚きさえ覚えます。
では、BookEventを購読しているEAがいない場合はどうでしょうか?
パフォーマンス向上のために、マーケットウォッチをカットすることをお勧めしますか?
お好みでカットしてください。
それがCopyTicksのテスト方法です。
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
ulong from =(TimeTradeServer()-1200)*1000;
ulong ticks =GetMicrosecondCount();
int records=CopyTicks(_Symbol,ExtArr,COPY_TICKS_INFO,from,2048);
ticks=GetMicrosecondCount()-ticks;
Print("Time: ",ticks," msc for ",records," records");
}
以下はマイクロ秒での出力です。過去20分間の2048個のINFOティックのサンプルあたり95マイクロ秒です。
もうこれで猫の目を 食った。CopyTicksでいろいろとテストしてみました。今回は、インジケーターを動かすだけで十分だと判断しました。
あなたのバリアント。
2016.10.18 14:29:11.966 Test14 (GBPUSD,M1) Time: 20263 msc for 2048 records
2016.10.18 14:29:10.841 Test14 (GBPUSD,M1) Time: 13190 msc for 2048 records
2016.10.18 14:29:07.788 Test14 (GBPUSD,M1) Time: 13344 msc for 2048 records
2016.10.18 14:29:07.738 Test14 (GBPUSD,M1) Time: 12751 msc for 2048 records
直近の4096クォートのクローズキャッシュに入ることです。
その中に入るものはマイクロ秒、それ以上のものは履歴(ディスクを含む)にアクセスする必要があります。
そのため、私の例では、ほとんど更新されないUSDCHFでは20分間のティックを取得し、キャッシュにありましたが、GBPUSDでは、すでに直近の4096ティックを超えており、遠くのデータベースに移動する必要がありました。
ulongを=(TimeTradeServer()-600)*1000から設定すると、GBPUSDでもフィットする。
直近の4096クォートのクローズキャッシュに入ることです。
その中に入るものはマイクロ秒、それ以上のものは履歴(ディスクを含む)にアクセスする必要があります。
あなたのデモでは、確かにそうなっています。BCSではそうではありません。
2016.10.18 15:12:32.949 Test14 (Si-12.16,M1) Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1) Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1) Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1) Time: 21926 msc for 1500 records
アルパリでは全然ダメですしね。
2016.10.18 15:14:47.159 Test14 (GBPUSD,M1) Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1) Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1) Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1) Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1) Time: 36227 msc for 1836 records
そのため、めったに更新されないUSDCHFのティックを20分間取得する私の例はキャッシュに収まりますが、GBPUSDの場合はすでに直近の4096ティックを超えているため、遠くのデータベースに移動することを余儀なくされています。
コピーティックスの不便さについて、上記でコメントしました。提示されたインジケータは、コピーイックスを何度も呼び出すことを余儀なくされるため、速度が低下しています。そして、すべてのラグはそのせいです。以下はその理由です。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
CopyTicks」のテスト
fxsaber さん 2016.10.11 19:23
timeからtimeまでの刻みを取得する最適な(最速の)アルゴリズムは何ですか?解決策を提案しました
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
CopyTicks」のテスト
fxsaber, 2016.10.12 08:44
非ゼロの場合 From inside CopyTicks は、開始する場所、つまり内部ベースのインデックスを探します(おそらくバイナリ検索)。
データベース内のインデックスを時間別に返す機能を追加してください。そうすると、このタスクは最適に解くことができるようになります
さて、日付間のティックをダウンロードするには、開始日を起点にUNKNOWN数分のリクエストをする必要があります。そして、終了日に達したかどうか、その都度チェックする。そして、各リクエストのコピーティックスは非常に高価であるという事実を考慮に入れて、あなたはそのようなブレーキを取得します。
そして、アルパリでは、まったくダメです
アルパリは修正されたようです。BCSはしていない。
先に要求されたコピーデータをキャッシュしておくとよいでしょう。また、コピーが数段階に分けて行われる場合(from[i]からfrom[i+ 1])、最初のリクエストの後に多くのキャッシュを行うのが論理的でしょう。
全体として、機能が内部でどのように配置されているかは不明です。しかし、100%とは言い難い仕事ぶりです。
int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_INFO, const uint count = 2000 )
{
int Res = 0;
MqlTick NewTicks[];
const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);
if ((NewAmount > 0) && (Count < NewAmount))
{
Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории
LastTime = NewTicks[NewAmount - 1].time_msc;
Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime
for (int i = NewAmount - 2; i >= 0; i--)
{
if (NewTicks[i].time_msc < LastTime)
break;
Count++;
}
}
return(Res);
}
#define TOSTRING(A) " " + #A + " = " + (string)(A)
void OnTick( void )
{
// возьмем тики с начала утренней сессии
LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
MqlTick Ticks[];
int i = 0;
int Sum = 0;
const ulong StartTime =GetMicrosecondCount();
// Взяли свеженькие тики
int Amount = GetFreshTicks(Ticks);
while (Amount > 0)
{
Sum += Amount;
i++;
Print(TOSTRING(i) + TOSTRING(Amount) + TOSTRING(Sum) + TOSTRING(GetMicrosecondCount() - StartTime));
// Взяли свеженькие тики
Amount = GetFreshTicks(Ticks);
}
}
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1) i = 39 Amount = 1999 Sum = 77961 GetMicrosecondCount()-StartTime = 584314
2016.10.18 16:06:18.729 Test15 (GBPUSD,M1) i = 38 Amount = 1999 Sum = 75962 GetMicrosecondCount()-StartTime = 568509
2016.10.18 16:06:18.714 Test15 (GBPUSD,M1) i = 37 Amount = 1999 Sum = 73963 GetMicrosecondCount()-StartTime = 552582
2016.10.18 16:06:18.696 Test15 (GBPUSD,M1) i = 36 Amount = 1999 Sum = 71964 GetMicrosecondCount()-StartTime = 536790
2016.10.18 16:06:18.681 Test15 (GBPUSD,M1) i = 35 Amount = 1999 Sum = 69965 GetMicrosecondCount()-StartTime = 520432
2016.10.18 16:06:18.666 Test15 (GBPUSD,M1) i = 34 Amount = 1999 Sum = 67966 GetMicrosecondCount()-StartTime = 504725
2016.10.18 16:06:18.649 Test15 (GBPUSD,M1) i = 33 Amount = 1999 Sum = 65967 GetMicrosecondCount()-StartTime = 488911
2016.10.18 16:06:18.634 Test15 (GBPUSD,M1) i = 32 Amount = 1999 Sum = 63968 GetMicrosecondCount()-StartTime = 473372
2016.10.18 16:06:18.619 Test15 (GBPUSD,M1) i = 31 Amount = 1999 Sum = 61969 GetMicrosecondCount()-StartTime = 458022
2016.10.18 16:06:18.604 Test15 (GBPUSD,M1) i = 30 Amount = 1999 Sum = 59970 GetMicrosecondCount()-StartTime = 442557
2016.10.18 16:06:18.589 Test15 (GBPUSD,M1) i = 29 Amount = 1999 Sum = 57971 GetMicrosecondCount()-StartTime = 427044
2016.10.18 16:06:18.571 Test15 (GBPUSD,M1) i = 28 Amount = 1999 Sum = 55972 GetMicrosecondCount()-StartTime = 411524
2016.10.18 16:06:18.556 Test15 (GBPUSD,M1) i = 27 Amount = 1999 Sum = 53973 GetMicrosecondCount()-StartTime = 396539
2016.10.18 16:06:18.541 Test15 (GBPUSD,M1) i = 26 Amount = 1999 Sum = 51974 GetMicrosecondCount()-StartTime = 381185
2016.10.18 16:06:18.526 Test15 (GBPUSD,M1) i = 25 Amount = 1999 Sum = 49975 GetMicrosecondCount()-StartTime = 366146
2016.10.18 16:06:18.511 Test15 (GBPUSD,M1) i = 24 Amount = 1999 Sum = 47976 GetMicrosecondCount()-StartTime = 351066
2016.10.18 16:06:18.496 Test15 (GBPUSD,M1) i = 23 Amount = 1999 Sum = 45977 GetMicrosecondCount()-StartTime = 336183
2016.10.18 16:06:18.481 Test15 (GBPUSD,M1) i = 22 Amount = 1999 Sum = 43978 GetMicrosecondCount()-StartTime = 321109
2016.10.18 16:06:18.466 Test15 (GBPUSD,M1) i = 21 Amount = 1999 Sum = 41979 GetMicrosecondCount()-StartTime = 306119
2016.10.18 16:06:18.449 Test15 (GBPUSD,M1) i = 20 Amount = 1999 Sum = 39980 GetMicrosecondCount()-StartTime = 288558
2016.10.18 16:06:18.434 Test15 (GBPUSD,M1) i = 19 Amount = 1999 Sum = 37981 GetMicrosecondCount()-StartTime = 273758
2016.10.18 16:06:18.419 Test15 (GBPUSD,M1) i = 18 Amount = 1999 Sum = 35982 GetMicrosecondCount()-StartTime = 259255
2016.10.18 16:06:18.406 Test15 (GBPUSD,M1) i = 17 Amount = 1999 Sum = 33983 GetMicrosecondCount()-StartTime = 244750
2016.10.18 16:06:18.391 Test15 (GBPUSD,M1) i = 16 Amount = 1999 Sum = 31984 GetMicrosecondCount()-StartTime = 230100
2016.10.18 16:06:18.371 Test15 (GBPUSD,M1) i = 15 Amount = 1999 Sum = 29985 GetMicrosecondCount()-StartTime = 216143
2016.10.18 16:06:18.361 Test15 (GBPUSD,M1) i = 14 Amount = 1999 Sum = 27986 GetMicrosecondCount()-StartTime = 201830
2016.10.18 16:06:18.346 Test15 (GBPUSD,M1) i = 13 Amount = 1999 Sum = 25987 GetMicrosecondCount()-StartTime = 186887
2016.10.18 16:06:18.331 Test15 (GBPUSD,M1) i = 12 Amount = 1999 Sum = 23988 GetMicrosecondCount()-StartTime = 172667
2016.10.18 16:06:18.311 Test15 (GBPUSD,M1) i = 11 Amount = 1999 Sum = 21989 GetMicrosecondCount()-StartTime = 158356
2016.10.18 16:06:18.299 Test15 (GBPUSD,M1) i = 10 Amount = 1999 Sum = 19990 GetMicrosecondCount()-StartTime = 143450
2016.10.18 16:06:18.289 Test15 (GBPUSD,M1) i = 9 Amount = 1999 Sum = 17991 GetMicrosecondCount()-StartTime = 128520
2016.10.18 16:06:18.269 Test15 (GBPUSD,M1) i = 8 Amount = 1999 Sum = 15992 GetMicrosecondCount()-StartTime = 114209
2016.10.18 16:06:18.256 Test15 (GBPUSD,M1) i = 7 Amount = 1999 Sum = 13993 GetMicrosecondCount()-StartTime = 100016
2016.10.18 16:06:18.246 Test15 (GBPUSD,M1) i = 6 Amount = 1999 Sum = 11994 GetMicrosecondCount()-StartTime = 85745
2016.10.18 16:06:18.231 Test15 (GBPUSD,M1) i = 5 Amount = 1999 Sum = 9995 GetMicrosecondCount()-StartTime = 71438
2016.10.18 16:06:18.219 Test15 (GBPUSD,M1) i = 4 Amount = 1999 Sum = 7996 GetMicrosecondCount()-StartTime = 57293
2016.10.18 16:06:18.204 Test15 (GBPUSD,M1) i = 3 Amount = 1999 Sum = 5997 GetMicrosecondCount()-StartTime = 43192
2016.10.18 16:06:18.181 Test15 (GBPUSD,M1) i = 2 Amount = 1999 Sum = 3998 GetMicrosecondCount()-StartTime = 28943
2016.10.18 16:06:18.171 Test15 (GBPUSD,M1) i = 1 Amount = 1999 Sum = 1999 GetMicrosecondCount()-StartTime = 15160
0.5秒で80Kティックって遅くない?一度に2000ティックではなく、それ以上を要求する必要があったと言うことですが、もちろん可能です。では、どのようなリクエスト値が最適なのでしょうか?
自分にとって必要なものを一度ディープダウンして、あとは近くのキャッシュからマイクロ秒単位で新しいものだけをダウンロードするのが最適です。
毎回ディスクに落ちながらディープクエリを作るのであれば、もちろん自分の責任です。