당사 팬 페이지에 가입하십시오
- 조회수:
- 42
- 평가:
- 게시됨:
- 업데이트됨:
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
틱 데이터를 압축하여 .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가지 변형이 프로그래밍되어 있습니다:
- 매도, 매수, 시간_msc
- Ask, Bid, time_msc, volume_real
- 모든 요소 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
Titik Impas Breakeven
단일 거래의 손절가를 시가에 맞춰 수동으로 조정하는 것은 비교적 간단한 작업이지만 수많은 포지션을 개별적으로 관리하는 것은 번거롭고 시간이 많이 소요될 수 있습니다. MT4/MT5용 티틱 임파스 손익분기점 스크립트는 이 과정을 간소화하여 여러 포지션을 거래하는 트레이더에게 효율성과 편의성을 제공합니다.
Inter
다중 통화 다중 타임프레임 표시기.