MetaTrader4
현재 수익 기반의 수익 실현 전략 - MetaTrader 4 활용하기
서론 대부분의 자동매매 프로그램, 즉 EA는 매수 가격으로부터의 핍 거리 기준으로 수익 실현을 합니다. 하지만 EA Perceptron에서 사용하는 코드는 현재 수익을 기반으로 합니다. 이런 방식은 여러 개의 포지션을 열어두고 있는 경우에도 매수 마법 번호를 기준으로 총 현재 수익을 쉽게 관리할 수 있게 해줍니다. 여러 개의 봇 인스턴스 또는 서로 다른 EA를 동시에 사용하는 경우 특히 유용하죠. 제 친구 추가하시고 최신 소식도 받아보세요! 이 코드를 사용하면 핍을 기준으로 한 수익 실현에서 발생할 수 있는 여러 문제를 해결할 수 있습니다. 예를 들어, 핍 기반의 수익 실현은 브로커의 슬리피지에 따라 변동할 수 있어 수익이 제한될 수 있습니다. 현재 수익을 기준으로 하는 코드를 사용하면 이러한 문제를 피하고 거래에 대한 더 많은 제어를 할 수 있습니다. 현재 수익을 기반으로 한 수익 실현 설정 방법에 대해 더 알고 싶다면, EA SwingBot의 코드를 참고하실 수 있습니다. … 총 주문 수 계산하기 같은 마법 번호를 가진 모든 열려 있는 주문의 총 수를 계산하는 코드부터 시작해볼까요? 마법 번호는 트레이더나 EA가 주문에 부여하는 고유 식별자입니다. 이 코드는 변수 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++;
}
}
} … 현재 수익 계산하기 코드는 두 개의 변수를 초기화합니다: ProfittoMinimo와 Profit. ProfittoMinimo는 이 수준에서 수익 실현을 활성화하는 데 사용되며, 값은 계좌의 통화로 표현됩니다. Profit 변수는 같은 마법 번호를 가진 모든 열린 포지션의 현재 수익을 누적하는 데 사용됩니다. 변수 StopLoss는 손절매 용도로 사용됩니다. 코드는 OrdersTotal() 함수를 사용하여 모든 열린 포지션을 반복하는 for 루프를 사용합니다. 각 열린 포지션에 대해, 해당 주문을 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의 경우, MagicNumber 필터를 제거하여 총 주문에 대한 기능을 유지할 수 있습니다.
{
Profit += OrderProfit();
}
}
} 최소 수익은 외부 변수로 설정하고 EA 옵션에서 구성할 수 있습니다: … 수익 도달 시 포지션 닫기 코드는 OrdersTotal() 함수를 사용하여 모든 열린 주문을 반복하는 for 루프를 사용합니다. 루프는 마지막 주문에서 시작하여 첫 번째 주문까지 거슬러 올라갑니다. 각 주문에 대해, 해당 거래를 OrderSelect() 함수로 선택합니다. 선택된 거래가 현재 차트와 같은 기호를 가지고 있고, OP_BUY 타입이며 코드에 지정된 동일한 마법 번호를 가진 경우, 해당 거래의 Profit이 ProfittoMinimo보다 크거나 같은지 확인합니다. 그렇다면 OrderClose() 함수를 사용하여 매도 가격으로 거래를 종료하고, 매수 주문이 종료되었다는 메시지를 출력합니다. 유사하게, 선택된 거래가 현재 차트와 같은 기호를 가지고 있고, OP_SELL 타입이며 코드에 지정된 동일한 마법 번호를 가진 경우, 해당 거래의 Profit이 ProfittoMinimo보다 크거나 같은지 확인합니다. 그렇다면 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) // 주문은 현재 주문의 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));
}
}
} … 결론 이 코드는 수익 실현을 기반으로 한 모든 포지션 종료 전략에 유용할 수 있으며, 현재 수익 증가를 기반으로 한 트레일링 스톱과 결합할 수도 있습니다. 또한, 여러 엑스퍼트 어드바이저를 사용할 경우에도 유용합니다. MagicNumber에 대한 if 조건을 제외하면, 모든 활성 EA로부터 열린 모든 포지션을 동시에 관리할 수 있는 일반적인 수익 실현 수준을 설정할 수 있습니다.
2023.10.27