English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
TesterWithdrawal() 함수를 이용한 수익 인출 모델링

TesterWithdrawal() 함수를 이용한 수익 인출 모델링

MetaTrader 5테스터 | 5 7월 2021, 16:04
152 0
Andriy Voitenko
Andriy Voitenko

소개

투기적 거래의 목적은 이익을 얻는 것입니다. 일반적으로 무역 시스템을 테스트 할 때 다음 항목을 제외하고 모든 측면을 분석합니다. 즉, 소득의 일부를 생활비로 인출합니다. 거래가 거래자에게 유일한 자금원이 아니더라도 거래 기간 (월, 분기, 연도) 동안 계획된 수익에 대한 질문이 조만간 발생합니다. MQL5의 TesterWithdrawal() 함수는 계정에서 돈을 인출하는 것을 모방하기 위한 것입니다.


1. 무엇을 확인할 수 있습니까?

위험한 상황에서 초과 자금 인출을 암시하는 거래 시스템 뿐만 아니라 거래에 대한 의견이 있습니다. 총 자본의 극히 일부만이 무역 계좌에 있습니다. 이것은 예기치 않은 상황의 원인으로 모든 돈을 잃지 않도록 보호하는 것입니다.

실제로는 자금 관리 전략의 한 예입니다. 관리를 위한 투자를 받는 많은 펀드는 각 거래자에게 특정 할당량 (총 자본의 일부)을 제공하지만 전체 자본은 거래자에게 제공되지 않습니다. 즉, 오픈 포지션의 양에 대한 제한 외에도 트레이더가 명령 할 수 있는 자본에도 제한이 있습니다. 결국 각 거래자는 위험한 투기를 만들기 위해 자산의 작은 부분에만 액세스 할 수 있습니다.

또 다른 문제는 테스트 중에 획득한 자산을 공격적으로 재투자 하는 것입니다. 트레이더는 최적화 과정에서 균형과 주식 라인을 수직으로 올리는 것을 목표로 합니다. 모든 사람은 돈의 각 수준에 특정한 규칙이 있다는 것을 이해합니다. 100 랏을 거래 할 때 0.1 랏 거래에서 수익을 내는 시스템이 좋다고 믿을 이유가 없습니다.

또한 심리적 문제가 있습니다. 모든 실무 거래자는 계좌에서 일정 수준의 돈으로 거래 시스템 작업에 개입하겠다고 고백할 수 있지만 그렇게하지 않겠다고 약속했습니다. 따라서 이러한 관점에서 초과분 인출은 거래의 안정 요인입니다.

MQL5에는 Expert Advisor 테스트 중 자금 인출을 구현하기 위한 함수가 있습니다. 다음 섹션은 그것에 전념합니다.


2. 함수 사용 방법은?

TesterWithdrawal() 함수는 전략 테스터의 계정에서 돈을 인출하는 모델링에만 사용되며 일반 모드에서 Expert Advisor의 작업에는 영향을 주지 않습니다. 

bool TesterWithdrawal(double money);

입력 매개 변수 money는 입금 통화로 인출할 금액을 지정하기 위한 것입니다. 반환된 값으로 작업의 성공 여부를 감지할 수 있습니다. 테스트 중에 수행된 각 철회 작업은 그림 1과 같이 "저널 (Journal)" 탭과 "결과 (Results)"탭에 해당 항목과 함께 표시됩니다.

테스트 중 자산의 성공적인 인출에 대한 항목

 그림 1. 테스트 중 자산의 성공적인 인출에 대한 항목

인출 규모가 자유 마진(free margin) 크기를 초과하여 인출이 수행되지 않은 경우, "저널"에 다음 항목이 나타납니다.

 테스트 중 실패한 인출 작업에 대한 항목

그림 2. 테스트 중 실패한 인출 작업에 대한 항목

이 함수를 호출하면 현재 잔액자본의 크기가 인출된 금액만큼 감소합니다. 그러나 전략 테스터는 손익을 계산할 때 인출을 고려하지 않고 그림 3과 같이 "인출"비율로 총 인출 합계를 계산합니다.

보고서의 총 인출 합계 비율

그림 3. 보고서의 총 인출 합계 비율

거래 계좌에 자산을 예금 하는 역함수는 아직 MQL5에 존재하지 않으며 구현될 가능성이 낮다는 점에 유의해야 합니다. 지속적인 예금 증가가 필요한 시스템이 필요한 사람은 누구입니까?

다음 섹션에서는 거래 전략이 구현 된 것 뿐만 아니라 우리가 관찰한 함수를 사용하여 자금 인출을 모델링하기위한 툴킷이 있는 Expert Advisor의 예를 다룹니다.


3. 테스트를 위한 기니피그

  
우리는 다소 간단한 Expert Advisor에서 테스트를 수행할 것입니다. Expert Advisor의 운영 원칙에 관심이 있는 사람들은 아래에서 거래 시스템에 대한 설명을 찾을 수 있습니다.

가격의 최대 값과 최소값은 PERIOD 입력 변수를 사용하여 설정된 5M 데이터의 지정된 기간에 계산됩니다. 계산된 레벨은 지지선 (CalcLow 변수) 및 저항선 (CalcHigh 변수)이 있는 수평 채널을 형성합니다. 보류 중인 주문은 채널 경계에 배치됩니다. 게임은 채널 피어싱에서 재생됩니다.

가격이 INSIDE_LEVEL 입력 변수 값 이상으로 채널 내부로 들어가면 보류 주문이 됩니다. 또한 한 방향으로 하나의 포지션 또는 보류 중인 주문만 열 수 있습니다.

레벨이 다시 계산 될 때 채널이 좁아지고 가격이 여전히 그 안에 머무르면 보류 중인 주문이 시장 가격에 더 가깝게 이동합니다. 대기 주문 이동 단계는 ORDER_STEP 입력 변수를 사용하여 설정합니다.

거래 수익의 크기는 TAKE_PROFIT 입력 변수에 지정되고 최대 손실은 STOP_LOSS를 사용하여 지정됩니다. 

Expert Advisor는 TRAILING_STOP 입력 변수에 지정된 단계로 손절매의 이동을 의미합니다.

고정 랏 또는 예금의 백분율로 계산된 랏 모두로 거래 할 수 있습니다. 랏 값은 LOT 입력 변수를 사용하여 설정하고 랏 계산 방법은 LOT_TYPE 변수를 사용하여 설정합니다. 랏를 수정할 가능성이 있습니다 (LOT_CORRECTION = true). 고정된 랏로 거래하고 그 크기가 포지션을 개설 할 수 있는 크기를 초과하는 경우, 랏 크기는 가장 가까운 허용 값으로 수정됩니다.

Expert Advisor의 알고리즘 튜닝을 위해 로그 작성 함수를 켤 수 있습니다 (WRITE_LOG_FILE = true). 따라서 모든 거래 작업에 대한 항목이 log.txt 텍스트 파일에 기록됩니다.

자금 인출을 관리하기 위해 Expert Advisor에 여러 입력 변수를 추가해보겠습니다.

첫 번째 매개 변수는 자산 인출 가능성의 플래그로 사용됩니다.

input bool WDR_ENABLE = true; // Allow withdrawal

 두 번째 매개 변수는 인출 주기를 결정합니다.

enum   wdr_period
  {
   days      = -2, // Day
   weeks     = -1, // Week 
   months    =  1, // Month  
   quarters  =  3, // Quarter
   halfyears =  6, // Half a year    
   years     = 12  // Year    
  };
input wdr_period WDR_PERIOD = weeks; // Periodicity of withdrawals
 세 번째 매개 변수는 인출할 금액을 설정합니다.
input double WDR_VALUE = 1; // Amount of money to be withdrawn

네 번째 매개 변수는 인출할 금액의 계산 방법을 결정합니다.

enum lot_type 
   {
      fixed,  // Fixed
      percent // Percentage of deposit
   };
input lot_type WDR_TYPE = percent; // Method of calculation of the withdrawal amount

계좌에서 일회성 인출 ​​금액을 계산하기 위해 wdr_val ue를 사용합니다. wdr_summa 변수는 인출할 총 금액을 계산하는데 사용됩니다.

또한 wdr_count 변수를 사용하여 성공적인 인출 작업의 총 수를 계산합니다. 이러한 변수의 값은 테스트 결과에 대한 자체 보고서를 작성하는데 필요합니다. 돈을 인출하는 모든 함수는 아래 함수에서 구현됩니다.

//--- Function of withdrawing assets from the account
//+------------------------------------------------------------------+
bool TimeOfWithDrawal()
//+------------------------------------------------------------------+
  {
   if(!WDR_ENABLE) return(false); // exit if withdrawal is prohibited
   
   if( tick.time > dt_debit + days_delay * DAY) // periodic withdrawals with specified period
     {
      dt_debit = dt_debit + days_delay * DAY;
      days_delay = Calc_Delay();// Updating the value of period-number of days between withdrawal operations
      
      if(WDR_TYPE == fixed) wdr_value = WDR_VALUE;
      else wdr_value = AccountInfoDouble(ACCOUNT_BALANCE) * 0.01 * WDR_VALUE;

      if(TesterWithdrawal(wdr_value))
        {
         wdr_count++;
         wdr_summa = wdr_summa + wdr_value;
         return(true);
        }
     }
   return(false);
  }

이제 최적화 모드에서 테스트 할 수 있도록 Expert Advisor를 준비해야 합니다. 최적화 매개 변수가 여러 개 있으므로 필요한 매개 변수를 선택할 입력 변수를 선언해보겠습니다.

enum opt_value
{
   opt_total_wdr,      // Total sum of withdrawal
   opt_edd_with_wdr,   // Drawdown with consideration of withdrawal
   opt_edd_without_wdr // Drawdown without consideration of withdrawal
};
input opt_value OPT_PARAM = opt_total_wdr; // Optimization by the parameter

또한 Expert Advisor에 또 다른 중요한 함수를 추가해야 합니다 - OnTester(); 이 함수의 반환된 값은 최적화 기준을 결정합니다.

//--- Displaying information about testing
//+------------------------------------------------------------------+
double OnTester(void)
//+------------------------------------------------------------------+
  {
   //--- Calculation of parameters for the report
   CalculateSummary(initial_deposit);
   CalcEquityDrawdown(initial_deposit, true, false);
   //--- Creation of the report
   GenerateReportFile("report.txt");

   //--- Returned value is the optimization criterion
   if (OPT_PARAM == opt_total_wdr) return(wdr_summa);
   else return(RelEquityDrawdownPercent);
  }

다음 섹션에서는 Expert Advisor의 테스트에 대한 자세한 고려 사항에 대해 설명합니다.


4. Expert Advisor 테스트

테스트의 무결성을 위해 먼저 인출 함수가 비활성화된 Expert Advisor의 테스트 결과를 얻어야 합니다. 이를 수행하려면 테스트하기 전에 그림 5와 같이 "인출 허용" 매개 변수를 false로 설정하십시오.

테스트 결과 반복에 관심이있는 사람들을 위해 Expert Advisor의 입력 매개 변수 설정 및 값은 아래 그림 4와 5에 나와 있습니다.

Expert Advisor 테스트를 위한 설정

그림 4. Expert Advisor 테스트를 위한 설정

 인출 함수가 비활성화된 Expert Advisor의 매개 변수

 그림 5. 인출 함수가 비활성화된 Expert Advisor의 매개 변수

테스트가 끝날 때 얻은 결과는 그림 6과 7에 나와 있습니다.

 Expert Advisor의 6개월 테스트 작업에 대한 잔액 변경

  그림 6. Expert Advisor의 6 개월 테스트 작업에 대한 잔액 변경 

 Expert Advisor의 작업 결과표

