//+------------------------------------------------------------------+ //| Sauron.mq4 | //| Simplified open release: 1.3 | //| Copyright © 2008, Giampiero.Raschetti©gmail.com | //| skype: giaras | //+------------------------------------------------------------------+ #property copyright "Copyright giaras©2008" #property link "http://www.fxtrade.it" //---- INPUT PARAMETERS // Trailing Stop Engine extern int MaxStopLoss = 105; extern int MinTakeProfit = 12; //---- MONEY MANAGEMENT MODULE extern double lots = 1; // TIME FILTER TIMING PARAMETERS extern string F_Filer1 = "====== Filter 1 Time based filter ============="; bool UseHourTrade = true; extern int FromHourTrade = 21; // start trading on this hour int ToHourTrade = 18; // end trading on this hour extern bool UseTimeBasedStopLoss = false; extern int TradeHoldingPeriod = 23; // Maximum holding period without profit extern string C_Signal1 = "====== Signal 1 MA Direction ================="; extern int S1_MA_FAST = 1; extern string C_Signal2 = "====== Signal 2 OSMA slope ==========="; extern int S2_OSMAFast = 1; extern int S2_OSMASlow = 22; extern double S2_OSMASignal = 9; //---- GLOBAL VARIABLES int MagicNumber = 666; // Use 3 different magic number for 3 different lot size static int prevtime = 0; int SignalCount; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { Print ("Initiating... Account info:"); Print ("Date Time:", TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double RefPrice; int i; int spread = 3; if(Time[0] == prevtime) return(0); prevtime = Time[0]; ToHourTrade = FromHourTrade; // FOR TESTING PARPOUSE ONLY if(ToHourTrade < FromHourTrade) return(0); //---- if(IsTradeAllowed()) { RefreshRates(); spread = MarketInfo(Symbol(), MODE_SPREAD); } else { prevtime = Time[1]; return(0); } int ticket = -1; SignalCount = Analyzer(); TrailingStopEngine(); // check for opened position int total = OrdersTotal(); //---- for(i = 0; i < total; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) break; bool OrderFound = false; // check for symbol & magic number if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { OrderFound = true; int k=0; while(k < TradeHoldingPeriod) // Count how many hours open { if(iTime(NULL,PERIOD_H1,k) > OrderOpenTime()) k++; else break; } // long position is opened if(OrderType() == OP_BUY) { // check profit and set trailing stops if(UseTimeBasedStopLoss && k >= TradeHoldingPeriod && OrderProfit() < 0 ) { if(SignalCount < 0) OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position!! return(0); } } else // PROCESS SELL ORDER { // check profit and set trailing stops if(UseTimeBasedStopLoss && k >= TradeHoldingPeriod && OrderProfit() < 0 ) { if(SignalCount > 0) OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position!! return(0); } } // exit return(0); } } if(OrderFound) return(0); if(BlockTradingFilter1()) return(0); if(SignalCount > 0) { //long ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask - MaxStopLoss * Point, Ask + MinTakeProfit * Point, "GR", MagicNumber, 0, Blue); //---- if(ticket < 0) { Sleep(30000); prevtime = Time[1]; } } else if(SignalCount < 0) { // short ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + MaxStopLoss * Point, Bid - MinTakeProfit * Point, "GR", MagicNumber, 0, Red); if(ticket < 0) { Sleep(30000); prevtime = Time[1]; } } //--- exit return(0); } //+------------------------------------------------------------------+ //| TRAILING STOP ENGINE MODULE //+------------------------------------------------------------------+ int TrailingStopEngine() { // MinTakeProfit=MaxStopLoss*2; return(0); } //+------------------------------------------------------------------+ //| Long Term Price Analyzer //+------------------------------------------------------------------+ int Analyzer() { int signalCount=0; signalCount += EntrySignal1(); signalCount += EntrySignal2(); return(signalCount); } //+------------------------------------------------------------------+ //| FILTER BLOCK MODULES //+------------------------------------------------------------------+ bool BlockTradingFilter1() { //Original code Contributed by Wackena bool BlockTrade=false; //trade by default if (UseHourTrade) { if( !(Hour() >= FromHourTrade && Hour() <= ToHourTrade && Minute()<= 3) ) { // Comment("Non-Trading Hours!"); BlockTrade=true; } } return (BlockTrade); } //+------------------------------------------------------------------+ //| ENTRY SIGNALS BLOCK MODULES //+------------------------------------------------------------------+ int EntrySignal1() { // Long term SMA trend detect int i,Signal; int LongTrend=0; for(i=0;i<3;i++) { if (iMA(Symbol(),PERIOD_H4,S1_MA_FAST,0,MODE_LWMA,PRICE_TYPICAL,i) > iMA(Symbol(),PERIOD_H4,S1_MA_FAST,0,MODE_LWMA,PRICE_TYPICAL,i+1)) LongTrend++; else LongTrend--; } if( LongTrend < 0) Signal=-1; else Signal=1; return(Signal); } int EntrySignal2() { // Daily MACD int Signal; if (iMACD(NULL,PERIOD_D1,S2_OSMAFast,S2_OSMASlow,S2_OSMASignal,PRICE_WEIGHTED,MODE_MAIN,0) > iMACD(NULL,PERIOD_D1,S2_OSMAFast,S2_OSMASlow,S2_OSMASignal,PRICE_WEIGHTED,MODE_MAIN,1) ) Signal=1; else Signal=-1; return (Signal); }