//+-----------------------------------------------------------------------------------+ //| STOCH POWER EA 5.mq4 | //| Copyright © 2005, Alejandro Galindo | //| http://elCactus.com | //| Copyright © 2007, AZAM575 & SYLARVAMPIRE & YUSOF786 | //| http://mymefx.com | //+-----------------------------------------------------------------------------------+ ///Please, do not sell this EA because its FREE #property copyright "Copyright © 2007, AZAM575&SYLARVAMPIRE&YUSOF786" #property link "MYMEFX.COM" #define NL "\n" extern string INFO = "STOCH POWER EA V5.0"; extern string OWN = "Copyright © 2007, AZAM575&SYLARVAMPIRE&YUSOF786"; extern string sq = "--STOCH SETTING--"; extern int K_Period = 28; extern int D_Period = 6; extern int Slow_Period = 14; extern int Stoch_TF1 = 1; // Primary stoch time frame extern int Stoch_TF2 = 5; // Secondary stoch time frame extern int shift = 1; extern int H_level = 80; extern int L_level = 20; extern string ChooseeMAMode = "Choose 1=mode SMA, 2=mode LWMA, 3=mode EMA"; extern int stochMAmode = 2; extern bool ExitWithSTOCH = False; extern string se ="--ENVELOPE SETTINGS--"; extern int ENVELOPE_Slow_Period = 14; extern int ENVELOPE_TF = 1440; extern string sb = "--TRADE SETTING--"; extern double Lots = 0.01; // We start with this lots number extern int TakeProfit = 32; // Profit Goal for the latest order opened extern bool MyMoneyProfitTarget = True; extern double My_Money_Profit_Target = 50; extern double multiply = 1.5; extern int MaxTrades = 8; // Maximum number of orders to open extern int Pips = 7; // Distance in Pips from one order to another extern int StopLoss = 0; // StopLoss extern int TrailingStop = 0; // Pips to trail the StopLoss extern string MM = "--MOney Management--"; // (from order 2, not from first order extern string MMSwicth = "if one the lots size will increase based on account size"; extern int mm = 1; // if one the lots size will increase based on account size extern string riskset = "risk to calculate the lots size (only if mm is enabled)"; extern int risk = 4; // risk to calculate the lots size (only if mm is enabled) extern string accounttypes = "0 if Normal Lots, 1 for mini lots, 2 for micro lots"; extern int AccountType = 2; // 0 if Normal Lots, 1 for mini lots, 2 for micro lots extern string magicnumber = "--MAgic No--"; extern int MagicNumber = 222777; // Magic number for the orders placed extern string so = "--CUTLOSS SETTING--"; extern bool SecureProfitProtection = False; extern string SP = "If profit made is bigger than SecureProfit we close the orders"; extern int SecureProfit = 22; // If profit made is bigger than SecureProfit we close the orders extern string OTP = "Number of orders to enable the account protection"; extern int OrderstoProtect = 3; // Number of orders to enable the account protection extern string ASP = "if one will check profit from all symbols, if cero only this symbol"; extern bool AllSymbolsProtect = False; // if one will check profit from all symbols, if cero only this symbol extern string EP = "if true, then the expert will protect the account equity to the percent specified"; extern bool EquityProtection = False; // if true, then the expert will protect the account equity to the percent specified extern string AEP = "percent of the account to protect on a set of trades"; extern int AccountEquityPercentProtection = 90; // percent of the account to protect on a set of trades extern string AMP = "if true, then the expert will use money protection to the USD specified"; extern bool AccountMoneyProtection = False; extern double AccountMoneyProtectionValue = 3000.00; extern string TradingTime = "--trading time setting--"; extern bool UseTradingHours = True; extern bool TradeAsianMarket = true; extern int StartHour1 = 11; // Start trades after time extern int StopHour1 = 23; // Stop trading after time extern bool TradeEuropeanMarket = true; extern int StartHour2 = 7; // Start trades after time extern int StopHour2 = 11; // Stop trading after time extern bool TradeNewYorkMarket = false; extern int StartHour3 = 15; // Start trades after time extern int StopHour3 = 17; // Stop trading after time extern bool TradeOnFriday = False; extern string OtherSetting = "--Others Setting--"; extern string reverse = "if one the desition to go long/short will be reversed"; extern bool ReverseCondition = False; // if one the desition to go long/short will be reversed extern string limitorder = "if true, instead open market orders it will open limit orders "; extern bool SetLimitOrders = False; // if true, instead open market orders it will open limit orders extern string news="-----News filter-----"; extern bool UseNewsFilter = true; extern int MinsUntilNews = 60; //extern int MinsAfterNews=60;//Code this if it turns out to be necessary extern string news1 = "3=High; 2=Medium; 1=Low"; extern int NewsImpact = 3; extern bool CloseProfitableTrade = false; extern int DisplayGapSize = 30; int OpenOrdersBasedOn=16; // Method to decide if we start long or short bool ContinueOpening=True; int OrdersTimeAlive=0; // in seconds int Manual=0; // If set to one then it will not open trades automatically color ArrowsColor=Black; // color for the orders arrows int OpenOrders=0, cnt=0; int MarketOpenOrders=0, LimitOpenOrders=0; int slippage=5; double sl=0, tp=0; double BuyPrice=0, SellPrice=0; double lotsi=0, mylotsi=0; int mode=0, myOrderType=0, myOrderTypetmp=0; string s1="--seting berapa jam dia nak open order--"; bool UseHourTrade = False; int FromHourTrade = 0; int ToHourTrade = 1; 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; bool Reversed=False; double tmp=0; double iTmpH=0; double iTmpL=0; datetime NonTradingTime[][2]; bool FileReaded=false; string dateLimit = "2030.01.12 23:00"; int CurTimeOpeningFlag=0; datetime LastOrderOpenTime=0; bool YesStop; string ChooseLineMode="Choose 1=mode main, 2=mode signal"; int stochlinemode = 1; bool TradeAllowed=true; string Gap, ScreenMessage; bool CloseAll;//Forces the EA to keep on closing pending trades until they are all closed //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { DisplayUserFeedback(); Gap=""; if (DisplayGapSize >0) { for (int cc=0; cc< DisplayGapSize; cc++) { Gap = StringConcatenate(Gap, " "); } } //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- DeleteAllObjects(); //---- return(0); } void DisplayUserFeedback() { if (UseNewsFilter) { NewsFilterCheck(); }//if (UseNewsFilter) } //+------------------------------------------------------------------+ bool CloseAllTrades() { // Attempts to close pending trades. // Returns false if any close fails, else returns true. // Only called if OrdersTotal > 0 bool CloseSucceeded = true; for (int cc = 0; cc < OrdersTotal(); cc++) { OrderSelect(cc, SELECT_BY_POS); if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) { bool result = OrderDelete(OrderTicket()); if (!result) CloseSucceeded = false; else cc--; }//if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)) }//if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) }//for (int cc = 0; cc < OrdersTotal(); cc++) return(CloseSucceeded); }// End bool CloseAllTrades() void CloseProfitableTradeBeforeNews() { // Only called if OrdersTotal() > 0 for (int cc = 0; cc < OrdersTotal(); cc++) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { if (OrderProfit() >=0) bool ticket = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),5,CLR_NONE); return; }//if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)) }//for (int cc = 0; cc < OrdersTotal(); cc++) }//End void CloseProfitableTradeBeforeNews() void NewsFilterCheck() { // Checks for impending news events. // Deletes pending trades where necessary // Closes open trades in profit or at be /* extern int MinsUntilNews=60; extern int MinsAfterNews=60; extern string news1="3=High; 2=Medium; 1=Low"; extern int NewsImpact=3; */ if(!IsTesting()) { int minutesUntilNextEvent = iCustom(NULL, 0, "FFCal", true, true, false, true, true, 1, 1); datetime dTime = minutesUntilNextEvent * 60; string sTime = TimeToStr(dTime, TIME_MINUTES); string sText; if (minutesUntilNextEvent>MinsUntilNews)//No news within the chosen timescale { sText = StringConcatenate("No News within the next ", sTime); TradeAllowed = true; }//if (minutesUntilNextEvent>MinsUntilNews) else { //News event within the chosen timescale int impactOfNextEvent = iCustom(NULL, 0, "FFCal", true, true, false, true, true, 2, 1); string sImpact = Num2Impact(impactOfNextEvent); if(StringLen(sImpact)>0) sImpact = "[" + sImpact + "] "; //sText = sImpact + "News in " + minutesUntilNextEvent + " mins."; sText = sImpact + "News in " + sTime; ScreenMessage = StringConcatenate(ScreenMessage, Gap, sText, NL); //Should the robot suspend trading? if (impactOfNextEvent >= NewsImpact) { TradeAllowed = false;//Suspend trading if (CloseProfitableTrade && OrdersTotal() >0) CloseProfitableTradeBeforeNews(); //Delete pending trades CloseAll = true; //Forces a retry at every tick if the delete fails bool CloseSucceeded = CloseAllTrades(); if (CloseSucceeded) CloseAll = false;// Closure succeeded }//if (impact >= NewsImpact) }//else ScreenMessage = StringConcatenate(ScreenMessage, Gap, sText, NL); }//if(!IsTesting()) }// End void NewsFilterCheck() string Num2Impact(int impact) { if (impact == 3) return ("HIGH IMPACT"); if (impact == 2) return ("MED IMPACT"); if (impact == 1) return ("LOW IMPACT"); else return (""); }//End string Num2Impact(int impact) //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //**************ADDED FOR ACCOUNT SENTRY *************** if (GlobalVariableGet("GV_CloseAllAndHalt") > 0){ return (0); } else //**************END ACCOUNT SENTRY HOOK **************** //--- Set Margin counter ---------------------------- WJ Begin --// //--- Init Code ---// string GlobValMargin = AccountNumber()+"_Stoch-Power-EA-5h_Margin"; if(!GlobalVariableCheck(GlobValMargin)) GlobalVariableSet(GlobValMargin,0); double AcctMargin = GlobalVariableGet(GlobValMargin); //--- Start Code ---// double AcctMarginCurr = AccountMargin(); if(AcctMargin < AcctMarginCurr){ AcctMargin = AcctMarginCurr; GlobalVariableSet(GlobValMargin,AcctMargin); } //--------------------------------------------------- WJ End ----// //---- int cnt=0; bool result; string text=""; string version="VERSI INI DAH EXPIRED...SILA YM xxul_gunturean utk penggantian"; // skrip masa trading if (UseTradingHours) { YesStop = true; // Check trading Asian Market if (TradeAsianMarket) { if (StartHour1 > 18) { // Check broker that uses Asian open before 0:00 if (Hour() >= StartHour1) YesStop = false; if (!YesStop) { if (StopHour1 < 24) { if ( Hour() <= StopHour1) YesStop = false; } // These cannot be combined even though the code looks the same if (StopHour1 >=0) { if ( Hour() <= StopHour1) YesStop = false; } } } else { if (Hour() >= StartHour1 && Hour() <= StopHour1) YesStop = false; } } if (YesStop) { // Check trading European Market if (TradeEuropeanMarket) { if (Hour() >= StartHour2 && Hour() <= StopHour2) YesStop = false; } } if (YesStop) { // Check trading European Market if (TradeNewYorkMarket) { if (Hour() >= StartHour3 && Hour() <= StopHour3) YesStop = false; } } if (YesStop) { // Comment ("Trading has been stopped as requested - wrong time of day"); return (0); } } //News events //Sets TradeAllowed to false if too close to a news event, and closes relevant trades if (UseNewsFilter) { NewsFilterCheck(); if (!TradeAllowed) { //DisplayUserFeedback(); return; } }//if (UseNewsFilter) // skrip masa trading if (AccountType==0) { if (mm!=0) { lotsi=MathCeil(AccountBalance()*risk/10000); } else { lotsi=Lots; } } if (AccountType==1) { // then is mini if (mm!=0) { lotsi=MathCeil(AccountBalance()*risk/10000)/10; } else { lotsi=Lots; } } if (AccountType==2) { if (mm!=0) { lotsi=MathCeil(AccountBalance()*risk/10000)/100; } else { lotsi=Lots; } } if (lotsi<0.01) lotsi=0.01; if (lotsi>100) lotsi=100; OpenOrders=0; MarketOpenOrders=0; LimitOpenOrders=0; for(cnt=0;cnt=AccountMoneyProtectionValue) { text = text + "\nClosing all orders and stop trading because account money protection activated.."; Print("Closing all orders and stop trading because account money protection activated.. Balance: ",AccountBalance()," Equity: ",AccountEquity()); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } ////aku masukkan time if (UseHourTrade){ if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) { text = text + "\nORDER TELAH DI TUTUP KERANA MASA DAH TAMAT."; Print("ORDER TELAH DI TUTUP KERANA MASA TAMAT. UNTUNG: ",AccountProfit()," EKUITI: ",AccountEquity()); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } } //set my profit for one Day if (MyMoneyProfitTarget && AccountProfit()>= My_Money_Profit_Target) { text = text + "\nClosing all orders and stop trading because mymoney profit target reached.."; Print("Closing all orders and stop trading because mymoney profit target reached.. Profit: ",AccountProfit()," Equity: ",AccountEquity()); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } // Account equity protection if (EquityProtection && AccountEquity()<=AccountBalance()*AccountEquityPercentProtection/100) { text = text + "\nClosing all orders and stop trading because account money protection activated."; Print("Closing all orders and stop trading because account money protection activated. Balance: ",AccountBalance()," Equity: ", AccountEquity()); //Comment("Closing orders because account equity protection was triggered. Balance: ",AccountBalance()," Equity: ", AccountEquity()); //OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Orange); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } // if dont trade at fridays then we close all if (!TradeOnFriday && DayOfWeek()==5) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text +"\nClosing all orders and stop trading because TradeOnFriday protection."; Print("Closing all orders and stop trading because TradeOnFriday protection."); } // Orders Time alive protection if (OrdersTimeAlive>0 && CurTime() - LastOrderOpenTime>OrdersTimeAlive) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text + "\nClosing all orders because OrdersTimeAlive protection."; Print("Closing all orders because OrdersTimeAlive protection."); } if (PreviousOpenOrders>OpenOrders) { for(cnt=OrdersTotal()-1;cnt>=0;cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { mode=OrderType(); if ((OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber) || AllSymbolsProtect) { if (mode==OP_BUY || mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); return(0); } } } } for(cnt=0;cnt=MaxTrades) { ContinueOpening=False; } else { ContinueOpening=True; } if (LastPrice==0) { for(cnt=0;cnt=(MaxTrades-OrderstoProtect) // Modified to make easy to understand if (SecureProfitProtection && MarketOpenOrders>=OrderstoProtect) { Profit=0; for(cnt=0;cnt=SecureProfit) { text = text + "\nClosing orders because account protection with SecureProfit was triggered."; Print("Closing orders because account protection with SeureProfit was triggered. Balance: ",AccountBalance()," Equity: ", AccountEquity()," Profit: ",Profit); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } } myOrderTypetmp=3; switch (OpenOrdersBasedOn) { case 16: myOrderTypetmp=OpenOrdersBasedOnSTOCH(); break; default: myOrderTypetmp=OpenOrdersBasedOnSTOCH(); break; } if (OpenOrders<1 && Manual==0) { myOrderType=myOrderTypetmp; if (ReverseCondition) { if (myOrderType==1) { myOrderType=2; } else { if (myOrderType==2) { myOrderType=1; } } } } if (ReverseCondition) { if (myOrderTypetmp==1) { myOrderTypetmp=2; } else { if (myOrderTypetmp==2) { myOrderTypetmp=1; } } } // if we have opened positions we take care of them cnt=OrdersTotal()-1; while(cnt>=0) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) break; if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) // && Reversed==False) { //Print("Ticket ",OrderTicket()," modified."); if (OrderType()==OP_SELL) { if (ExitWithSTOCH&& myOrderTypetmp==2) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text +"\nClosing all orders because Indicator triggered another signal."; Print("Closing all orders because Indicator triggered another signal."); //return(0); } if (TrailingStop>0) { if ((OrderOpenPrice()-OrderClosePrice())>=(TrailingStop*Point+Pips*Point)) { if (OrderStopLoss()>(OrderClosePrice()+TrailingStop*Point)) { result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+TrailingStop*Point,OrderClosePrice()-TakeProfit*Point-TrailingStop*Point,0,Purple); if(result!=TRUE) Print("LastError = ", GetLastError()); else OrderPrint(); return(0); } } } } if (OrderType()==OP_BUY) { if (ExitWithSTOCH && myOrderTypetmp==1) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text +"\nClosing all orders because Indicator triggered another signal."; Print("Closing all orders because Indicator triggered another signal."); //return(0); } if (TrailingStop>0) { if ((OrderClosePrice()-OrderOpenPrice())>=(TrailingStop*Point+Pips*Point)) { if (OrderStopLoss()<(OrderClosePrice()-TrailingStop*Point)) { result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-TrailingStop*Point,OrderClosePrice()+TakeProfit*Point+TrailingStop*Point,0,ArrowsColor); if(result!=TRUE) Print("LastError = ", GetLastError()); else OrderPrint(); return(0); } } } } } cnt--; } if (!IsTesting()) { if (myOrderType==3 && OpenOrders<1) { text=text + "\nOPEN ORDER"; } //else { text= text + "\n "; } Comment("LAST PRICE=",LastPrice," OPEN ORDERS=",PreviousOpenOrders,"\nCONTINUE OPENING=",ContinueOpening," MY ORDER TYPE=",myOrderType,"\nLOT=",lotsi,text); } if (OpenOrders<1) OpenMarketOrders(); else if (SetLimitOrders) OpenLimitOrders(); else OpenMarketOrders(); //---- return(0); } //+------------------------------------------------------------------+ void OpenMarketOrders() { int cnt=0; if (myOrderType==1 && ContinueOpening && TradeAllowed==true) { if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1) { SellPrice=Bid; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=SellPrice-TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=SellPrice+StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); } // Sleep(6000); ////aku letak // RefreshRates(); } if (myOrderType==2 && ContinueOpening && TradeAllowed==true) { if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1) { BuyPrice=Ask; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=BuyPrice+TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=BuyPrice-StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); } } } void OpenLimitOrders() { int cnt=0; if (myOrderType==1 && ContinueOpening && TradeAllowed==true) { //if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1) //{ //SellPrice=Bid; SellPrice = LastPrice+Pips*Point; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=SellPrice-TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=SellPrice+StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_SELLLIMIT,mylotsi,SellPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); //} } if (myOrderType==2 && ContinueOpening && TradeAllowed==true) { //if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1) //{ //BuyPrice=Ask; BuyPrice=LastPrice-Pips*Point; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=BuyPrice+TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=BuyPrice-StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_BUYLIMIT,mylotsi,BuyPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); //} } } void DeleteAllObjects() { int obj_total=ObjectsTotal(); string name; for(int i=0;iH_level && currentstochcurrentstoch && currentstoch > H_level) //if(previousstoch>H_level && previousstoch>currentstoch && currentstoch=stos2 && stom2>H_level && (Low[0] > E_lower && High[0] < E_upper))||(stom3=stos4 && stom4>H_level && ((Low[0]E_upper)))) //if(previousstoch>H_level && signalstoch > currentstoch) { myOrderType=1; } //buy order // if(previousstochL_level) //if(previousstochL_level) if ((stom1>stos1 && stom2<=stos2 && stom2 E_lower && High[0] < E_upper))||(stom3>stos3 && stom4<=stos4 && stom4 E_upper)))) // if(previousstoch