그림 7. Expert Advisor의 작업 결과표

우리에게 흥미로운 매개 변수는 형평성의 상대적인 하락입니다. 이 경우 4.75% 입니다. 

이제 자금 인출을 활성화하면 이 매개 변수가 어떻게 변경되는지 확인해보겠습니다. 인출의 양과 주기를 다르게 하여 테스트를 수행해봅시다.

그림 8은 최적화 및 철회가 활성화된 Expert Advisor의 매개 변수를 보여줍니다. 그림 9는 이러한 테스트의 결과를 보여줍니다.

최적화 및 인출이 활성화된 Expert Advisor의 매개 변수

 그림 8. 최적화 및 인출이 활성화된 Expert Advisor의 매개 변수

자본의 상대적 삭감 계산 결과

그림 9. 자본의 상대적 삭감 계산 결과

인출이 전혀 비활성화된 경우보다 인출주기가 1일 또는 1주일 때 인출주기가 낮기 때문에 테스트 결과는 약간 놀랍습니다.

또한 일일 삭감 라인이 100%로 증가한 다음 8%로 돌아가 계속 내려갑니다. 결과를 올바르게 해석하려면 전략 테스터에서 상대적 자본 감소가 계산되는 방식을 알아야 합니다. 이것이 다음 섹션의 주제입니다.


5. 자기 자본 삭감 계산

호기심 많은 사람들은 전략 테스터에서 형평성 계산이 수행되는 방식과 이 매개 변수를 스스로 계산하는 방법을 알고 싶어합니다.

Expert Advisor에서 TesterWithdrawal() 함수를 사용하지 않는 경우 분석하는 매개 변수의 계산은 MetaTrader 4의 계산과 차이가 없습니다. "전문가 테스트 보고서의 숫자가 의미하는 것" 문서에 설명되어 있습니다. 소스 코드와 결과 테스터 보고서의 기타 여러 매개 변수는 "전문가 테스트 결과를 평가하는 방법" 문서에 나와 있습니다.

전략 테스터의 상대적 및 최대 감소 계산에 대한 시각적 설명은 아래의 그림 10 입니다.

인출을 고려하지 않고 자기 자본의 삭감 계산 

그림 10. 인출을 고려하지 않고 자기 자본의 삭감 계산

작업하는 동안 전략 테스터는 주식의 현재 최대 및 최소값을 결정합니다. 차트에 파란색 확인 표시가 있는 새 주식 최대 값이 표시되면 최대 및 최소 인출이 다시 계산되고 가장 큰 값이 저장되어 결과 보고서에 표시됩니다.

중요한 것은 테스트가 끝날 때 매개 변수를 마지막으로 다시 계산하는 것입니다. 마지막으로 등록되지 않은 자산의 극한값이 최대 손실 가치를 제공하는 상황이 발생할 수 있기 때문입니다. 삭감의 최대값 변경은 각각 파란색과 빨간색으로 표시됩니다. 회색은 새로운 최대 값이 올 때마다 등록된 삭감을 나타냅니다.

TesterWithDrawal() 함수의 호출은 전략 테스터에서 삭감 계산 알고리즘을 변경한다는 점에 유의해야 합니다. 이전 변형과의 차이점은 새로운 주식 최대 값이 올 때 뿐만 아니라 자산 인출시에도 인출 값을 다시 계산한다는 것입니다. 시각적 데모는 그림 11에 있습니다.

인출을 고려한 삭감 계산 

 그림 11. 인출을 고려한 삭감 계산

자산을 인출하는 순간은 위 그림에서 녹색 확인 표시와 함께 표시됩니다. 돈 인출은 다소 빈번하기 때문에 차트의 극한값에 의해 결정되는 최대 인출값을 고정할 수 없습니다. 결과적으로 인출을 고려한 결과 인출은 고려하지 않은 것보다 낮을 수 있습니다 (그림 9 참조).

