Hello!
I would like to ask you for some advice on, what I imagin is for codersactually quite straightforward, how to code a repulse cross over 0.
I have a very simple EA that only opens and closes trades when repulse
crosses 0.
Only when compiling in mt4 I get ‘iCustom’ – wrong parameters count for the following lines:
if(Cross(0, iCustom(NULL, PERIOD_D1, "repulse_period1", 0) < 0) //repulse_period1 crosses below fixed value
if(Cross(1, iCustom(NULL, PERIOD_H1, "repulse_period1", 0) > 0) //repulse_period1 crosses above fixed value
Any advice would be highly appreciated!
Thank you,
Barry
iCustom The function returns the handle of a specified custom indicator. int iCustom( string symbol, // symbol name ENUM_TIMEFRAMES period, // period string name // folder/custom_indicator_name ... // list of indicator input parameters );
Hi Marco,
OK sorry, please find below the full code.
The error is on lines 225 and 235, column 16.
Many thanks!
Barry
//+------------------------------------------------------------------+ //| Strategy: AbsStrength5.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 = 648436; double MM_Percent = 1; int MaxSlippage = 3; //adjusted in OnInit bool crossed[2]; //initialized to true, used in function Cross int MaxOpenTrades = 2; int MaxLongTrades = 1000; int MaxShortTrades = 1000; int MaxPendingOrders = 1000; bool Hedging = true; int OrderRetry = 5; //# of retries if sending order returns error int OrderWait = 5; //# of seconds to wait if sending order returns error double myPoint; //initialized in OnInit double MM_Size(double SL) //Risk % per trade, SL = relative Stop Loss to calculate risk { double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT); double MinLot = MarketInfo(Symbol(), MODE_MINLOT); double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE); double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE); double lots = MM_Percent * 1.0 / 100 * AccountBalance() / (SL / ticksize * tickvalue); if(lots > MaxLot) lots = MaxLot; if(lots < MinLot) lots = MinLot; return(lots); } double MM_Size_BO() //Risk % per trade for Binary Options { double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT); double MinLot = MarketInfo(Symbol(), MODE_MINLOT); double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE); double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE); return(MM_Percent * 1.0 / 100 * AccountBalance()); } 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+" | AbsStrength5 @ "+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); } 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); } //+------------------------------------------------------------------+ //| 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; 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; double TradeSize; //Close Long Positions, instant signal is tested first if(Cross(0, iCustom(NULL, PERIOD_D1, "repulse_period1", 0) < 0) //repulse_period1 crosses below fixed value ) { if(IsTradeAllowed()) myOrderClose(OP_BUY, 100, ""); else //not autotrading => only send alert myAlert("order", ""); } //Open Buy Order, instant signal is tested first if(Cross(1, iCustom(NULL, PERIOD_H1, "repulse_period1", 0) > "0") //repulse_period1 crosses above fixed value ) { RefreshRates(); price = Ask; if(IsTradeAllowed()) { ticket = myOrderSend(OP_BUY, price, TradeSize, ""); if(ticket <= 0) return; } else //not autotrading => only send alert myAlert("order", ""); } } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| Strategy: AbsStrength5.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 = 648436; double MM_Percent = 1; int MaxSlippage = 3; //adjusted in OnInit bool crossed[2]; //initialized to true, used in function Cross int MaxOpenTrades = 2; int MaxLongTrades = 1000; int MaxShortTrades = 1000; int MaxPendingOrders = 1000; bool Hedging = true; int OrderRetry = 5; //# of retries if sending order returns error int OrderWait = 5; //# of seconds to wait if sending order returns error double myPoint; //initialized in OnInit double MM_Size(double SL) //Risk % per trade, SL = relative Stop Loss to calculate risk { double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT); double MinLot = MarketInfo(Symbol(), MODE_MINLOT); double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE); double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE); double lots = MM_Percent * 1.0 / 100 * AccountBalance() / (SL / ticksize * tickvalue); if(lots > MaxLot) lots = MaxLot; if(lots < MinLot) lots = MinLot; return(lots); } double MM_Size_BO() //Risk % per trade for Binary Options { double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT); double MinLot = MarketInfo(Symbol(), MODE_MINLOT); double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE); double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE); return(MM_Percent * 1.0 / 100 * AccountBalance()); } 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+" | AbsStrength5 @ "+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); } 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); } //+------------------------------------------------------------------+ //| 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; 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; double TradeSize; //Close Long Positions, instant signal is tested first if(Cross(0, iCustom(NULL, PERIOD_D1, "repulse_period1", 0,0) < 0) //repulse_period1 crosses below fixed value ) { if(IsTradeAllowed()) myOrderClose(OP_BUY, 100, ""); else //not autotrading => only send alert myAlert("order", ""); } //Open Buy Order, instant signal is tested first if(Cross(1, iCustom(NULL, PERIOD_H1, "repulse_period1", 0,0) > "0") //repulse_period1 crosses above fixed value ) { RefreshRates(); price = Ask; if(IsTradeAllowed()) { ticket = myOrderSend(OP_BUY, price, TradeSize, ""); if(ticket <= 0) return; } else //not autotrading => only send alert myAlert("order", ""); } } //+------------------------------------------------------------------+
Marco, I seem to have it working now.
Thanks for your help!
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello!
I would like to ask you for some advice on, what I imagin is for codersactually quite straightforward, how to code a repulse cross over 0.
I have a very simple EA that only opens and closes trades when repulse crosses 0.
Only when compiling in mt4 I get ‘iCustom’ – wrong parameters count for the following lines:
if(Cross(0, iCustom(NULL, PERIOD_D1, "repulse_period1", 0) < 0) //repulse_period1 crosses below fixed value
if(Cross(1, iCustom(NULL, PERIOD_H1, "repulse_period1", 0) > 0) //repulse_period1 crosses above fixed value
Any advice would be highly appreciated!
Thank you,