如何在不计算最低持仓买入和最高持仓卖出的情况​​下平仓?

问题描述

enter image description here

我设法获得最高的、全部的和利润..不能获得最低的.. 对于最低我们可以使用 MathMin(lowest,OrderOpenPrice()) 吗? 仍然坚持如何通过保持最高(卖出)和最低(买入)未平仓头寸来平仓

assign_column_number
double HighestOpenPrice(int m)
{
   double highest=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TradES))
         continue;
      if(OrderType()==m && m==0 && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
         highest=MathMax(highest,OrderOpenPrice());
      if(OrderType()==m && m==1 && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
         highest=MathMax(highest,OrderOpenPrice());
   }
   return(highest);
}
double TotalOpenProfit(int direction)
{
   double result = 0;
   for(int i=OrdersTotal()-1; i>=0; i--)  
   {
      if(!OrderSelect(i,MODE_TradES)) continue;
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if((direction < 0 && OrderType() == OP_BUY) || (direction > 0 && OrderType() == OP_SELL)) continue;
      result += OrderProfit()+OrderSwap()+OrderCommission();
   }
   return(result);
} 

解决方法

您可以在不迭代所有订单的情况下执行此操作。如果在您的策略中,最新订单在买入的情况下具有最高价格或在卖出的情况下具有最低价格,您可以简单地分配发送新订单时的票号到全局变量。例如:

//Global variables
int lastSellTicket = 0; 
int lastBuyTicket = 0;

和订单发送案例(例如销售

int ticket = OrderSend(Symbol(),OP_SELL,lot,Bid,"Sell",magic);
if(ticket > 0) {
    lastSellTicket = ticket;
}
else{
    Print("Error send order. Error code: ",GetLastError());
}

如果不是最新的订单(而是最高/最低价),您可以做同样的事情,但在发送订单之前,使用最高/最低OrderOpenPrice()和当前开仓价之间的比较。 示例(购买):

double lastBuyOpenPrice = -1;
if(OrderSelect(lastBuyTicket,SELECT_BY_TICKET)){
    lastBuyOpenPrice = OrderOpenPrice();
}
int ticket = OrderSend(Symbol(),OP_BUY,Ask,"Buy",magic);
if(ticket > 0 ) {
    if(Ask > lastBuyOpenPrice ){ //If current open price is greater than the latest one
        lastBuyTicket = ticket;
    }
}
else{
    Print("Error send order. Error code: ",GetLastError());
}

然后,在您的 TotalOpenProfitCustomCloseAll 函数中添加逻辑以避免计算/关闭这些最新订单:

if(OrderTicket() != lastSellTicket || OrderTicket() != lastBuyTicket){
    //your logic...
}