돈 인출이 이익을 얻은 결과 자본의 성장보다 훨씬 크면 낮은 인출률로 이어질 수 있습니다. 이 상황이 차트에 극값이 형성되는 것을 허용하지 않는 이유는 다음과 같습니다. 그리고 한계에서는 상대적인 삭감 텐트가 0이 되는 직선 하강 선처럼 보일 것입니다. 이 효과는 그림 9에 표시된 차트에서 일일 인출이 1000$ 이상으로 시작되었습니다.

아래에 설명된 대로 전체 알고리즘을 단일 프로 시저 CalcEquityDrawdown에 결합하여 MQL5에서 자기 자본의 최대 및 상대적 인출 계산을 재현해보겠습니다.

double RelEquityDrawdownPercent; // relative drawdown of equity in percentage terms
double MaxEquityDrawdown;        // maximal drawdown of equity
//--- Calculation of the drawdown of equity
//+------------------------------------------------------------------+
void CalcEquityDrawdown(double initial_deposit, // initial deposit
                        bool finally)          // flag of calculation that registers extremums
//+------------------------------------------------------------------+
  {
   double drawdownpercent;
   double drawdown;
   double equity;
   static double maxpeak = 0.0, minpeak = 0.0;

   //--- exclusion of consideration of profit withdrawals for the calculation of drawdowns
   if(wdr_ignore) equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
   else equity = AccountInfoDouble(ACCOUNT_EQUITY);

   if(maxpeak == 0.0) maxpeak = equity;
   if(minpeak == 0.0) minpeak = equity;

   //--- check of conditions of extremum
   if((maxpeak < equity)||(finally))
    {
      //--- calculation of drawdowns
      drawdown = maxpeak - minpeak;
      drawdownpercent = drawdown / maxpeak * 100.0;

      //--- Saving maximal values of drawdowns
      if(MaxEquityDrawdown < drawdown) MaxEquityDrawdown = drawdown;
      if(RelEquityDrawdownPercent < drawdownpercent) RelEquityDrawdownPercent = drawdownpercent;
    
      //--- nulling the values of extremums
      maxpeak = equity;
      minpeak = equity;
    }

   if(minpeak > equity) minpeak = equity;
 }

계산을 정확하게 유지하려면 새로운 틱이 올 때마다 아래에 제공된 매개 변수를 사용하여 Expert Advisor의 본문에서 위에 작성된 절차를 호출해야 합니다.

CalcEquityDrawdown(initial_deposit, false);

또한 삭감의 신뢰할 수 있는 값을 얻으려면 OnTester() 함수의 Expert Advisor 끝에서 finally = true계산이 끝났음을 나타내는 매개 변수를 사용하여 호출해야 합니다. 그리고 현재 고정되지 않은 삭감이 등록 된 최대값보다 크면 최대값을 대체하고 결과 보고서에 표시됩니다.

CalcEquityDrawdown(initial_deposit, true);

인출 알고리즘이 Expert Advisor에서 구현 된 경우 인출을 올바르게 계산하려면 인출 할 때마다 finally=true 매개 변수와 함께 CalcEquityDrawdown 함수를 호출해야 합니다. 호출 순서는 다음과 같습니다.

//--- Withdrawing assets and calculating drawdowns of equity
if(TimeOfWithDrawal())
    CalcEquityDrawdown(initial_deposit, true);
else 
    CalcEquityDrawdown(initial_deposit, false);

위에서 설명한 방법론의 정확성을 확인하기 위해 계산된 데이터와 전략 테스터의 데이터를 비교해보겠습니다. 이를 위해 OnTester() 함수가 확인하려는 매개 변수의 값을 반환하도록 해야 합니다. RelEquityDrawdownPercent 변수에 저장된 지분의 상대적 삭감입니다.

