大家好!今天我们来聊聊如何在交易中利用盈亏平衡点来优化我们的交易策略。这个小小的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) // 如果盈亏平衡和跟踪止损尚未生效'
通过这个计数器,我们可以限制最大持仓数量。在本例中,我们将其设置为一次只能有1个订单。
if(OrdersCounter()<MaximumOrders)
因此,每当达到盈亏平衡时,这个函数将忽略计数。由于我们在这个例子中只有一个持仓,它将返回零,然后我们就可以开新的订单,整个过程就这样循环下去。
当然,这一切的实现都得益于我创建的盈亏平衡功能。
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); } } }
你们也试试看吧!