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:
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
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