새 빌드 604의 테스터가 올바르게 작동하지 않음 - 페이지 4

 

509 및 604에서 테스트하기 위해 이 간단한 EA를 만들었습니다. 둘 다 MQ 데모 계정 444 동일한 서버에서 동일한 날짜에 백테스트합니다.

  • EA는 대체 매수 매도 매수 매도 거래를 만듭니다.
  • 고정 SL/TP. 계정 잔액 을 기준으로 로트 크기 조정. 아래 소스 코드.
  • 509는 509에서 컴파일되고 509에서 테스트되었습니다.
  • 600은 604에서 컴파일되고 604에서 테스트되었습니다.
전략 테스터 보고서
EA 509 테스트
MetaQuotes-새로운 MT4 테스트(빌드 509)

상징 EURUSD(유로 vs 미국 달러)
기간 1시간(H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
모델 모든 틱(사용 가능한 모든 최소 시간 프레임을 기반으로 한 가장 정확한 방법)
테스트 중인 바 1384 모델링된 진드기 1448514 모델링 품질 46.42%
불일치 차트 오류 0
초기 보증금 10000.00
총 순이익 -1199.25 총 이익 20200.90 총 손실 -21400.15
이익률 0.94 예상 수익 -8.75
절대 드로다운 2515.20 최대 드로다운 3725.52 (33.23%) 상대적인 하락 33.23% (3725.52)
총 거래 137 숏포지션(원 %) 68 (41.18%) 롱 포지션(원 %) 69 (44.93%)
이익 거래(전체의 %) 59 (43.07%) 손실 거래(총 %) 78 (56.93%)
가장 큰 이익 거래 394.33 손실 무역 -337.74
평균 이익 거래 342.39 손실 무역 -274.36
최고 연속 우승(금전적 이익) 4 (1494.97) 연속 손실 (돈 손실) 12 (-3337.77)
최대 연속 이익(승수) 1494.97 (4) 연속 손실(손실 횟수) -3337.77 (12)
평균 연속 우승 2 연속 손실 2
평균 연속 우승 2 연속 손실 2

 
EA 600+ 테스트
MetaQuotes-새로운 MT4 테스트(빌드 604)

상징 EURUSD(유로 vs 미국 달러)
기간 1시간(H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
모델 모든 틱(사용 가능한 모든 최소 시간 프레임을 기반으로 한 가장 정확한 방법)
테스트 중인 바 1384 모델링된 진드기 1459801 모델링 품질 46.42%
불일치 차트 오류 0
초기 보증금 10000.00 확산 현재 (6)
총 순이익 -1985.08 총 이익 19147.44 총 손실 -21132.52
이익률 0.91 예상 수익 -14.81
절대 드로다운 2677.75 최대 드로다운 4021.28 (35.45%) 상대적인 하락 35.45% (4021.28)
총 거래 134 숏포지션(원 %) 67 (40.30%) 롱 포지션(원 %) 67 (44.78%)
이익 거래(전체의 %) 57 (42.54%) 손실 거래(총 %) 77 (57.46%)
가장 큰 이익 거래 394.33 손실 무역 -337.74
평균 이익 거래 335.92 손실 무역 -274.45
최고 연속 우승(금전적 이익) 4 (1494.97) 연속 손실 (돈 손실) 12 (-3336.50)
최대 연속 이익(승수) 1494.97 (4) 연속 손실(손실 횟수) -3336.50 (12)
평균 연속 우승 2 연속 손실 2
 
//========================================================================
//|                                                      Test EA 509.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"

//========================================================================
  int start()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return(0);
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return(0);
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 509 Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 
//========================================================================
//|                                                     Test EA 600+.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"
#property version   "1.00"
#property strict
//========================================================================
  void OnTick()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return;
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return;
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 600+ Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 

509 그래프:

604 그래프:

 

그들은 지난 분기를 제외하고 동일한 테스트를 실행하는 것으로 보입니다. 제 생각에는 동일한 서버에서 베타 테스트 버전을 실행하고 있었기 때문이라고 생각합니다(다른 데모 계정 이 있음에도 불구하고) 아마도 간격이 있을 수 있는 라이브 피드 데이터가 테스트를 방해하고 있을 것입니다. 차트 기록을 삭제하고 두 터미널에서 동일한 차트 기록을 다운로드한 다음 테스트를 다시 실행하겠습니다.

편집: 나는 그것이 그 자체로 재판이 될 것이라는 것을 알고 있었을 것입니다. MQ에 1974년으로 거슬러 올라가는 1분 차트 데이터가 있다는 것은 좋은 일이지만 나는 그것을 모두 원하지 않았습니다!! PC에 실리콘 밸리의 절반이 필요할 정도로 전혀 또는 너무 많이 가질 수 없는 것과 같습니다!! 내 터미널은 현재 700mb RAM *rollseyes*를 실행 중입니다.

 
SDC :

그들은 지난 분기를 제외하고 동일한 테스트를 실행하는 것으로 보입니다. 제 생각에는 동일한 서버에서 베타 테스트 버전을 실행하고 있었기 때문인 것 같습니다(다른 데모 계정이기는 하지만). 아마도 간격이 있을 수 있는 라이브 피드 데이터가 테스트를 방해하고 있을 것입니다. 차트 기록을 삭제하고 두 터미널에서 동일한 차트 기록을 다운로드한 다음 테스트를 다시 실행하겠습니다.

편집: 나는 그것이 그 자체로 재판이 될 것이라는 것을 알고 있었을 것입니다. MQ에 1974년으로 거슬러 올라가는 1분 차트 데이터가 있다는 것은 좋은 일이지만 나는 그것을 모두 원하지 않았습니다!! PC에 실리콘 밸리의 절반이 필요할 정도로 전혀 또는 너무 많이 가질 수 없는 것과 같습니다!! 내 터미널은 이제 700mb RAM *rollseyes*를 실행 중입니다.


안녕하세요, M15 및 M1 테스트를 시도해 볼 수 있습니까? 이전 mq4에서 새 코드로 코드를 변환했습니까? 새로운 mq4로 변환하여 기존의 복잡한 mq4 EA로 시도해 주시겠습니까?

내부 및 사용자 지정 표시기 를 포함하여 datetime 등과 같은 다른 데이터 유형을 포함합니다. 이 코드에 사용된 표시기를 볼 수 없습니다.

604의 가능한 문제는 표시기 및 기타 숫자에 대해 일부 숫자 정밀도가 손실된다는 것입니다.

두 환경에서 변수의 정확한 값을 비교하기 위해 숫자 테스트 방법을 개발해야 합니다...

 

아마도 문제의 근본 원인은 아니지만 60x에서 어딘가에 ResetLastError()를 포함해야 합니까? (while 루프 내부의 첫 번째 명령?)

 
cbalta :


안녕하세요, M15 및 M1 테스트를 시도해 볼 수 있습니까? 이전 mq4에서 새 코드로 코드를 변환했습니까? 새로운 mq4로 변환하여 기존의 복잡한 mq4 EA로 시도해 주시겠습니까?

내부 및 사용자 지정 표시기를 포함하여 datetime 등과 같은 다른 데이터 유형을 포함합니다. 이 코드에 사용된 표시기를 볼 수 없습니다.

604의 가능한 문제는 표시기 및 기타 숫자에 대해 일부 숫자 정밀도가 손실된다는 것입니다.

두 환경에서 변수의 정확한 값을 비교하기 위해 숫자 테스트 방법을 개발해야 합니다...


게시한 것과 동일한 소스 코드를 사용하고 509 메타에디터에서 509 테스트 코드를 컴파일했으며 604 메타에디터에서 600 소스 코드를 컴파일했습니다. 둘 사이의 유일한 차이점은 새 것이 void OnTick()을 사용한다는 것뿐입니다. 시작()

나는 이것이 가능한 한 적은 수의 알려지지 않은 기본 테스트가 되기를 원했기 때문에 어떤 지표도 사용하지 않았습니다. 테스트 매개변수 를 넓히려면 지표 및 기타 거래 기준을 사용하도록 EA를 수정할 수 있습니다.

 
ydrol :

아마도 문제의 근본 원인은 아니지만 60x에서 어딘가에 ResetLastError()를 포함해야 합니까? (while 루프 내부의 첫 번째 명령?)

할 필요가 있는지 잘 모르겠습니다. 찾아보겠습니다. EA가 오류 없이 테스트를 실행했기 때문에 새 터미널에서 GetLastError()가 어떻게 수행되었는지 보지 못했습니다. 내 RAM 사용량(최대 1GB 이상)은 히스토리 센터에서 다운로드 버튼을 눌렀을 때 메타쿼트 데모 서버에서 다운로드한 수십 년의 1분 차트 데이터로 인해 일부를 삭제해야 했습니다.
사유: