시스템트레이딩 게시글

현재 수익 기반의 Take Profit – MetaTrader 4 자동매매 시스템

첨부파일
47010.zip (1.03 KB, 다운로드 0회)

소개

대부분의 자동매매 시스템은 구매 가격으로부터의 피프스 거리를 기준으로 이익 실현(테이크 프로핏)을 설정합니다. 하지만 EA Perceptron의 코드는 현재의 수익을 주로 기준으로 삼고 있습니다. 이 접근법은 여러 개의 포지션을 열고 있는 경우에도 총 현재 수익을 쉽게 관리할 수 있게 해줍니다. 만약 여러 개의 봇 인스턴스나 다양한 자동매매 시스템을 동시에 사용하는 경우, 매직 넘버를 기준으로 총 수익을 모니터링할 수 있습니다. 저를 친구 추가하고 최신 소식을 따라가세요!

이 코드를 사용하면 피프스 기준의 이익 실현에서 발생할 수 있는 문제들을 해결할 수 있습니다. 예를 들어, 피프스 기준의 이익 실현은 브로커의 슬리피지에 따라 달라질 수 있어 이익을 제한할 수 있습니다. 하지만 현재 수익을 기준으로 하는 코드를 사용하면 이러한 문제를 피하고 거래에 대한 더 많은 제어를 할 수 있습니다.

현재 수익 기반의 이익 실현을 설정하는 방법에 대해 더 알고 싶다면 EA SwingBot의 코드를 참조하시면 됩니다.


총 주문 수 계산

같은 매직 넘버를 가진 열려 있는 주문의 총 수를 계산하는 코드부터 시작해 보겠습니다.

매직 넘버는 트레이더나 자동매매 시스템(Expert Advisor)이 주문에 부여하는 고유 식별자입니다.

이 코드는 변수를 total_orders로 초기화하여 0으로 설정합니다. 그 후, for 루프를 사용해 모든 열려 있는 주문을 반복하며 OrderSelect() 함수를 통해 각 주문을 선택합니다. 주문이 성공적으로 선택되면 total_orders 변수를 1 증가시킵니다.

//----------------- 
   int total_orders = 0;
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderMagicNumber() == MagicNumber)
         {
         total_orders++;
        }
        }
     }


현재 수익 계산하기

이 코드는 두 개의 변수를 초기화합니다: ProfittoMinimoProfit. ProfittoMinimo는 이익 실현을 활성화하는 수준을 나타내며, 이 값은 계좌의 통화로 표현됩니다. Profit 변수는 같은 매직 넘버를 가진 모든 열려 있는 포지션의 현재 수익을 누적하는 데 사용됩니다. 변수 StopLoss는 손절매에 사용됩니다.

코드는 OrdersTotal() 함수를 사용하여 모든 열려 있는 포지션을 반복합니다. 각 포지션에 대해 OrderSelect() 함수를 사용하여 해당 주문을 선택합니다. 주문이 성공적으로 선택되고 같은 매직 넘버를 가진 경우, 주문의 수익을 Profit 변수에 추가합니다.

      double ProfittoMinimo = 3; // 목표 수익
      double Profit = 0; // 현재 수익
      
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderMagicNumber() == MagicNumber) // 여러 EA의 경우 매직 넘버 필터를 제거하여 모든 주문에 대한 기능을 유지할 수 있습니다.
              {
               Profit += OrderProfit();
              }
           }
        }


최소 수익은 외부 변수로 설정할 수 있으며, EA 옵션에서 구성할 수 있습니다:

최소 수익


수익 도달 시 포지션 종료

이 코드는 OrdersTotal() 함수를 사용하여 모든 열려 있는 주문을 반복합니다. 루프는 마지막 주문에서 첫 번째 주문까지 진행됩니다. 각 주문에 대해 해당 거래를 OrderSelect() 함수를 사용하여 선택합니다.

선택된 거래가 현재 차트와 같은 심볼을 가지고 있고, OP_BUY 유형이며, 코드에 지정된 매직 넘버와 동일하다면, 거래의 ProfitProfittoMinimo 이상인지 확인합니다. 그렇다면 OrderClose() 함수를 사용하여 매도 가격에서 거래를 종료하고, 구매 주문이 종료되었다는 메시지를 출력합니다.

마찬가지로 선택된 거래가 현재 차트와 같은 심볼을 가지고 있고, OP_SELL 유형이며, 코드에 지정된 매직 넘버와 동일하다면, 거래의 ProfitProfittoMinimo 이상인지 확인합니다. 그렇다면 OrderClose() 함수를 사용하여 매수 가격에서 거래를 종료하고, 판매 주문이 종료되었다는 메시지를 출력합니다.

      for(int e = OrdersTotal() - 1; e >= 0; e--)
        {
         if(OrderSelect(e, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber) // 주문은 현재 진행 중인 주문의 매직 넘버와 일치할 때만 수정됩니다.
              {
               if(Profit >= ProfittoMinimo)
                 {
                  OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // 매도 가격
                  Print("구매 주문 종료됨", Profit, " - 최소 손절매: ",MarketInfo(Symbol(), MODE_STOPLEVEL));
                 }
          }

            if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
              {
               if(Profit >= ProfittoMinimo)
                 {
                  OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // 매수 가격
                  Print("판매 주문 종료됨", Profit, " - 최소 손절매: ",MarketInfo(Symbol(), MODE_STOPLEVEL));
                 }
          }
        }
        }


결론

이 코드는 이익 실현에 기반한 모든 포지션 종료 전략에 유용할 수 있으며, 현재 수익 증가에 기반한 트레일링 스톱과 결합할 수도 있습니다. 또한, 여러 개의 자동매매 시스템에서도 유용합니다. 매직 넘버에 대한 if 조건을 제외하면, 모든 활성 EA에서 모든 열려 있는 포지션을 동시에 제어할 수 있는 일반적인 이익 실현 수준을 설정할 수 있습니다.



    댓글 (0)