Guys - I know there's quite a few senior and experienced programmers out there - please help - again, I believe this is probably a simple problem that would take 5 min for the "mistake" to be found by someone with the skillset which alot of you have.
I'll put the code here to make it easier for someone to review...
PHP Code:
extern string sNameExpert = "RSI Cross";
extern int nAccount =0;
extern double dBuyStopLossPoint = 25;
extern double dSellStopLossPoint = 25;
extern double dBuyTakeProfitPoint = 50;
extern double dSellTakeProfitPoint = 50;
extern double dBuyTrailingStopPoint = 0;
extern double dSellTrailingStopPoint = 0;
extern double dLots = 1;
extern int nSlippage = 3;
extern color colorOpenBuy = Blue;
extern color colorCloseBuy = Aqua;
extern color colorOpenSell = Red;
extern color colorCloseSell = Aqua;
void deinit() {
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start(){
double LongRSI=iRSI(Symbol(),Period(),14,PRICE_OPEN,2);
double ShortRSI=iRSI(Symbol(),Period(),14,PRICE_OPEN,1);
if(AccountFreeMargin() < (1000*dLots)){
Print("We have no money. Free Margin = " + AccountFreeMargin());
return(0);
}
bool lFlagBuyOpen = false, lFlagSellOpen = false, lFlagBuyClose = false, lFlagSellClose = false;
lFlagBuyOpen = (LongRSI>=50 && ShortRSI<50);
lFlagSellOpen = (LongRSI<=50 && ShortRSI>50);
lFlagBuyClose = False;
lFlagSellClose = False;
if (!ExistPositions()){
if (lFlagBuyOpen){
OpenBuy();
return(0);
}
if (lFlagSellOpen){
OpenSell();
return(0);
}
}
if (ExistPositions()){
if(OrderType()==OP_BUY){
if (lFlagBuyClose){
bool flagCloseBuy = OrderClose(OrderTicket(), OrderLots(), Bid, nSlippage, colorCloseBuy);
return(0);
}
}
if(OrderType()==OP_SELL){
if (lFlagSellClose){
bool flagCloseSell = OrderClose(OrderTicket(), OrderLots(), Ask, nSlippage, colorCloseSell);
return(0);
}
}
}
if (dBuyTrailingStopPoint > 0 || dSellTrailingStopPoint > 0){
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
bool lMagic = true;
if (MAGIC > 0 && OrderMagicNumber() != MAGIC)
lMagic = false;
if (OrderSymbol()==Symbol() && lMagic) {
if (OrderType()==OP_BUY && dBuyTrailingStopPoint > 0) {
if (Bid-OrderOpenPrice() > dBuyTrailingStopPoint*Point) {
if (OrderStopLoss()<Bid-dBuyTrailingStopPoint*Point)
ModifyStopLoss(Bid-dBuyTrailingStopPoint*Point);
}
}
if (OrderType()==OP_SELL) {
if (OrderOpenPrice()-Ask>dSellTrailingStopPoint*Point) {
if (OrderStopLoss()>Ask+dSellTrailingStopPoint*Point || OrderStopLoss()==0)
ModifyStopLoss(Ask+dSellTrailingStopPoint*Point);
}
}
}
}
}
}
return (0);
}
bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
bool lMagic = true;
if (MAGIC > 0 && OrderMagicNumber() != MAGIC)
lMagic = false;
if (OrderSymbol()==Symbol() && lMagic) {
return(True);
}
}
}
return(false);
}
void ModifyStopLoss(double ldStopLoss) {
bool lFlagModify = OrderModify(OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE);
}
void OpenBuy() {
double dStopLoss = 0, dTakeProfit = 0;
if (dBuyStopLossPoint > 0)
dStopLoss = Ask-dBuyStopLossPoint*Point;
if (dBuyTakeProfitPoint > 0)
dTakeProfit = Ask + dBuyTakeProfitPoint * Point;
OrderSend(Symbol(), OP_BUY, dLots, Ask, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenBuy);
}
void OpenSell() {
double dStopLoss = 0, dTakeProfit = 0;
if (dSellStopLossPoint > 0)
dStopLoss = Bid+dSellStopLossPoint*Point;
if (dSellTakeProfitPoint > 0)
dTakeProfit = Bid-dSellTakeProfitPoint*Point;
OrderSend(Symbol(),OP_SELL, dLots, Bid, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenSell);
}