#property copyright "Copyright © 2010, EliteCurrencyTrader.com" #property link "http://www.EliteCurrencyTrader.com" extern double Lots = 1.0; extern double ABRidge = 1.0; extern double TakeProfit = 25.0; extern double StopLoss = 0.0; extern double TrailingStop = 20.0; extern double Contra = 0.5; extern int MaximumOrders = 1; extern int vobDepth = 100; extern int MeroV = 9; extern int Boon = 3; extern int SAR = 10; double g_icustom_144; double g_icustom_152; double g_icustom_160; double g_digits_168; double g_str2dbl_176; double g_ifractals_184; double g_ifractals_192; string g_dbl2str_200; double gda_208[]; double gda_212[]; int g_magic_216 = 131313; int g_datetime_220; int init() { return (0); } int deinit() { return (0); } int start() { g_digits_168 = MarketInfo(Symbol(), MODE_DIGITS); g_dbl2str_200 = DoubleToStr(g_str2dbl_176, g_digits_168); g_str2dbl_176 = StrToDouble(g_dbl2str_200); if (!IsTradeAllowed()) return (0); if (!IsConnected()) return (0); if (IsStopped()) return (0); if (IsTradeContextBusy()) { Print("Trade context is busy!"); return (0); } if (!IsDateTimeEnabled(TimeCurrent())) return (0); if (!CheckParams()) return (0); if (!PrepareIndicators()) return (0); int l_ord_total_0 = OrdersTotal(); if (l_ord_total_0 > 0) { for (int l_count_4 = 0; l_count_4 < l_ord_total_0; l_count_4++) { if (GetOrderByPos(l_count_4)) { if (TradeSignalCloseOrder() || TradeSignalCloseOrderOnTime(l_count_4)) CloseOrder(); else if (TrailingStop > 0.0) TrailOrderStop(); } } return (0); } int li_8 = TradeSignalOpenOrder(); if (li_8 == 0) return (0); double ld_12 = CalcLotsVolume(); if (ld_12 == 0.0 || !CheckAccount(ld_12)) return (0); int li_20 = OpenOrder(li_8, ld_12); return (0); } bool CheckParams() { if (Bars < 100) { Print("Bars less than 100"); return (FALSE); } if (TakeProfit < 10.0) { Print("TakeProfit is less than 10"); return (FALSE); } if (Lots == 0.0 && ABRidge < 1.0) { Print("ABRidge is less than 1"); return (FALSE); } return (TRUE); } bool CheckAccount(double ad_0) { bool li_ret_8 = AccountFreeMargin() > 1000.0 * ad_0; if (!li_ret_8) Print("No money to open more orders.", " Free Margin = ", AccountFreeMargin(), " Balance = ", AccountBalance()); return (li_ret_8); } double CalcLotsVolume() { double ld_ret_0; if (Lots > 0.0) ld_ret_0 = Lots; else ld_ret_0 = MathFloor(AccountEquity() / MaximumOrders / (ABRidge * AccountLeverage())) / 10.0; if (ld_ret_0 < 0.1) ld_ret_0 = 0.1; else if (ld_ret_0 > vobDepth) ld_ret_0 = vobDepth; return (ld_ret_0); } bool PrepareIndicators() { double l_ifractals_0; g_icustom_144 = iCustom(NULL, 0, "Alligator", 13, 8, 8, 5, 5, 3, 0, 0); if (IsError("Boole -1020")) return (FALSE); g_icustom_152 = iCustom(NULL, 0, "Alligator", 13, 8, 8, 5, 5, 3, 1, 0); if (IsError("Boole -2832")) return (FALSE); g_icustom_160 = iCustom(NULL, 0, "Alligator", 13, 8, 8, 5, 5, 3, 2, 0); if (IsError("Boole -3642")) return (FALSE); int li_8 = 3; g_ifractals_184 = 0; g_ifractals_192 = 0; for (int li_12 = 0; li_12 <= li_8; li_12++) { l_ifractals_0 = iFractals(NULL, 0, MODE_LOWER, li_12); if (IsError("Lower Fractals")) return (FALSE); if (l_ifractals_0 != 0.0) g_ifractals_184 = l_ifractals_0; l_ifractals_0 = iFractals(NULL, 0, MODE_UPPER, li_12); if (IsError("Upper Fractals")) return (FALSE); if (l_ifractals_0 != 0.0) g_ifractals_192 = l_ifractals_0; } li_8 = 0; ArrayResize(gda_208, li_8 + 1); ArrayResize(gda_212, li_8 + 1); for (li_12 = 0; li_12 <= li_8; li_12++) { gda_208[li_12] = iDeMarker(NULL, 0, MeroV, li_12); if (IsError("DeMarker")) return (FALSE); gda_212[li_12] = (-iWPR(NULL, 0, SAR, li_12 + 1)) / 100.0; if (IsError("WPR")) return (FALSE); } return (TRUE); } int TradeSignalOpenOrder() { if (!IsGatorActive()) return (0); if (WasWPROverBuy() || WasWPROverSell()) return (0); if (IsFractalLower() && WasDemarkerHigh()) return (1); if (IsFractalUpper() && WasDemarkerLow()) return (-1); return (0); } int TradeSignalCloseOrder() { return (!IsOrderProfitable()); } int TradeSignalCloseOrderOnTime(int ai_unused_0) { g_datetime_220 = OrderOpenTime(); if (TimeDay(g_datetime_220) - TimeDay(iTime(Symbol(), 0, 0)) >= 3) return (1); return (0); } bool IsDateTimeEnabled(int ai_0) { int l_day_of_year_4 = TimeDayOfYear(ai_0); int l_day_of_week_8 = TimeDayOfWeek(ai_0); return (l_day_of_week_8 > 0 && l_day_of_week_8 < 6 && l_day_of_year_4 > 7 && l_day_of_year_4 < 360); } bool IsGatorActive() { return (g_icustom_160 - g_icustom_152 >= Contra * Point && g_icustom_152 - g_icustom_144 >= Contra * Point && g_icustom_160 - g_icustom_144 >= Contra * Point); } int IsFractalLower() { return (g_ifractals_184 != 0.0); } int IsFractalUpper() { return (g_ifractals_192 != 0.0); } bool IsOrderProfitable() { return (TRUE); } int WasDemarkerLow() { return (ArrayMinValue(gda_208) < 0.5); } int WasDemarkerHigh() { return (ArrayMaxValue(gda_208) > 0.5); } int WasWPROverBuy() { return (ArrayMinValue(gda_212) <= 0.25); } int WasWPROverSell() { return (ArrayMaxValue(gda_212) >= 0.75); } int OpenOrder(int ai_0, double a_lots_4, string a_comment_12 = "") { double l_price_20 = 0; double l_price_28 = 0; double l_price_36 = PriceOpen(ai_0); l_price_28 = l_price_36 + TakeProfit * Point * ai_0; if (StopLoss > 0.0) l_price_20 = PriceClose(ai_0) - StopLoss * Point * ai_0; int l_ticket_44 = OrderSend(Symbol(), DirectionOrderType(ai_0), a_lots_4, l_price_36, Boon, 0, 0, a_comment_12, g_magic_216, 0, ColorOpen(ai_0)); Sleep(1000); OrderModify(l_ticket_44, l_price_36, l_price_20, l_price_28, 0, Red); return (0); } void CloseOrder() { Print("Закрытие!"); OrderClose(OrderTicket(), OrderLots(), Bid, Boon, Red); } bool GetOrderByPos(int a_pos_0) { return (OrderSelect(a_pos_0, SELECT_BY_POS, MODE_TRADES) && OrderType() <= OP_SELL && OrderSymbol() == Symbol()); } void TrailOrderStop() { int li_0 = OrderTypeDirection(); double ld_4 = NormalizeDouble(TrailingStop * Point * li_0, Digits); double ld_12 = NormalizeDouble(iif(li_0 > 0 || OrderStopLoss() != 0.0, OrderStopLoss(), 999999), Digits); double l_price_20 = NormalizeDouble(PriceClose(li_0) - ld_4, Digits); double ld_28 = NormalizeDouble(l_price_20 - OrderOpenPrice(), Digits); double ld_36 = NormalizeDouble(l_price_20 - ld_12, Digits); if (ld_28 * li_0 > 0.0 && ld_36 * li_0 >= Point) { OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, OrderTakeProfit(), 0, ColorOpen(li_0)); if (GetLastError() != 0/* NO_ERROR */) { } } } int OrderTypeDirection() { return (1 - OrderType()); } int DirectionOrderType(int ai_0) { return (iif(ai_0 > 0, 0, 1)); } int ColorOpen(int ai_0) { return (iif(ai_0 > 0, 32768, 255)); } double PriceOpen(int ai_0) { return (iif(ai_0 > 0, Ask, Bid)); } double PriceClose(int ai_0) { return (iif(ai_0 > 0, Bid, Ask)); } double iif(bool ai_0, double ad_4, double ad_12) { if (ai_0) return (ad_4); return (ad_12); } bool IsError(string as_0 = "Raptor V1") { int l_error_8 = GetLastError(); bool li_ret_12 = l_error_8 > 1/* NO_RESULT */; if (li_ret_12) Print(as_0, " error = ", l_error_8, "; desc = ", ErrorDescription(l_error_8)); return (li_ret_12); } string ErrorDescription(int ai_0) { string ls_ret_4; switch (ai_0) { case 0: case 1: ls_ret_4 = "no error"; break; case 2: ls_ret_4 = "common error"; break; case 3: ls_ret_4 = "invalid trade parameters"; break; case 4: ls_ret_4 = "trade server is busy"; break; case 5: ls_ret_4 = "old version of the client terminal"; break; case 6: ls_ret_4 = "no connection with trade server"; break; case 7: ls_ret_4 = "not enough rights"; break; case 8: ls_ret_4 = "too frequent requests"; break; case 9: ls_ret_4 = "malfunctional trade operation (never returned error)"; break; case 64: ls_ret_4 = "account disabled"; break; case 65: ls_ret_4 = "invalid account"; break; case 128: ls_ret_4 = "trade timeout"; break; case 129: ls_ret_4 = "invalid price"; break; case 130: ls_ret_4 = "invalid stops"; break; case 131: ls_ret_4 = "invalid trade volume"; break; case 132: ls_ret_4 = "market is closed"; break; case 133: ls_ret_4 = "trade is disabled"; break; case 134: ls_ret_4 = "not enough money"; break; case 135: ls_ret_4 = "price changed"; break; case 136: ls_ret_4 = "off quotes"; break; case 137: ls_ret_4 = "broker is busy (never returned error)"; break; case 138: ls_ret_4 = "requote"; break; case 139: ls_ret_4 = "order is locked"; break; case 140: ls_ret_4 = "long positions only allowed"; break; case 141: ls_ret_4 = "too many requests"; break; case 145: ls_ret_4 = "modification denied because order too close to market"; break; case 146: ls_ret_4 = "trade context is busy"; break; case 147: ls_ret_4 = "expirations are denied by broker"; break; case 148: ls_ret_4 = "amount of open and pending orders has reached the limit"; break; case 4000: ls_ret_4 = "no error (never generated code)"; break; case 4001: ls_ret_4 = "wrong function pointer"; break; case 4002: ls_ret_4 = "array index is out of range"; break; case 4003: ls_ret_4 = "no memory for function call stack"; break; case 4004: ls_ret_4 = "recursive stack overflow"; break; case 4005: ls_ret_4 = "not enough stack for parameter"; break; case 4006: ls_ret_4 = "no memory for parameter string"; break; case 4007: ls_ret_4 = "no memory for temp string"; break; case 4008: ls_ret_4 = "not initialized string"; break; case 4009: ls_ret_4 = "not initialized string in array"; break; case 4010: ls_ret_4 = "no memory for array\' string"; break; case 4011: ls_ret_4 = "too long string"; break; case 4012: ls_ret_4 = "remainder from zero divide"; break; case 4013: ls_ret_4 = "zero divide"; break; case 4014: ls_ret_4 = "unknown command"; break; case 4015: ls_ret_4 = "wrong jump (never generated error)"; break; case 4016: ls_ret_4 = "not initialized array"; break; case 4017: ls_ret_4 = "dll calls are not allowed"; break; case 4018: ls_ret_4 = "cannot load library"; break; case 4019: ls_ret_4 = "cannot call function"; break; case 4020: ls_ret_4 = "expert function calls are not allowed"; break; case 4021: ls_ret_4 = "not enough memory for temp string returned from function"; break; case 4022: ls_ret_4 = "system is busy (never generated error)"; break; case 4050: ls_ret_4 = "invalid function parameters count"; break; case 4051: ls_ret_4 = "invalid function parameter value"; break; case 4052: ls_ret_4 = "string function internal error"; break; case 4053: ls_ret_4 = "some array error"; break; case 4054: ls_ret_4 = "incorrect series array using"; break; case 4055: ls_ret_4 = "custom indicator error"; break; case 4056: ls_ret_4 = "arrays are incompatible"; break; case 4057: ls_ret_4 = "global variables processing error"; break; case 4058: ls_ret_4 = "global variable not found"; break; case 4059: ls_ret_4 = "function is not allowed in testing mode"; break; case 4060: ls_ret_4 = "function is not confirmed"; break; case 4061: ls_ret_4 = "send mail error"; break; case 4062: ls_ret_4 = "string parameter expected"; break; case 4063: ls_ret_4 = "integer parameter expected"; break; case 4064: ls_ret_4 = "double parameter expected"; break; case 4065: ls_ret_4 = "array as parameter expected"; break; case 4066: ls_ret_4 = "requested history data in update state"; break; case 4099: ls_ret_4 = "end of file"; break; case 4100: ls_ret_4 = "some file error"; break; case 4101: ls_ret_4 = "wrong file name"; break; case 4102: ls_ret_4 = "too many opened files"; break; case 4103: ls_ret_4 = "cannot open file"; break; case 4104: ls_ret_4 = "incompatible access to a file"; break; case 4105: ls_ret_4 = "no order selected"; break; case 4106: ls_ret_4 = "unknown symbol"; break; case 4107: ls_ret_4 = "invalid price parameter for trade function"; break; case 4108: ls_ret_4 = "invalid ticket"; break; case 4109: ls_ret_4 = "trade is not allowed in the expert properties"; break; case 4110: ls_ret_4 = "longs are not allowed in the expert properties"; break; case 4111: ls_ret_4 = "shorts are not allowed in the expert properties"; break; case 4200: ls_ret_4 = "object is already exist"; break; case 4201: ls_ret_4 = "unknown object property"; break; case 4202: ls_ret_4 = "object is not exist"; break; case 4203: ls_ret_4 = "unknown object type"; break; case 4204: ls_ret_4 = "no object name"; break; case 4205: ls_ret_4 = "object coordinates error"; break; case 4206: ls_ret_4 = "no specified subwindow"; break; default: ls_ret_4 = "unknown error"; } return (ls_ret_4); } double ArrayMinValue(double ada_0[]) { return (ada_0[ArrayMinimum(ada_0)]); } double ArrayMaxValue(double ada_0[]) { return (ada_0[ArrayMaximum(ada_0)]); }