int CTickHistory::LastTicks(MqlTick &_ticks[])
{
if(m_lasttick<=0) return(-1); //нет загруженной историиint n=CopyTicks(m_symbol,tk,COPY_TICKS_TRADE,m_lasttick,TICKHISTORY_MAX_TICKS);
if(n>m_lastcount)
{
n=ArrayResize(_ticks,n-m_lastcount);//размер массива под новые тики
ArrayCopy(_ticks,tk,0,m_lastcount,n);//копирование только новых тиков//определим количество всех тиков, приходящихся на последний момент времени,//необходимое для отсечки загруженных тиков при следующем вызовеif(m_lasttick!=_ticks[n-1].time_msc)
{
m_lasttick=_ticks[n-1].time_msc;
m_lastcount=1;
for(int i=n-2; i>=0; i--)
{
if(_ticks[i].time_msc<m_lasttick) break;
m_lastcount++;
}
}else m_lastcount+=n;
}else n=0;//нет новых тиковreturn(n);
}
2016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Pred tiks
2016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 0 time = 2016.08.2610:42:15.5762016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 1 time = 2016.08.2610:42:15.5952016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr tiks
2016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 0 time = 2016.08.2610:42:15.5952016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 1 time = 2016.08.2610:42:17.2252016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 2 time = 2016.08.2610:42:17.2252016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 3 time = 2016.08.2610:42:17.2252016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 4 time = 2016.08.2610:42:17.2252016.08.2610:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 5 time = 2016.08.2610:42:17.235
深く考えず、深いところから「付け焼き刃」で見ているのです。
なぜ考えるのか?
インジケーターを動かして、ご自分の目で確かめてください。
そして、書かれていることをちゃんと読んでいるのか?
読ませていただきましたが、現在入札は終了しています、どの方向にティックがダウンロードされるのかもう一度確認してみます(私のスクリプト上)。
スクリプトで 確認するのではなく、RTS-9.16のチャブで、モスクワ時間の-8-9時にインジケータを 実行する必要があります(確認するため)。
また、刻みは常に 深さ方向にコピーされるわけではなく、新しいブロックの最初の刻みが前のブロックの時刻と一緒である場合のみです。
新しい ティック(ブロック)を待つ必要があり、ポストファクタムをコピーすることはできません。
スクリプトを実行すれば、履歴から コピーしているので、問題ありません。
新しいブロックを「待つ」のではなく
スクリプトではなく、モスクワ時間の午後8時〜9時にRTS-9.16チャブでインジケータを実行する必要があります。
また、刻みは常に 深さ方向にコピーされるわけではなく、新しいブロックの最初の刻みが前のブロックの時刻と一緒の場合のみコピーされます。
ポストファクタムをコピーするのではなく、 新しい ティック(ブロック)を 期待 する必要があります。
私はインジケータを持っていて、それは最後の20-30ティックを出力します。受信した全てのティックが異常な時間を持つティックの履歴にあるかどうかを確認する、というチェックを追加すればいいと思います。
古いダニかどうか分からないので、チェックを「ボルトオン」にすることはできないでしょう(私の場合はうまくいきませんでした)。
チェックの基準は何ですか?これは、インジケーターとテープを並べると、「目」で見るしかありません
しかし、あなたは長い間待たなければならない(私が言ったように、たった一つの基準で深くコピーされた)。
この欠陥は、2つの条件下でのみ現れることを忘れないでください。
1.新しいティック(ブロック)を「待つ」。
2.新しいブロックでは、最初のティックが前のブロックの前のティック(複数可)の時間を持っている場合にのみ、それは、深さで "上乗せ "されます。
古いダニかどうか分からないので、チェックを「ボルトオン」にすることはできないでしょう(私の場合はうまくいきませんでした)。
チェックの基準は何ですか?これは、インジケーターとテープを並べると、「目」で見るしかありません
しかし、あなたは長い間待たなければならない(私が言ったように、たった一つの基準で深くコピーされた)。
この欠陥は、2つの条件下でのみ現れることを忘れないでください。
1.新しいティック(ブロック)を「待つ」。
2.新しいブロックでは、最初のティックが前のブロックの前のティック(複数可)の時間を持っている場合にのみ、それは、深さで "上乗せ "されます。
不要なものを切り捨てる-指標の計算と作図。tick配列の取得とチェックのみ残す。エラーを探すには(誰のものであっても)、できるだけコードを単純化する必要があります。
私のコードにエラーがあった場合、必ず表示されるようになりました。
しかし、このままでは、インジケータは正しく動作します(表のデータで何度も確認しました)。
これは、中流商品でインジケータを作動させると、はっきりとわかる。
そして、「二本松で道に迷う」ことはほとんどありません(このコードには、カットできる行が1つもありません:( ))。
私のコードにエラーがあった場合、必ず表示されるようになりました。
しかし、このままでは、インジケータは正しく動作します(表のデータで何度も確認しました)。
これは、中流商品でインジケータを作動させると、はっきりとわかる。
そして、「二本松で道に迷う」ことはほとんどありません(このコードには、カットできる行が1つもありません :() )。
これは、私のティック履歴 処理のクラスから引っ張ってきた、最後のティックを返す関数の例ですが、私は、すべてがコードから明らかになると思います。
ティックリクエストモード-最後の「ティック」-すなわち時間は「0」です。
1つのインジケータ(左のグラフ)はOnCalculate()でCopyTicks()を要求し、2つ目のインジケータ(右のグラフ)はOnBookEvent()でCopyTicks()を要求しています。
そして、この写真です。
ティックの表示方法は、インデックス「0」の要素がチャートの一番下にあり、インデックス「0」の要素のティックタイムが最も古いというものです。インデックス "29 "のエレメントは、最も若いティックタイムを持つ。少なくともこの図では、2つの矛盾を発見しました。
この関数は、私のティック履歴 処理クラスから引っ張ってきたものですが、コードを見れば一目瞭然だと思います。
以下は、私のコードにおける重複防止策です。
COPY_TICKS_ALLをCOPY_TICKS_TRADEに修正し、正常に動作しているようです。
が、チェックし続けます。:)
テープを静的に見ることができないので、クリアランスを待ちます。