거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Facebook에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
라이브러리

TickCompressor - 평균 1 틱에서 2-3 바이트 압축 - MetaTrader 5용 라이브러리

조회수:
42
평가:
(4)
게시됨:
업데이트됨:
\MQL5\Include\Forester\
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

틱 데이터를 압축하여 .tcs MQ 파일보다 최대 3.5배 더 컴팩트한 형태로 저장합니다. 또한 60바이트의 MqlTick 구조보다 3바이트를 읽는 데 걸리는 시간이 짧기 때문에 빠른 작업이 가능합니다.

데이터 블록의 추가 ZIP 압축이 적용된 2023년 Ask, Bid, 시간의 파일 크기는 스크린샷에서 확인할 수 있습니다:

2023년 .tcs 형식의 파일 크기:

3.56배 압축.

틱을 저장하기 위해 이전 가격과의 매도 호가와 매수 호가의 차이가 사용됩니다. 종종 (전체 틱의 최대 50...70%) (-8...7)포인트를 초과하지 않으며, 4비트로 기록할 수 있습니다. 매도 호가와 매수 호가는 1바이트로 합쳐집니다.
여기에 1바이트를 더해 0~255밀리초의 시간차를 저장합니다(최대 229까지의 코드에서 229 이상의 값은 -8...7포인트를 초과하는 틱을 인코딩하는 데 사용됨).

가격이나 시간이 더 큰 값으로 다를 경우 더 큰 바이트 수로 패킹됩니다.

추가 압축을 위해 ZIP 아카이브를 적용할 수 있습니다. 데이터 크기가 최대 2배까지 줄어듭니다.

또는 -129~128의 Ask와 Bid를 각각 8비트 또는 1바이트로 압축하여 3바이트로 압축할 수도 있습니다. 여기에 시간 1바이트가 더해져 대부분의 경우 총 3바이트가 됩니다.
가끔(https://www.mql5.com/ru/forum/499639/page6#comment_58544810) 4바이트보다 2바이트로 압축되는 틱이 더 많은 경우 3바이트로 압축하는 것이 더 효율적일 수 있습니다. 계측기 통계를 살펴봐야 합니다.
명령을 사용하여 최대 압축을 3바이트로 전환할 수 있습니다:

#define  compressTo3Bytes // 틱을 2바이트가 아닌 3바이트로 압축합니다.


압축된 형태로 저장할 틱 요소

저장할 틱 요소는 3가지 변형이 프로그래밍되어 있습니다:

  1. 매도, 매수, 시간_msc
  2. Ask, Bid, time_msc, volume_real
  3. 모든 요소 Ask, Bid, Last, time_msc, volume_real, flags(int volume은 volume_real에서 계산됨).

추가로 ZIP으로 압축할 수도 있습니다. 총 6가지 변형이 있습니다.

method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6

압축을 시작하기 전에 틱 스토리지의 변형과 가격 계산 및 정규화에 사용되는 몇 가지 표준 매개 변수를 클래스에 전달해야 합니다.

    TickCompressor Compressor2;
    double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
    Compressor2.Start(method,_Point,VolumeStep_,_Digits);

Expert Advisor가 플래그를 사용하는 경우 다음 명령으로 가격 변동으로부터 복원할 수 있습니다.

#define  RestoreFlags // 요청, 입찰, 볼륨 변경에서 틱 플래그 복원 - 틱 생성 시간이 869ms가 아닌 931로 7% 추가됩니다.

압축 테스트를 위한 전문가 어드바이저가 첨부되어 있으며, 속도와 압축률에 대한 통계를 제공합니다. 틱의 압축 및 압축 해제 예제를 볼 수 있습니다.

거래용 전문가 어드바이저의 예는 여기에서 볼 수 있습니다 https://www.mql5.com/ko/code/65821.

2바이트 및 3바이트 압축에 대한 통계:

2바이트로 압축: 3바이트로 압축
틱: 47707712
압축 크기: 135718404
2862666420 바이트를 135718404 바이트로 압축 ==> 4.74%
압축 성능: 764 MB/s
압축 성능: 13.4 틱(백만)/초.
압축 성능 기준: 281.7
압축 해제 성능: 3550 MB/s
압축 해제 성능: 62.0 틱(수백만)/초
압축 해제 성능 기준: 1308.8


전문가 통계 https://www.mql5.com/en/code/65821
for BTCUSDT

-------------------- 통계: --------------------
2바이트: 70.1%, 50705359 틱
4바이트: 17.1%, 12350966 틱
5바이트: 12.7%, 9185484 틱
6바이트: 0.0%, 15274 틱
11바이트: 0.1%, 46214 틱
12바이트: 0.0%, 1 틱
24바이트: 0.0%, 1 틱
합계: 72303299 틱, 197342036 바이트.
평균: 틱당 2.729바이트
압축 해제된 크기: 197342036. 압축 크기: 108302550. ZIP 압축: 54.9%
평균: 틱당 1.498바이트

EURUSD의 경우

-------------------- 통계: --------------------
2바이트: 66.2%, 29694779 틱
4바이트: 2.3%, 1022937 틱
5바이트: 31.5%, 14106637 틱
6바이트: 0.0%, 25 틱
7바이트: 0.0%, 8 틱
11바이트: 0.0%, 800 틱
12바이트: 0.0%, 3 틱
13바이트: 0.0%, 4 틱
24바이트: 0.0%, 1 틱
합계: 44825194 틱, 134023609 바이트.
평균: 2.99 바이트당
압축 해제된 크기: 134023609. 압축 크기: 95495454. ZIP 압축: 71.3 %
평균: 틱당 2.13 바이트
틱: 47707712
압축 크기: 169378137
2862462720 바이트를 169378137 바이트로 압축 ==> 5.92%
압축 성능: 623 MB/s
압축 성능: 10.9 틱(백만)/초.
압축 성능 기준: 183.9
압축 해제 성능: 3225 MB/s
압축 해제 성능: 56.4 틱(백만)/초
압축 해제 성능 기준: 952.6
Correct = true

통계 출처: 전문가 https://www.mql5.com/en/code/65821
for BTCUSDT

-------------------- 통계: --------------------
3바이트: 86.6%, 62644158 틱
4바이트: 0.6%, 412167 틱
5바이트: 12.7%, 9185484 틱
6바이트: 0.0%, 15274 틱
11바이트: 0.1%, 46214 틱
12바이트: 0.0%, 1 틱
24바이트: 0.0%, 1 틱
합계: 72303299 틱, 236108596 바이트.
평균: 틱당 3.266 바이트
압축 해제 크기: 236108596. 압축 크기: 105802525. ZIP 압축: 44.8%
평균: 틱당 1.463바이트

EURUSD의 경우

3바이트: 66.5%, 29801633 틱
4바이트: 2.0%, 916083 틱
5바이트: 31.5%, 14106637 틱
6바이트: 0.0%, 25 틱
7바이트: 0.0%, 8틱
11바이트: 0.0%, 800틱
12바이트: 0.0%, 3틱
13바이트: 0.0%, 4틱
24바이트: 0.0%, 1틱
합계: 44825194 틱, 163611534 바이트.
평균: 틱당 3.65바이트
압축 해제된 크기: 163611534. 압축 크기: 96541155. ZIP 압축: 59.0%
평균: 틱당 2.154바이트

코드 예시

틱 압축

블록 단위로:

    int ZIPpos=0;//압축 바이트 카운터
    if(Amount>ticks_per_block){// > 1 블록 - tmp에서 Ticks2로 블록 붙이기
       for(int start=0; start<Amount; start+=ticks_per_block){
          Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start));
          ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //Ticks2 끝으로 복사
       }
    }else{//1 블록 - Ticks2로 직접 포장 풀기
       Compressor2.Compress(Ticks, Ticks2, 0, Amount);
    } 

