Tüm işlemlerin tablosu. MQL5 üzerinden erişim - sayfa 4

 
prostotrader :

Derin olduğunu düşünmüyorum ama derinlikten "tuttuklarını" görüyorum.

Neden düşünüyorum?

Göstergeyi çalıştırın ve kendiniz görün!

Ve yazılanları da okuyor musun?

Okudum ama şimdi müzayedeler kapandı, başlayacaklar - Kenelerin hangi yöne indirildiğini tekrar kontrol edeceğim (senaryomda).
 
Karputov Vladimir :
Okudum ama şimdi müzayedeler kapandı, başlayacaklar - Kenelerin hangi yöne indirildiğini tekrar kontrol edeceğim (senaryomda).

Komut dosyasını kontrol etmeniz gerekmez, ancak göstergeyi RTS-9.16 saatinde Moskova saatiyle 20-9: 00'da çalıştırmanız gerekir (görmek için)

Ve onay işaretleri her zaman derinlemesine kopyalanmaz, ancak yalnızca yeni bloktaki ilk işaret önceki bloğun zamanıyla birlikteyse.

Yeni keneler (blok) beklemenin bir yolunun olması ve olaydan sonra kopyalama yapmaması gerekir.

Komut dosyanızı çalıştırırsanız, her şey yoluna girecek, çünkü geçmişten kopyalama olacak ve

yeni bloklar için " beklemek " değil.

 
prostotrader :

Komut dosyasını kontrol etmeniz gerekmez, ancak göstergeyi RTS-9.16 saatinde Moskova saatiyle 8-9 pm'de çalıştırmanız gerekir.

Ve onay işaretleri her zaman derinlemesine kopyalanmaz, ancak yalnızca yeni bloktaki ilk işaret önceki bloğun zamanıyla birlikteyse.

Yeni keneler (blok) beklemeniz ve gerçeğin ardından kopyalamamanız gerekir.

Bir göstergem var, son 20-30 keneyi gösteriyor. Sanırım buna bir çek ekleyebilirim: anormal zamanlarda kene geçmişindeki isabetler için alınan tüm keneleri kontrol edin.
 
Karputov Vladimir :
Bir göstergem var, son 20-30 keneyi gösteriyor. Sanırım buna bir çek ekleyebilirim: Anormal zamanlarda kenelerin geçmişindeki isabetler için alınan tüm keneleri kontrol edin.

Çeki "bağlayamazsınız" (benim için işe yaramadı), çünkü bunların eski keneler olduğu bilinmiyor,

hangi kriterlere göre kontrol edilecek? Bu, yalnızca gösterge ve bant yan yana yerleştirildiğinde "gözle" görülebilir.

Ama beklemek uzun zaman alacak (dediği gibi tek bir burcun derinliklerine kopyalanmış)

Kusurun yalnızca iki koşulda ortaya çıktığını unutmayın.

1. Yeni keneler "bekliyoruz" (blok)

2. Yalnızca yeni bloktaki 1. tik, önceki bloğun önceki tik(ler)inin zamanına sahipse, derin "tacked".

 
prostotrader :

Çeki "bağlayamazsınız" (benim için işe yaramadı), çünkü bunların eski keneler olduğu bilinmiyor,

hangi kriterlere göre kontrol edilecek? Bu, yalnızca gösterge ve bant yan yana yerleştirildiğinde "gözle" görülebilir.

Ama beklemek uzun zaman alacak (dediği gibi tek bir burcun derinliklerine kopyalanmış)

Kusurun yalnızca iki koşulda ortaya çıktığını unutmayın.

1. Yeni keneler "bekliyoruz" (blok)

2. Yalnızca yeni bloktaki 1. tik, önceki bloğun önceki tik(ler)inin zamanına sahipse, derin "tacked".

Fazlalığı kesin - göstergenin hesaplanması ve oluşturulması. Yalnızca kene dizisini alıp kontrol etmeyi bırakın. Bir hatayı (kimin kim olursa olsun) aramak için kodu mümkün olduğunca basitleştirmeniz gerekir.
 
Karputov Vladimir :
Fazlalığı kesin - göstergenin hesaplanması ve oluşturulması. Yalnızca kene dizisini alıp kontrol etmeyi bırakın. Bir hatayı (kimin kim olursa olsun) aramak için kodu mümkün olduğunca basitleştirmeniz gerekir.

Kodumda bir hata olsaydı, her zaman görünürdü.

Ve böylece gösterge doğru çalışıyor (tablodaki verilerle birçok kez kontrol ettim)

Göstergeyi orta-sıvı aletlerde çalıştırırsanız bu açıkça görülür.

Ve "iki çam arasında kaybolmak" neredeyse imkansız (bu kodda tek bir satır kısaltılamaz :( )

 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 :

Kodumda bir hata olsaydı, her zaman görünürdü.

Ve böylece gösterge doğru çalışıyor (tablodaki verilerle birçok kez kontrol ettim)

Göstergeyi orta-sıvı aletlerde çalıştırırsanız bu açıkça görülür.

Ve "iki çam arasında kaybolmak" neredeyse imkansız (bu kodda tek bir satır kısaltılamaz :( )

Start_time'da önceden yüklenen keneleri hesaba katmanız gerekir, aksi takdirde kenelerin tekrarı olur.

İşte bir örnek, işlev, kene geçmişi işleme sınıfımdan çıkarılan son keneleri döndürür, ancak bence her şey koddan netleşecektir.

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

Kene sorgulama modu - son "tikler" keneler - yani zaman "0"dır:

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

Bir gösterge (soldaki çizelgede) OnCalculate() işlevinde CopyTicks()'i, ikinci gösterge (sağdaki çizelgede) OnBookEvent() işlevinde CopyTicks()'i ister.

Ve işte resim:

?

İşaretler şu şekilde görüntülenir: "0" indeksli eleman grafiğin en altındadır ve "0" indeksli elemanın onay zamanı en eskisidir. "29" indeksli eleman en genç onay süresine sahiptir. Elimizde ne var: En azından bu şekilde aynı anda iki tutarsızlık buldum, aşağıda ilki için bir örnek var:

eleman indeksi tik zamanı Not



23 1472205757952 Hata: 147220575795 2 < 1472205757959
22 1472205757959 Bu doğru: 1472205757959 !< 1472205757432
21 1472205757432
Dosyalar:
 
Yury Kulikov :
Start_time'da önceden yüklenen keneleri hesaba katmanız gerekir, aksi takdirde kenelerin tekrarı olur.

İşte bir örnek, işlev, kene geçmişi işleme sınıfımdan çıkarılan son keneleri döndürür, ancak bence her şey koddan netleşecektir.

Çoğaltmayı önlemek için kodum:

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

COPY_TICKS_ALL, COPY_TICKS_TRADE olarak düzeltildi ve olması gerektiği gibi çalışıyor gibi görünüyor,

 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 ;

ama tekrar kontrol edeceğim. :)

Yayını statik olarak görüntüleyemezsiniz, temizlenmesini bekleyeceğim

Neden: