모든 거래의 테이블. MQL5를 통한 액세스 - 페이지 4

 
prostotrader :

나는 그것이 깊지 않다고 생각하지만 그들이 깊이에서 "움켜잡고" 있는 것을 봅니다.

왜 생각해?

표시기를 실행하고 직접 확인하십시오!

그리고 당신은 쓰여진 것을 읽습니까?

나는 그것을 읽었지만 이제 경매가 닫히고 시작될 것입니다. 틱이 다운로드되는 방향을 다시 확인합니다 (내 스크립트에서).
 
Karputov Vladimir :
나는 그것을 읽었지만 이제 경매가 닫히고 시작될 것입니다. 틱이 다운로드되는 방향을 다시 확인합니다 (내 스크립트에서).

스크립트 에서 확인하지 않고 모스크바 시간 오후 8-9시에 RTS-9.16 시간에 표시기 를 실행해야 합니다(볼 수 있음)

그리고 틱 이 항상 깊이 복사되는 것은 아니지만 새 블록의 첫 번째 틱이 이전 블록의 시간과 함께 있는 경우에만 복사됩니다.

새로운 틱(블록)을 예상 할 수 있는 방법이 필요하고, 사실 이후에 복사하지 않는 것이 필요합니다.

스크립트를 실행하면 기록 에서 복사가 있기 때문에 모든 것이 잘 될 것입니다.

새 블록을 " 기다리지 " 않습니다.

 
prostotrader :

스크립트에서 확인하지 않고 모스크바 시간 오후 8-9시에 RTS-9.16 시간에 표시기를 실행해야 합니다.

그리고 틱 이 항상 깊이 복사되는 것은 아니지만 새 블록의 첫 번째 틱이 이전 블록의 시간과 함께 있는 경우에만 복사됩니다.

새로운 틱(블록)을 예상 해야 하며 사실 이후에 복사하지 않아야 합니다.

표시기가 있으며 마지막 20-30 틱을 표시합니다. 나는 그것에 수표를 붙일 수 있다고 생각합니다: 비정상적인 시간에 틱의 기록에서 히트에 대해 수신된 모든 틱을 확인합니다.
 
Karputov Vladimir :
표시기가 있으며 마지막 20-30 틱을 표시합니다. 나는 그것에 수표를 붙일 수 있다고 생각합니다. 비정상적인 시간에 틱 기록에서 히트에 대해 수신된 모든 틱을 확인합니다.

이것이 오래된 진드기라는 것이 알려져 있지 않기 때문에 수표를 "나사"할 수 없습니다 (나에게는 효과가 없었습니다).

어떤 기준으로 확인합니까? 이것은 표시기와 테이프가 나란히 배치된 경우에만 "눈"으로 볼 수 있습니다.

하지만 기다리는 데 시간이 오래 걸릴 것입니다 (그가 말했듯이 하나의 기호의 깊이에 복사됩니다)

결함은 두 가지 조건에서만 나타납니다.

1. 새로운 틱(차단)을 "기대"합니다.

2. 새 블록의 첫 번째 틱에 이전 블록의 이전 틱 시간이 있는 경우에만 깊이 "Tacked"됩니다.

 
prostotrader :

이것이 오래된 진드기인지 알려지지 않았기 때문에 수표를 "고정"할 수 없습니다 (나에게는 효과가 없었습니다).

어떤 기준으로 확인합니까? 이것은 표시기와 테이프가 나란히 배치된 경우에만 "눈"으로 볼 수 있습니다.

하지만 기다리는 데 시간이 오래 걸릴 것입니다 (그가 말했듯이 하나의 기호의 깊이에 복사됩니다)

결함은 두 가지 조건에서만 나타납니다.

1. 새로운 틱(차단)을 "기대"합니다.

2. 새 블록의 첫 번째 틱에 이전 블록의 이전 틱 시간이 있는 경우에만 깊이 "Tacked"됩니다.

초과분을 차단하십시오 - 표시기의 계산 및 렌더링. 틱 배열을 가져오고 확인하는 것만 남겨주세요. 오류를 찾으려면(누구에게 상관없이) 가능한 한 코드를 단순화해야 합니다.
 
Karputov Vladimir :
초과분을 차단하십시오 - 표시기의 계산 및 렌더링. 틱 배열을 가져오고 확인하는 것만 남겨주세요. 오류를 찾으려면(누구에게 상관없이) 가능한 한 코드를 단순화해야 합니다.

내 코드에 오류가 있으면 항상 표시됩니다.

따라서 표시기가 올바르게 작동합니다 (표의 데이터로 여러 번 확인했습니다)

이것은 중간 액체 기기에서 표시기를 실행하면 명확하게 알 수 있습니다.

그리고 "두 소나무에서 길을 잃는 것"은 거의 불가능합니다(이 코드에서는 한 줄도 줄일 수 없습니다 :( )

 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 :

내 코드에 오류가 있으면 항상 표시됩니다.

따라서 표시기가 올바르게 작동합니다 (표의 데이터로 여러 번 확인했습니다)

이것은 중간 액체 기기에서 표시기를 실행하면 명확하게 알 수 있습니다.

그리고 "두 소나무에서 길을 잃는 것"은 거의 불가능합니다(이 코드에서는 한 줄도 줄일 수 없습니다 :( )

start_time에서 이전에 로드된 틱을 고려해야 합니다. 그렇지 않으면 틱이 중복됩니다.

다음은 예입니다. 이 함수는 틱 기록 처리 클래스에서 가져온 마지막 틱을 반환하지만 코드에서 모든 것이 명확해질 것이라고 생각합니다.

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

하나의 표시기(왼쪽 차트)는 OnCalculate() 함수에서 CopyTicks()를 요청하고 두 번째 표시기(오른쪽 차트)는 OnBookEvent() 함수에서 CopyTicks()를 요청합니다.

그리고 여기 사진이 있습니다:

?

눈금은 다음과 같이 표시됩니다. 인덱스가 "0"인 요소는 차트의 맨 아래에 있고 인덱스 "0"이 있는 요소의 눈금 시간이 가장 오래된 것입니다. 인덱스가 "29"인 요소는 가장 어린 틱 시간을 갖습니다. 우리가 가진 것: 적어도 이 그림에서 한 번에 두 가지 불일치를 발견했습니다. 아래는 첫 번째 예입니다.

요소 색인 틱 시간 메모



23 1472205757952 오류: 147220575795 2 < 1472205757959
22 1472205757959 맞습니다: 1472205757959 !< 1472205757432
21 1472205757432
파일:
 
Yury Kulikov :
start_time에서 이전에 로드된 틱을 고려해야 합니다. 그렇지 않으면 틱이 중복됩니다.

다음은 예입니다. 이 함수는 틱 기록 처리 클래스에서 가져온 마지막 틱을 반환하지만 코드에서 모든 것이 명확해질 것이라고 생각합니다.

중복을 방지하는 코드는 다음과 같습니다.

 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 ;

하지만 다시 확인하겠습니다. :)

정적으로 피드를 볼 수 없습니다. 지워질 때까지 기다리겠습니다.