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

MathTicker - 수학 모드의 눈금 생성기 - MetaTrader 5용 라이브러리

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

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 테스터에 의한 디스크 마모에 비해 거의 중요하지 않습니다.

단점:

BidAsk 변형의 속도는 EAToMath와 비슷합니다. 다른 변형은 더 많은 데이터를 포함하거나 추가 ZIP 압축이 있기 때문에 속도가 느립니다.

사용 기능:

표준 함수 Symbol(), Digits( ) (=4), Point() (=0.0001)는 테스트 중인 심볼과 관련이 없는 기본값을 생성하므로 전략에서 사용할 수 없습니다. 대신 파일에서 읽은 값에 재정의되는 _Symbol, _Digits, _Point를 사용합니다. 또한 기록된 심볼의 값이 포함된 새로운 상수 _TickSize _TickValue가 추가되었으며, 이는 예금 통화에서 수익, 수수료 및 스왑을 올바르게 계산하는 데 필요합니다.

틱을 저장할 때 선택한 테스트 기간의 작업 순서:

  1. 실제 틱, 필요한 상품 및 테스트 날짜별로 테스트 모드를 선택합니다. 작업 변수를 저장 중 하나로 설정하고 틱 저장 옵션을 선택합니다. 테스터를 시작합니다. 그러면 지정된 폴더에 틱이 포함된 파일이 생성됩니다.

  2. 작업 변수를 Run_Strategy로 설정합니다. 나중에 비교할 수 있도록 실제 틱으로 모드를 종료할 수 있습니다. 테스터를 시작합니다. 계산은 파일이 아닌 실제 틱에 의해 이루어집니다. 결과를 얻습니다.


  3. 테스트 모드를 수학적 계산으로 설정합니다. 테스터를 시작합니다. 파일에서 틱으로 계산이 이루어집니다. 2단계의 결과와 비교합니다. 동일해야 하지만 몇 배 더 빨라야 합니다.

아카이브 작업 순서:

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

  4. 테스터를 시작합니다. 계산은 필요한 연간 파일에서 틱으로 이루어집니다. 작업이 하나의 파일이 아니라 여러 개의 파일로 수행되기 때문에 파일을 열고 닫는 데 시간이 걸리기 때문에 약간 느립니다. 예를 들어, 3년간의 틱을 생성하는 데 1.7초가 아니라 2.7초가 걸립니다.
  5. 아래 전문가 조언자가 얻은 틱의 합계는 첫 번째 틱의 작은 값만큼 다를 수 있습니다. 실제 틱 모드에서 사용자 지정 캐릭터로 테스트할 때 첫 번째 틱은 매도 또는 매수만 생성합니다(둘 다 저장하지 않은 경우). 아카이브에서 테스트할 때는 이전 틱에서 둘 다 복원됩니다.

작업 속도를 추정하는 가장 간단한 전문가 조언자의 예입니다:

#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

EMA_ATR_VA EMA_ATR_VA

적응 지수 이동 평균 - ATR 지표를 기반으로 호세 실바가 조정한 ATR 변동성입니다.

EMA_STD_VA EMA_STD_VA

표준 편차 값에 따른 적응 지수 평균.

SAR ADX Signal SAR ADX Signal

모바일 알림이 있는 SAR ADX 신호, MT4 버전에서 재작성(소스를 더 이상 찾을 수 없음). 다시 칠할 수 있는 지표이므로 사용 시 주의하세요.

EMA_BB_VA EMA_BB_VA

적응형(볼린저 밴드에 따라 다름) 지수이동평균(호세 실바가 조정한 BB 변동성).