"매개 변수에 의한 최적화" 입력 매개 변수에 대해 "인출을 고려한 도면" 값을 설정하여 Expert Advisor의 코드에 구현됩니다. 나머지 매개 변수는 그림 8과 같이 변경하지 않고 그대로 두어야 합니다. 이러한 테스트의 결과는 그림 12에 나와 있습니다.

 계산 결과와 전략 테스터의 데이터 비교

 그림 12. 계산 결과와 전략 테스터의 데이터 비교

얻어진 결과를 비교해 보면 상대적인 삭감 계산 알고리즘이 정확함을 알 수 있다.

삭감 계산에 또 다른 변형을 추가해보겠습니다. 여기서 우리는 자금 인출이 주식에 미치는 영향을 배제할 것입니다. 자본의 상대적 삭감 변화를 관찰합니다.

이를 위해 Expert Advisor에 변수를 추가하고 Expert Advisor의 매개 변수를 계산할 때 인출을 고려할 필요가 있는지 여부를 결정하는 데 사용합니다.

bool wdr_ignore; // calculation of rate without the consideration of withdrawals

wdr_ignore의 값은 다음과 같습니다. '매개 변수에 의한 최적화'변수가 '인출을 고려하지 않고 그리기'로 설정된 경우 true입니다.

그 외에도 아래 그림과 같이 해당 매개 변수의 처리를 추가하여 삭감 CalcEquityDrawdown의 계산 절차를 수정해야 합니다.

if (wdr_ignore) 
  equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
else 
  equity = AccountInfoDouble(ACCOUNT_EQUITY);

이제 모든 것이 삭감의 새로운 가치를 얻을 준비가 되었습니다. 새로운 계산 알고리즘을 활성화하여 테스트를 수행해 보겠습니다. 테스트 결과는 그림 13에 나와 있습니다.

인출을 고려하지 않고 인출 계산 결과 

그림 13. 인출을 고려하지 않고 인출 계산 결과

결과는 자산 인출 사실이나 인출 금액이 인출에 의존하지 않음을 보여줍니다. 따라서 TesterWithDrawal() 함수의 영향을 받지 않는 순수한 요소를 얻었습니다. 그러나 이러한 종류의 계산을 사용하려면 실제 값이 변경되고 이러한 요소가 테스터의 결과 보고서에서 정확하지 않기 때문에 손익 값을 수정해야 합니다.

이익, 손실 및 비율 (수익성)을 ​​계산하고 얻은 값을 텍스트 파일에 보고서로 저장해봅시다. 나열된 매개 변수의 계산 절차는 다음과 같습니다.

double SummaryProfit;     // Total net profit
double GrossProfit;       // Gross profit
double GrossLoss;         // Gross loss
double ProfitFactor;      // Profitability
//--- Calculation of parameters for the report
//+------------------------------------------------------------------+
void CalculateSummary(double initial_deposit)
//+------------------------------------------------------------------+
  {
   double drawdownpercent, drawdown;
   double maxpeak = initial_deposit, 
          minpeak = initial_deposit, 
          balance = initial_deposit;
          
   double profit = 0.0;
   
   //--- Select entire history
   HistorySelect(0, TimeCurrent());
   int trades_total = HistoryDealsTotal();

   //--- Searching the deals in the history
   for(int i=0; i < trades_total; i++)
     {
      long ticket = HistoryDealGetTicket(i);
      long type   = HistoryDealGetInteger(ticket, DEAL_TYPE);

      //--- Initial deposit is not considered
      if((i == 0)&&(type == DEAL_TYPE_BALANCE)) continue;

      //--- Calculation of profit
      profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) +
                 HistoryDealGetDouble(ticket, DEAL_COMMISSION) +
               HistoryDealGetDouble(ticket, DEAL_SWAP);
      
      balance += profit;

      if(minpeak > balance) minpeak = balance;

      //---
      if((!wdr_ignore)&&(type != DEAL_TYPE_BUY)&&(type != DEAL_TYPE_SELL)) continue;

      //---
      if(profit < 0) GrossLoss   += profit;
      else           GrossProfit += profit;
      SummaryProfit += profit;
     }

   if(GrossLoss < 0.0) GrossLoss *= -1.0;
   //--- Profitability
   if(GrossLoss > 0.0) ProfitFactor = GrossProfit / GrossLoss;
  }

