당사 팬 페이지에 가입하십시오
- 조회수:
- 120
- 평가:
- 게시됨:
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
업데이트:
제가 전문가 어드바이저를 최적화하는 데 사용하는 이 라이브러리를 대폭 업데이트했습니다. 이 버전은 간소화되었지만 자동화하고 싶은 일상적인 작업을 포함하도록 쉽게 확장할 수 있습니다. 예를 들어, 프롭 펌 챌린지 실패 후 거래 제한을 추가하거나 챌린지 성공 또는 실패 후 월요일에 거래를 재개할 수 있습니다.
이 라이브러리의 모든 변경 사항과 추가 사항은 코드 마지막에 설명되어 있습니다. 이 프레임워크는 유연하며 거래 제한을 위한 더 복잡한 로직을 추가하거나, 거래를 예약하거나, 최적화 결과에 따라 성능을 미세 조정하는 등 특정 요구에 맞게 조정할 수 있습니다.
일상적인 작업에 맞게 자유롭게 커스터마이징할 수 있습니다!
이 라이브러리는 메타트레이더 5에서 EA(Expert Advisor)를 테스트하기 위해 설계되었으며, 특히 독점적인 회사 거래 요건에 중점을 두고 있습니다. 목표는 트레이더가 특정 수익 및 손실 임계값을 충족해야만 회사의 도전 과제를 통과할 수 있는 거래 환경을 시뮬레이션하는 것입니다. EA는 지정된 수익 또는 손실 비율에 도달할 때마다 초기값으로 재설정하여 계좌 잔고를 조정하며, 많은 프롭 업체의 규칙을 모방합니다.
다음은 잔고 재설정 라이브러리를 사용하는 EA(Expert Advisor)의 전체 구조입니다. 이 설정은 #include 지시문을 통해 기능을 깔끔하게 분리하면서 잔고 재설정 로직을 EA에 직접 통합합니다:
#include <BalanceReset.mqh> // 잔액 재설정 라이브러리 포함 //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ int OnInit() { InitBalance(); // 시작 잔액 초기화 return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ //| 전문가 틱 기능| //+------------------------------------------------------------------+ void OnTick() { CheckBalanceAndReset(); // 임계값에 따른 잔액 확인 및 재설정 } //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { PrintBalanceResetResults(); // 잔액 재설정 결과를 로그에 출력 }
주요 기능
-
수익 및 손실 임계값 조정
- 라이브러리에서는 백테스팅 프로세스 중에 잔액 재설정을 트리거하는 손익 임계값을 조정할 수 있습니다. 이러한 임계값은 입력 매개변수를 사용하여 변경할 수 있으므로 테스트 조건을 쉽게 사용자 지정할 수 있습니다.
예시:
input double profit_threshold = 8.0; // 수익 임계값, 기본값은 8%입니다. input double loss_threshold = -6.0; // 손실 임계값, 기본값은 -6%입니다.
2. 초기 잔액 초기화
- 이 기능은 테스트 시작 시점의 초기 계좌 잔액을 저장합니다. 초기 시작 잔액을 캡처하기 위해 처음 틱할 때만 실행됩니다.
예시:
void InitBalance() { initial_balance = AccountInfoDouble(ACCOUNT_BALANCE); // 초기 잔액 저장 }
3. 밸런스 재설정 로직
- 라이브러리의 핵심은 초기 잔고와 현재 잔고를 비교하여 수익 또는 손실 비율을 계산하는 것입니다. 수익이 지정된 임계값(예: 8%)을 초과하거나 손실이 임계값(예: -6%)을 초과하면 잔액이 초기값으로 재설정됩니다.
- 수익금 재설정: 수익 임계값에 도달하면 초과 금액을 출금하여 잔액을 초기값으로 되돌리기 위해 TesterWithdrawal 기능을 사용합니다.
- 손실 초기화: 손실 임계값이 트리거되면 잔액을 초기 금액으로 복원하는 데 TesterDeposit 기능이 사용됩니다.
예시:
void CheckBalanceAndReset() { double current_balance = AccountInfoDouble(ACCOUNT_BALANCE); if (initial_balance == 0) { initial_balance = current_balance; // 첫 번째 틱, 초기 잔액 저장 } double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0; if (profit_percentage >= profit_threshold) { double withdrawal_amount = current_balance - initial_balance; if (TesterWithdrawal(withdrawal_amount)) { successful_resets++; ArrayResize(reset_times, ArraySize(reset_times) + 1); reset_times[ArraySize(reset_times) - 1] = TimeCurrent(); Print("Profit reached. Balance has been reset to the initial value."); } } if (profit_percentage <= loss_threshold) { double deposit_amount = initial_balance - current_balance; if (TesterDeposit(deposit_amount)) { unsuccessful_resets++; ArrayResize(reset_times, ArraySize(reset_times) + 1); reset_times[ArraySize(reset_times) - 1] = TimeCurrent(); Print("Loss reached. Balance has been reset to the initial value."); } } }
4. 결과 로깅
- 테스트가 완료되면 이 기능은 성공적인 재설정 횟수(수익 및 손실 모두)와 각 재설정 사이의 일수를 출력합니다. 이를 통해 테스트 중 잔고 재설정이 얼마나 자주 발생했는지에 대한 인사이트를 얻을 수 있습니다.
예시:
void PrintBalanceResetResults() { PrintFormat("Number of successful profit resets: %d", successful_resets); PrintFormat("Number of successful loss resets: %d", unsuccessful_resets); for (int i = 1; i < ArraySize(reset_times); i++) { int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // 하루에 86400초 PrintFormat("Days between reset %d and reset %d: %d days", i, i + 1, days_between_resets); } }

결론
이 라이브러리는 일반적인 전용 트레이딩 펌 요구사항을 준수하는 트레이딩 환경을 시뮬레이션하는 데 도움이 됩니다. 사전 정의된 손익 임계값이 충족되면 잔고를 재설정하여 트레이더가 전략을 보다 효과적으로 테스트하고 프롭 펌 규칙에 따라 EA의 성과를 분석할 수 있습니다.
코드 변경 및 추가에 대한 설명:
새 코드에는 이전 코드에 비해 몇 가지 개선 및 추가 사항이 포함되어 있습니다. 다음은 추가 및 수정된 내용에 대한 자세한 설명입니다:
새로운 입력 매개변수:
-
최대 손실 및 최소 원 :
input double max_loss = 1; // 최대 손실 input double min_won = 1; // 최소 원
목적: 이 입력 파라미터를 통해 최대 허용 손실(max_loss)과 필요한 최소 수익 리셋 횟수(min_won)를 설정할 수 있습니다. 이를 통해 최적화 조건을 보다 세밀하게 제어할 수 있습니다.
추가 변수:
-
reset_status[] :
string reset_status[]; // 각 리셋의 상태를 저장하는 배열
목적: 각 잔고 재설정 이벤트의 상태("이익 재설정" 또는 "손실 재설정")를 저장하기 위해 추가된 배열입니다.
stopOptimization :
bool stopOptimization = false;
목적: 특정 조건에 따라 최적화를 중지해야 하는 시점을 나타내는 데 사용되는 플래그입니다.
badResult :
bool badResult = false; // 최적화 결과가 좋지 않음을 나타내는 플래그
목적: 최적화 결과를 바람직하지 않은 것으로 표시하는 플래그로, OnTester()의 결과에 영향을 주는 데 사용할 수 있습니다.
CheckBalanceAndReset() 의 수정 사항:
-
리셋 상태를 기록합니다:
ArrayResize(reset_status, ArraySize(reset_status) + 1); // 재설정 상태를 기록하도록 배열의 크기를 조정합니다. reset_status[ArraySize(reset_status) - 1] = "Profit reset"; // 상태 기록
목적: 수익금 리셋이 발생하면 해당 상태를 reset_status[] 배열에 기록합니다.
최적화 중지 조건으로 손실 리셋 처리하기:
if (TesterDeposit(deposit_amount)) { unsuccessful_resets++; // 실패한 손실 재설정 카운터 증가 // 재설정 시간 및 상태 기록 ArrayResize(reset_status, ArraySize(reset_status) + 1); reset_status[ArraySize(reset_status) - 1] = "Loss reset"; { stopOptimization = true; CheckStopCondition(); // 최적화를 중지해야 하는지 확인 } PrintFormat("Loss reached. Balance has been reset to the initial value."); }
목적: 손실 재설정 후 코드는 이제 unsuccessful_resets를 증가시키고, 상태를 기록하고, stopOptimization을 true로 설정하고, CheckStopCondition()을 호출하여 최적화를 중지해야 하는지 여부를 결정합니다.
새 함수 CheckStopCondition() :
void CheckStopCondition() { if(stopOptimization) { Print("Stopping current optimization pass"); badResult = true; // 결과를 불량으로 표시 TesterStop(); } }
목적: 이 함수는 stopOptimization이 참인지 확인하고, 참인 경우 결과를 불량으로 표시하고 TesterStop() 을 사용하여 현재 최적화 패스를 중지합니다.
새로운 함수 OnTester() :
double OnTester() { // 재설정 성공 횟수가 필요한 최소값보다 적거나 badResult가 설정된 경우 if(successful_resets < min_won || badResult) { Print("Optimization failed: returning a highly unfavorable result."); // 매우 불리한 결과를 반환하여 최적화 패스를 망칠 수 있습니다. return -999999; } // 성공과 실패한 재설정의 차이 계산하기 int reset_difference = successful_resets - unsuccessful_resets; // 차이가 음수인지 확인 if(reset_difference < 0) { Print("Negative difference between successful and unsuccessful resets. Returning a highly unfavorable result."); // 차이가 음수인 경우 매우 불리한 결과를 반환합니다. return -999999; } // 로그에 차액을 출력합니다. PrintFormat("Difference between successful and unsuccessful resets: %d", reset_difference); // 테스터의 결과로 차액을 반환합니다. return reset_difference; }

목적: 이 함수는 최적화 프로세스에 대한 사용자 지정 기준을 제공합니다. 재설정에 성공한 횟수가 최소 요구 사항을 충족하는지 또는 결과가 나쁜지 확인합니다. 성공한 재설정과 실패한 재설정의 차이를 계산하고 그 차이가 음수가 아닌 한 이 값을 반환하며, 이 경우 매우 불리한 결과를 반환하여 최적화 프로그램에 영향을 줍니다.

PrintBalanceResetResults()의 개선 사항:
// 각 재설정 날짜와 그 사이의 일수를 출력합니다. for(int i = 1; i < ArraySize(reset_times); i++) { // 재설정 사이의 일수 계산하기 int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // 하루에 86400초 // 재설정 날짜, 상태 및 그 사이의 날짜를 인쇄합니다. PrintFormat("Reset %d: %s (%s), Reset %d: %s (%s), Days between: %d days", i, TimeToString(reset_times[i-1], TIME_DATE), reset_status[i-1], i + 1, TimeToString(reset_times[i], TIME_DATE), reset_status[i], days_between_resets); }
목적: 이 함수는 이제 재설정 횟수뿐만 아니라 날짜, 상태, 재설정 사이의 일수 등 각 재설정 이벤트에 대한 세부 정보도 출력합니다. 이를 통해 재설정 활동에 대한 보다 포괄적인 로그를 제공합니다.
변수 초기화 및 사용:
-
초기 잔액 확인:
if(initial_balance == 0) { initial_balance = current_balance; }
목적: 첫 번째 틱 시 initial_balance가 올바르게 설정되었는지 확인합니다.
수익률 계산:
double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0;
목적: 초기 잔액 대비 수익 또는 손실 비율을 계산합니다.
추가 요약:
-
최적화 프로세스 제어:
- 이제 코드에 최대 재설정 실패 횟수를 초과하거나 최소 재설정 성공 횟수를 달성하지 못하는 등 특정 조건에 따라 최적화 프로세스를 중지하는 메커니즘이 포함됩니다.
-
향상된 로깅 및 추적:
- reset_status[]를 추가하고 PrintBalanceResetResults()에 세부 로깅을 추가하여 재설정 이벤트와 그 결과를 더 잘 추적할 수 있습니다.
-
OnTester()를 통한 옵티마이저와의 통합:
- OnTester() 를 구현함으로써 스크립트는 결과를 최적화 엔진에 다시 전달하여 사용자 지정 기준에 따라 파라미터 세트의 선택에 영향을 줄 수 있습니다.
MetaQuotes Ltd에서 영어로 번역함.
원본 코드: https://www.mql5.com/en/code/52163
TardioBot
역사적 인물인 주세페 타르디오의 이름을 딴 타르디오봇 V1.05는 삼각 차익거래 전략을 사용하는 메타트레이더 5용 전문가용 어드바이저입니다.
선형 레그 슬로프 V2
선형 회귀 알고리즘을 사용한 이동 평균.