1블록의 틱 수를 배열의 총 틱 수보다 크게 설정하면 1블록으로 압축됩니다.

항상 1블록으로 압축해야 하는 경우 다음을 사용할 수 있습니다.

Compressor2.Compress(Ticks,Ticks2); 

그러나 이렇게 크거나 매우 큰 블록의 압축 해제 속도는 2배 정도 느려질 수 있습니다. 또한 큰 블록에는 많은 메모리가 소비됩니다.


틱 포장 풀기

포장을 풀 때 포장된 틱의 수를 아는 것이 바람직합니다. 수신기 배열은 이 크기를 가져야 합니다.

ArrayResize(Ticks3,Amount);

예를 들어 파일에 크기를 저장할 수 있습니다. 그런 다음 포장을 풀 때 사용합니다.

크기를 알 수 없는 경우 블록의 틱 수만큼 루프 내부의 크기를 변경할 수 있습니다.

       //slow down 
ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //큰 배열 크기 조정 - 작은 블록을 덮어쓰는 것보다 느리게 작동합니다.


이 코드는 블록 단위로 틱을 가져옵니다. 큰 블록이 1개만 있는 경우에도 올바르게 계산합니다. 틱은 큰 배열로 수집되지 않지만 Strategy(Ticks3[j]) 전략에 의해 즉시 처리될 수 있습니다;

    while (ZIPpos<ArraySize(Ticks2)){
       nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//다음 블록의 크기를 4로 늘리십시오.

       uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // 다음 크기를 사용하여 새 블록을 tmp에 복사합니다.
       // 3배 느려짐 ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //큰 배열 크기 조정 - 작은 블록을 덮어쓰는 것보다 느리게 작동합니다.
       //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//블록의 압축을 풀고 Ticks3에 추가합니다.
       
       total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //블록의 압축을 풀고 Ticks3에서 덮어씁니다.
       ZIPpos+=nextSize;
       for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//전략
    };


모든 블록의 틱을 하나의 큰 배열로 수집합니다:

    while (ZIPpos<ArraySize(Ticks2)){
       nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//다음 블록의 크기를 4로 늘리십시오.

       uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // 다음 크기를 사용하여 새 블록을 tmp에 복사합니다.
       //큰 배열 크기 조정 - 작은 블록을 덮어쓰는 것보다 느리게 작동합니다.
       total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//블록의 압축을 풀고 Ticks3에 추가합니다.
       
       //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //블록 압축을 풀고 Ticks3에 덮어씁니다.
       ZIPpos+=nextSize;
       //for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//strategy
    };


또는 한 줄로 수집합니다. 하나의 블록만 기록해야 합니다. 그 이상이면 위의 두 가지 코드 변형을 사용하세요.

total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);



MetaQuotes Ltd에서 러시아어로 번역함.
원본 코드: https://www.mql5.com/ru/code/66201

MARSICD MARSICD

두 가지 RSI 지표를 기반으로 한 추세 지표입니다.

MA_NRTR MA_NRTR

NRTR 형식의 간단한 추세 표시기

Titik Impas Breakeven Titik Impas Breakeven

단일 거래의 손절가를 시가에 맞춰 수동으로 조정하는 것은 비교적 간단한 작업이지만 수많은 포지션을 개별적으로 관리하는 것은 번거롭고 시간이 많이 소요될 수 있습니다. MT4/MT5용 티틱 임파스 손익분기점 스크립트는 이 과정을 간소화하여 여러 포지션을 거래하는 트레이더에게 효율성과 편의성을 제공합니다.

Inter Inter

다중 통화 다중 타임프레임 표시기.