시스템트레이딩 게시글

드로우다운이 특정 비율에 도달하면 모든 주문 닫기 - 메타트레이더 4를 위한 EA

첨부파일
14582.zip (2.27 KB, 다운로드 2회)

안녕하세요, 트레이더 여러분! 오늘은 여러분의 계좌 잔액의 특정 비율에 도달했을 때 모든 열린 주문을 닫는 기능을 가진 코드를 소개해 드리려고 합니다.

이 코드는 주문의 매직 넘버를 입력하고(모든 주문을 제어하려면 0 입력), 코드 로직이 해당 비율에 도달했을 때 주문을 닫도록 설정할 수 있습니다.

사용 방법은 간단합니다. DD_close 함수를 호출하기만 하면 됩니다!

아래는 이 코드와 함께 제공되는 EA의 헤더 파일입니다.

// 이 옵션을 사용하려면, 함수 호출 : ( DD_close )
//+------------------------------------------------------------------+
//|                          전역 변수                            |
//+------------------------------------------------------------------+
bool Close_All_V;
//+------------------------------------------------------------------+
//|                          메인 함수                            |
//+------------------------------------------------------------------+
// DD:               여기서 DD 비율, 100은 주문을 닫지 않음을 의미합니다.
// Magic_Number:     EA의 매직 넘버, 모든 주문을 제어하려면 0 입력.
void DD_close(int DD,int Magic_Number) 
  {
   if(DD(Magic_Number)>=DD)
      Close_All_V=true;
   if(Close_All_V)
      Close_All(Magic_Number);
  }
//+------------------------------------------------------------------+
//|                          주문 닫기 확인                             |
//+------------------------------------------------------------------+
void Check_Close(int Check_Number) // 주문 닫기 확인
  {
   if(Check_Number<0) Print("주문 닫기 실패: ",ErrorDescription(GetLastError()));
   else Close_All_V=false;
  }
//+------------------------------------------------------------------+
//|                          모든 주문 닫기                               |
//+------------------------------------------------------------------+
void Close_All(int M_N)
  {
   int Loop=0;
   for(int i=0; Loop<OrdersTotal(); i++)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         Loop++;
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()==M_N || OrderMagicNumber()==0)
              {
               if(OrderType()==OP_BUY)
                  Check_Close(OrderClose(OrderTicket(),OrderLots(),Bid,100,clrNONE));
               if(OrderType()==OP_SELL)
                  Check_Close(OrderClose(OrderTicket(),OrderLots(),Ask,100,clrNONE));
              }
        }
  }
//+------------------------------------------------------------------+
//|                          손실 계산                          |
//+------------------------------------------------------------------+
double Loss(int M_N)
  {
   double re=0;
   int Loop=0;
   for(int i=0; Loop<OrdersTotal(); i++)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         Loop++;
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()==M_N || OrderMagicNumber()==0)
               re=re+OrderProfit();
        }
   return re * -1;
  }
//+------------------------------------------------------------------+
//|                  드로우다운 비율 계산                   |
//+------------------------------------------------------------------+
double DD(int M_N)
  {
   return ( 100 / AccountBalance ( ) ) * Loss ( M_N );
  }
//+------------------------------------------------------------------+

연관 포스트

댓글 (0)