보고서를 텍스트 파일로 생성하는 함수는 다음과 같습니다.

//--- Forming the report  
//+------------------------------------------------------------------+
void GenerateReportFile(string filename)
//+------------------------------------------------------------------+
  {
   string str, msg;

   ResetLastError();
   hReportFile = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_TXT|FILE_ANSI);
   if(hReportFile != INVALID_HANDLE)
     {

      StringInit(str,65,'-'); // separator

      WriteToReportFile(str);
      WriteToReportFile("| Period of testing: " + TimeToString(first_tick.time, TIME_DATE) + " - " +
                        TimeToString(tick.time,TIME_DATE) + "\t\t\t|");
      WriteToReportFile(str);

      //----
      WriteToReportFile("| Initial deposit \t\t\t"+DoubleToString(initial_deposit, 2));
      WriteToReportFile("| Total net profit    \t\t\t"+DoubleToString(SummaryProfit, 2));
      WriteToReportFile("| Gross profit     \t\t\t"+DoubleToString(GrossProfit, 2));
      WriteToReportFile("| Gross loss      \t\t\t"+DoubleToString(-GrossLoss, 2));
      if(GrossLoss > 0.0)
         WriteToReportFile("| Profitability       \t\t\t"+DoubleToString(ProfitFactor,2));
      WriteToReportFile("| Relative drawdown of equity \t"+
                        StringFormat("%1.2f%% (%1.2f)", RelEquityDrawdownPercent, MaxEquityDrawdown));

      if(WDR_ENABLE)
        {
         StringInit(msg, 10, 0);
         switch(WDR_PERIOD)
           {
            case day:     msg = "day";    break;
            case week:    msg = "week";  break;
            case month:   msg = "month";   break;
            case quarter: msg = "quarter"; break;
            case year:    msg = "year";     break;
           }

         WriteToReportFile(str);
         WriteToReportFile("| Periodicity of withdrawing       \t\t" + msg);

         if(WDR_TYPE == fixed) msg = DoubleToString(WDR_VALUE, 2);
         else msg = DoubleToString(WDR_VALUE, 1) + " % from deposit " + DoubleToString(initial_deposit, 2);

         WriteToReportFile("| Amount of money withdrawn     \t\t" + msg);
         WriteToReportFile("| Number of withdrawal operations \t\t" + IntegerToString(wdr_count));
         WriteToReportFile("| Withdrawn from account          \t\t" + DoubleToString(wdr_summa, 2));
        }

      WriteToReportFile(str);
      WriteToReportFile(" ");

      FileClose(hReportFile);
     }
  }

이 함수의 실행 결과는 그림 14와 같이 정보로 채워진 텍스트 파일이 생성됩니다.

 GenerateReportFile 프로 시저에 의해 생성된 보고서의 파일

 그림 14. GenerateReportFile 프로 시저에 의해 생성된 보고서의 파일

이 함수는 파일의 기존 내용에 각각의 새 보고서를 추가하는 방식으로 작성됩니다. 이 사실 때문에 우리는 Expert Advisor의 다른 입력 매개 변수와 테스트 결과의 값을 비교할 수 있습니다.

보고서에서 알 수 있듯이 인출을 고려하지 않고 계산하면 (하단 표) 총 순이익은 테스터의 계산 (상단 표)에 비해 인출 금액만큼 적고 총 손실이 큽니다. 전략 테스터에서 자산을 인출 할 때 손익의 실제 가치를 얻으려면 총 순이익에서 "인출" 매개 변수의 값을 빼서 총 손실에 더해야 합니다.


6. 결과 분석

