RSI Expert Advisor Code In Need Of Simple Fix

 

Hello:


Experienced coder here in HTML and CSS yet I'm new to MQL4 and studying / learning as I go. Have been testing the script below with success, however when trying to use S/Ls and T/Ps, I receive the Error 130 - Invalid Stops message and orders will not go through. If any coders with more experience could point out the problems to fix, what to add, what to scrap, etc, it would be greatly appreciated. Also trying to include an Orders variable to open multiple lots. Thanks for reading!

Broker: IBFX [Five Digits]



#property copyright "RSI"

#property link "RSI"

#define major 1
#define minor 0

extern string _tmp1_ = " --- Trade params ---";
extern string ExpertName = "RSI";
extern double Lots = 0.01;
extern double Orders = 10;
extern int StopLoss = 100;
extern int TakeProfit = 100;
extern int Slippage = 3;
extern int Magic = 007;

extern string _tmp2_ = " --- RSI ---";
extern int RSI.period = 2;
extern int RSI.applied_price = PRICE_CLOSE;
extern int RSI.SignalBar = 1;
extern double RSI.SellAbove = 90.0;
extern double RSI.BuyBelow = 10.0;

extern string _tmp3_ = " --- Chart ---";
extern color clBuy = DodgerBlue;
extern color clSell = Red;
extern color clClose = Gold;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <stdlib.mqh>
#include <stderror.mqh>

int RepeatN = 3;
int BuyCnt, SellCnt;

void init()
{
}

void deinit()
{
}

void start()
{
//-----

double RSI1 = iRSI(NULL, 60, RSI.period, RSI.applied_price, RSI.SignalBar);
double RSI2 = iRSI(NULL, 60, RSI.period, RSI.applied_price, RSI.SignalBar+1);

//-----

RecountOrders();

//-----

double price, sl, tp;
int ticket;

if (RSI1 < RSI.BuyBelow && RSI2 >= RSI.BuyBelow)
{
if (BuyCnt > 0) return;
if (CloseOrders(OP_SELL) > 0) return;
if (OrdersCountBar0(0) > 0) return;

//-----

for (int i=0; i<RepeatN; i++)
{
RefreshRates();
price = Ask;

sl = If(StopLoss > 0, price - StopLoss*Point, 0);
tp = If(TakeProfit > 0, price + TakeProfit*Point, 0);

ticket = Buy(Symbol(), GetLots(), price, sl, tp, Magic);
if (ticket > 0) break;
}

return;
}

if (RSI1 > RSI.SellAbove && RSI2 <= RSI.SellAbove)
{
if (SellCnt > 0) return;
if (CloseOrders(OP_BUY) > 0) return;
if (OrdersCountBar0(0) > 0) return;

//-----

for (i=0; i<RepeatN; i++)
{
RefreshRates();
price = Bid;

sl = If(StopLoss > 0, price + StopLoss*Point, 0);
tp = If(TakeProfit > 0, price - TakeProfit*Point, 0);

ticket = Sell(Symbol(), GetLots(), price, sl, tp, Magic);
if (ticket > 0) break;
}

return;
}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

double If(bool cond, double if_true, double if_false)
{
if (cond) return (if_true);
return (if_false);
}

double GetLots()
{
return (Lots);
}

void RecountOrders()
{
BuyCnt = 0;
SellCnt = 0;

int cnt = OrdersTotal();
for (int i=0; i < cnt; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;

int type = OrderType();
if (type == OP_BUY) BuyCnt++;
if (type == OP_SELL) SellCnt++;
}
}

int OrdersCountBar0(int TF)
{
int orders = 0;

int cnt = OrdersTotal();
for (int i=0; i<cnt; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;

if (OrderOpenTime() >= iTime(NULL, TF, 0)) orders++;
}

cnt = OrdersHistoryTotal();
for (i=0; i<cnt; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;

if (OrderOpenTime() >= iTime(NULL, TF, 0)) orders++;
}

return (orders);
}

int CloseOrders(int type1, int type2 = -1)
{
int cnt = OrdersTotal();
for (int i=cnt-1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;

int type = OrderType();
if (type != type1 && type != type2) continue;

if (type == OP_BUY)
{
RefreshRates();
CloseOrder(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID));
continue;
}

if (type == OP_SELL)
{
RefreshRates();
CloseOrder(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK));
continue;
}
}

int orders = 0;
cnt = OrdersTotal();
for (i = 0; i < cnt; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;

type = OrderType();
if (type != type1 && type != type2) continue;

orders++;
}

return (orders);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

int SleepOk = 2000;
int SleepErr = 6000;

int Buy(string symbol, double lot, double price, double sl, double tp, int magic, string comment="RSI")
{
int dig = MarketInfo(symbol, MODE_DIGITS);

price = NormalizeDouble(price, dig);
sl = NormalizeDouble(sl, dig);
tp = NormalizeDouble(tp, dig);

string _lot = DoubleToStr(lot, 2);
string _price = DoubleToStr(price, dig);
string _sl = DoubleToStr(sl, dig);
string _tp = DoubleToStr(tp, dig);

Print("Buy \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");

int res = OrderSend(symbol, OP_BUY, lot, price, Slippage, sl, tp, comment, magic, 0, clBuy);
if (res >= 0) {
Sleep(SleepOk);
return (res);
}

int code = GetLastError();
Print("Error opening BUY order: ", ErrorDescription(code), " (", code, ")");
Sleep(SleepErr);

return (-1);
}

int Sell(string symbol, double lot, double price, double sl, double tp, int magic, string comment="RSI")
{
int dig = MarketInfo(symbol, MODE_DIGITS);

price = NormalizeDouble(price, dig);
sl = NormalizeDouble(sl, dig);
tp = NormalizeDouble(tp, dig);

string _lot = DoubleToStr(lot, 2);
string _price = DoubleToStr(price, dig);
string _sl = DoubleToStr(sl, dig);
string _tp = DoubleToStr(tp, dig);

Print("Sell \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");

int res = OrderSend(symbol, OP_SELL, lot, price, Slippage, sl, tp, comment, magic, 0, clSell);
if (res >= 0) {
Sleep(SleepOk);
return (res);
}

int code = GetLastError();
Print("Error opening SELL order: ", ErrorDescription(code), " (", code, ")");
Sleep(SleepErr);

return (-1);
}

bool CloseOrder(int ticket, double lot, double price)
{
if (!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);
if (OrderCloseTime() > 0) return(false);

int dig = MarketInfo(OrderSymbol(), MODE_DIGITS);
string _lot = DoubleToStr(lot, 2);
string _price = DoubleToStr(price, dig);

Print("CloseOrder ", ticket, ", ", _lot, ", ", _price, ", ", Slippage);

bool res = OrderClose(ticket, lot, price, Slippage, clClose);
if (res) {
Sleep(SleepOk);
return (res);
}

int code = GetLastError();
Print("CloseOrder failed: ", ErrorDescription(code), " (", code, ")");
Sleep(SleepErr);

return (false);
}
 

send the TP & SL separately

https://www.mql5.com/en/forum/129818

& for the next time

for large files attached the file

Reason: