안녕하세요, 트레이더 여러분! 오늘은 MetaTrader 4에서 사용할 수 있는 매력적인 EA에 대해 이야기해볼게요. 이 EA의 가장 큰 장점은 주문 수를 세는 기능입니다.
int OrdersCounter() { int counter=0; //--- for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) // 이 EA로 개설된 주문인지 확인 { //--- 브레이크 이븐이 발생했는지 확인 /* 매수의 경우, 손절매가 개설 가격 이상인 경우만 해당. 대기 주문이 있을 경우에는 적합하지 않습니다. 매수와 매도에만 적합합니다.*/ double XBreakeven = OrderType()==OP_BUY ? OrderStopLoss() >= OrderOpenPrice() : OrderStopLoss() <= OrderOpenPrice(); if(!XBreakeven) // 브레이크 이븐이나 트레일링 스톱이 발생하지 않았을 경우 { counter++; // 포지션 수 세기 } } return counter; }
여기서 우리는 브레이크 이븐이나 트레일링 스톱이 발생하지 않은 주문만을 세고 있습니다. 즉, 개설 가격을 보호하지 않은 모든 주문을 세고 있다는 것이죠.
double XBreakeven = OrderType()==OP_BUY ? OrderStopLoss() >= OrderOpenPrice() : OrderStopLoss() <= OrderOpenPrice(); if(!XBreakeven) // 브레이크 이븐이나 트레일링 스톱이 발생하지 않았을 경우
이렇게 세어놓은 값을 통해 최대 포지션 수를 제한할 수 있습니다. 저의 경우, 한 번에 하나의 주문만 설정해 두었습니다.
if(OrdersCounter()<MaximumOrders) 브레이크 이븐이 발생하면 이 함수는 해당 주문을 세지 않게 됩니다. 예를 들어, 하나의 포지션만 있을 때, 카운팅 결과는 0이 되므로 새로운 매도 주문을 열 수 있게 되는 것이죠.
이 기능이 없었다면 브레이크 이븐을 설정하는 것도 힘들었을 것입니다.
void BreakEvenFunction() { //--- for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { // 매수의 경우, 입찰가가 개설 가격 + 브레이크 이븐 핍스보다 높을 때 double xHybrid = OrderType()==OP_BUY ? (Bid>OrderOpenPrice()+BreakevenPips*_Point && OrderStopLoss()<OrderOpenPrice()) : (Ask<OrderOpenPrice()-BreakevenPips*_Point && OrderStopLoss()>OrderOpenPrice()); /* 매수의 경우, 손절매가 개설 가격 이상일 때만 해당. 매도는 반대입니다. */ if(xHybrid) { bool modfy = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrNONE); } } }
이제 여러분도 이 기능을 시도해 보세요!