거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Twitter에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
조회수:
120
평가:
(5)
게시됨:
\MQL5\Include\
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

업데이트:

제가 전문가 어드바이저를 최적화하는 데 사용하는 이 라이브러리를 대폭 업데이트했습니다. 이 버전은 간소화되었지만 자동화하고 싶은 일상적인 작업을 포함하도록 쉽게 확장할 수 있습니다. 예를 들어, 프롭 펌 챌린지 실패 후 거래 제한을 추가하거나 챌린지 성공 또는 실패 후 월요일에 거래를 재개할 수 있습니다.

이 라이브러리의 모든 변경 사항과 추가 사항은 코드 마지막에 설명되어 있습니다. 이 프레임워크는 유연하며 거래 제한을 위한 더 복잡한 로직을 추가하거나, 거래를 예약하거나, 최적화 결과에 따라 성능을 미세 조정하는 등 특정 요구에 맞게 조정할 수 있습니다.

일상적인 작업에 맞게 자유롭게 커스터마이징할 수 있습니다!


이 라이브러리는 메타트레이더 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();  // 잔액 재설정 결과를 로그에 출력
}


주요 기능

  1. 수익 및 손실 임계값 조정

    • 라이브러리에서는 백테스팅 프로세스 중에 잔액 재설정을 트리거하는 손익 임계값을 조정할 수 있습니다. 이러한 임계값은 입력 매개변수를 사용하여 변경할 수 있으므로 테스트 조건을 쉽게 사용자 지정할 수 있습니다.

    예시:

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 TardioBot

역사적 인물인 주세페 타르디오의 이름을 딴 타르디오봇 V1.05는 삼각 차익거래 전략을 사용하는 메타트레이더 5용 전문가용 어드바이저입니다.

선형 레그 슬로프 V2 선형 레그 슬로프 V2

선형 회귀 알고리즘을 사용한 이동 평균.

라게르 필터 라게르 필터

존 엘러스의 저서 "주식과 선물을 위한 사이버네틱 분석: 트레이딩 향상을 위한 최첨단 DSP 기술"에 나오는 두 가지 이동평균 지표입니다.

선도적인 선도적인

존 엘러스의 저서 "주식과 선물을 위한 사이버네틱 분석: 트레이딩 향상을 위한 최첨단 DSP 기술"에 나오는 하나의 차트에 두 개의 이동평균(리드와 그 EMA 평균)을 표시한 지표입니다.