#property copyright "Copyright © 2009 Forex Hitter, GetToBeRichNow.com" #property link "http://GetToBeRichNow.com" #include extern string _d0 = "Forex Hitter ver: 1.1.2"; extern string _d1 = "System Parameters"; extern int MagicNumber = 1357; extern int Slippage = 3; extern bool SignalMail = FALSE; extern string _d2 = "Order Parameters"; extern int BuyTakeProfit = 130; extern int BuyStopLoss = 70; extern int BuyTrailingStop = 40; extern int SellTakeProfit = 130; extern int SellStopLoss = 70; extern int SellTrailingStop = 40; extern double Lots = 0.1; extern string _d3 = "Money Managment Risk"; extern double Risk = 0.2; extern string _d4 = "Starategy Parameters"; int gi_168 = 24; double gd_172 = 0.25; double gd_180 = 1.75; bool gi_188 = FALSE; extern bool SafeMode = TRUE; int gi_196; double gd_200; double gd_208; double gd_216; double gd_224; double gd_232; double g_high_240 = 0.0; double g_low_248 = 0.0; int g_time_256 = 0; int g_time_260 = 0; int gia_264[9]; int gia_268[9]; int gia_272[9]; int gia_276[9]; int gia_280[9]; int gia_284[9]; int gia_288[9]; int gia_292[9]; double gda_296[9]; double gda_300[9]; int gi_304 = -1; bool gi_308 = FALSE; bool gi_312 = FALSE; int gi_316 = -1; void InitParams() { gia_264[0] = D'01.01.2007 03:30'; gia_268[0] = 100; gia_272[0] = 100; gia_276[0] = 35; gia_280[0] = 460; gia_284[0] = 20; gia_288[0] = 0; gia_292[0] = 21; gda_296[0] = 1.5; gda_300[0] = 1; gia_264[1] = D'01.07.2007 04:30'; gia_268[1] = 150; gia_272[1] = 100; gia_276[1] = 50; gia_280[1] = 460; gia_284[1] = 0; gia_288[1] = 40; gia_292[1] = 24; gda_296[1] = 0.5; gda_300[1] = 1.75; gia_264[2] = D'01.01.2008 03:30'; gia_268[2] = 0; gia_272[2] = 40; gia_276[2] = 0; gia_280[2] = 40; gia_284[2] = 25; gia_288[2] = 0; gia_292[2] = 24; gda_296[2] = 1.75; gda_300[2] = 0.75; gia_264[3] = D'01.07.2008 04:30'; gia_268[3] = 450; gia_272[3] = 60; gia_276[3] = 5; gia_280[3] = 460; gia_284[3] = 25; gia_288[3] = 0; gia_292[3] = 27; gda_296[3] = 0.5; gda_300[3] = 1.75; gia_264[4] = D'01.10.2008 04:30'; gia_268[4] = 450; gia_272[4] = 80; gia_276[4] = 15; gia_280[4] = 460; gia_284[4] = 40; gia_288[4] = 25; gia_292[4] = 24; gda_296[4] = 2; gda_300[4] = 1.25; gia_264[5] = D'01.11.2008 04:30'; gia_268[5] = 450; gia_272[5] = 100; gia_276[5] = 25; gia_280[5] = 460; gia_284[5] = 100; gia_288[5] = 30; gia_292[5] = 28; gda_296[5] = 1.5; gda_300[5] = 1.75; gia_264[6] = D'01.12.2008 03:30'; gia_268[6] = 300; gia_272[6] = 90; gia_276[6] = 15; gia_280[6] = 300; gia_284[6] = 90; gia_288[6] = 15; gia_292[6] = 26; gda_296[6] = 1.3; gda_300[6] = 1.8; gia_264[7] = D'01.01.2009 03:30'; gia_268[7] = 140; gia_272[7] = 110; gia_276[7] = 40; gia_280[7] = 140; gia_284[7] = 110; gia_288[7] = 40; gia_292[7] = 30; gda_296[7] = 0.25; gda_300[7] = 1.75; gia_264[8] = D'01.04.2009 04:30'; gia_268[8] = 130; gia_272[8] = 70; gia_276[8] = 40; gia_280[8] = 130; gia_284[8] = 70; gia_288[8] = 40; gia_292[8] = 24; gda_296[8] = 0.25; gda_300[8] = 1.75; } void CheckParams() { int li_0 = ArrayBsearch(gia_264, Time[gi_196]); if (gi_304 != li_0) { BuyTakeProfit = gia_268[li_0]; BuyStopLoss = gia_272[li_0]; BuyTrailingStop = gia_276[li_0]; SellTakeProfit = gia_280[li_0]; SellStopLoss = gia_284[li_0]; SellTrailingStop = gia_288[li_0]; gi_168 = gia_292[li_0]; gd_172 = gda_296[li_0]; gd_180 = gda_300[li_0]; gi_304 = li_0; } } void init() { if (gi_188) gi_196 = 0; else gi_196 = 1; gd_200 = 0.0001 / Point; Comment("Forex Hitter ver: 1.1.2"); if (StringFind(Symbol(), "EUR") < 0 || StringFind(Symbol(), "USD") < 0) MessageBox("You have selected the wrong currency pair!\n Forex Hitter works with the EURUSD pair only!", "Forex Hitter: Warning", MB_ICONEXCLAMATION); if (Period() != PERIOD_H1) MessageBox("You have selected wrong timeframe!\n Please, select H1 timeframe on the upper panel of your MetaTrader4 window!", "Forex Hitter: Warning", MB_ICONEXCLAMATION); if (IsTesting()) InitParams(); } int deinit() { Comment(""); return (0); } void Bands(int a_period_0, double ad_4, int a_applied_price_12, double &ad_16, double &ad_24, int ai_32) { double l_ima_36 = iMA(NULL, 0, a_period_0, 0, MODE_SMA, a_applied_price_12, ai_32); double l_istddev_44 = iStdDev(NULL, 0, a_period_0, 0, MODE_SMA, a_applied_price_12, ai_32); ad_16 = l_ima_36 + ad_4 * l_istddev_44; ad_24 = l_ima_36 - ad_4 * l_istddev_44; } void setRules() { if (IsTesting()) CheckParams(); HideTestIndicators(TRUE); Bands(gi_168, gd_172, PRICE_CLOSE, gd_208, gd_216, gi_196); Bands(gi_168, gd_172 + gd_180, PRICE_CLOSE, gd_224, gd_232, gi_196); HideTestIndicators(FALSE); } int crossUp(double ad_0) { return (Low[gi_196 + 1] < ad_0 || Open[gi_196] < ad_0 && Close[gi_196] > ad_0); } int crossDown(double ad_0) { return (High[gi_196 + 1] > ad_0 || Open[gi_196] > ad_0 && Close[gi_196] < ad_0); } int breakUp() { if (Low[gi_196] <= gd_232) { gi_308 = TRUE; g_low_248 = Low[gi_196]; } else if (Low[gi_196] > gd_216) gi_308 = FALSE; if (gi_308 && Close[gi_196] > gd_216) return (1); return (0); } int breakDown() { if (High[gi_196] >= gd_224) { gi_312 = TRUE; g_high_240 = High[gi_196]; } else if (High[gi_196] < gd_208) gi_312 = FALSE; if (gi_312 && Close[gi_196] < gd_208) return (1); return (0); } int openBuyRule() { return (breakUp()); } int openSellRule() { return (breakDown()); } bool closeBuyRule() { return ((g_time_256 != Time[gi_196] && Low[gi_196] <= gd_232 || (g_low_248 > 0.0 && Low[gi_196] <= g_low_248)) || crossDown(gd_208) || breakDown()); } bool closeSellRule() { return ((g_time_260 != Time[gi_196] && High[gi_196] >= gd_224 || (g_high_240 > 0.0 && High[gi_196] >= g_high_240)) || crossUp(gd_216) || breakUp()); } int openBuy() { double l_price_0 = 0; double l_price_8 = 0; int l_stoplevel_16 = MarketInfo(Symbol(), MODE_STOPLEVEL); if (BuyStopLoss > 0) { if (BuyStopLoss * gd_200 > l_stoplevel_16) l_price_8 = NormalizeDouble(Bid - BuyStopLoss * Point * gd_200, Digits); else l_price_8 = NormalizeDouble(Bid - l_stoplevel_16 * Point, Digits); } if (BuyTakeProfit > 0) { if (BuyTakeProfit * gd_200 > l_stoplevel_16) l_price_0 = NormalizeDouble(Ask + BuyTakeProfit * Point * gd_200, Digits); else l_price_0 = NormalizeDouble(Ask + l_stoplevel_16 * Point, Digits); } int l_ticket_20 = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, l_price_8, l_price_0, "Forex Hitter: Buy", MagicNumber, 0, Green); if (l_ticket_20 > 0) if (SignalMail) SendMail("Forex Hitter", "Open Buy: [" + Symbol() + "] " + NormalizeDouble(Ask, Digits)); return (l_ticket_20); } int openSell() { double l_price_0 = 0; double l_price_8 = 0; int l_stoplevel_16 = MarketInfo(Symbol(), MODE_STOPLEVEL); if (SellStopLoss > 0) { if (SellStopLoss * gd_200 > l_stoplevel_16) l_price_8 = NormalizeDouble(Ask + SellStopLoss * Point * gd_200, Digits); else l_price_8 = NormalizeDouble(Ask + l_stoplevel_16 * Point, Digits); } if (SellTakeProfit > 0) { if (SellTakeProfit * gd_200 > l_stoplevel_16) l_price_0 = NormalizeDouble(Bid - SellTakeProfit * Point * gd_200, Digits); else l_price_0 = NormalizeDouble(Bid - l_stoplevel_16 * Point, Digits); } int l_ticket_20 = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, l_price_8, l_price_0, "Forex Hitter: Sell", MagicNumber, 0, Red); if (l_ticket_20 > 0) if (SignalMail) SendMail("Forex Hitter", "Open Sell: [" + Symbol() + "] " + NormalizeDouble(Bid, Digits)); return (l_ticket_20); } int buyControl() { if (closeBuyRule()) if (OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Violet)) return (-1); if (BuyTrailingStop > 0) { if (Bid - OrderOpenPrice() > Point * gd_200 * BuyTrailingStop) if (OrderStopLoss() < Bid - Point * gd_200 * BuyTrailingStop || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - Point * gd_200 * BuyTrailingStop, Digits), OrderTakeProfit(), 0, Green); } return (OrderTicket()); } int sellControl() { if (closeSellRule()) if (OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Violet)) return (-1); if (SellTrailingStop > 0) { if (OrderOpenPrice() - Ask > Point * gd_200 * SellTrailingStop) if (OrderStopLoss() > Ask + Point * gd_200 * SellTrailingStop || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + Point * gd_200 * SellTrailingStop, Digits), OrderTakeProfit(), 0, Red); } return (OrderTicket()); } double MMLots(double ad_0) { return (NormalizeLots(ad_0 * AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED) / (AccountLeverage() / 100.0))); } double NormalizeLots(double ad_0) { double l_lotstep_16 = MarketInfo(Symbol(), MODE_LOTSTEP); double l_minlot_24 = MarketInfo(Symbol(), MODE_MINLOT); double l_maxlot_32 = MarketInfo(Symbol(), MODE_MAXLOT); double ld_ret_8 = MathCeil(ad_0 / l_lotstep_16) * l_lotstep_16; if (ld_ret_8 < l_minlot_24) ld_ret_8 = l_minlot_24; if (ld_ret_8 > l_maxlot_32) ld_ret_8 = l_maxlot_32; return (ld_ret_8); } int start() { if (Bars < 100) { Print("bars less than 100"); return (0); } setRules(); int li_0 = -1; int li_4 = -1; for (int l_pos_8 = OrdersTotal() - 1; l_pos_8 >= 0; l_pos_8--) { if (OrderSelect(l_pos_8, SELECT_BY_POS)) { if (OrderMagicNumber() == MagicNumber) { if (OrderSymbol() == Symbol()) { switch (OrderType()) { case OP_BUY: li_0 = buyControl(); break; case OP_SELL: li_4 = sellControl(); } } } } } int li_16 = openBuyRule(); int li_20 = openSellRule(); if (Risk > 0.0) Lots = MMLots(Risk); if (AccountFreeMargin() < MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lots) { Print("We have no money. Free Margin = ", AccountFreeMargin(), " RequiredMargin = ", MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lots); return (0); } if (g_time_256 != Time[gi_196] && li_16 && li_0 < 0 && !SafeMode || gi_316 != FALSE) { if (openBuy() > 0) { g_time_256 = Time[gi_196]; gi_316 = FALSE; } } else { if (g_time_260 != Time[gi_196] && li_20 && li_4 < 0 && !SafeMode || gi_316 != TRUE) { if (openSell() > 0) { g_time_260 = Time[gi_196]; gi_316 = TRUE; } } } return (0); }