2017-12-18 112 views
0

我使用此代碼檢查訂單是否存在於我的代碼中的buy1和sell1價格。 某些訂單會執行兩次。 不應該發生,因爲我正在檢查是否有相同的公益訂單。 任何人都能看到最新的錯誤?mql4檢查訂單是否存在多次執行

bool CheckBuyOrder1(double buy1_tp){ 
for(int i = 0 ; i < OrdersTotal() - 1 ; i++) { 
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
    if(OrderTakeProfit() == buy1_tp && OrderComment() == "buy") 
return(true); 
} 
return(false); 
} 

bool CheckSellOrder1(double sell1_tp){ 
for(int i = 0 ; i < OrdersTotal() - 1 ; i++) { 
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
    if(OrderTakeProfit() == sell1_tp && OrderComment() == "sell") 
return(true); 
} 
return(false); 
} 

int totalOrders = OrdersTotal(); 

void OnTick() 
{ 
if(totalOrders != OrdersTotal()){ 
double vbid = MarketInfo("EURUSD",MODE_BID); 
double bid = NormalizeDouble(vbid, 3); 
double market_buy_tp = bid; 
double buy1= bid + 0.002; 
double buy1_tp= bid + 0.003; 
if(CheckOpenOrders1(market_buy_tp)==false && CheckBuyOrder1(buy1_tp)==false){ 
int ticket9=OrderSend(Symbol(),OP_BUYSTOP,Lots,buy1,MaxSlippage,0,buy1_tp,"buy",16380,0,clrGreen); 
} 

double market_sell_tp = bid; 
double sell1 = bid - 0.003; 
double sell1_tp= bid - 0.004; 
if(CheckOpenOrdersSell1(market_sell_tp)==false && CheckSellOrder1(sell1_tp)==false){ 
int ticket19=OrderSend(Symbol(),OP_SELLSTOP,Lots,sell1,MaxSlippage,0,sell1_tp,"sell",16380,0,clrGreen); 
} 
totalOrders = OrdersTotal(); 
}} 

回答

0

每當你嘗試與其他一些double比較的OrderTakeProfit()值 - 牢記四捨五入和浮點表示。

E.g.如果您需要將0.10與另一個double進行比較,您認爲它爲0.10 - 您可能會驚訝於0.10爲0.09(9)6或0.10(0)4

這就是爲什麼有時您可能找不到這樣的訂單。

double o = Point/2; // initialize in OnInit(), declare in global vars 
... 

bool CheckOrderBuy(double tp){ 
    for (int i = OrdersTotal() - 1; i >= 0; i--){ 
     if (!OrderSelect(i, SELECT_BY_POS))continue; 
     if ( fabs(OrderTakeProfit() - tp) < o 
      &&  OrderType()    == OP_BUY 
       ) return true; 
    } 
    return false; 
} 
+0

啊非常感謝! 所以我必須正常化所有雙打? – Sander

+0

你可能正常化,但我認爲正常化只有在發送訂單時纔有必要。更好的辦法是確保兩個雙打相差小於半個勾號(或者甚至是十分之一的勾號) –