ERROR CODE 4051
jakevicary: OrderSend error #4051 invalid function parameter value
RefreshRates(); if(type == OP_BUY) price = Ask; else if(type == OP_SELL) price = Bid; ⋮ ticket = OrderSend(Symbol(), type, NormalizeDouble(volume, LotDigits), NormalizeDouble(price, Digits()), MaxSlippage, 0, 0, ordername, MagicNumber, 0, clr); if(ticket < 0){ ⋮ Sleep(OrderWait*1000);
If the send fails, you keep trying with the same values. You must RefreshRates and get new prices after sleep.- Use the debugger or print out your variables, including _LastError and find out why.
double TradeSize; ⋮ ticket = myOrderSend(OP_SELL, price, TradeSize, "");
heres the updated code
all runs well except the last few trades every time
i have attached an image for referance, the last few never have S/L for some reason and blows the account
//+------------------------------------------------------------------+ //| Strategy: ADR1203.mq4 | //| Created with EABuilder.com | //| http://eabuilder.com | //+------------------------------------------------------------------+ #property copyright "Created with EABuilder.com" #property link "http://eabuilder.com" #property version "1.00" #property description "" #include <stdlib.mqh> #include <stderror.mqh> int LotDigits; //initialized in OnInit int MagicNumber = 549266; int PendingOrderExpirationMinutes = 1; //pending order expiration double TradeSize = 0.5; int MaxSlippage = 3; //adjusted in OnInit double MaxSL = 20; bool crossed[4]; //initialized to true, used in function Cross bool Send_Email = true; int MaxOpenTrades = 1000; int MaxLongTrades = 1000; int MaxShortTrades = 1000; int MaxPendingOrders = 1000; bool Hedging = true; int OrderRetry = 4; //# of retries if sending order returns error int OrderWait = 5; //# of seconds to wait if sending order returns error double myPoint; //initialized in OnInit void DeleteByDuration(int sec) //delete pending order after time since placing the order { if(!IsTradeAllowed()) return; bool success = false; int err; int total = OrdersTotal(); for(int i = total-1; i >= 0; i--) { while(IsTradeContextBusy()) Sleep(100); if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() <= 1 || OrderOpenTime() + sec > TimeCurrent()) continue; while(IsTradeContextBusy()) Sleep(100); RefreshRates(); success = OrderDelete(OrderTicket()); if(!success) { err = GetLastError(); myAlert("error", "OrderDelete failed; error #"+err+" "+ErrorDescription(err)); } } if(success) myAlert("order", "Orders deleted by duration: "+Symbol()+" Magic #"+MagicNumber); } bool Cross(int i, bool condition) //returns true if "condition" is true and was false in the previous call { bool ret = condition && !crossed[i]; crossed[i] = condition; return(ret); } void myAlert(string type, string message) { if(type == "print") Print(message); else if(type == "error") { Print(type+" | ADR1203 @ "+Symbol()+","+Period()+" | "+message); if(Send_Email) SendMail("ADR1203", type+" | ADR1203 @ "+Symbol()+","+Period()+" | "+message); } else if(type == "order") { } else if(type == "modify") { } } int TradesCount(int type) //returns # of open trades for order type, current symbol and magic number { int result = 0; int total = OrdersTotal(); for(int i = 0; i < total; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue; if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() != type) continue; result++; } return(result); } int myOrderSend(int type, double price, double volume, string ordername) //send order, return ticket ("price" is irrelevant for market orders) { if(!IsTradeAllowed()) return(-1); int ticket = -1; int retries = 0; int err; int long_trades = TradesCount(OP_BUY); int short_trades = TradesCount(OP_SELL); int long_pending = TradesCount(OP_BUYLIMIT) + TradesCount(OP_BUYSTOP); int short_pending = TradesCount(OP_SELLLIMIT) + TradesCount(OP_SELLSTOP); string ordername_ = ordername; if(ordername != "") ordername_ = "("+ordername+")"; //test Hedging if(!Hedging && ((type % 2 == 0 && short_trades + short_pending > 0) || (type % 2 == 1 && long_trades + long_pending > 0))) { myAlert("print", "Order"+ordername_+" not sent, hedging not allowed"); return(-1); } //test maximum trades if((type % 2 == 0 && long_trades >= MaxLongTrades) || (type % 2 == 1 && short_trades >= MaxShortTrades) || (long_trades + short_trades >= MaxOpenTrades) || (type > 1 && long_pending + short_pending >= MaxPendingOrders)) { myAlert("print", "Order"+ordername_+" not sent, maximum reached"); return(-1); } //prepare to send order while(IsTradeContextBusy()) Sleep(100); RefreshRates(); if(type == OP_BUY) price = Ask; else if(type == OP_SELL) price = Bid; else if(price < 0) //invalid price for pending order { myAlert("order", "Order"+ordername_+" not sent, invalid price for pending order"); return(-1); } int clr = (type % 2 == 1) ? clrRed : clrBlue; while(ticket < 0 && retries < OrderRetry+1) { ticket = OrderSend(Symbol(), type, NormalizeDouble(volume, LotDigits), NormalizeDouble(price, Digits()), MaxSlippage, 0, 0, ordername, MagicNumber, 0, clr); if(ticket < 0) { err = GetLastError(); myAlert("print", "OrderSend"+ordername_+" error #"+err+" "+ErrorDescription(err)); Sleep(OrderWait*1000); } retries++; } if(ticket < 0) { myAlert("error", "OrderSend"+ordername_+" failed "+(OrderRetry+1)+" times; error #"+err+" "+ErrorDescription(err)); return(-1); } string typestr[6] = {"Buy", "Sell", "Buy Limit", "Sell Limit", "Buy Stop", "Sell Stop"}; myAlert("order", "Order sent"+ordername_+": "+typestr[type]+" "+Symbol()+" Magic #"+MagicNumber); return(ticket); } int myOrderModify(int ticket, double SL, double TP) //modify SL and TP (absolute price), zero targets do not modify { if(!IsTradeAllowed()) return(-1); bool success = false; int retries = 0; int err; SL = NormalizeDouble(SL, Digits()); TP = NormalizeDouble(TP, Digits()); if(SL < 0) SL = 0; if(TP < 0) TP = 0; //prepare to select order while(IsTradeContextBusy()) Sleep(100); if(!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { err = GetLastError(); myAlert("error", "OrderSelect failed; error #"+err+" "+ErrorDescription(err)); return(-1); } //prepare to modify order while(IsTradeContextBusy()) Sleep(100); RefreshRates(); if(CompareDoubles(SL, 0)) SL = OrderStopLoss(); //not to modify if(CompareDoubles(TP, 0)) TP = OrderTakeProfit(); //not to modify if(CompareDoubles(SL, OrderStopLoss()) && CompareDoubles(TP, OrderTakeProfit())) return(0); //nothing to do while(!success && retries < OrderRetry+1) { success = OrderModify(ticket, NormalizeDouble(OrderOpenPrice(), Digits()), NormalizeDouble(SL, Digits()), NormalizeDouble(TP, Digits()), OrderExpiration(), CLR_NONE); if(!success) { err = GetLastError(); myAlert("print", "OrderModify error #"+err+" "+ErrorDescription(err)); Sleep(OrderWait*1000); } retries++; } if(!success) { myAlert("error", "OrderModify failed "+(OrderRetry+1)+" times; error #"+err+" "+ErrorDescription(err)); return(-1); } string alertstr = "Order modified: ticket="+ticket; if(!CompareDoubles(SL, 0)) alertstr = alertstr+" SL="+SL; if(!CompareDoubles(TP, 0)) alertstr = alertstr+" TP="+TP; myAlert("modify", alertstr); return(0); } void myOrderClose(int type, int volumepercent, string ordername) //close open orders for current symbol, magic number and "type" (OP_BUY or OP_SELL) { if(!IsTradeAllowed()) return; if (type > 1) { myAlert("error", "Invalid type in myOrderClose"); return; } bool success = false; int err; string ordername_ = ordername; if(ordername != "") ordername_ = "("+ordername+")"; int total = OrdersTotal(); for(int i = total-1; i >= 0; i--) { while(IsTradeContextBusy()) Sleep(100); if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() != type) continue; while(IsTradeContextBusy()) Sleep(100); RefreshRates(); double price = (type == OP_SELL) ? Ask : Bid; double volume = NormalizeDouble(OrderLots()*volumepercent * 1.0 / 100, LotDigits); if (NormalizeDouble(volume, LotDigits) == 0) continue; success = OrderClose(OrderTicket(), volume, NormalizeDouble(price, Digits()), MaxSlippage, clrWhite); if(!success) { err = GetLastError(); myAlert("error", "OrderClose"+ordername_+" failed; error #"+err+" "+ErrorDescription(err)); } } string typestr[6] = {"Buy", "Sell", "Buy Limit", "Sell Limit", "Buy Stop", "Sell Stop"}; if(success) myAlert("order", "Orders closed"+ordername_+": "+typestr[type]+" "+Symbol()+" Magic #"+MagicNumber); } void TrailingStopTrail(int type, double TS, double step, bool aboveBE) //set Stop Loss to "TS" if price is going your way with "step" { int total = OrdersTotal(); TS = NormalizeDouble(TS, Digits()); step = NormalizeDouble(step, Digits()); for(int i = total-1; i >= 0; i--) { while(IsTradeContextBusy()) Sleep(100); if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() != type) continue; RefreshRates(); if(type == OP_BUY && (!aboveBE || Bid > OrderOpenPrice() + TS) && (NormalizeDouble(OrderStopLoss(), Digits()) <= 0 || Bid > OrderStopLoss() + TS + step)) myOrderModify(OrderTicket(), Bid - TS, 0); else if(type == OP_SELL && (!aboveBE || Ask < OrderOpenPrice() - TS) && (NormalizeDouble(OrderStopLoss(), Digits()) <= 0 || Ask < OrderStopLoss() - TS - step)) myOrderModify(OrderTicket(), Ask + TS, 0); } } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //initialize myPoint myPoint = Point(); if(Digits() == 5 || Digits() == 3) { myPoint *= 10; MaxSlippage *= 10; } //initialize LotDigits double LotStep = MarketInfo(Symbol(), MODE_LOTSTEP); if(LotStep >= 1) LotDigits = 0; else if(LotStep >= 0.1) LotDigits = 1; else if(LotStep >= 0.01) LotDigits = 2; else LotDigits = 3; MaxSL = MaxSL * myPoint; int i; //initialize crossed for (i = 0; i < ArraySize(crossed); i++) crossed[i] = true; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int ticket = -1; double price; DeleteByDuration(PendingOrderExpirationMinutes * 60); TrailingStopTrail(OP_BUY, 5 * myPoint, 5 * myPoint, true); //Trailing Stop = trail TrailingStopTrail(OP_SELL, 5 * myPoint, 5 * myPoint, true); //Trailing Stop = trail //Close Long Positions, instant signal is tested first if(Cross(1, iMA(NULL, PERIOD_CURRENT, 10, 0, MODE_SMA, PRICE_CLOSE, 0) > iMFI(NULL, PERIOD_CURRENT, 3, 0)) //Moving Average crosses above Money Flow Index ) { if(IsTradeAllowed()) myOrderClose(OP_BUY, 100, ""); else //not autotrading => only send alert myAlert("order", ""); } //Close Short Positions, instant signal is tested first if(Cross(0, iMA(NULL, PERIOD_CURRENT, 3, 0, MODE_SMA, PRICE_CLOSE, 0) > iMFI(NULL, PERIOD_CURRENT, 10, 0)) //Moving Average crosses above Money Flow Index ) { if(IsTradeAllowed()) myOrderClose(OP_SELL, 100, ""); else //not autotrading => only send alert myAlert("order", ""); } //Open Buy Order, instant signal is tested first if(Cross(2, iADX(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE, MODE_MINUSDI, 0) < iADX(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE, MODE_PLUSDI, 0)) //Average Directional Movement Index crosses below Average Directional Movement Index ) { RefreshRates(); price = Ask; if(IsTradeAllowed()) { ticket = myOrderSend(OP_BUY, price, TradeSize, ""); if(ticket <= 0) return; } else //not autotrading => only send alert myAlert("order", ""); } //Open Sell Order, instant signal is tested first if(Cross(3, iADX(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE, MODE_PLUSDI, 0) < iADX(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE, MODE_MINUSDI, 0)) //Average Directional Movement Index crosses below Average Directional Movement Index ) { RefreshRates(); price = Bid; if(IsTradeAllowed()) { ticket = myOrderSend(OP_SELL, price, TradeSize, ""); if(ticket <= 0) return; } else //not autotrading => only send alert myAlert("order", ""); } } //+------------------------------------------------------------------+
Files:
Hi guys, this is my first post here!
ive written a basic EA and ive just gone to test it but i am getting the same error code below,
EURUSDi,M1: OrderSend error #4051 invalid function parameter value
Heres my code
I have all the correct settings in MT4 its self allowing it to trade
i just cant find anything anywhere on how to fix this
Thankyou heaps!
Jake