//| Copyright 2007,Alejandro Galindo | //| Copyright 2007,Kalenzo | //| some modifications by cocoracas | //+----------------------------------------------------------------------------+ #property copyright "Copyright 2007, cocoracas" #property link "http://www.forex-tsd.com" extern int MaxTrades = 4; extern int Pips = 5; extern double TakeProfit = 40; extern double TrailingStop = 20; extern double InitialStop = 110; extern string Note1 = "TF 1M"; extern int MACDTimeFrame = 0; int SecureProfit = 5; int AccountProtection = 1; int OrdersToProtect = 3; int ReverseCondition = 0; double FirstOrderLots=0.1; int OrdersOpened = 0; int cnt = 0; double lots = 0.1; int slippage = 5; double stoploss = 0; double takeprofit = 0; double bprice = 0; double sprice = 0; double lotsi = 0; int type = 0; int state = 0; bool EnableTrading = true; double openprice = 0; int PreviousOrders = 0; double Profit = 0; int LastTicket = 0; int LastType = 0; double LastClosePrice = 0; double LastLots = 0; double PipValue = 0; string text2 = ""; string text = ""; double lotstmp; double trade; double trade1; int trendtype; //---- input parameters extern int RSIOMA = 14; extern int RSIOMA_MODE = MODE_EMA; extern int RSIOMA_PRICE = PRICE_CLOSE; extern int Ma_RSIOMA = 21, Ma_RSIOMA_MODE = MODE_EMA; extern int BuyTrigger = 80; extern int SellTrigger = 20; extern int MainTrendLong = 50; extern int MainTrendShort = 50; double RSIBuffer[]; double PosBuffer[]; double NegBuffer[]; double bdn[],bup[]; double sdn[],sup[]; double marsioma[]; //---- buffers string short_name; double rel,rel1,negative,positive; int i; //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ int start() { double macd = iMACD(NULL,0,5,13,1,PRICE_CLOSE,MODE_MAIN,0); int counted_bars=IndicatorCounted(); double rel,rel1,negative,positive; //---- if(Bars<=RSIOMA) return(0); //---- initial zero if(counted_bars<1) for(i=1;i<=RSIOMA;i++) RSIBuffer[Bars-i]=0.0; //---- i=Bars-RSIOMA-1; int ma = i; if(counted_bars>=RSIOMA) i=Bars-counted_bars-1; while(i>=0) { double sumn=0.0,sump=0.0; if(i==Bars-RSIOMA-1) { int k=Bars-2; //---- initial accumulation while(k>=i) { double cma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,k); double pma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,k+1); rel=cma-pma; if(rel>0) sump+=rel; else sumn-=rel; k--; } positive=sump/RSIOMA; negative=sumn/RSIOMA; } else { //---- smoothed moving average double ccma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i); double ppma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i+1); rel=ccma-ppma; if(rel>0) sump=rel; else sumn=-rel; positive=(PosBuffer[i+1]*(RSIOMA-1)+sump)/RSIOMA; negative=(NegBuffer[i+1]*(RSIOMA-1)+sumn)/RSIOMA; } // Comment(rel); PosBuffer[i]=positive; NegBuffer[i]=negative; if(negative==0.0) RSIBuffer[i]=0.0; else { RSIBuffer[i]=100.0-100.0/(1+positive/negative); bdn[i] = 0; bup[i] = 0; sdn[i] = 0; sup[i] = 0; if(RSIBuffer[i]>MainTrendLong) bup[i] = -10; if(RSIBuffer[i]<MainTrendShort) bdn[i] = -10; if(RSIBuffer[i]<20 && RSIBuffer[i]>RSIBuffer[i+1]) sup[i] = -10; if(RSIBuffer[i]>80 && RSIBuffer[i]<RSIBuffer[i+1]) sdn[i] = -10; } i--; } while(ma>=0) { marsioma[ma] = iMAOnArray(RSIBuffer,0,Ma_RSIOMA,0,Ma_RSIOMA_MODE,ma); ma--; } //Comment(rel); FirstOrderLots = AccountBalance()/3000; lotsi = FirstOrderLots; if (lotsi > 100.0) lotsi = 100; if (lotsi<0.01) lotsi=0.1; string tripo; if (rel > 0 && macd > 0) tripo = "compra"; if (rel < 0 && macd < 0) tripo = "vende"; OrdersOpened = 0; Comment("Tipo de Operación = ",tripo,"\nSi haces las operaciones manualmente, no inviertas en la primera operación más de ; ",AccountBalance()/4000," Lotes"); for (cnt = 0; cnt < OrdersTotal(); cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderSymbol() == Symbol()) OrdersOpened++; } PipValue=MarketInfo(Symbol(),MODE_TICKVALUE); if (PipValue == 0.0) PipValue = 5; if (PreviousOrders > OrdersOpened) { for (cnt = OrdersTotal(); cnt >= 0; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); type = OrderType(); if (OrderSymbol() == Symbol()) { if (type == OP_BUY) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Blue); if (type == OP_SELL) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Red); //return(0); } } } PreviousOrders = OrdersOpened; if (OrdersOpened >= MaxTrades) EnableTrading = false; else EnableTrading = true; if (openprice == 0.0) { for (cnt = 0; cnt < OrdersTotal(); cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); type = OrderType(); if (OrderSymbol() == Symbol()) { openprice = OrderOpenPrice(); if (type == OP_BUY) state = 2; if (type == OP_SELL) state = 1; } } } //double ma34 = iMA(NULL,PERIOD_M1,2,0,MODE_EMA,PRICE_CLOSE,0); //double ma89 = iMA(NULL,PERIOD_M1,5,0,MODE_EMA,PRICE_CLOSE,0); //double sarCurrent = iSAR(NULL,PERIOD_M5,0.009,0.2,0); //double sarPrevious = iSAR(NULL,PERIOD_M5,0.009,0.2,1); if (OrdersOpened < 1) { state = 3; if (rel > 0 && macd > 0) state = 2; if (rel < 0 && macd < 0) state = 1; if (ReverseCondition == 1) { if (state == 1) { state = 2; } else { if (state == 2) { state = 1; } } } } for (cnt = OrdersTotal(); cnt >= 0; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderSymbol() == Symbol()) { if (OrderType() == OP_SELL) { if (TrailingStop > 0.0) { if (OrderOpenPrice() - Ask >= (TrailingStop + Pips) * Point) { if (OrderStopLoss() > Ask + Point * TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask + Point * TrailingStop,OrderClosePrice() - TakeProfit * Point - TrailingStop * Point,800,Purple); return(0); } } } } if (OrderType() == OP_BUY) { if (TrailingStop > 0.0) { if (Bid - OrderOpenPrice() >= (TrailingStop + Pips) * Point) { if (OrderStopLoss() < Bid - Point * TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid - Point * TrailingStop,OrderClosePrice() + TakeProfit * Point + TrailingStop * Point,800,Yellow); return(0); } } } } } } Profit = 0; LastTicket = 0; LastType = 0; LastClosePrice = 0; LastLots = 0; for (cnt = 0; cnt < OrdersTotal(); cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderSymbol() == Symbol()) { LastTicket = OrderTicket(); if (OrderType() == OP_BUY) LastType = 0; if (OrderType() == OP_SELL) LastType = 1; LastClosePrice = OrderClosePrice(); LastLots = OrderLots(); if (LastType == 0) { if (OrderClosePrice() < OrderOpenPrice()) Profit -= (OrderOpenPrice() - OrderClosePrice()) * OrderLots() / Point; if (OrderClosePrice() > OrderOpenPrice()) Profit += (OrderClosePrice() - OrderOpenPrice()) * OrderLots() / Point; } if (LastType == 1) { if (OrderClosePrice() > OrderOpenPrice()) Profit -= (OrderClosePrice() - OrderOpenPrice()) * OrderLots() / Point; if (OrderClosePrice() < OrderOpenPrice()) Profit += (OrderOpenPrice() - OrderClosePrice()) * OrderLots() / Point; } } } Profit = Profit * PipValue; text = "Profit: $" + DoubleToStr(Profit,2) + " +/-"; /* if (LastType == 0 && state == 1) { OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Yellow); EnableTrading = false; return(0); } if (LastType == 1 && state == 2) { OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Yellow); EnableTrading = false; return(0); } */ if ((OrdersOpened >= MaxTrades - OrdersToProtect) && (AccountProtection == 1)) { if (Profit >= SecureProfit) { OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Yellow); EnableTrading = false; return(0); } } if (!IsTesting()) { if (state == 3) text2 = "No conditions to open trades"; else text2 = " "; } if ((state == 1) && EnableTrading) { if ((Bid - openprice >= Pips * Point) || (OrdersOpened < 1)) { sprice = Bid; openprice = 0; if (TakeProfit == 0.0) takeprofit = 0; else takeprofit = sprice - TakeProfit * Point; if (InitialStop == 0.0) stoploss = 0; else stoploss = sprice + InitialStop * Point; if (OrdersOpened != 0) { lots = lotsi; for (cnt = 1; cnt <= OrdersOpened; cnt++) { if (MaxTrades>12) { lots=NormalizeDouble(lots*3,2); } else { lots=NormalizeDouble(lots*3,2); } } } else { lots = lotsi; } if (lots > 100.0) lots = 100; OrderSend(Symbol(),OP_SELL,lots,sprice,slippage,stoploss,takeprofit,0,0,0,Red); return(0); } } if ((state == 2) && EnableTrading) { if ((openprice - Ask >= Pips * Point) || (OrdersOpened < 1)) { bprice = Ask; openprice = 0; if (TakeProfit == 0.0) takeprofit = 0; else takeprofit = bprice + TakeProfit * Point; if (InitialStop == 0.0) stoploss = 0; else stoploss = bprice - InitialStop * Point; if (OrdersOpened != 0) { lots = lotsi; for (cnt = 1; cnt <= OrdersOpened; cnt++) { if (MaxTrades>12) { lots=NormalizeDouble(lots*3,2); } else { lots=NormalizeDouble(lots*3,2); } } } else { lots = lotsi; } if (lots > 100.0) lots = 100; OrderSend(Symbol(),OP_BUY,lots,bprice,slippage,stoploss,takeprofit,0,0,0,Blue); return(0); } } return(0); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
MACD Histogram
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached
Other Features:
BackTest : EURUSD on H1
From 2010-04-01 to 2010-04-30
Profit Factor:1.17 Total Net Profit:1389284.12