あらゆる取引のテーブル。MQL5経由でのアクセス - ページ 4

 
prostotrader:

深く考えず、深いところから「付け焼き刃」で見ているのです。

なぜ考えるのか?

インジケーターを動かして、ご自分の目で確かめてください。

そして、書かれていることをちゃんと読んでいるのか?

私はそれを読んだが、今貿易は閉じている、私はそれを起動すると、私は(私のスクリプト上で)どの方向にティックがダウンロードされていることを再度確認します。
 
Karputov Vladimir:
読ませていただきましたが、現在入札は終了しています、どの方向にティックがダウンロードされるのかもう一度確認してみます(私のスクリプト上)。

スクリプトで 確認するのではなく、RTS-9.16のチャブで、モスクワ時間の-8-9時にインジケータを 実行する必要があります(確認するため)。

また、刻みは常に 深さ方向にコピーされるわけではなく、新しいブロックの最初の刻みが前のブロックの時刻と一緒である場合のみです。

新しい ティック(ブロック)を待つ必要があり、ポストファクタムをコピーすることはできません。

スクリプトを実行すれば、履歴から コピーしているので、問題ありません。

新しいブロックを「待つ」のではなく

 
prostotrader:

スクリプトではなく、モスクワ時間の午後8時〜9時にRTS-9.16チャブでインジケータを実行する必要があります。

また、刻みは常に 深さ方向にコピーされるわけではなく、新しいブロックの最初の刻みが前のブロックの時刻と一緒の場合のみコピーされます。

ポストファクタムをコピーするのではなく、 新しい ティック(ブロック)を 期待 する必要があります。

直近の20~30ティックを出力するインジケータがあるのですが。受信した全てのティックが異常な時間を持つティックの履歴にあるかどうかを確認する、というチェックを追加すればいいと思います。
 
Karputov Vladimir:
私はインジケータを持っていて、それは最後の20-30ティックを出力します。受信した全てのティックが異常な時間を持つティックの履歴にあるかどうかを確認する、というチェックを追加すればいいと思います。

古いダニかどうか分からないので、チェックを「ボルトオン」にすることはできないでしょう(私の場合はうまくいきませんでした)。

チェックの基準は何ですか?これは、インジケーターとテープを並べると、「目」で見るしかありません

しかし、あなたは長い間待たなければならない(私が言ったように、たった一つの基準で深くコピーされた)。

この欠陥は、2つの条件下でのみ現れることを忘れないでください。

1.新しいティック(ブロック)を「待つ」。

2.新しいブロックでは、最初のティックが前のブロックの前のティック(複数可)の時間を持っている場合にのみ、それは、深さで "上乗せ "されます。

 
prostotrader:

古いダニかどうか分からないので、チェックを「ボルトオン」にすることはできないでしょう(私の場合はうまくいきませんでした)。

チェックの基準は何ですか?これは、インジケーターとテープを並べると、「目」で見るしかありません

しかし、あなたは長い間待たなければならない(私が言ったように、たった一つの基準で深くコピーされた)。

この欠陥は、2つの条件下でのみ現れることを忘れないでください。

1.新しいティック(ブロック)を「待つ」。

2.新しいブロックでは、最初のティックが前のブロックの前のティック(複数可)の時間を持っている場合にのみ、それは、深さで "上乗せ "されます。

不要なものを切り捨てる - インジケーターの計算とレンダリング。ティックの配列の取得と確認のみを残す。エラーを探すには(誰のものであっても)、できるだけコードを単純化する必要があります。
 
Karputov Vladimir:
不要なものを切り捨てる-指標の計算と作図。tick配列の取得とチェックのみ残す。エラーを探すには(誰のものであっても)、できるだけコードを単純化する必要があります。

私のコードにエラーがあった場合、必ず表示されるようになりました。

しかし、このままでは、インジケータは正しく動作します(表のデータで何度も確認しました)。

これは、中流商品でインジケータを作動させると、はっきりとわかる。

そして、「二本松で道に迷う」ことはほとんどありません(このコードには、カットできる行が1つもありません:( ))。

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0);
         if(copied>0)
           {
            for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;
}
 
prostotrader:

私のコードにエラーがあった場合、必ず表示されるようになりました。

しかし、このままでは、インジケータは正しく動作します(表のデータで何度も確認しました)。

これは、中流商品でインジケータを作動させると、はっきりとわかる。

そして、「二本松で道に迷う」ことはほとんどありません(このコードには、カットできる行が1つもありません :() )。

start_timeで以前に読み込んだtickを考慮する必要があり、そうしないとtickの重複が発生します。

これは、私のティック履歴 処理のクラスから引っ張ってきた、最後のティックを返す関数の例ですが、私は、すべてがコードから明らかになると思います。

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);
}
 

ティックリクエストモード-最後の「ティック」-すなわち時間は「0」です。

   int copied=CopyTicks(_Symbol,tick_array,type,0,ticks);

1つのインジケータ(左のグラフ)はOnCalculate()でCopyTicks()を要求し、2つ目のインジケータ(右のグラフ)はOnBookEvent()でCopyTicks()を要求しています。

そして、この写真です。

?

ティックの表示方法は、インデックス「0」の要素がチャートの一番下にあり、インデックス「0」の要素のティックタイムが最も古いというものです。インデックス "29 "のエレメントは、最も若いティックタイムを持つ。少なくともこの図では、2つの矛盾を発見しました。

項目インデックスダニ時間備考



231472205757952エラー: 1472205757952 < 1472205757959
221472205757959その通り:1472205757959 !< 1472205757432
211472205757432
ファイル:
 
Yury Kulikov:
start_timeに以前読み込んだtickを考慮する必要があり、そうでない場合はtickの重複が発生します。

この関数は、私のティック履歴 処理クラスから引っ張ってきたものですが、コードを見れば一目瞭然だと思います。

以下は、私のコードにおける重複防止策です。

if(start_time==ulong(ticks[copied-1].time_msc)) return;
 

COPY_TICKS_ALLをCOPY_TICKS_TRADEに修正し、正常に動作しているようです。

2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Pred tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 0 time = 2016.08.26 10:42:15.576
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 1 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 0 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 1 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 2 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 3 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 4 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 5 time = 2016.08.26 10:42:17.235

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,start_time,0);
         if(copied>0)
           {
             int a_size = ArraySize(prev_ticks);
             if (a_size>0)
             {
               if (prev_ticks[a_size-1].time_msc == ticks[0].time_msc)
               {
                 Print("Pred tiks");
                 for(int i=0; i<a_size; i++)
                 {
                   
                   Print("Prev ticks, element ", i, " time = ", ConvTimeMscToStr( prev_ticks[i].time_msc ) );
                 }
                  Print("Curr tiks");
                 for(int i=0; i<copied; i++)
                 {
                  
                   Print("Curr ticks, element ", i, " time = ", ConvTimeMscToStr(ticks[i].time_msc ));
                 }
               }
               else
               {
                 ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }   
               }
             }
             else
             {
               ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }
             }
           
           /* for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }*/
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;

が、チェックし続けます。:)

テープを静的に見ることができないので、クリアランスを待ちます。

理由: