//+------------------------------------------------------------------+ //| fingerlingshoal.mq4 | //| Copyright © 2005, Alejandro Galindo | //| http://elCactus.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Alejandro Galindo" #property link "http://elCactus.com" //---- extern double TakeProfit = 10; extern double Lots = 0.01; extern double InitialStop = 250; extern double TrailingStop = 10; extern int MagicNumber=8888; //---- extern bool Use.Time.Filter = false; extern string Server.Time.To.Start = "00:00"; extern string Server.Time.To.Stop = "24:00"; datetime start_time,end_time; bool tradinghour=true; //==== #define SIGNAL_NONE 0 #define SIGNAL_BUY 1 #define SIGNAL_SELL 2 #define SIGNAL_CLOSEBUY 3 #define SIGNAL_CLOSESELL 4 //---- extern double FastEMA=5; extern double SlowEMA=21; //---- extern bool travel=true; // extern int MaxTrades = 48; extern int Pips = 18; extern int SecureProfit = 7; extern int AccountProtection = 1; extern int OrderstoProtect = 6; extern int ReverseCondition = 261; extern double EURUSDPipValue = 10; extern double GBPUSDPipValue = 10; extern double USDCHFPipValue = 10; extern double USDJPYPipValue = 9.715; extern int StartYear = 2005; extern int StartMonth = 1; extern int EndYear = 2010; extern int EndMonth = 12; extern int EndHour = 22; extern int EndMinute = 30; extern int mm = 0; extern int risk = 50; extern int AccountisNormal = 0; //---- bool IsTrading=true; //--- int OpenOrders = 0, cnt = 0; int slippage = 2; double sl = 0, tp = 0; double BuyPrice = 0, SellPrice = 0; double lotsi = 0, mylotsi = 0; int mode = 0; int myOrderType_m5 = 0; int myOrderType_m15 = 0; int myOrderType_m60 = 0; int myOrderType = 0; bool ContinueOpening = True; double LastPrice = 0; int PreviousOpenOrders = 0; double Profit = 0; int LastTicket = 0, LastType = 0; double LastClosePrice = 0, LastLots = 0; double Pivot = 0; double PipValue = 0; string text = "", text2 = ""; static int LASTRUN; int BarCount; int Current; bool TickCheck = False; extern bool EachTickMode = false; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { BarCount = Bars; if (EachTickMode) Current = 0; else Current = 1; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int Order = SIGNAL_NONE; int Total, Ticket; double StopLossLevel, TakeProfitLevel; if ((LASTRUN == Time[0])) { return(0); // It's a no go, no new bar } else { LASTRUN = Time[0]; // Finally a new bar!! Now execute the rest of the code } //==== //==== if (EachTickMode && Bars != BarCount) TickCheck = False; Total = OrdersTotal(); Order = SIGNAL_NONE; //---- if(AccountisNormal == 1) if(mm != 0) lotsi = MathCeil(AccountBalance()*risk / 10000); else lotsi = Lots; else // then is mini if(mm != 0) lotsi = MathCeil(AccountBalance()*risk / 10000) / 10; else lotsi = Lots; //---- if(lotsi > 100) lotsi = 100; OpenOrders = 0; //---- for(cnt = 0; cnt < OrdersTotal(); cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if ( OrderSymbol() != Symbol()) continue; if ( OrderMagicNumber() != MagicNumber) continue; OpenOrders++; } //---- if(OpenOrders < 1) { if(TimeYear(CurTime()) < StartYear) return(0); //---- if(TimeMonth(CurTime()) < StartMonth) return(0); //---- if(TimeYear(CurTime()) > EndYear) return(0); //---- if(TimeMonth(CurTime()) > EndMonth ) return(0); // The time to control trading and Manual stop progra running! if(!travel)return(0); if (DayOfWeek() == 0 ) return(0); // Sunday check if (DayOfWeek() == 1 && Hour() < 2) return(0); // Monday check if (DayOfWeek() == 5 && Hour() >= 16) return(0); // Friday check if (DayOfWeek() == 5 && Day()<=7) return(0); // First Friday Of the Month echeck } //---- if(Symbol() == "EURUSD") PipValue = EURUSDPipValue; //---- if(Symbol() == "GBPUSD") PipValue = GBPUSDPipValue; //---- if(Symbol() == "USDJPY") PipValue = USDJPYPipValue; //---- if(Symbol() == "USDCHF") PipValue = USDCHFPipValue; //---- if(PipValue == 0) PipValue = 10 ; //---- if(PreviousOpenOrders > OpenOrders) { for(cnt=OrdersTotal();cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); mode = OrderType(); //---- if ( OrderSymbol() != Symbol()) continue; if ( OrderMagicNumber() != MagicNumber) continue; { if(mode == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Blue); //---- if(mode == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Red); return(0); } } //---- Time period calculation //start_time = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " " + Server.Time.To.Start); //---- Date and time to start //end_time = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " " + Server.Time.To.Stop); //---- Date and time to stop //---- Is it time to trade //if(Use.Time.Filter && (TimeCurrent() < start_time || TimeCurrent() >= end_time)) tradinghour=false; //else tradinghour=true; } PreviousOpenOrders = OpenOrders; //---- if(OpenOrders >= MaxTrades) ContinueOpening = False; else ContinueOpening = True; //---- if(LastPrice == 0) { for(cnt = 0; cnt < OrdersTotal(); cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); mode = OrderType(); //---- if ( OrderSymbol() != Symbol()) continue; if ( OrderMagicNumber() != MagicNumber) continue; { LastPrice = OrderOpenPrice(); //---- if(mode == OP_BUY) myOrderType = 2; //---- if(mode == OP_SELL) myOrderType = 1; } } } //---- if(OpenOrders < 1) { myOrderType = 3; //----5 minute iMA //+------------------------------------------------------------------+ //| Variable Begin | //+------------------------------------------------------------------+ double ac0_m1 = iAC(NULL, PERIOD_M1, Current + 0); double ac1_m1 = iAC(NULL, PERIOD_M1, Current + 1); double ac2_m1 = iAC(NULL, PERIOD_M1, Current + 2); double ao0_m1 = iAO(NULL, PERIOD_M1, Current + 0); double ao1_m1 = iAO(NULL, PERIOD_M1, Current + 1); double ac0_m5 = iAC(NULL, PERIOD_M5, Current + 0); double ac1_m5 = iAC(NULL, PERIOD_M5, Current + 1); double ac2_m5 = iAC(NULL, PERIOD_M5, Current + 2); double ao0_m5 = iAO(NULL, PERIOD_M5, Current + 0); double ao1_m5 = iAO(NULL, PERIOD_M5, Current + 1); double ac0_m15 = iAC(NULL, PERIOD_M15, Current + 0); double ac1_m15 = iAC(NULL, PERIOD_M15, Current + 1); double ac2_m15 = iAC(NULL, PERIOD_M15, Current + 2); double ao0_m15 = iAO(NULL, PERIOD_M15, Current + 0); double ao1_m15 = iAO(NULL, PERIOD_M15, Current + 1); double Buy1_1_m1 = ac0_m1, Buy1_1_m5 = ac0_m5, Buy1_1_m15 = ac0_m15; double Buy1_2_m1 = ac1_m1, Buy1_2_m5 = ac1_m5, Buy1_2_m15 = ac1_m15; double Buy2_1_m1 = ac1_m1, Buy2_1_m5 = ac1_m5, Buy2_1_m15 = ac1_m15; double Buy2_2_m1 = ac2_m1, Buy2_2_m5 = ac2_m5, Buy2_2_m15 = ac2_m15; double Buy3_1_m1 = ao0_m1, Buy3_1_m5 = ao0_m5, Buy3_1_m15 = ao0_m15; double Buy3_2_m1 = ao1_m1, Buy3_2_m5 = ao1_m5, Buy3_2_m15 = ao1_m15; double Sell1_1_m1 = ac0_m1, Sell1_1_m5 = ac0_m5, Sell1_1_m15 = ac0_m15; double Sell1_2_m1 = ac1_m1, Sell1_2_m5 = ac1_m5, Sell1_2_m15 = ac1_m15; double Sell2_1_m1 = ac1_m1, Sell2_1_m5 = ac1_m5, Sell2_1_m15 = ac1_m15; double Sell2_2_m1 = ac2_m1, Sell2_2_m5 = ac2_m5, Sell2_2_m15 = ac2_m15; double Sell3_1_m1 = ao0_m1, Sell3_1_m5 = ao0_m5, Sell3_1_m15 = ao0_m15; double Sell3_2_m1 = ao1_m1, Sell3_2_m5 = ao1_m5, Sell3_2_m15 = ao1_m15; double CloseBuy1_1_m1 = ac0_m1, CloseBuy1_1_m5 = ac0_m5, CloseBuy1_1_m15 = ac0_m15; double CloseBuy1_2_m1 = ac1_m1, CloseBuy1_2_m5 = ac1_m5, CloseBuy1_2_m15 = ac1_m15; double CloseBuy2_1_m1 = ac1_m1, CloseBuy2_1_m5 = ac1_m5, CloseBuy2_1_m15 = ac1_m15; double CloseBuy2_2_m1 = ac2_m1, CloseBuy2_2_m5 = ac2_m5, CloseBuy2_2_m15 = ac2_m15; double CloseSell1_1_m1 = ac0_m1, CloseSell1_1_m5 = ac0_m5, CloseSell1_1_m15 = ac0_m15; double CloseSell1_2_m1 = ac1_m1, CloseSell1_2_m5 = ac1_m5, CloseSell1_2_m15 = ac1_m15; double CloseSell2_1_m1 = ac1_m1, CloseSell2_1_m5 = ac1_m5, CloseSell2_1_m15 = ac1_m15; double CloseSell2_2_m1 = ac2_m1, CloseSell2_2_m5 = ac2_m5, CloseSell2_2_m15 = ac2_m15; //+------------------------------------------------------------------+ //| Variable End | //+------------------------------------------------------------------+ if ((CloseBuy1_1_m1 < CloseBuy1_2_m1) && (CloseBuy2_1_m1 > CloseBuy2_2_m1)) myOrderType_m5 = 4; if ((CloseSell1_1_m1 > CloseSell1_2_m1) && (CloseSell2_1_m1 < CloseSell2_2_m1)) myOrderType_m5 = 5; if (Buy1_1_m1 > Buy1_2_m1 && Buy2_1_m1 < Buy2_2_m1 && Buy3_1_m1 > Buy3_2_m1) myOrderType_m5 = 2; if (Sell1_1_m1 < Sell1_2_m1 && Sell2_1_m1 > Sell2_2_m1 && Sell3_1_m1 < Sell3_2_m1) myOrderType_m5 = 1; if ((CloseBuy1_1_m5 < CloseBuy1_2_m5) && (CloseBuy2_1_m5 > CloseBuy2_2_m5)) myOrderType_m15 = 4; if ((CloseSell1_1_m5 > CloseSell1_2_m5) && (CloseSell2_1_m5 < CloseSell2_2_m5)) myOrderType_m15 = 5; if (Buy1_1_m5 > Buy1_2_m5 && Buy2_1_m5 < Buy2_2_m5 && Buy3_1_m5 > Buy3_2_m5) myOrderType_m15 = 2; if (Sell1_1_m5 < Sell1_2_m5 && Sell2_1_m5 > Sell2_2_m5 && Sell3_1_m5 < Sell3_2_m5) myOrderType_m15 = 1; if ((CloseBuy1_1_m15 < CloseBuy1_2_m15) && (CloseBuy2_1_m15 > CloseBuy2_2_m15)) myOrderType_m60 = 4; if ((CloseSell1_1_m15 > CloseSell1_2_m15) && (CloseSell2_1_m15 < CloseSell2_2_m15)) myOrderType_m60 = 5; if (Buy1_1_m15 > Buy1_2_m15 && Buy2_1_m15 < Buy2_2_m15 && Buy3_1_m15 > Buy3_2_m1) myOrderType_m60 = 2; if (Sell1_1_m15 < Sell1_2_m15 && Sell2_1_m15 > Sell2_2_m15 && Sell3_1_m15 < Sell3_2_m1) myOrderType_m60 = 1; if(myOrderType_m5==2 && myOrderType_m15==2 && myOrderType_m60==2)myOrderType=2; if(myOrderType_m5==1 && myOrderType_m15==1 && myOrderType_m60==1)myOrderType=1; if(myOrderType_m5==1 && myOrderType_m15==2 && myOrderType_m60==2)myOrderType=3; if(myOrderType_m5==1 && myOrderType_m15==1 && myOrderType_m60==2)myOrderType=3; if(myOrderType_m5==2 && myOrderType_m15==1 && myOrderType_m60==1)myOrderType=3; if(myOrderType_m5==2 && myOrderType_m15==2 && myOrderType_m60==1)myOrderType=3; if(myOrderType_m5==4 && myOrderType_m15==4 && myOrderType_m60==4)myOrderType=4; if(myOrderType_m5==5 && myOrderType_m15==5 && myOrderType_m60==5)myOrderType=5; //---- if(ReverseCondition == 1) if(myOrderType == 1) myOrderType = 2; else if(myOrderType == 2) myOrderType = 1; } // if we have opened positions we take care of them for(cnt = OrdersTotal(); cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //---- if ( OrderSymbol() != Symbol()) continue; if ( OrderMagicNumber() != MagicNumber) continue; { if(OrderType() == OP_SELL) if(TrailingStop > 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) 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()) continue; if ( OrderMagicNumber() != MagicNumber) continue; { LastTicket = OrderTicket(); //---- if(OrderType() == OP_BUY) LastType = OP_BUY; //---- if(OrderType() == OP_SELL) LastType = OP_SELL; LastClosePrice = OrderClosePrice(); LastLots = OrderLots(); //---- if(LastType == OP_BUY) { if(OrderClosePrice() < OrderOpenPrice()) Profit = Profit - (OrderOpenPrice() - OrderClosePrice())*OrderLots() / Point; //---- if(OrderClosePrice() > OrderOpenPrice()) Profit = Profit + (OrderClosePrice() - OrderOpenPrice())*OrderLots() / Point; } //---- if(LastType == OP_SELL) { if(OrderClosePrice() > OrderOpenPrice()) Profit=Profit - (OrderClosePrice()-OrderOpenPrice())*OrderLots() / Point; //---- if(OrderClosePrice() < OrderOpenPrice()) Profit=Profit+(OrderOpenPrice()-OrderClosePrice())*OrderLots()/Point; } } } Profit = Profit*PipValue; text2 = "Profit: $" + DoubleToStr(Profit, 2) + " +/-"; //---- if(OpenOrders >= (MaxTrades - OrderstoProtect) && AccountProtection == 1) { if(Profit >= SecureProfit) { OrderClose(LastTicket, LastLots, LastClosePrice, slippage, Yellow); ContinueOpening = False; return(0); } } //---- if(!IsTesting()) { if(myOrderType == 3) text = "No conditions to open trades"; else text=" "; Comment("LastPrice=", LastPrice, " Previous open orders=", PreviousOpenOrders, "\nContinue opening=", ContinueOpening, " OrderType=", myOrderType, "\n", text2, "\nLots=", lotsi, "\n", text); } //---- if(myOrderType == 4 || myOrderType == 5) { for(cnt=OrdersTotal();cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); mode = OrderType(); //---- if ( OrderSymbol() != Symbol()) continue; if ( OrderMagicNumber() != MagicNumber) continue; { if(mode == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Blue); //---- if(mode == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Red); return(0); } } } if(myOrderType == 1 && ContinueOpening) { if((Bid - LastPrice) >= Pips*Point || OpenOrders < 1) { SellPrice = Bid; LastPrice = 0; //---- if(TakeProfit == 0) tp = 0; else tp = SellPrice - TakeProfit*Point; //---- if(InitialStop == 0) sl=0; else sl=SellPrice+InitialStop*Point; //---- if(OpenOrders != 0) { mylotsi=lotsi; //---- for(cnt = 1; cnt <= OpenOrders; cnt++) if(MaxTrades > 48) mylotsi = NormalizeDouble(mylotsi*2, 2); else mylotsi = NormalizeDouble(mylotsi*3, 2); } else mylotsi = lotsi; //---- if(mylotsi > 100) mylotsi = 100; OrderSend(Symbol(), OP_SELL, mylotsi, SellPrice, slippage, sl, tp, NULL, MagicNumber, 0, Red); return(0); } } //---- if(myOrderType == 2 && ContinueOpening) { if((LastPrice - Ask) >= Pips*Point || OpenOrders < 1) { BuyPrice = Ask; LastPrice = 0; //---- if(TakeProfit == 0) tp = 0; else tp = BuyPrice + TakeProfit*Point; //---- if(InitialStop == 0) sl = 0; else sl = BuyPrice - InitialStop*Point; //---- if(OpenOrders != 0) { mylotsi = lotsi; //---- for(cnt = 1; cnt <= OpenOrders; cnt++) { if(MaxTrades > 48) mylotsi = NormalizeDouble(mylotsi*2, 2); else mylotsi = NormalizeDouble(mylotsi*3, 2); } } else mylotsi = lotsi; //---- if(mylotsi > 100) mylotsi = 100; OrderSend(Symbol(), OP_BUY, mylotsi, BuyPrice, slippage, sl, tp, NULL, MagicNumber, 0, Blue); return(0); } } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Bill Williams Accelerator/Decelerator oscillator
Bill Williams Awesome oscillator
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: