//+-----------------------------------------------------------------------------------+ //| Stoch_Power_Hedger_V3.1.mq4 | //| Forrest Miller, 5/17/2009 | //| wackena@bogie-enterprises.com| //| Copyright © 2009, spike2009 | //| http://bulldogge1232000@yahoo.com | //+-----------------------------------------------------------------------------------+ ///Please, do not sell this EA because its FREE #property copyright "Copyright © 2009, spike2009 " #property link "http://bulldogge1232000@yahoo.com" extern string INFO="Stoch_Power_Hedger_V3.1"; extern string OWN="Copyright © 2009, spike2009 "; extern string sq="--STOCH SETTING--"; extern int K_Period = 145; extern int D_Period = 20; extern int Slow_Period = 80; extern int Stoch_TF = 60; extern int shift= 1; extern int H_level = 78; extern int L_level = 22; extern string ChooseLineMode="Choose 1=mode main, 2=mode signal"; extern int stochlinemode = 1; extern string ChooseeMAMode="Choose 1=mode SMA, 2=mode LWMA, 3=mode EMA, 4=mode SMMA"; 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 = 110; // Profit Goal for the latest order opened extern bool MyMoneyProfitTarget=False; extern double My_Money_Profit_Target=50; extern double multiply= 1.7; extern int MaxTrades= 6; // Maximum number of orders to open extern int Pips= 90; // Distance in Pips from one order to another extern int StopLoss = 600; // 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=True; extern string SP="If profit made is bigger than SecureProfit we close the orders"; extern int SecureProfit= 5; // 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; string s1="--seting berapa jam dia nak open order--"; bool UseHourTrade = False; int FromHourTrade = 0; int ToHourTrade = 1; extern string TradingTime="--trading time setting--"; extern bool UseTradingHours = false; 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 = 9; // 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=True; extern string OtherSetting="--Others Setting--"; int OrdersTimeAlive= 0; // in seconds 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 int Manual= 0; // If set to one then it will not open trades automatically color ArrowsColor= Yellow; // color for the orders arrows int OpenOrdersBasedOn= 16; // Method to decide if we start long or short bool ContinueOpening[6]={True}; int OpenOrders[6]={0}, cnt=0; int MarketOpenOrders[6]={0}, LimitOpenOrders[6]={0}; int slippage=50; double sl=0, tp=0; double BuyPrice=0, SellPrice=0; double lotsi=0, mylotsi=0; int mode=0, myOrderType[6]={0}, myOrderTypetmp=0; int MyMode=OP_BUY; double LastPrice[6]={0}; int PreviousOpenOrders[6]={0,0,0,0,0,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[6]={0}; bool YesStop; double buyLastPrice; int buyPreviousOpenOrders; bool buyContinueOpening; int buymyOrderType; double maxdd,maxpercentdd; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- int dig=MarketInfo(Symbol(),MODE_DIGITS); int x; if(dig==2) x=1; if(dig==3) x=10; if(dig==4) x=1; if(dig==5) x=10; if(TakeProfit>0) TakeProfit = TakeProfit*x; if(StopLoss>0) StopLoss = StopLoss*x; if(Pips>0) Pips = Pips*x; if(TrailingStop>0) TrailingStop = TrailingStop*x; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Print("MaxDD: ",maxdd); Print("MaxPercDD: ",maxpercentdd); DeleteAllObjects(); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //############################################################################################## //##########CONTROLO LA PERDIDA MAXIMA Y EL PORCENTAJE DE PERDIDA############################### double OpenProfit; OpenProfit = AccountEquity()-AccountBalance(); if (OpenProfit 0){ return (0); } else //**************END ACCOUNT SENTRY HOOK **************** MyMode=OP_BUY; here_we_go( MagicNumber, 100, L_level ); MyMode=OP_SELL; here_we_go( 111333, H_level, 0 ); return (0); } int here_we_go( int MagicNumber1, int H_level1, int L_level1 ) { //--- 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); } } // 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[MyMode]=0; MarketOpenOrders[MyMode]=0; LimitOpenOrders[MyMode]=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[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=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[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=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[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=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[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=False; return(0); } // if dont trade at fridays then we close all if (!TradeOnFriday && DayOfWeek()==5) { PreviousOpenOrders[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=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[MyMode]>OrdersTimeAlive) { PreviousOpenOrders[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=False; text = text + "\nClosing all orders because OrdersTimeAlive protection."; Print("Closing all orders because OrdersTimeAlive protection."); } if (PreviousOpenOrders[MyMode]>OpenOrders[MyMode]) { for(cnt=OrdersTotal()-1;cnt>=0;cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { mode=OrderType(); if ((OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber1) || AllSymbolsProtect) { if (mode==MyMode) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); return(0); } } } } for(cnt=0;cnt=MaxTrades) { ContinueOpening[MyMode]=False; } else { ContinueOpening[MyMode]=True; } if (LastPrice[MyMode]==0) { for(cnt=0;cnt=(MaxTrades-OrderstoProtect) // Modified to make easy to understand if (SecureProfitProtection && MarketOpenOrders[MyMode]>=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[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=False; return(0); } } myOrderTypetmp=3; switch (OpenOrdersBasedOn) { case 16: myOrderTypetmp=OpenOrdersBasedOnSTOCH(H_level1, L_level1); break; default: myOrderTypetmp=OpenOrdersBasedOnSTOCH(H_level1, L_level1); break; } if (OpenOrders[MyMode]<1 && Manual==0) { myOrderType[MyMode]=myOrderTypetmp; if (ReverseCondition) { if (myOrderType[MyMode]==1) { myOrderType[MyMode]=2; } else { if (myOrderType[MyMode]==2) { myOrderType[MyMode]=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() == MagicNumber1)) // && Reversed==False) { //Print("Ticket ",OrderTicket()," modified."); if (OrderType()==OP_SELL) { if (ExitWithSTOCH&& myOrderTypetmp==2) { PreviousOpenOrders[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=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[MyMode]=OpenOrders[MyMode]+1; ContinueOpening[MyMode]=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 ( MyMode == OP_BUY ) { buyLastPrice = LastPrice[MyMode]; buyPreviousOpenOrders = PreviousOpenOrders[MyMode]; buyContinueOpening = ContinueOpening[MyMode]; buymyOrderType = myOrderType[MyMode]; } else { if (myOrderType[MyMode]==3 && OpenOrders[MyMode]<1) { text=text + "\nOPEN ORDER"; } //else { text= text + "\n "; } Comment("LAST PRICE=",buyLastPrice,",",LastPrice," OPEN ORDERS=",buyPreviousOpenOrders,",",PreviousOpenOrders,"\nCONTINUE OPENING=",buyContinueOpening,",",ContinueOpening[MyMode]," MY ORDER TYPE=",buymyOrderType,",",myOrderType[MyMode],"\nLOT=",lotsi,text); } } if (OpenOrders[MyMode]<1) OpenMarketOrders(MagicNumber1); else if (SetLimitOrders) OpenLimitOrders(MagicNumber1); else OpenMarketOrders(MagicNumber1); //---- return(0); } //+------------------------------------------------------------------+ void OpenMarketOrders(int MagicNumber1) { int cnt=0, ticket, attempts; if (myOrderType[MyMode]==1 && ContinueOpening[MyMode] && MyMode==OP_SELL) { if ((Bid-LastPrice[MyMode])>=Pips*Point || OpenOrders[MyMode]<1) { ticket=-1; attempts=0; SellPrice=Bid; LastPrice[MyMode]=0; if (TakeProfit==0) { tp=0; } else { tp=SellPrice-TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=SellPrice+StopLoss*Point; } if (OpenOrders[MyMode]!=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; } while( ticket < 0) { while(!IsTradeAllowed() || IsTradeContextBusy()) {Sleep(5000);} RefreshRates(); ticket=OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,0,0,"MyMEFx EA"+MagicNumber1,MagicNumber1,0,ArrowsColor); if(ticket>0){ if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {Print("SELL order opened : ",OrderOpenPrice()); break;}} else {Print("Error opening SELL order : ",GetLastError()); attempts++; Sleep(5000);} if(attempts >= 20) {Print("20 attempts to open SELL position have failed"); break;} } if(IsTradeContextBusy() || !IsTradeAllowed()) { Print("Trade context is busy! The expert cannot modify Sell position!"); return(-1); } OrderModify(ticket,OrderOpenPrice(),sl,tp,0,GreenYellow); return(0); } // Sleep(6000); ////aku letak // RefreshRates(); } if (myOrderType[MyMode]==2 && ContinueOpening[MyMode] && MyMode==OP_BUY) { if ((LastPrice[MyMode]-Ask)>=Pips*Point || OpenOrders[MyMode]<1) { ticket=-1; attempts=0; BuyPrice=Ask; LastPrice[MyMode]=0; if (TakeProfit==0) { tp=0; } else { tp=BuyPrice+TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=BuyPrice-StopLoss*Point; } if (OpenOrders[MyMode]!=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; } while( ticket < 0) { while(!IsTradeAllowed() || IsTradeContextBusy()) {Sleep(5000);} RefreshRates(); ticket=OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,0,0,"MyMEFx EA"+MagicNumber1,MagicNumber1,0,ArrowsColor); if(ticket>0){ if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {Print("BUY order opened : ",OrderOpenPrice()); break;}} else {Print("Error opening BUY order : ",GetLastError()); attempts++; Sleep(5000);} if(attempts >= 20) {Print("20 attempts to open BUY position have failed"); break;} } if(IsTradeContextBusy() || !IsTradeAllowed()) { Print("Trade context is busy! The expert cannot modify Buy position!"); return(-1); } OrderModify(ticket,OrderOpenPrice(),sl,tp,0,GreenYellow); return(0); } } } void OpenLimitOrders(int MagicNumber1) { int cnt=0; if (myOrderType[MyMode]==1 && ContinueOpening[MyMode]) { //if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1) //{ //SellPrice=Bid; SellPrice = LastPrice[MyMode]+Pips*Point; LastPrice[MyMode]=0; if (TakeProfit==0) { tp=0; } else { tp=SellPrice-TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=SellPrice+StopLoss*Point; } if (OpenOrders[MyMode]!=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"+MagicNumber1,MagicNumber1,0,ArrowsColor); return(0); //} } if (myOrderType[MyMode]==2 && ContinueOpening[MyMode]) { //if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1) //{ //BuyPrice=Ask; BuyPrice=LastPrice[MyMode]-Pips*Point; LastPrice[MyMode]=0; if (TakeProfit==0) { tp=0; } else { tp=BuyPrice+TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=BuyPrice-StopLoss*Point; } if (OpenOrders[MyMode]!=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"+MagicNumber1,MagicNumber1,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 && currentstochH_level1)) && (Var7 > Var6 && Var7 < Var5))) //if(previousstoch>H_level && signalstoch > currentstoch) { myOrderType=1; } //buy order // if(previousstochL_level) //if(previousstochL_level) if ((Var7 > Var5 && Var7 > Var8)||(Var3 > Var4 && ((Var1 > Var2) || (stom2 Var6 && Var7 < Var5))) // if(previousstoch