안녕하세요, 트레이더 여러분! 오늘은 여러분의 계좌 잔액의 특정 비율에 도달했을 때 모든 열린 주문을 닫는 기능을 가진 코드를 소개해 드리려고 합니다.
이 코드는 주문의 매직 넘버를 입력하고(모든 주문을 제어하려면 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 ); } //+------------------------------------------------------------------+