#property copyright "Copyright © 2009, Trading Automatics Ltd" #property link "http://www.tradingautomatics.com" int gi_76 = 5; int gi_80 = 3; int gi_84 = 10; extern bool TimeFilter = FALSE; extern int SessionStart = 9; extern int SessionEnd = 20; int gi_100 = 1; bool gi_104 = TRUE; int gi_108 = 1; extern double Lots = 0.2; extern bool UseMoneyManagement = TRUE; extern double Risk = 2.0; extern int SL = 200; extern int TP = 250; extern int BETrigger = 25; extern int MagicNumber = 345456; extern int Slippage = 3; extern bool Broker5Digits = FALSE; double gd_156 = 0.0002; bool gi_164 = FALSE; int gi_168 = 0; int gi_172 = 0; int g_cmd_176 = OP_BUY; int gi_180 = 0; int init() { if (Broker5Digits) { gi_76 = 10 * gi_76; SL = 10 * SL; Slippage = 10 * Slippage; TP = 10 * TP; } gd_156 = MarketInfo(Symbol(), MODE_SPREAD) * Point; return (0); } int IsTradingTime() { if (!TimeFilter) return (1); if (Hour() >= SessionStart && Hour() <= SessionEnd && SessionStart < SessionEnd) return (1); if (Hour() <= SessionEnd || Hour() >= SessionStart && SessionStart > SessionEnd) return (1); return (0); } int deinit() { return (0); } int start() { double ld_8; double ld_0 = 0.0; int li_16 = 0; int l_ticket_20 = 0; int l_cmd_24 = -1; double l_price_28 = 0; double ld_unused_36 = 0; for (int l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) { OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { l_ticket_20 = OrderTicket(); l_cmd_24 = OrderType(); break; } } if (gi_168 != Time[0]) { gi_180 = 0; ld_0 = (High[1] + Low[1]) / 2.0; li_16 = NextTrade(); if (l_ticket_20 > 0 && !gi_164) { if (l_cmd_24 == OP_BUY && Close[1] > iMA(Symbol(), 0, 22, 0, MODE_SMA, PRICE_CLOSE, 1)) gi_164 = TRUE; if (l_cmd_24 == OP_SELL && Close[1] < iMA(Symbol(), 0, 22, 0, MODE_SMA, PRICE_CLOSE, 1)) gi_164 = TRUE; } if (l_ticket_20 > 0 && gi_104 && Time[gi_108 - 1] > OrderOpenTime() && gi_164) { ld_8 = (High[1] - Low[1]) / 3.0; if (l_cmd_24 == OP_BUY) { if (Close[1] < iMA(Symbol(), 0, 22, 0, MODE_SMA, PRICE_CLOSE, 1) && High[1] - Low[1] > High[2] - Low[2] && Close[1] <= Low[1] + ld_8 && Open[1] >= High[1] - ld_8) { OrderClose(l_ticket_20, OrderLots(), Bid, 3, Blue); l_ticket_20 = 0; } } if (l_cmd_24 == OP_SELL) { if (Close[1] > iMA(Symbol(), 0, 22, 0, MODE_SMA, PRICE_CLOSE, 1) && High[1] - Low[1] > High[2] - Low[2] && Open[1] <= Low[1] + ld_8 && Close[1] >= High[1] - ld_8) { OrderClose(l_ticket_20, OrderLots(), Ask, 3, Red); l_ticket_20 = 0; } } } if (Close[1] >= ld_0 && Open[1] >= ld_0 && li_16 == 1 && IsTradingTime()) gi_180 = 1; if (Close[1] <= ld_0 && Open[1] <= ld_0 && li_16 == -1 && IsTradingTime()) gi_180 = -1; gi_168 = Time[0]; } if (l_ticket_20 == 0) { if (gi_172 >= Time[gi_100]) { if (GetLastTradeRes()) { if (g_cmd_176 == OP_SELL) { l_price_28 = Ask - SL * Point; OrderSend(Symbol(), OP_BUY, GetLots(), Ask, Slippage, l_price_28, 0, "", MagicNumber, 0, Blue); gi_164 = FALSE; } else { l_price_28 = Bid + SL * Point; OrderSend(Symbol(), OP_SELL, GetLots(), Bid, Slippage, l_price_28, 0, "", MagicNumber, 0, Red); gi_164 = FALSE; } } } } else { if (BETrigger > 0) HandleBreakEven(); if (OrderLots() > 3.0 * GetLots() / 4.0) { if (l_cmd_24 == OP_BUY) if (Bid >= OrderOpenPrice() + TP * Point) OrderClose(l_ticket_20, OrderLots() / 2.0, Bid, 3, Blue); if (l_cmd_24 == OP_SELL) if (Ask <= OrderOpenPrice() - TP * Point) OrderClose(l_ticket_20, OrderLots() / 2.0, Ask, 3, Red); } } if (gi_180 == 1) { if (Bid >= High[1] + gi_76 * Point) { if (l_ticket_20 > 0 && l_cmd_24 == OP_SELL) { OrderClose(l_ticket_20, OrderLots(), Ask, 3, Red); l_ticket_20 = 0; gi_172 = Time[0]; } if (l_ticket_20 == 0) { l_price_28 = Ask - SL * Point; OrderSend(Symbol(), OP_BUY, GetLots(), Ask, Slippage, l_price_28, 0, "", MagicNumber, 0, Blue); } gi_180 = 0; } } if (gi_180 == -1) { if (Bid <= Low[1] - gi_76 * Point) { if (l_ticket_20 > 0 && l_cmd_24 == OP_BUY) { OrderClose(l_ticket_20, OrderLots(), Bid, 3, Blue); l_ticket_20 = 0; gi_172 = Time[0]; } if (l_ticket_20 == 0) { l_price_28 = Bid + SL * Point; OrderSend(Symbol(), OP_SELL, GetLots(), Bid, Slippage, l_price_28, 0, "", MagicNumber, 0, Red); } gi_180 = 0; } } return (0); } bool IsLongSetUp(int ai_0) { int l_count_4 = 0; for (int li_8 = ai_0; li_8 < Bars; li_8++) { if (Low[li_8] < Low[li_8 + 1] && High[li_8] < High[li_8 + 1]) { l_count_4++; if (l_count_4 != gi_80) continue; return (TRUE); } if (Low[li_8] <= Low[li_8 + 1] && High[li_8] >= High[li_8 + 1]) continue; return (FALSE); } return (FALSE); } bool IsShortSetUp(int ai_0) { int l_count_4 = 0; for (int li_8 = ai_0; li_8 < Bars; li_8++) { if (Low[li_8] > Low[li_8 + 1] && High[li_8] > High[li_8 + 1]) { l_count_4++; if (l_count_4 != gi_80) continue; return (TRUE); } if (Low[li_8] <= Low[li_8 + 1] && High[li_8] >= High[li_8 + 1]) continue; return (FALSE); } return (FALSE); } int NextTrade() { for (int li_0 = 2; li_0 < gi_84; li_0++) { if (IsLongSetUp(li_0)) return (1); if (IsShortSetUp(li_0)) return (-1); } return (0); } void HandleBreakEven() { for (int l_pos_0 = 0; l_pos_0 < OrdersTotal(); l_pos_0++) { OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderType() == OP_BUY) { if (Bid >= OrderOpenPrice() + BETrigger * Point && OrderStopLoss() < OrderOpenPrice()) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, CLR_NONE); } else { if (OrderType() == OP_SELL) if (Ask <= OrderOpenPrice() - BETrigger * Point && OrderStopLoss() > OrderOpenPrice()) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, CLR_NONE); } } } } bool GetLastTradeRes() { for (int l_pos_0 = OrdersHistoryTotal() - 1; l_pos_0 >= 0; l_pos_0--) { OrderSelect(l_pos_0, SELECT_BY_POS, MODE_HISTORY); if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { g_cmd_176 = OrderType(); if (OrderProfit() < 0.0) return (TRUE); return (FALSE); } } return (FALSE); } double GetLots() { double ld_ret_0; double ld_8; double l_lotstep_32; double l_marginrequired_40; if (UseMoneyManagement) { l_lotstep_32 = MarketInfo(Symbol(), MODE_LOTSTEP); l_marginrequired_40 = MarketInfo(Symbol(), MODE_MARGINREQUIRED); ld_ret_0 = AccountBalance() * Risk / 100.0 / l_marginrequired_40; ld_8 = MathMod(ld_ret_0, l_lotstep_32); if (ld_8 != 0.0) ld_ret_0 -= ld_8; } else ld_ret_0 = Lots; double l_minlot_16 = MarketInfo(Symbol(), MODE_MINLOT); double l_maxlot_24 = MarketInfo(Symbol(), MODE_MAXLOT); if (ld_ret_0 < l_minlot_16) ld_ret_0 = l_minlot_16; if (ld_ret_0 > l_maxlot_24) ld_ret_0 = l_maxlot_24; return (ld_ret_0); }