'CopyTicks' 테스트 - 페이지 22

 
fxsaber :
아니 불행히도. Renat는 유리가 전체 시장 시계에 지속적으로 스트리밍되고 있다고 주장했습니다. 그러나 이것은 대부분의 상황에서 편리한(낭비적인) 솔루션이 아닙니다.

이것이 유일하게 가능한 옵션입니다. 주문서 스트리밍은 기본적이고 분리할 수 없는 틱 스트림입니다.

플랫폼의 모든 것은 상호 연결되어 있으며 글로벌 데이터 동기화가 필요합니다. 그리고 틱 흐름은 이것에서 중요한 역할을 합니다.

 
Renat Fatkhullin :

이것이 유일하게 가능한 옵션입니다. 주문서 스트리밍은 기본적이고 분리할 수 없는 틱 스트림입니다.

플랫폼의 모든 것은 상호 연결되어 있으며 글로벌 데이터 동기화가 필요합니다. 그리고 틱 흐름은 이것에서 중요한 역할을 합니다.

한 명 이상의 전문가 고문이 BookEvent에 가입하지 않으면 어떻게 될까요?

생산성을 높이려면 시장 시계를 자르는 것이 좋습니다.

 
Renat Fatkhullin :

그러나 가장 중요한 것은 위의 샘플 비율 계산이 중요하지 않다는 것입니다. 그것들은 너무 서툴게 실행됩니다(모든 것이 측정되지만 CopyTicks의 시간은 아님). 이는 심지어 놀랍습니다.

속도계산은 안보고 위에서 말씀하신 방법으로 직접 측정해보겠습니다.
 
fxsaber :

한 명 이상의 전문가 고문이 BookEvent에 가입하지 않으면 어떻게 될까요?

생산성을 높이려면 시장 시계를 자르는 것이 좋습니다.

좋아하면 잘라.

 
Renat Fatkhullin :

CopyTicks를 테스트하는 방법은 다음과 같습니다.

MqlTick ExtArr[ 2048 ];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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마이크로초

2016.10 . 18 14 : 15 : 38.673 TEST (USDCHF,M1)         Time : 95 msc for 1206 records
그것은 당신이 선언한 10밀리초와 근본적으로 다릅니다. CopyTicks를 측정하지 않았기 때문입니다.

예, 고양이는 개를 내장 하고 이미 먹었습니다. Kopitix로 테스트를 많이 했습니다. 이번에는 지표를 시작하는 것으로 충분하다고 판단했습니다.

당신의 선택

Network 'xxx' : authorized on MetaQuotes-Demo through Access Point EU Amsterdam (ping: 54.84 ms)

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 from =( TimeTradeServer() - 600 )*1000을 넣으면 GBPUSD에도 맞습니다.

 
Renat Fatkhullin :

요점은 마지막 4096 인용문에 대한 닫기 캐시에 들어가는 것입니다.

거기에 들어가는 모든 것은 마이크로초가 걸리고 그보다 더 긴 것은 기록 호출(디스크 포함)이 필요합니다.

데모에서는 실제로 그렇습니다. BCS에서 - 아니요

Network 'xxx' : authorized on BCS-MetaTrader5 through Access Server # 2 (ping: 46.66 ms)


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

와 알파리는 진짜 별로다

Network 'xxx' : authorized on Alpari-MT5 through mt5.nl. 3 (ping: 61.87 ms)

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틱을 초과하여 저를 먼 기지로 올라가게 만들었습니다.

그는 Kopitiks의 불편에 대해 위에서 말했습니다. 표시된 표시기는 CopyTix를 여러 번 호출해야 하기 때문에 느려집니다. 그리고 모든 브레이크는 그 때문이다. 그리고 여기 문제가 있습니다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

'CopyTicks' 테스트

fxsaber , 2016.10.11 19:23

from_time에서 to_time으로 틱을 가져오기 위한 최적(성능) 알고리즘은 무엇입니까?

솔루션이 제안되었습니다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

'CopyTicks' 테스트

fxsaber , 2016.10.12 08:44

0이 아닌 경우 CopyTicks 내부에서 시작하기 위해 장소(아마도 이진 검색)가 검색됩니다(내부 데이터베이스의 인덱스).

데이터베이스의 인덱스를 시간별로 반환하는 함수를 추가해주세요. 그러면 이 문제를 최적으로 해결할 수 있습니다.

이제 날짜 사이의 틱을 다운로드하려면 시작 날짜부터 시작하여 UNKNOWN의 틱 수를 요청해야 합니다. 그런 다음 종료 날짜에 도달했는지 매번 확인하십시오. 그리고 각 copyitix 요청이 매우 비싸고 그러한 브레이크가 획득된다는 사실을 고려합니다.

 
fxsaber :

와 알파리는 진짜 별로다

Alpari가 수리된 것 같습니다. BCS - 아니요.

이전에 요청한 copytix 데이터의 캐시가 있으면 좋을 것입니다. 글쎄, 복사가 여러 단계([i]에서 [i + 1]까지)로 수행되는 경우 첫 번째 요청 후에 캐시에 많은 것을 푸시하는 것이 논리적입니다.

일반적으로 내부에서 기능이 어떻게 배열되어 있는지 명확하지 않습니다. 그러나 그녀와 함께 일하는 것은 어렵습니다 - 100%.

 
조언자
long LastTime = 0 ; // time_msc-время последнего тика (самого свежего), полученного из истории
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);    
  }  
}
Metaquotes-demo에 대한 결과
2016.10 . 18 16 : 06 : 18.744 Test15 (GBPUSD,M1)       i = 40 Amount = 1453 Sum = 79414 GetMicrosecondCount ()-StartTime = 584393
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틱이 아니라 더 많이 요청해야 한다고 말할 수 있습니다. 그렇다면 최적의 쿼리 값은 무엇입니까?
 
fxsaber :
0.5초에 80K 틱 - 천천히! 물론 한 번에 2000틱이 아니라 더 많이 요청해야 한다고 말할 수 있습니다. 그렇다면 최적의 쿼리 값은 무엇입니까?

자신에게 필요한 것을 한 번 깊이 다운로드한 다음 마이크로초 내에 가까운 캐시에서 새 것만 다운로드하는 것이 가장 좋습니다.

디스크 오류로 깊은 쿼리를 수행할 때마다 당연히 책임이 있습니다.