extern int MA_length = 10; extern int MA_timeframe = 30; extern int MAtype = 0; extern double Percent = 0.1; extern int TradeOnFriday = 1; extern int slip = 100; extern double Lots = 0.1; extern int TakeProfit = 30; extern int Stoploss = 300; int gi_120 = 23; int gi_124 = 1; int gi_128 = 84; int gi_132 = 1; double gd_136 = 0.002; bool gi_144 = TRUE; extern int PipStep = 30; extern double IncreasementType = 0.0; double g_price_160 = 0.0; double g_ord_stoploss_168 = 0.0; double gd_176; double gd_184; double gd_192 = 0.0; double gd_200; int gi_208 = 0; int gi_212 = 0; int g_ord_total_216 = 0; int gi_unused_220 = 10; int gi_unused_224 = 500; int gi_228 = 500; int g_color_232 = DodgerBlue; int gi_unused_236 = 16748574; int gi_unused_240 = 16748574; int g_color_244 = Red; int gi_unused_248 = 255; int gi_unused_252 = 255; int gi_unused_256 = 16777215; string gs_260 = "Firebird v63D"; string gs_unused_268 = "expert.wav"; int gi_unused_276 = 0; int gi_unused_280 = 1; int gi_unused_284 = 2; extern int GMT = 2; extern int DST = 0; extern int OpeningHour = 0; extern int ClosingHour = 23; int gi_304 = 0; int g_magic_308; int gi_312; double gd_316; double g_price_324; double gd_332; int init() { LogWrite(Symbol() + ",M" + Period()); return (0); } int start() { int li_0; int li_4; int l_ord_total_8; int li_12; int l_day_of_year_16; LogWrite(TimeToStr(TimeCurrent()) + " - " + "Bid=" + Bid); g_magic_308 = MagicfromSymbol(); Comment(g_magic_308); SetupGlobalVariables(); if (DayOfWeek() == 6 && Hour() >= 20) { Comment("weekend"); return (0); } if (!(IsTesting() || IsDemo())) { if (LossCheck()) { Alert("excessive loss!"); PlaySound("alert.wav"); return (0); } } if (AccountBalance() - AccountEquity() > gi_212) gi_212 = AccountBalance() - AccountEquity(); if (MyOrdersTotal() > g_ord_total_216) g_ord_total_216 = OrdersTotal(); double ld_20 = divergence(gi_120, gi_128, gi_124, gi_132, 0); Comment("maxDrawDown=", gi_212, " maxOrdersOpen=", g_ord_total_216, " Current Divergence = ", ld_20); gd_200 = PipStep; if (IncreasementType > 0.0) { gd_200 = MathSqrt(MyOrdersTotal()) * PipStep; gd_200 = MathPow(MyOrdersTotal(), IncreasementType) * PipStep; } LogWrite("CurrentPipStep=" + gd_200); gi_312 = 0; if (Day() != 5 || TradeOnFriday > 0) { l_ord_total_8 = OrdersTotal(); li_12 = MyOrdersTotal(); LogWrite("OrdersTotal=" + l_ord_total_8); LogWrite("MyOrdersTotal=" + li_12); if (li_12 == 0) l_day_of_year_16 = DayOfYear(); if (li_12 > 0) gd_316 = GetPreviousOpenPrice(); else LogWrite("LastPrice=" + gd_316); li_0 = CheckJustClosedOrder(); if (li_0 != 1) { gi_208 = FALSE; gd_316 = GetPreviousOpenPrice(); LogWrite("LastPrice=" + gd_316); if (MathAbs(ld_20) <= gd_136) { if (Hour() < OpeningHour + GMT + DST || Hour() > ClosingHour + GMT + DST) Comment("bad hours."); else { if (MAtype == FALSE) { li_4 = EnterPositionBasedOnOpen(); if (li_4 == 1) { gi_208 = TRUE; gi_312 = 2; } if (li_4 == 2) { gi_208 = TRUE; gi_312 = 1; } } if (MAtype == TRUE) { li_4 = EnterPositionBasedOnHL(); if (li_4 == 1) { gi_208 = TRUE; gi_312 = 2; } if (li_4 == 2) { gi_208 = TRUE; gi_312 = 1; } } } } } li_12 = MyOrdersTotal(); if (li_12 > 0 && gi_208 == TRUE) { gd_332 = CalculateAverageOpeningPrice(li_12); Comment("AveragePrice: ", gd_332, " myTotal: ", li_12); } if (gi_208 == TRUE && li_12 > 1) ChangeOpenOrders(0, li_12, gd_332); if (li_12 > 0) KeepTrackOfStopLoss(gd_332); } return (0); } void SetupGlobalVariables() { switch (g_magic_308) { case 26910: Percent = 0.15; TradeOnFriday = 1; slip = 100; PipStep = 5; IncreasementType = 0.0; gi_unused_220 = 8; OpeningHour = 6; ClosingHour = 14; return; case 25803: Percent = 0.25; TradeOnFriday = 1; slip = 100; PipStep = 5; IncreasementType = 0.0; gi_unused_220 = 8; OpeningHour = 7; ClosingHour = 15; return; case 26715: MA_length = 18; MA_timeframe = 30; MAtype = FALSE; Percent = 0.1; TradeOnFriday = 1; slip = 100; Lots = 0.05; TakeProfit = 10; Stoploss = 300; PipStep = 7; IncreasementType = 0.0; gi_unused_220 = 6; OpeningHour = 6; ClosingHour = 14; return; return; } } double GetPreviousOpenPrice() { double l_ord_open_price_4; for (int l_pos_0 = OrdersTotal() - 1; l_pos_0 >= 0; l_pos_0--) { OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_308 && OrderComment() == GetCommentForOrder()) { l_ord_open_price_4 = OrderOpenPrice(); break; } } return (l_ord_open_price_4); } int CheckJustClosedOrder() { int l_datetime_4; string ls_8; int l_str2time_16; int li_24; int l_hist_total_20 = OrdersHistoryTotal(); bool li_ret_28 = FALSE; for (int l_pos_0 = 0; l_pos_0 < l_hist_total_20; l_pos_0++) { if (OrderSelect(l_pos_0, SELECT_BY_POS, MODE_HISTORY) == TRUE) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_308 && OrderComment() == GetCommentForOrder()) { l_datetime_4 = OrderCloseTime(); ls_8 = Year() + "-" + Month() + "-" + Day() + " " + Hour() + ":" + Minute() + ":" + Seconds(); l_str2time_16 = StrToTime(ls_8); li_24 = l_str2time_16 - l_datetime_4; if (60 * Period() * 2 > li_24) { li_ret_28 = TRUE; break; } } } } return (li_ret_28); } int EnterPositionBasedOnOpen() { int li_ret_0; double l_ima_4 = iMA(NULL, MA_timeframe, MA_length, 0, MODE_SMA, PRICE_OPEN, 0); double ld_12 = iRVI(NULL, 0, 10, MODE_MAIN, 0) - iRVI(NULL, 0, 10, MODE_MAIN, 1); if (l_ima_4 * (Percent / 100.0 + 1.0) < Bid && gi_312 != 22 && Bid >= gd_316 + gd_200 * Point || MyOrdersTotal() == 0 && ld_12 < 0.0) { OrderSend(Symbol(), OP_SELL, Lots, Bid, slip, Bid + Stoploss * Point, Bid - TakeProfit * Point, GetCommentForOrder(), g_magic_308, 0, g_color_244); li_ret_0 = 1; } if (l_ima_4 * (1 - Percent / 100.0) > Ask && gi_312 != 11 && Ask <= gd_316 - gd_200 * Point || MyOrdersTotal() == 0 && ld_12 > 0.0) { OrderSend(Symbol(), OP_BUY, Lots, Ask, slip, Ask - Stoploss * Point, Ask + TakeProfit * Point, GetCommentForOrder(), g_magic_308, 0, g_color_232); li_ret_0 = 2; } return (li_ret_0); } int EnterPositionBasedOnHL() { int li_ret_0; if (iMA(NULL, MA_timeframe, MA_length, 0, MODE_SMA, PRICE_HIGH, 0) * (Percent / 100.0 + 1.0) < Bid && gi_312 != 22 && Bid >= gd_316 + gd_200 * Point || MyOrdersTotal() == 0) { OrderSend(Symbol(), OP_SELL, Lots, Bid, slip, Bid + Stoploss * Point, Bid - TakeProfit * Point, GetCommentForOrder(), g_magic_308, 0, g_color_244); li_ret_0 = 1; } if (iMA(NULL, MA_timeframe, MA_length, 0, MODE_SMA, PRICE_LOW, 0) * (1 - Percent / 100.0) > Ask && gi_312 != 11 && Ask <= gd_316 - gd_200 * Point || MyOrdersTotal() == 0) { OrderSend(Symbol(), OP_BUY, Lots, Ask, slip, Ask - Stoploss * Point, Ask + TakeProfit * Point, GetCommentForOrder(), g_magic_308, 0, g_color_232); li_ret_0 = 2; } return (li_ret_0); } double CalculateAverageOpeningPrice(int ai_0) { double ld_ret_8 = 0; for (int l_pos_4 = OrdersTotal() - 1; l_pos_4 >= 0; l_pos_4--) { OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_308 && OrderComment() == GetCommentForOrder()) ld_ret_8 += OrderOpenPrice(); } ld_ret_8 /= MathMax(ai_0, 1); return (ld_ret_8); } void ChangeOpenOrders(bool ai_0, int ai_4, double ad_8) { int l_ord_total_20 = OrdersTotal(); for (int l_pos_16 = 0; l_pos_16 < l_ord_total_20; l_pos_16++) { OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_308 && OrderComment() == GetCommentForOrder()) { if (OrderType() == OP_BUY) { g_price_324 = ad_8 + TakeProfit * Point; g_price_160 = ad_8 - Stoploss * Point / ai_4; } if (OrderType() == OP_SELL) { g_price_324 = ad_8 - TakeProfit * Point; g_price_160 = ad_8 + Stoploss * Point / ai_4; } if (ai_0) OrderModify(OrderTicket(), 0, g_price_160, g_price_324, 0, Yellow); } } } void KeepTrackOfStopLoss(double ad_0) { int l_cmd_8 = -1; int l_ord_total_12 = OrdersTotal(); for (int l_pos_16 = 0; l_pos_16 < l_ord_total_12; l_pos_16++) { OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_308 && OrderComment() == GetCommentForOrder()) { g_ord_stoploss_168 = OrderStopLoss(); l_cmd_8 = OrderType(); } } gd_176 = ad_0; gi_312 = 0; if (l_cmd_8 == OP_BUY) gi_312 = 1; else if (l_cmd_8 == OP_SELL) gi_312 = 2; if (g_ord_stoploss_168 != 0.0) { gd_192 = MathAbs(gd_176 - g_ord_stoploss_168) / 2.0; gd_184 = (Bid + Ask) / 2.0; if (g_ord_stoploss_168 < gd_184 + gd_192 && g_ord_stoploss_168 > gd_184 - gd_192) { if (gi_312 == 1) gi_312 = 11; if (gi_312 == 2) gi_312 = 22; } g_ord_stoploss_168 = 0; } } int MagicfromSymbol() { int li_ret_0 = 0; for (int li_4 = 0; li_4 < 5; li_4++) li_ret_0 = 3 * li_ret_0 + StringGetChar(Symbol(), li_4); li_ret_0 = 3 * li_ret_0 + Period(); return (li_ret_0); } double divergence(int a_period_0, int a_period_4, int a_applied_price_8, int a_applied_price_12, int ai_16) { double ld_64; double l_ima_24 = iMA(Symbol(), 0, a_period_0, 0, MODE_SMA, a_applied_price_8, ai_16); double l_ima_40 = iMA(Symbol(), 0, a_period_4, 0, MODE_SMA, a_applied_price_12, ai_16); double ld_56 = l_ima_24 - l_ima_40; double l_ima_32 = iMA(Symbol(), 0, a_period_0, 0, MODE_SMA, a_applied_price_8, ai_16 + 1); double l_ima_48 = iMA(Symbol(), 0, a_period_4, 0, MODE_SMA, a_applied_price_12, ai_16 + 1); if (gi_144) ld_64 = l_ima_24 - l_ima_40 - (l_ima_32 - l_ima_48); else ld_64 = l_ima_32 - l_ima_48; return (ld_56 - ld_64); } bool LossCheck() { bool li_4; int l_file_0 = FileOpen(LogFileName(), FILE_CSV|FILE_READ, ";"); if (l_file_0 > 0) { li_4 = FileReadNumber(l_file_0); FileClose(l_file_0); } else li_4 = FALSE; if (li_4 == 0) { l_file_0 = FileOpen(LogFileName(), FILE_CSV|FILE_WRITE, ";"); FileWrite(l_file_0, AccountEquity()); FileClose(l_file_0); } if (li_4 - AccountEquity() >= gi_228 * GetSizeLot()) return (TRUE); return (FALSE); } string LogFileName() { string l_dbl2str_0 = DoubleToStr(Year(), 0); string l_dbl2str_8 = DoubleToStr(Month(), 0); if (StringLen(l_dbl2str_8) < 2) l_dbl2str_8 = "0" + l_dbl2str_8; string l_dbl2str_16 = DoubleToStr(Day(), 0); if (StringLen(l_dbl2str_16) < 2) l_dbl2str_16 = "0" + l_dbl2str_16; return (l_dbl2str_0 + l_dbl2str_8 + l_dbl2str_16 + ".log"); } void LogWrite(string as_0) { int l_file_8; if (gi_304 == 1) { l_file_8 = FileOpen(gs_260 + ".log", FILE_CSV|FILE_WRITE, ";"); FileSeek(l_file_8, 0, SEEK_END); FileWrite(l_file_8, as_0); FileFlush(l_file_8); FileClose(l_file_8); } } int MyOrdersTotal() { int l_count_0 = 0; for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) { if (OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicfromSymbol() && OrderComment() == GetCommentForOrder()) l_count_0++; } return (l_count_0); } string GetCommentForOrder() { return (gs_260); } double GetSizeLot() { return (Lots); }