당사 팬 페이지에 가입하십시오
- 조회수:
- 37
- 평가:
- 게시됨:
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
EAToMath 라이브러리의 대안 https://www.mql5.com/ko/code/61283
실제 틱 모드에서 틱을 기록하고 수학 모드에서 기록된 각 틱으로 전략을 호출하는 틱을 읽습니다.
생성 이유: MQ 테스터는 옵티마이저가 실행될 때마다 각 에이전트에 틱 데이터 파일을 씁니다. 저는 36명의 에이전트가 도구와 테스트 기간 동안 각각 10GB씩, 480GB 드라이브에 총 360GB를 쓰고 있습니다. 이 프로세스는 각 최적화 전에 약 1시간 정도 소요됩니다. 일반적인 SSD의 수명은 500~1,000회 쓰기 주기입니다. 매번 360GB를 다시 쓰면 리소스가 매우 빨리 소진됩니다. 이 라이브러리는 하나의 파일만 쓰면 36개의 모든 에이전트가 이 하나의 파일에서 데이터를 읽습니다. 이 모든 것이 라이브러리를 작성한 이유입니다: 파일 1개만 사용 + 각 에이전트에 데이터를 쓰는 데 1시간 절약 + MQ 테스터와 실제 틱 모드에서 가상과 비교한 가속.
이 문제는 각각 자신의 버전으로 fxsaber(EAToMath의 저자)와 동시에 조사했습니다. 내 코드가 더 명확하므로 사용합니다.
거래 작업에는 MT4Orders 라이브러리가 사용됩니다 https://www.mql5.com/ko/code/16006
가상 거래에는 가상 라이브러리를 사용해야합니다 https://www.mql5.com/ko/code/22577
거래 결과를 보려면 MT4Orders QuickReport https://www.mql5.com/ko/code/47816 또는 보고서
틱을 압축하려면 TickCompressorhttps://www.mql5.com/ko/code/66201
불필요한 틱을 제거하려면 예를 들어 견적 세션이 거래 세션보다 큰 경우 Control_Trade_Sessions 도서관 https://www.mql5.com/ko/code/48059이 연결됩니다. 모든 틱이 사용되는 경우, 즉 세션이 일치하는 경우에도 삭제할 수 있습니다.
EAToMath와의 차이점:
장점:
- 코드가 더 짧고 간단하며 플러그인 라이브러리가 5개에 불과합니다. 수정이 필요한 경우 더 쉽게 이해할 수 있습니다.
- 다른 알고리즘으로 인해 데이터가 더 잘 압축됩니다 https://www.mql5.com/ko/code/66201. time_msc, 요청 및 입찰만 저장할 경우 최대 86%의 틱이 3자 숫자, 즉 3바이트로 저장됩니다. 2023년 BTCUSDT 틱 데이터 저장 시 틱당 평균 크기 = 3.266 바이트
볼륨으로 저장 시 평균 = 4.835 바이트. 그리고 전체 틱 저장 시 = 8.439 바이트. 아래는 테스트 결과가 담긴 표입니다.
또한, 내장된 ZIP 아카이빙을 사용할 수 있습니다. 파일 크기가 2 배 줄어 듭니다. 이러한 파일은 245Mb가 걸리는 반면 2023 년 .tcs의 파일 크기 합계는 364Mb, 즉 압축이 MQ보다 1.5 배 더 좋습니다. 그리고 수학 모드에서 틱 생성 속도는 약 2배 더 빠릅니다. 아래 표를 참조하세요. - 더 많은 저장 옵션이 있습니다:

- 시스템에서 링크를 만들어 파일을 SSD 또는 RAM 디스크에 저장할 수 있습니다. 파일은 많은 공간을 차지할 수 있고 RAM 드라이브가 충분하지 않을 수 있으므로 기본 드라이브에 저장하도록 선택할 수 있습니다. SSD와 RAM 읽기 속도는 거의 동일하며, 가장 자주 요청되는 데이터의 전체 용량의 최대 5%까지 SSD가 캐시한다고 읽었습니다.
읽기를 할 때는 읽지 않고 저장할 때보다 메모리 셀을 더 자주 덮어써야 하므로 SSD에 약간의 마모가 있습니다. 정확한 수치는 모르겠지만 예를 들어 10회 읽기 또는 1000회 읽기당 1회 덮어쓰기.... 그러나 이것은 MQ 테스터에 의한 디스크 마모에 비해 거의 중요하지 않습니다.
단점:
- 가상 연결은 직접 수행해야 하며(여기 https://www.mql5.com/ko/code/22577 지침 참조), EAToMath는 전략을 가상 자체에 전달합니다.
BidAsk 변형의 속도는 EAToMath와 비슷합니다. 다른 변형은 더 많은 데이터를 포함하거나 추가 ZIP 압축이 있기 때문에 속도가 느립니다.
사용 기능:
표준 함수 Symbol(), Digits( ) (=4), Point() (=0.0001)는 테스트 중인 심볼과 관련이 없는 기본값을 생성하므로 전략에서 사용할 수 없습니다. 대신 파일에서 읽은 값에 재정의되는 _Symbol, _Digits, _Point를 사용합니다. 또한 기록된 심볼의 값이 포함된 새로운 상수 _TickSize 및 _TickValue가 추가되었으며, 이는 예금 통화에서 수익, 수수료 및 스왑을 올바르게 계산하는 데 필요합니다.
틱을 저장할 때 선택한 테스트 기간의 작업 순서:
- 실제 틱, 필요한 상품 및 테스트 날짜별로 테스트 모드를 선택합니다. 작업 변수를 저장 중 하나로 설정하고 틱 저장 옵션을 선택합니다. 테스터를 시작합니다. 그러면 지정된 폴더에 틱이 포함된 파일이 생성됩니다.
- 작업 변수를 Run_Strategy로 설정합니다. 나중에 비교할 수 있도록 실제 틱으로 모드를 종료할 수 있습니다. 테스터를 시작합니다. 계산은 파일이 아닌 실제 틱에 의해 이루어집니다. 결과를 얻습니다.

- 테스트 모드를 수학적 계산으로 설정합니다. 테스터를 시작합니다. 파일에서 틱으로 계산이 이루어집니다. 2단계의 결과와 비교합니다. 동일해야 하지만 몇 배 더 빨라야 합니다.
아카이브 작업 순서:
- 기록의 모든 틱이 포함된 아카이브 만들기: 필요한 도구인 실제 틱으로 테스트 모드를 선택합니다. 사용 가능한 기록에서 <= 첫 틱부터 >= 마지막 틱까지 테스트 날짜를 설정합니다. 작업 변수를 저장...To_아카이브 중 하나로 설정하고 틱을 저장하는 옵션을 선택합니다. 테스터를 시작합니다. 그러면 지정된 폴더에 도구 이름이 있는 폴더가 생성되고, 이 폴더에 연도별 틱이 있는 파일이 저장됩니다. 필요에 따라 지난 연도를 덮어쓸 수 있으며, 이를 위해 날짜에서 현재 연도만 선택하여 이전 연도를 덮어쓰지 않도록 합니다.
- 테스트 모드를 수학으로 설정합니다. Task 변수를 Run_Strategy_Fron_Archive로 설정합니다.
- MathTicker: 전체 아카이브 그룹을 사용하여
도구 - 도구 이름(틱이 저장된 폴더의 이름과 일치해야 함), 테스트 시작 및 종료 날짜를 설정합니다.

- 테스터를 시작합니다. 계산은 필요한 연간 파일에서 틱으로 이루어집니다. 작업이 하나의 파일이 아니라 여러 개의 파일로 수행되기 때문에 파일을 열고 닫는 데 시간이 걸리기 때문에 약간 느립니다. 예를 들어, 3년간의 틱을 생성하는 데 1.7초가 아니라 2.7초가 걸립니다.
- 아래 전문가 조언자가 얻은 틱의 합계는 첫 번째 틱의 작은 값만큼 다를 수 있습니다. 실제 틱 모드에서 사용자 지정 캐릭터로 테스트할 때 첫 번째 틱은 매도 또는 매수만 생성합니다(둘 다 저장하지 않은 경우). 아카이브에서 테스트할 때는 이전 틱에서 둘 다 복원됩니다.
작업 속도를 추정하는 가장 간단한 전문가 조언자의 예입니다:
#property tester_no_cache #include <Forester\MathTicker.mqh> // 수학 모드에서 거래 연결 input int rep=0;//최적화를 위한 반복 sinput bool AddVolumes=true; void OnInit(){} void OnTick(){ static MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)){ #ifdef _MathTick_ if(MathTick.SaveTick(Tick)){ return; }//틱을 저장하면 종료하고 거래하지 않습니다. #endif Strategy(Tick); } } double Sum = 0;int tk=0; void Strategy(MqlTick& Tick){ // 가장 간단한 전략 - EAToMath와 읽기 속도를 비교하는 데 사용됩니다. Sum += Tick.bid+Tick.ask+(AddVolumes?Tick.volume_real:0.0); tk++; //if(tk<100){Print(Tick.time," " ",Tick.ask," ",Tick.bid," ",Tick.last," ",Tick.volume_real," ",Tick.flags);} } ulong StartTime = GetMicrosecondCount(); double OnTester(){ #ifdef _MathTick_ // MathTick으로 실행하면 파일에서 틱으로 기호 매개변수를 계산합니다. 매트 모드에서 테스트할 경우 if(MathTick.SaveTicksEnd()){return 0;}// 틱을 기록한 후 파일을 닫고 종료합니다. if(MathTick.ReadSymbolVars()){ MathTick.Ticker();// 매트 모드에서 모든 틱을 Strategy(MqlTick &Tick)에 공급합니다. } #endif Print("ticks: ",tk); long work_time = (long)(GetMicrosecondCount() - StartTime)/1000; //return(NormalizeDouble(work_time, 1)); // 작업 속도와 return Sum;//를 입력하여 계산 결과를 비교합니다. }
하나의 설정을 토글할 수 있습니다:
//#define RestoreFlags // восстановить флаги тика из изменения ask, bid, volume - добавит 7% к времени генерации тиков 931 вместо 869 мс
틱을 생성할 때 틱 압축에 대한 통계가 표시됩니다.
아래는 통계, 볼륨 및 틱 생성 시간에 대한 출력물입니다.
-----------
볼륨 없는 MQ테스터
합격 1 결과 반환 4345830621850.311523 in 0:00:08.232
| C ZIP 압축 | |
|---|---|
| AskBid. 파일 크기: 225MB -------------------- 통계: -------------------- 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바이트 최종 잔액 0.00 USD 통과 10 반환 결과 4345830621850.311523 in 0:00:01.485 정규화 없음 통과 1 반환 결과 4345830621850.311523 in 0:00:00.892 | AskBid_Zipped. 파일 크기: 106 MB -------------------- 통계: -------------------- 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. 압축 크기:111720863. ZIP 압축: 47.3% 통과 10 0:00:02.548에 반환된 결과 4345830621850.311523 정규화 없음 통과 2 0:00:01.890에 반환된 결과 4345830621850.311523 |
볼륨이 있는 MQ 테스터
통과 1 반환 결과 4345879117123.356445 in 0:00:07.962
| C ZIP 압축 | |
|---|---|
| AskBidVolume. 파일 크기: 333 MB -------------------- 통계: -------------------- 4 바이트: 60.4%, 43684907 틱 5 바이트: 1.1%, 809676 틱 6 바이트: 33.5%, 24194111 틱 7 바이트: 4.9%, 3548666 틱 8 바이트: 0.0%, 7909 틱 12 바이트: 0.1%, 40022 틱 13 바이트: 0.0%, 17964 틱 14 바이트: 0.0%, 2틱 19바이트: 0.0%, 41틱 32바이트: 0.0%, 1틱 합계: 72303299 틱, 349571243 바이트. 평균: 틱당 4.835바이트 통과 1 반환 결과 4345879117123.356445 in 0:00:02.803 정규화 없음 통과 4 반환 결과 4345879117123.356445 in 0:00:01.659 | AskBidVolume_Zipped. 파일 크기: 204 MB -------------------- 통계: -------------------- 4 바이트: 60.4%, 43684907 틱 5 바이트: 1.1%, 809676 틱 6 바이트: 33.5%, 24194111 틱 7 바이트: 4.9%, 3548666 틱 8 바이트: 0.0%, 7909 틱 12바이트: 0.1%, 40022 틱 13바이트: 0.0%, 17964 틱 14바이트: 0.0%, 2 틱 19바이트: 0.0%, 41 틱 32바이트: 0.0%, 1 틱 합계: 72303299 틱, 349571243 바이트. 평균: 4.835 바이트당 압축 해제 크기:349571243. 압축 크기:214897079. ZIP 압축: 61.5% 2번 통과 0:00:04.260에 반환된 결과 4345879117123.356445 정규화 없음 2번 통과 0:00:03.096에 반환된 결과 4345879117123.356445 |
| All. 파일 크기: 582 MB -------------------- 통계: -------------------- 8 바이트: 61.5%, 44494583 틱 9 바이트: 33.5%, 24194111 틱 10 바이트: 4.9%, 3548666 틱 11 바이트: 0.0%, 7909 틱 15 바이트: 0.1%, 40022 틱 16 바이트: 0.0%, 17964 틱 17 바이트: 0.0%, 2틱 22바이트: 0.0%, 41틱 44바이트: 0.0%, 1틱 총: 72303299 틱, 610166056 바이트. 평균: 틱당 8.439바이트 통과 2 반환 결과 4345879117123.356445 in 0:00:03.768 정규화 없음 통과 1 반환 결과 4345879117123.356445 in 0:00:02.256 | All_Zipped. 파일 크기: 245 MB -------------------- 통계: -------------------- 8 바이트: 61.5%, 44494583 틱 9 바이트: 33.5%, 24194111 틱 10 바이트: 4.9%, 3548666 틱 11 바이트: 0.0%, 7909 틱 15 바이트: 0.1%, 40022 틱 16바이트: 0.0%, 17964 틱 17바이트: 0.0%, 2 틱 22바이트: 0.0%, 41 틱 44바이트: 0.0%, 1 틱 합계: 72303299 틱, 610166056 바이트. 평균: 8.439바이트당 압축 해제된 크기:610166056. 압축 크기:257105213. ZIP 압축: 42.1% 통과 1 0:00:05.388에 반환된 결과 4345879117123.356445 정규화 없음 통과 10 0:00:03.936에 반환된 결과 4345879117123.356445 |
2023년 같은 해의 .tcs 파일 크기입니다:

ZIP을 사용하는 모든 변형, 전체 틱 저장도 더 작아집니다(3.5 ~ 1.5배).
가상 트레이딩 및 보고서 출력을 위한 Expert Advisor 예시:
#property tester_no_cache #include <MT4Orders.mqh> // https://www.mql5.com/ko/code/16006 #include <Forester\MathTicker.mqh> // 수학 모드에서 거래 연결 #define ORDER_CURRENCY_DIGITS 2 // 거래 내역에서 수익/수수료/스왑을 계산할 때 사용하는 숫자 설정입니다. #define VIRTUAL_LIMITS_TP_SLIPPAGE // 리미터와 TP는 첫 번째 수락 가격으로 실행됩니다 - 포지티브 슬리피지 #define ORDER_COMMISSION -0 // 커미션 할당 = 로트 * ORDER_COMMISSION. #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ko/code/22577 #define REPORT_TESTER // 테스터가 자동으로 보고서를 기록합니다. #define REPORT_BROWSER // 브라우저 시작과 함께 보고서 만들기 - DLL 권한이 필요합니다. #define USE_highcharts //- 모든 하이차트 제품을 무료로 다운로드하여 사용해 볼 수 있습니다. 프로젝트/제품을 출시할 준비가 되면 상용 라이선스를 구매하세요. https://shop.highcharts.com/ #include <MT4Orders_QuickReport.mqh>// enum VirtTyp {MQ_Tester=0,Virtual1=1,Virtual2=2}; sinput VirtTyp tester1=1;//Tester 1 sinput VirtTyp tester2=2;//Tester 2 input int rep=0;//최적화를 위한 반복 bool isOptimization = false, isTester=false; double balInit=0; VIRTUAL_POINTER Virtual[10]; void OnInit(){ Virtual[0] = 0; // 0 - 실제 거래 환경 Virtual[1] = VIRTUAL::Create(AccountBalance()); // 가상화 생성 1. Virtual[2] = VIRTUAL::Create(AccountBalance()); // 가상화 생성 2. //Virtual[tester1].Select(); isOptimization = MQLInfoInteger(MQL_OPTIMIZATION) ; isTester = MQLInfoInteger(MQL_TESTER); balInit=AccountBalance(); } void OnTick(){ //Virtual[0].Select(); VIRTUAL::NewTick();// 현재 가상 머신으로 틱을 보냅니다. static MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)){ #ifdef _MathTick_ if(MathTick.SaveTick(Tick)){ return; }//틱을 작성하면 함수가 종료될 때 Strategy()가 호출되지 않습니다. #endif Strategy(Tick);//거래 } } void Strategy(MqlTick& Tick){ // 가장 간단한 전략 - EAToMath와 읽기 속도를 비교하는 데 사용됩니다. if(Tick.ask==0 || Tick.bid==0){return;}//MQ 테스터는 실패한 틱에 거래되지만, 가상은 그렇지 않습니다. MQ에 대해서도 금지 if(tester1>0){Virtual[tester1].Select(); VIRTUAL::NewTick(Tick);}//가상화 1을 선택하고 체크 표시를 보냅니다. if(tester2>0){Virtual[tester2].Select(); VIRTUAL::NewTick(Tick);}//가상화 2를 선택하고 체크 표시를 보냅니다. if(isNewHour(Tick.time)){//매시간 첫 번째 틱 if(GetHour0(Tick.time) % 2==0){// 테스터 1에서 짝수 시간에 구매 Virtual[tester1].Select();//가상화 선택 1 OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, Tick.ask - 100 * _Point, Tick.ask + 100 * _Point); }else{//테스터 2의 홀수 시간대에 판매 Virtual[tester2].Select();//가상화 선택 2 OrderSend(_Symbol, OP_SELL, 1, Tick.bid, 0, Tick.bid + 100 * _Point, Tick.bid - 100 * _Point); } } } double OnTester(){ #ifdef _MathTick_ // MathTick으로 실행하면 틱 파일에서 기호 매개변수를 읽습니다. 매트 모드에서 테스트할 경우 if(MathTick.SaveTicksEnd()){return 0;}//틱 저장 후 반환 if(MathTick.isMath && MathTick.ReadSymbolVars()){ if(tester1==0){Alert(" >>>>>>>>> Virtual tester 1=MQ. In math mode can be used only virtual tester. <<<<<<<<");return 0;} if(tester2==0){Alert(" >>>>>>>>> Virtual tester 1=MQ. In math mode can be used only virtual tester. <<<<<<<<");return 0;} SYMBOL_BASE sb; sb.Point=_Point; sb.Digits=_Digits; sb.Symbol=_Symbol; sb.SymbolID=0; sb.TickSize=_TickSize; sb.TickValue=_TickValue / _TickSize;//this.TickValue_ /= this.TickSize_; //\fxsaber\Virtual\Symbol_Base.mqh의 SetSymbol()에서와 같이 Virtual[1].Select(); VIRTUAL::SetSymbolBase(sb); Virtual[2].Select(); VIRTUAL::SetSymbolBase(sb); //minFreezeLevel = _minFreezeLevel*_Point; minStopLevel = _minStopLevel*_Point; Virtual[tester1].Select(); MathTick.Ticker();// 매트 모드에서 모든 틱을 Strategy(MqlTick &Tick)에 공급합니다. } #endif double ret_val=0; for (int v = 0 ; v <= VIRTUAL::Total(); v++){ if(Virtual[v].Select()){ if(v > 0){ VIRTUAL::Stop(); #ifdef _MathTick_ // MathTick으로 실행하면 틱 파일에서 기호 매개변수를 읽습니다. 매트 모드에서 테스트할 경우 if(MathTick.isMath){ VIRTUAL::CalcSwaps( MathTick.swapShort, MathTick.swapLong, 0, MathTick.swap3days ); }틱 파일에서 //스왑 else{VIRTUAL::CalcSwaps( _Symbol, 0 );} #else VIRTUAL::CalcSwaps( _Symbol, 0 );//스왑 계산 - 모든 거래에는 하나의 스왑이 있습니다. 즉, 2개 이상의 다른 상품이 있는 경우 두 상품 모두 메인 심볼의 스왑을 갖습니다. #endif }// 테스터에서와 같이 마지막 틱 가격으로 불완전한 거래를 청산합니다. if( !isOptimization){QuickReport("report_"+(string)v, true, v,false,true);} Print((string)v+" AccountBalance = ",AccountBalance(), " AccountEquity = ",AccountEquity()); double prib=AccountBalance()-balInit; ret_val += prib; // }} return ret_val;//를 입력하여 계산 결과를 비교합니다. } bool isNewHour (datetime &t){ static int next_h=-1; if(t < next_h){ return false; } else { next_h = (GetHour0(t)+1)*3600;return true;}} int GetHour0 (datetime &t){return((int)( t / 3600));}//1971년 1월 1일부터 현재 시간
이 예는 서로 다른 거래를 하는 2개의 가상 머신을 생성합니다. 짝수 시간에는 한 테스터가 매수하고, 홀수 시간에는 다른 테스터가 매도합니다.
테스터가 두 명인 복잡한 예제이지만, 한 명의 테스터로 작업해야 하는 경우 단순화할 수 있습니다.
MQ 테스터를 선택하고 가상 테스터의 결과와 비교하여 계산의 정확성을 제어 할 수도 있습니다. 다양한 커미션이 있고 가상 테스터에는 하나의 변형만 프로그래밍되어 있기 때문에 커미션만 일치하지 않을 수 있습니다(
).
MetaQuotes Ltd에서 러시아어로 번역함.
원본 코드: https://www.mql5.com/ru/code/65821
SAR ADX Signal
모바일 알림이 있는 SAR ADX 신호, MT4 버전에서 재작성(소스를 더 이상 찾을 수 없음). 다시 칠할 수 있는 지표이므로 사용 시 주의하세요.
EMA_BB_VA
적응형(볼린저 밴드에 따라 다름) 지수이동평균(호세 실바가 조정한 BB 변동성).