수행한 모든 실험 결과를 바탕으로 몇 가지 결론을 내릴 수 있습니다.

  1. TesterWithDrawal() 함수를 사용하면 전략 테스터에서 삭감을 계산하는 알고리즘이 변경됩니다. 여러 Expert Advisor 중 하나가 돈을 인출하는 메커니즘을 포함하는 경우 상대적인 인출의 가치로 비교하는 것은 올바르지 않을 수 있습니다. 이 함수를 사용하면 지정된 자본 삭감 비율에 따라 정기적으로 계정에서 얼마나 많은 돈을 가져올 수 있는지를 실용적인 계산을 할 수 있습니다.
  2. 이 함수의 사용은 Expert Advisor의 작업 안정성을 확인하고 자금 관리를 담당하는 코드의 로직을 조정하는 데 사용되는 거래의 종합적인 불안정 요인으로 구현될 수 있습니다. Expert Advisor가 균형 또는 형평성 수준을 기반으로 결정을 내리는 논리를 가지고 있는 경우 이 함수를 사용하면 테스트 및 조정을 위한 추가 기회가 제공됩니다.
  3. 인출을 고려하지 않고 상대적인 삭감을 재계산할 때 글에 설명 된 알고리즘을 사용하면 이 함수의 사용에 영향을 받지 않는 상대 삭감의 순수한 값을 얻을 수 있습니다.


결론 

이 글에서는 계정에서 자산을 인출하는 프로세스를 모델링하기 위한 TesterWithdrawal() 함수의 사용법과 전략 테스터에서 자산 인출 계산 알고리즘에 미치는 영향에 대해 설명합니다.

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/131

파일 첨부됨 |
testexpert.mq5 (33.95 KB)
Expert Advisor 작성시 MQL5 Standard Trade Class 라이브러리 사용 Expert Advisor 작성시 MQL5 Standard Trade Class 라이브러리 사용
`이 글에서는 거래를 하기 전에 포지션 청산 및 수정, 주문 보류 및 삭제 및 마진 확인을 구현하는 Expert Advisors를 작성하는 데 MQL5 표준 라이브러리 거래 클래스의 주요 함수를 사용하는 방법을 설명합니다. 또한 트레이드 클래스를 사용하여 주문 및 거래 세부 정보를 얻는 방법을 시연했습니다.
특정 매직 넘버에 의한 총 포지션 볼륨 계산을 위한 최적 방법 특정 매직 넘버에 의한 총 포지션 볼륨 계산을 위한 최적 방법
이 글에서는 지정된 기호와 매직 넘버의 총 포지션 볼륨 계산 문제를 고려합니다. 제안 된 방법은 거래 내역에서 필요한 최소한의 부분만 요청하고 총 포지션이 0 일 때 가장 가까운 시간을 찾아 최근 거래로 계산을 수행합니다. 클라이언트 터미널의 전역 변수 작업도 고려됩니다.
Expert Advisor 작업 중 균형 곡선의 기울기 조절 Expert Advisor 작업 중 균형 곡선의 기울기 조절
무역 시스템에 대한 규칙을 찾고 Expert Advisor에서 프로그래밍하는 것은 작업의 절반입니다. 어쨋든 거래 결과가 누적되므로 Expert Advisor의 운영을 수정해야 합니다. 이 기사에서는 균형 곡선의 기울기를 측정하는 피드백을 생성하여 Expert Advisor의 성능을 향상시킬 수있는 접근 방식 중 하나를 설명합니다.
MQL5 객체 지향 프로그래밍 접근 방식을 사용한 Expert Advisor 작성하기 MQL5 객체 지향 프로그래밍 접근 방식을 사용한 Expert Advisor 작성하기
이 글은 "초보자를 위한 MQL5에서 Expert Advisor를 작성하기 위한 단계별 가이드" 글에서 수행 한 작업에 대한 객체 지향 접근 방식에 초점을 맞추고 있습니다. 대부분의 사람들은 이것이 어렵다고 생각하지만, 이 글을 다 읽고 나면 객체 지향 기반의 Expert Advisor를 직접 작성할 수 있을 것임을 확신하고 싶습니다.