#property copyright "Copyright © 2009, EstrategiasForex." #property link "http://www.EstrategiasForex.net" #include extern string Basico = "===== Configuración básica ====="; extern double ObjetivoMax = 2.0; extern int Agresividad = 5; extern string Avanzado = "==== Configuración avanzada ===="; extern bool LotesAutomaticos = TRUE; extern double LotesManuales = 0.01; extern double ObjetivoMin = 0.0; extern double PerdidaMax = 0.0; extern int Periodos = 24; extern bool AutoCerrarViernes = TRUE; extern string HoraCierreViernes = "20:00"; extern bool ModoTendencia = TRUE; extern bool ModoRango = FALSE; bool gi_156 = TRUE; bool gi_160 = FALSE; bool gi_unused_164 = TRUE; bool g_bool_168 = TRUE; double gd_172 = 0.1; double gd_180 = 3.0; double gd_188 = 1.0; double gd_196 = 0.0; int g_stoplevel_204 = 15; bool gi_208 = FALSE; double gd_212 = 2.0; bool gi_220 = TRUE; bool gi_224 = FALSE; int gi_228 = 15; int gi_232 = 15; string gs_236 = "ForexMatic V4.1"; string gs_244 = ""; int gi_252 = 60; int gi_256 = 10; int gi_260 = 1; int gi_unused_264 = 5; int gi_268 = 7; int g_timeframe_272 = PERIOD_M5; int g_slippage_276 = 3; int g_magic_280 = 123154; int g_magic_284 = 965373; int gi_288 = 1; double gd_292 = 0.0; int gi_300 = 50; double g_ima_304; double g_ima_312; double gd_320 = 0.0; double gd_328 = 0.0; double gd_336 = 0.0; string gs_fmv4_344 = "FMV4"; string gs_cfmv4_352 = "CFMV4"; string gs_ofmv4_360 = "OFMV4"; double gd_unused_368 = 0.0; bool gi_376 = FALSE; bool gi_380 = FALSE; bool gi_384 = FALSE; bool gi_388 = FALSE; int g_str2time_392 = 0; int g_str2time_396 = 0; string g_dbl2str_400 = ""; int gi_unused_408 = 6395; int gi_unused_412 = 3086; int gi_unused_416 = 4127; int gi_unused_420 = 7908; string gs_424 = ""; string gs_432 = ""; string gs_440 = "23:50"; bool g_bool_448 = FALSE; int init() { Comment(""); if (!IsTesting()) { GlobalVariablesDeleteAll(gs_fmv4_344); GlobalVariableDel(gs_cfmv4_352); GlobalVariableDel(gs_ofmv4_360); } return (0); } int deinit() { if (!IsTesting()) { GlobalVariableDel(gs_fmv4_344 + Symbol()); GlobalVariableSet(gs_cfmv4_352, GlobalVariableGet(gs_cfmv4_352) - 1.0); } Comment(""); return (0); } int start() { if (!gi_380) { gi_380 = FALSE; if (!VerifOK()) { MessageBox("No ha configurado correctamente el número de licencia. \nDebe solicitar su número de licencia al e-mail: soporte@forexmatic.net \nmencionando el siguiente código de activación:\n\n" + gs_424 + "\n\nCuando reciba el número de licencia, debe ingesarlo en la ventana \nde configuración del Asesor Experto", "Activación del Asesor Experto"); gi_376 = TRUE; } else gi_376 = FALSE; } if (!IsTesting()) gs_fmv4_344 = "FMV4" + Symbol(); if (Agresividad < 0 || Agresividad > 9) return (MessageBox("El parámetro Agresividad debe estar entre 0 y 9 \n\n0 = No agresivo\n9 = Muy agresivo")); g_bool_168 = LotesAutomaticos; gd_172 = LotesManuales; gd_180 = ObjetivoMax; gd_188 = ObjetivoMin; gd_196 = PerdidaMax; gi_156 = ModoTendencia; gi_160 = ModoRango; gi_228 = Periodos; g_magic_280 = GetMagic(1); g_magic_284 = GetMagic(2); gs_236 = ""; g_bool_448 = StringSubstr(Symbol(), 6, 1) == "m"; if (!IsTesting()) { if (GlobalVariableCheck("FMV4Periodos")) gi_228 = GlobalVariableGet("FMV4Periodos"); if (GlobalVariableCheck("FMV4LotesAutomaticos")) LotesAutomaticos = GlobalVariableGet("FMV4LotesAutomaticos"); if (GlobalVariableCheck("FMV4LotesManuales")) LotesManuales = GlobalVariableGet("FMV4LotesManuales"); if (GlobalVariableCheck("FMV4ObjetivoMax")) gd_180 = GlobalVariableGet("FMV4ObjetivoMax"); if (GlobalVariableCheck("FMV4ObjetivoMin")) gd_188 = GlobalVariableGet("FMV4ObjetivoMin"); if (GlobalVariableCheck("FMV4PerdidaMax")) gd_196 = GlobalVariableGet("FMV4PerdidaMax"); if (GlobalVariableCheck("FMV4Agresividad")) Agresividad = GlobalVariableGet("FMV4Agresividad"); if (GlobalVariableCheck("FMV4ModoTendencia")) gi_156 = GlobalVariableGet("FMV4ModoTendencia"); if (GlobalVariableCheck("FMV4ModoRango")) gi_160 = GlobalVariableGet("FMV4ModoRango"); } g_str2time_392 = StrToTime("2008.12.31 23:59"); g_str2time_396 = StrToTime("2009.05.31 23:59"); gi_384 = TimeCurrent() >= g_str2time_392; gi_388 = TimeCurrent() >= g_str2time_396; if (gi_376 && gi_384 && !IsDemo()) { Comment("El período de prueba en cuentas Reales del Sistema " + gs_236 + " ha finalizado. \nPuede continuar utilizando éste sistema pero sólo operará en cuentas Demo.\nSi desea utilizar éste sistema en una cuenta Real, por favor comuníquese a info@estrategiasforex.net o visite www.estrategiasforex.net/ForexMatic."); return (0); } if (!gi_376 && gi_388 && !IsDemo()) { Comment("La licencia de uso del Sistema " + gs_236 + " ha caducado. \nPara renovar la licencia por favor escriba a soporte@estrategiasforex.net. Gracias."); return (0); } if (!IsTesting() && !GlobalVariableCheck("FMV4ObjetivoMax")) { if (!GlobalVariableCheck(gs_ofmv4_360)) GlobalVariableSet(gs_ofmv4_360, ObjetivoMax); else if (GlobalVariableCheck(gs_ofmv4_360) && GlobalVariableGet(gs_ofmv4_360) != gd_180) return (MessageBox("El objetivo configurado para " + Symbol() + " es diferente al objetivo configurado en otros pares. Por favor, verifique.")); } if (!IsTesting()) { if (!GlobalVariableCheck(gs_fmv4_344)) { GlobalVariableSet(gs_fmv4_344, Period()); GlobalVariableSet(gs_cfmv4_352, GlobalVariableGet(gs_cfmv4_352) + 1.0); } else { if (GlobalVariableCheck(gs_fmv4_344) && GlobalVariableGet(gs_fmv4_344) != Period()) { GlobalVariableDel(gs_fmv4_344); GlobalVariableSet(gs_cfmv4_352, GlobalVariableGet(gs_cfmv4_352) - 1.0); return (MessageBox("Ya está ejecutando " + gs_236 + " en el par " + Symbol() + " en otro marco de tiempo. Por favor, verifique.")); } } } gi_300 = 5.0 * MarketInfo(Symbol(), MODE_STOPLEVEL); if (gi_220) g_timeframe_272 = Period(); else g_timeframe_272 = gi_232; if (gi_224) { if (Period() == PERIOD_M1) gi_252 = 24; else { if (Period() == PERIOD_M5) gi_252 = 18; else { if (Period() == PERIOD_M15) gi_252 = 48; else { if (Period() == PERIOD_M30) gi_252 = 24; else { if (Period() == PERIOD_H1) gi_252 = 24; else { if (Period() == PERIOD_H4) gi_252 = 42; else { if (Period() == PERIOD_D1) gi_252 = 28; else gi_252 = 60; } } } } } } } else gi_252 = gi_228; gd_292 = NormalizeDouble(MarketInfo(Symbol(), MODE_SPREAD), 2); if (!TargetOK() && !CerradoViernes()) { if (TimeCurrent() < StrToTime(TimeYear(TimeCurrent()) + "." + TimeMonth(TimeCurrent()) + "." + TimeDay(TimeCurrent()) + " 23:00") && TimeDayOfWeek(TimeCurrent()) != 5 || TimeCurrent() < StrToTime(TimeYear(TimeCurrent()) + "." + TimeMonth(TimeCurrent()) + "." + TimeDay(TimeCurrent()) + " " + HoraCierreViernes) - 3600) { if (gi_156) TradeMode1(); if (gi_160) TradeMode2(); } else { ClearPending(); gs_432 = "\n\nEl robot ha dejado de abrir operaciones debido a la proximidad de la hora de cierre\n"; } } WriteComment(); if (gi_156) { CloseOrderMode1(); MovePendingMode1(); } else ClearPendingMode(1); if (gi_160) { CloseOrderMode2(); MovePendingMode2(); ProtectMode2(); } else ClearPendingMode(2); return (0); } int TradeMode1() { double l_price_52; double l_price_60; double ld_68; int l_ticket_76; int l_error_80; int l_global_var_84 = 0; double ld_88 = 1; if (!IsTesting()) l_global_var_84 = GlobalVariableGet(gs_cfmv4_352); else l_global_var_84 = 4; g_ima_304 = iMA(NULL, g_timeframe_272, 144, 0, MODE_SMMA, PRICE_CLOSE, 1); g_ima_312 = iMA(NULL, g_timeframe_272, 144, 0, MODE_SMMA, PRICE_CLOSE, 0); int l_highest_4 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 0); int l_lowest_8 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 0); double l_high_12 = High[l_highest_4]; double l_low_20 = Low[l_lowest_8]; double ld_28 = NormalizeDouble((l_high_12 + l_low_20) / 2.0, Digits); double ld_36 = NormalizeDouble((ld_28 + l_high_12) / 2.0, Digits); double ld_44 = NormalizeDouble((ld_28 + l_low_20) / 2.0, Digits); g_stoplevel_204 = NormalizeDouble(MathAbs(ld_28 - l_high_12) / Point / 10.0, 0); if (l_high_12 - l_low_20 < gi_300 * Point) { ClearPending(); return (0); } if (l_global_var_84 > 2) ld_88 = l_global_var_84 / 2; else ld_88 = 1; RefreshRates(); g_dbl2str_400 = DoubleToStr(GetLots(l_high_12, ld_44, 1), 2); if ((g_ima_304 < g_ima_312 && Close[0] > g_ima_312) || IsTesting() && l_highest_4 >= gi_260 && Close[0] > ld_36 && Close[0] < l_high_12) { l_price_52 = ld_44 - 1.0 * Point; ld_68 = NormalizeDouble((MathMax(Ask, l_high_12) + g_stoplevel_204 * Point - l_price_52) / Point, Digits); l_price_60 = NormalizeDouble(MathMax(Ask, l_high_12) + g_stoplevel_204 * Point + 1.75 * ld_68 / ld_88 * Point, Digits); if (!OrderExistsMode1(OP_BUYSTOP) && !OrderExistsMode1(OP_BUY)) { l_ticket_76 = OrderSend(Symbol(), OP_BUYSTOP, GetLots(MathMax(Ask, l_high_12) + g_stoplevel_204 * Point, l_price_52, 1), MathMax(Ask, l_high_12) + g_stoplevel_204 * Point, g_slippage_276, l_price_52, l_price_60, gs_236 + "1" + Symbol() + " M" + Period(), g_magic_280, 0, Blue); if (l_ticket_76 < 0) { l_error_80 = GetLastError(); Print("Error(", l_error_80, "): enviando orden Buy Stop (", ErrorDescription(l_error_80), ")"); return (0); } } if (OrderExistsMode1(OP_SELLSTOP) == 1) DeleteOrderMode1(OP_SELLSTOP); return (0); } if ((g_ima_304 > g_ima_312 && Close[0] < g_ima_312) || IsTesting() && l_lowest_8 >= gi_260 && Close[0] < ld_44 && Close[0] > l_low_20) { l_price_52 = ld_36 + 1.0 * Point; ld_68 = NormalizeDouble((l_price_52 - (MathMin(Bid, l_low_20) - g_stoplevel_204 * Point)) / Point, Digits); l_price_60 = NormalizeDouble(MathMin(Bid, l_low_20) - g_stoplevel_204 * Point - 1.75 * ld_68 / ld_88 * Point, Digits); if (!OrderExistsMode1(OP_SELLSTOP) && !OrderExistsMode1(OP_SELL)) { l_ticket_76 = OrderSend(Symbol(), OP_SELLSTOP, GetLots(MathMin(Bid, l_low_20) - g_stoplevel_204 * Point, l_price_52, 1), MathMin(Bid, l_low_20) - g_stoplevel_204 * Point, g_slippage_276, l_price_52, l_price_60, gs_236 + "1" + Symbol() + " M" + Period(), g_magic_280, 0, Red); if (l_ticket_76 < 0) { l_error_80 = GetLastError(); Print("Error(", l_error_80, "): enviando orden Sell Stop (", ErrorDescription(l_error_80), ")"); return (0); } } if (OrderExistsMode1(OP_BUYSTOP) == 1) DeleteOrderMode1(OP_BUYSTOP); return (0); } return (0); } int TradeMode2() { double l_price_52; double l_price_60; double ld_68; int l_ticket_76; int l_error_80; int l_stoplevel_84 = 0; RefreshRates(); g_ima_304 = iMA(NULL, g_timeframe_272, 144, 0, MODE_SMMA, PRICE_CLOSE, 1); g_ima_312 = iMA(NULL, g_timeframe_272, 144, 0, MODE_SMMA, PRICE_CLOSE, 0); int l_highest_4 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 1); int l_lowest_8 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 1); double l_high_12 = High[l_highest_4]; double l_low_20 = Low[l_lowest_8]; l_stoplevel_84 = MarketInfo(Symbol(), MODE_STOPLEVEL); double ld_28 = NormalizeDouble((MathMax(Ask, l_high_12) + l_low_20) / 2.0, Digits); double ld_36 = NormalizeDouble((ld_28 + MathMax(Ask, l_high_12)) / 2.0, Digits); double ld_44 = NormalizeDouble((ld_28 + l_low_20) / 2.0, Digits); g_stoplevel_204 = NormalizeDouble(-0.05 * (MathAbs(ld_28 - l_low_20) / Point), 0); if (g_stoplevel_204 < l_stoplevel_84) g_stoplevel_204 = l_stoplevel_84; if (l_high_12 - l_low_20 < gi_300 * Point) { ClearPending(); return (0); } if (Bid > (l_high_12 + ld_36) / 2.0) { l_price_60 = NormalizeDouble(ld_28, Digits); ld_68 = NormalizeDouble((MathMax(Bid, l_high_12) - l_price_60 - g_stoplevel_204 * Point) / Point, Digits); l_price_52 = NormalizeDouble(l_high_12 + g_stoplevel_204 * Point, Digits); if (!OrderExistsMode2(OP_SELLSTOP) && !OrderExistsMode2(OP_SELL)) { l_ticket_76 = OrderSend(Symbol(), OP_SELLSTOP, GetLots(ld_36 - MathAbs(Ask - Bid) * Point - g_stoplevel_204 * Point, l_price_52, 2), ld_36 - g_stoplevel_204 * Point, g_slippage_276, l_price_52, l_price_60, gs_236 + "2" + Symbol() + " M" + Period(), g_magic_284, 0, Red); if (l_ticket_76 < 0) { l_error_80 = GetLastError(); Print("Error(", l_error_80, "): enviando orden Sell Stop (", ErrorDescription(l_error_80), ") Bid=" + DoubleToStr(Bid, Digits) + " OP=" + DoubleToStr(ld_36 - g_stoplevel_204 * Point, Digits) + " TP=" + DoubleToStr(l_price_60, Digits) + " SL" + DoubleToStr(l_price_52, Digits)); return (0); } } if (OrderExistsMode2(OP_BUYSTOP) == 1) DeleteOrderMode2(OP_BUYSTOP); return (0); } if (Ask < (ld_44 + l_low_20) / 2.0) { l_price_60 = NormalizeDouble(ld_28, Digits); ld_68 = NormalizeDouble((l_price_60 - (MathMin(Bid, l_low_20) + g_stoplevel_204 * Point)) / Point, Digits); l_price_52 = NormalizeDouble(l_low_20 - g_stoplevel_204 * Point, Digits); if (!OrderExistsMode2(OP_BUYSTOP) && !OrderExistsMode2(OP_BUY)) { l_ticket_76 = OrderSend(Symbol(), OP_BUYSTOP, GetLots(ld_44 + g_stoplevel_204 * Point, l_price_52, 2), ld_44 + g_stoplevel_204 * Point, g_slippage_276, l_price_52, l_price_60, gs_236 + "2" + Symbol() + " M" + Period(), g_magic_284, 0, Blue); if (l_ticket_76 < 0) { l_error_80 = GetLastError(); Print("Error(", l_error_80, "): enviando orden Buy Stop (", ErrorDescription(l_error_80), ") Ask=" + DoubleToStr(Ask, Digits) + " OP=" + DoubleToStr(ld_44 + g_stoplevel_204 * Point, Digits) + " TP=" + DoubleToStr(l_price_60, Digits) + " SL=" + DoubleToStr(l_price_52, Digits)); return (0); } } if (OrderExistsMode2(OP_SELLSTOP) == 1) DeleteOrderMode2(OP_SELLSTOP); return (0); } return (0); } double GetLots(double ad_0 = 0.0, double ad_8 = 0.0, int ai_16 = 0) { double ld_ret_20; double ld_68; double ld_76; double ld_84; double ld_92; int li_108; double ld_100 = 0; double ld_28 = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); double ld_36 = NormalizeDouble(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 4); double ld_44 = 100.0 * ld_36; ld_100 = (10 - Agresividad) / 2; if (ld_28 == 0.01) li_108 = 2; else li_108 = 1; gi_288 = li_108; if (g_bool_168 == TRUE && gd_328 != 0.0 && ad_0 != 0.0 && ad_8 != 0.0) { ld_68 = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSIZE), 2); ld_92 = NormalizeDouble(MarketInfo(Symbol(), MODE_TICKVALUE), 2); ld_76 = MathAbs(ad_0 - ad_8) / Point / 2.0; ld_84 = gd_328 / ld_76; ld_ret_20 = NormalizeDouble(ld_84 / ld_92 / ld_100, gi_288); } else { if (gi_208 == TRUE) ld_ret_20 = NormalizeDouble(AccountBalance() / (ld_44 / (gd_212 / 10.0)) - 0.05, gi_288); else ld_ret_20 = gd_172; } double ld_52 = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); double ld_60 = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); if (g_bool_448) ld_ret_20 = NormalizeDouble(ld_ret_20 / 10.0, 2); if (IsTesting() && ai_16 == 2) ld_ret_20 = 2.0 * ld_ret_20; if (ld_ret_20 < ld_52) ld_ret_20 = ld_52; if (ld_ret_20 > ld_60) ld_ret_20 = ld_60; return (ld_ret_20); } double TickValue() { double ld_0 = NormalizeDouble(MarketInfo(Symbol(), MODE_TICKVALUE), Digits); return (ld_0); } int OrderExistsMode1(int a_cmd_0) { int l_ord_total_4 = OrdersTotal(); for (int l_pos_8 = 0; l_pos_8 < l_ord_total_4; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderType() == a_cmd_0 && OrderMagicNumber() == g_magic_280 && OrderSymbol() == Symbol()) return (1); } return (0); } int OrderExistsMode2(int a_cmd_0) { int l_ord_total_4 = OrdersTotal(); for (int l_pos_8 = 0; l_pos_8 < l_ord_total_4; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderType() == a_cmd_0 && OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) return (1); } return (0); } int DeleteOrderMode1(int a_cmd_0) { int l_ord_total_4 = OrdersTotal(); for (int l_pos_8 = 0; l_pos_8 < l_ord_total_4; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderType() == a_cmd_0 && OrderMagicNumber() == g_magic_280 && OrderSymbol() == Symbol()) OrderDelete(OrderTicket()); } return (0); } int DeleteOrderMode2(int a_cmd_0) { int l_ord_total_4 = OrdersTotal(); for (int l_pos_8 = 0; l_pos_8 < l_ord_total_4; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderType() == a_cmd_0 && OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) OrderDelete(OrderTicket()); } return (0); } int ClearPending() { int l_error_4; int l_ord_total_0 = OrdersTotal(); for (int l_pos_8 = 0; l_pos_8 < l_ord_total_0; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP && OrderMagicNumber() == g_magic_280 || OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) { if (!OrderDelete(OrderTicket())) { l_error_4 = GetLastError(); Print("Error(", l_error_4, "): eliminando orden pendiente (", ErrorDescription(l_error_4), ")"); return (0); } } } return (0); } int ClearPendingMode(int ai_0) { int l_error_8; int l_magic_16; int l_ord_total_4 = OrdersTotal(); for (int l_pos_12 = 0; l_pos_12 < l_ord_total_4; l_pos_12++) { l_magic_16 = -1; if (ai_0 == 1) l_magic_16 = g_magic_280; else { if (ai_0 == 2) l_magic_16 = g_magic_284; else return (0); } OrderSelect(l_pos_12, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP && OrderMagicNumber() == l_magic_16 && OrderSymbol() == Symbol()) { if (!OrderDelete(OrderTicket())) { l_error_8 = GetLastError(); Print("Error(", l_error_8, "): eliminando orden pendiente en modo " + ai_0 + " (", ErrorDescription(l_error_8), ")"); return (0); } } } return (0); } int CloseOrderMode1() { double ld_56; int l_error_68; int l_ord_total_64 = OrdersTotal(); int l_highest_0 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 0); int l_lowest_4 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 0); double l_high_16 = High[l_highest_0]; double l_low_24 = Low[l_lowest_4]; double ld_32 = NormalizeDouble((l_high_16 + l_low_24) / 2.0, Digits); int l_highest_8 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_256, 0); int l_lowest_12 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_256, 0); double l_high_40 = High[l_highest_8]; double l_low_48 = Low[l_lowest_12]; RefreshRates(); for (int l_pos_72 = 0; l_pos_72 < l_ord_total_64; l_pos_72++) { OrderSelect(l_pos_72, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_280 && OrderSymbol() == Symbol()) { if (OrderOpenPrice() > OrderStopLoss()) ld_56 = (OrderOpenPrice() - OrderStopLoss()) / Point; else ld_56 = 0; if (!((ld_56 != 0.0 && l_highest_0 >= gi_268 && SecurProfit(1) == 1) || Close[0] < l_low_48)) continue; Print("Cerrando orden de compra en Modo 1"); if (!(!OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet))) continue; l_error_68 = GetLastError(); Print("Error(", l_error_68, "): cerrando orden Buy (", ErrorDescription(l_error_68), ")"); return (0); } if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_280 && OrderSymbol() == Symbol()) { if (OrderOpenPrice() < OrderStopLoss()) ld_56 = (OrderStopLoss() - OrderOpenPrice()) / Point; else ld_56 = 0; if ((ld_56 != 0.0 && l_lowest_4 >= gi_268 && SecurProfit(1) == 1) || Close[0] > l_high_40) { Print("Cerrando orden de venta en Modo 1"); if (!OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet)) { l_error_68 = GetLastError(); Print("Error(", l_error_68, "): cerrando orden Sell (", ErrorDescription(l_error_68), ")"); return (0); } } } } return (0); } int CloseOrderMode2() { int l_error_68; int l_ord_total_64 = OrdersTotal(); int l_highest_0 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 0); int l_lowest_4 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 0); double l_high_16 = High[l_highest_0]; double l_low_24 = Low[l_lowest_4]; double ld_32 = NormalizeDouble((l_high_16 + l_low_24) / 2.0, Digits); int l_highest_8 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_256, 0); int l_lowest_12 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_256, 0); double ld_unused_40 = High[l_highest_8]; double ld_unused_48 = Low[l_lowest_12]; RefreshRates(); for (int l_pos_72 = 0; l_pos_72 < l_ord_total_64; l_pos_72++) { OrderSelect(l_pos_72, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUY && OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) { if (Bid < ld_32) continue; Print("Cerrando orden de compra en Modo 2"); if (!(!OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet))) continue; l_error_68 = GetLastError(); Print("Error(", l_error_68, "): cerrando orden Buy (", ErrorDescription(l_error_68), ")"); return (0); } if (OrderType() == OP_SELL && OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) { if (Ask <= ld_32) { Print("Cerrando orden de venta en Modo 2"); if (!OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet)) { l_error_68 = GetLastError(); Print("Error(", l_error_68, "): cerrando orden Sell (", ErrorDescription(l_error_68), ")"); return (0); } } } } return (0); } int MovePendingMode1() { double l_price_48; double l_price_56; double ld_64; int l_ord_total_72 = OrdersTotal(); int l_global_var_80 = 0; double ld_84 = 1; if (!IsTesting()) l_global_var_80 = GlobalVariableGet(gs_cfmv4_352); else l_global_var_80 = 4; if (l_global_var_80 > 2) ld_84 = l_global_var_80 / 2; else ld_84 = 1; RefreshRates(); int l_highest_0 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 1); int l_lowest_4 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 1); double l_high_8 = High[l_highest_0]; double l_low_16 = Low[l_lowest_4]; double ld_24 = NormalizeDouble((l_high_8 + l_low_16) / 2.0, Digits); double ld_32 = NormalizeDouble((ld_24 + l_high_8) / 2.0, Digits); double ld_40 = NormalizeDouble((ld_24 + l_low_16) / 2.0, Digits); g_stoplevel_204 = NormalizeDouble(MathAbs(ld_24 - l_high_8) / Point / 10.0, 0); for (int l_pos_92 = 0; l_pos_92 < l_ord_total_72; l_pos_92++) { OrderSelect(l_pos_92, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUYSTOP && OrderMagicNumber() == g_magic_280 && OrderSymbol() == Symbol()) { if (l_highest_0 >= gi_260 && OrderOpenPrice() > l_high_8 + g_stoplevel_204 * Point) { l_price_48 = ld_40 - 1.0 * Point; ld_64 = NormalizeDouble((MathMax(Ask, l_high_8) + g_stoplevel_204 * Point - l_price_48) / Point, Digits); l_price_56 = NormalizeDouble(MathMax(Ask, l_high_8) + g_stoplevel_204 * Point + 1.75 * ld_64 / ld_84 * Point, Digits); OrderModify(OrderTicket(), l_high_8 + g_stoplevel_204 * Point, l_price_48, l_price_56, 0, Green); } } else { if (OrderType() == OP_SELLSTOP && OrderMagicNumber() == g_magic_280 && OrderSymbol() == Symbol()) { if (l_lowest_4 >= gi_260 && OrderOpenPrice() < l_low_16 - g_stoplevel_204 * Point) { l_price_48 = ld_32 + 1.0 * Point; ld_64 = NormalizeDouble((l_price_48 - (MathMin(Bid, l_low_16) - g_stoplevel_204 * Point)) / Point, Digits); l_price_56 = NormalizeDouble(MathMin(Bid, l_low_16) - g_stoplevel_204 * Point - 1.75 * ld_64 / ld_84 * Point, Digits); OrderModify(OrderTicket(), l_low_16 - g_stoplevel_204 * Point, l_price_48, l_price_56, 0, Red); } } } } return (0); } int MovePendingMode2() { double l_price_48; double l_price_56; double ld_64; int l_ord_total_72 = OrdersTotal(); int l_stoplevel_80 = 0; RefreshRates(); int l_highest_0 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 1); int l_lowest_4 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 1); double l_high_8 = High[l_highest_0]; double l_low_16 = Low[l_lowest_4]; l_stoplevel_80 = MarketInfo(Symbol(), MODE_STOPLEVEL); double ld_24 = NormalizeDouble((l_high_8 + l_low_16) / 2.0, Digits); double ld_32 = NormalizeDouble((ld_24 + MathMax(Ask, l_high_8)) / 2.0, Digits); double ld_40 = NormalizeDouble((ld_24 + l_low_16) / 2.0, Digits); g_stoplevel_204 = NormalizeDouble(-0.05 * (MathAbs(ld_24 - l_low_16) / Point), 0); if (g_stoplevel_204 < l_stoplevel_80) g_stoplevel_204 = l_stoplevel_80; for (int l_pos_84 = 0; l_pos_84 < l_ord_total_72; l_pos_84++) { OrderSelect(l_pos_84, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUYSTOP && OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) { if (OrderOpenPrice() > ld_40) { l_price_56 = NormalizeDouble(ld_24, Digits); ld_64 = NormalizeDouble((l_price_56 - (MathMin(Bid, l_low_16) + g_stoplevel_204 * Point)) / Point, Digits); l_price_48 = NormalizeDouble(l_low_16 - g_stoplevel_204 * Point, Digits); OrderModify(OrderTicket(), ld_40 + g_stoplevel_204 * Point, l_price_48, l_price_56, 0, Blue); } } else { if (OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP && OrderMagicNumber() == g_magic_284 && OrderSymbol() == Symbol()) { if (OrderOpenPrice() < ld_32) { l_price_56 = NormalizeDouble(ld_24, Digits); ld_64 = NormalizeDouble((MathMax(Bid, l_high_8) - l_price_56 - g_stoplevel_204 * Point) / Point, Digits); l_price_48 = NormalizeDouble(l_high_8 + g_stoplevel_204 * Point, Digits); OrderModify(OrderTicket(), ld_32 - g_stoplevel_204 * Point, l_price_48, l_price_56, 0, Red); } } } } return (0); } int SecurProfit(int ai_0) { double ld_4 = 0; bool li_ret_12 = FALSE; if (OrderStopLoss() != 0.0) ld_4 = MathAbs(OrderOpenPrice() - OrderStopLoss()) / Point / 2.0; else ld_4 = 0; if (OrderProfit() >= TickValue() * GetLots(OrderOpenPrice(), OrderStopLoss(), ai_0) * ld_4) li_ret_12 = TRUE; return (li_ret_12); } int WriteComment() { string ls_12 = ""; string ls_20 = ""; string ls_28 = ""; int l_str2time_36 = StrToTime("2020.12.31 23:59"); bool li_40 = FALSE; double ld_68 = 0; int li_unused_76 = 0; int l_highest_44 = iHighest(NULL, g_timeframe_272, MODE_HIGH, gi_252, 0); int l_lowest_48 = iLowest(NULL, g_timeframe_272, MODE_LOW, gi_252, 0); double l_high_52 = High[l_highest_44]; double l_low_60 = Low[l_lowest_48]; int l_hist_total_8 = OrdersHistoryTotal(); double ld_80 = 0.0; double ld_88 = 0.0; double ld_96 = 0.0; double ld_104 = 0.0; double ld_112 = 0.0; double ld_120 = 0.0; for (int l_pos_4 = 0; l_pos_4 < l_hist_total_8; l_pos_4++) { OrderSelect(l_pos_4, SELECT_BY_POS, MODE_HISTORY); if (OrderMagicNumber() == g_magic_280 || OrderMagicNumber() == g_magic_284) { li_40 = TRUE; l_str2time_36 = MathMin(l_str2time_36, OrderOpenTime()); ld_80 += OrderProfit() / (OrderLots() * TickValue()); ld_88 += OrderProfit(); ld_96 += OrderSwap(); if (OrderSymbol() == Symbol()) { ld_104 += OrderProfit() / (OrderLots() * TickValue()); ld_112 += OrderProfit(); ld_120 += OrderSwap(); } } } if (l_hist_total_8 == 0) ls_12 = "0"; else { ls_12 = DoubleToStr(ld_80, 0) + " pips"; ls_20 = DoubleToStr(ld_104, 0) + " pips"; } ls_28 = "Gracias por operar con ForexMatic V4.1!\n"; if (gi_376 && !gi_384) ls_28 = ls_28 + "Versión de evaluación. Puede utilizar este sistema en su cuenta Real hasta el " + TimeDay(g_str2time_392) + "/" + TimeMonth(g_str2time_392) + "/" + TimeYear(g_str2time_392) + ".\n"; if (Period() != PERIOD_H1) { ls_28 = ls_28 + "\nATENCIÓN!!! El sistema " + gs_236 + " puede obtener mejores resultados si se aplica a gráficas de 1 Hora.\n\n"; } ls_28 = ls_28 + "Calculando máximos y mínimos de los últimos " + gi_252 + " períodos\n"; ls_28 = ls_28 + "Apalancamiento de la cuenta: 1:" + AccountLeverage() + "\n"; ld_68 = MinRecommendedObj(); ls_28 = ls_28 + "Operando en " + DoubleToStr(GlobalVariableGet(gs_cfmv4_352), 0) + " pares. Objetivo mínimo recomendado: " + DoubleToStr(ld_68, 2) + "%. Cantidad de lotes recomendados: " + g_dbl2str_400 + "\n"; if (ld_68 > 10.0 && GlobalVariableGet(gs_cfmv4_352) > 1.0) ls_28 = ls_28 + "(Considere la posibilidad de operar en menos pares, con menos lotes o con un nivel de agresividad más bajo, para reducir el riesgo y el objetivo mínimo recomendado)\n"; if (li_40) { ls_28 = ls_28 + "Pips totales ganados desde el " + TimeToStr(l_str2time_36, TIME_DATE) + ": " + ls_12 + " ($ " + DoubleToStr(ld_88 + ld_96, 2) + ")\n"; ls_28 = ls_28 + "Pips ganados en " + Symbol() + " desde el " + TimeToStr(l_str2time_36, TIME_DATE) + ": " + ls_20 + " ($ " + DoubleToStr(ld_112 + ld_120, 2) + ")\n"; } if (gd_180 > 0.0) { ls_28 = ls_28 + "\n" + gs_244; } if (l_high_52 - l_low_60 < gi_300 * Point) { ls_28 = ls_28 + "\nEl mercado está muy estable. No se realizan operaciones por el momento.\n"; } ls_28 = ls_28 + gs_432; Comment(ls_28); return (0); } int TargetOK() { int l_hist_total_8; int l_ord_total_12; double ld_48; double ld_56; double ld_16 = 0; double ld_24 = 0; double ld_32 = 0; double ld_40 = 0; double ld_64 = 0; bool li_ret_72 = FALSE; bool li_76 = FALSE; int l_datetime_80 = 0; int li_84 = 0; RefreshRates(); if (gd_180 > 0.0) { gs_244 = ""; l_hist_total_8 = OrdersHistoryTotal(); gd_320 = 0; ld_48 = 0; ld_56 = 0; li_76 = FALSE; for (int l_pos_4 = 0; l_pos_4 < l_hist_total_8; l_pos_4++) { OrderSelect(l_pos_4, SELECT_BY_POS, MODE_HISTORY); if (OrderMagicNumber() == g_magic_280 || OrderMagicNumber() == g_magic_284 && TimeToStr(OrderCloseTime(), TIME_DATE) == TimeToStr(TimeCurrent(), TIME_DATE)) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { if (l_datetime_80 == 0) l_datetime_80 = OrderOpenTime(); li_84 = MathMax(li_84, OrderCloseTime()); li_76 = TRUE; gd_320 += OrderProfit(); ld_64 += OrderSwap(); } } if (OrderMagicNumber() != g_magic_280 && OrderMagicNumber() != g_magic_284 && TimeToStr(OrderCloseTime(), TIME_DATE) == TimeToStr(TimeCurrent(), TIME_DATE)) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { ld_48 += OrderProfit(); ld_56 += OrderSwap(); } } } l_ord_total_12 = OrdersTotal(); for (l_pos_4 = 0; l_pos_4 < l_ord_total_12; l_pos_4++) { OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber() == g_magic_280 || OrderMagicNumber() == g_magic_284) { gd_320 += OrderProfit(); ld_64 += OrderSwap(); } else { if (OrderMagicNumber() != g_magic_280 && OrderMagicNumber() != g_magic_284) { ld_48 += OrderProfit(); ld_56 += OrderSwap(); } } } if (!li_76) ld_16 = AccountBalance(); else ld_16 = AccountEquity() - (gd_320 + ld_64) - (ld_48 + ld_56); ld_24 = ld_16 * (gd_180 / 100.0 + 1.0); ld_32 = ld_16 * (gd_188 / 100.0 + 1.0); ld_40 = ld_16 * (1 - gd_196 / 100.0); gd_328 = NormalizeDouble(ld_24 - ld_16, 2); gd_336 = NormalizeDouble(ld_32 - ld_16, 2); if (ld_16 + gd_320 + ld_64 >= ld_24) { li_ret_72 = TRUE; CloseAll(); gs_244 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + TimeToStr(TimeCurrent(), TIME_MINUTES) + ": Objetivo diario del " + DoubleToStr(gd_180, 2) + "%($" + DoubleToStr(ld_24 - ld_16, 2) + ") alcanzado en " + TimeHour(li_84 - l_datetime_80) + " hs " + TimeMinute(li_84 - l_datetime_80) + " min. Ganancia de hoy: $" + DoubleToStr(gd_320 + ld_64, 2); } else { if (ld_32 != 0.0 && TimeCurrent() > StrToTime(TimeYear(TimeCurrent()) + "." + TimeMonth(TimeCurrent()) + "." + TimeDay(TimeCurrent()) + " " + gs_440) || (TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() > StrToTime(TimeYear(TimeCurrent()) + "." + TimeMonth(TimeCurrent()) + "." + TimeDay(TimeCurrent()) + " " + HoraCierreViernes) - 600) && ld_16 + gd_320 + ld_64 >= ld_32) { li_ret_72 = TRUE; CloseAll(); gs_244 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + TimeToStr(TimeCurrent(), TIME_MINUTES) + ": Objetivo mínimo diario del " + DoubleToStr(gd_188, 2) + "%($" + DoubleToStr(ld_32 - ld_16, 2) + ") alcanzado. Ganancia de hoy: $" + DoubleToStr(gd_320 + ld_64, 2); } else { if (gd_196 != 0.0 && ld_16 + gd_320 + ld_64 <= ld_40) { li_ret_72 = TRUE; CloseAll(); gs_244 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + TimeToStr(TimeCurrent(), TIME_MINUTES) + ": Se ha alcanzado la pérdida máxima permitida del " + DoubleToStr(gd_196, 2) + "%($" + DoubleToStr(ld_40 - ld_16, 2) + "). Pérdida de hoy: $" + DoubleToStr(gd_320 + ld_64, 2) + " (" + DoubleToStr(100.0 * (gd_320 + ld_64) / ld_16, 2) + "%). Hoy no se realizan más operaciones."; } else gs_244 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + TimeToStr(TimeCurrent(), TIME_MINUTES) + ": Objetivo diario: " + DoubleToStr(gd_180, 2) + "% ($" + DoubleToStr(ld_24 - ld_16, 2) + "). Ganancia de hoy: $" + DoubleToStr(gd_320 + ld_64, 2) + " (" + DoubleToStr(100.0 * (gd_320 + ld_64) / ld_16, 2) + "%)"; } } } else gs_244 = ""; return (li_ret_72); } int CloseAll() { int l_error_4; int l_ord_total_0 = OrdersTotal(); RefreshRates(); for (int l_pos_8 = 0; l_pos_8 < l_ord_total_0; l_pos_8++) { OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber() == g_magic_280 || OrderMagicNumber() == g_magic_284) { if (OrderType() == OP_BUY) { if (!(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, Violet))) continue; l_error_4 = GetLastError(); Print("Error(", l_error_4, "): cerrando orden Buy (", ErrorDescription(l_error_4), ")"); return (0); } if (OrderType() == OP_SELL) { if (!(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 3, Violet))) continue; l_error_4 = GetLastError(); Print("Error(", l_error_4, "): cerrando orden Sell (", ErrorDescription(l_error_4), ")"); return (0); } if (!OrderDelete(OrderTicket())) { l_error_4 = GetLastError(); Print("Error(", l_error_4, "): eliminanado orden pendiente (", ErrorDescription(l_error_4), ")"); return (0); } } } return (0); } int ProtectMode2() { int l_ord_total_0 = OrdersTotal(); double ld_8 = 0; double l_ord_open_price_16 = 0; double ld_24 = 0; if (!gi_160) return (0); ld_24 = MarketInfo(Symbol(), MODE_STOPLEVEL); RefreshRates(); for (int l_pos_32 = 0; l_pos_32 < l_ord_total_0; l_pos_32++) { OrderSelect(l_pos_32, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_284) { ld_8 = 0.6 * MathAbs(OrderOpenPrice() - OrderTakeProfit()); if (OrderType() == OP_BUY && OrderStopLoss() > 0.0 && OrderStopLoss() < OrderOpenPrice() - ld_24 * Point) { l_ord_open_price_16 = OrderOpenPrice(); if (Bid > OrderOpenPrice() + ld_8) { Print("Protegiendo orden de compra"); OrderModify(OrderTicket(), OrderLots(), l_ord_open_price_16, OrderTakeProfit(), 0, Blue); } } else { if (OrderType() == OP_SELL && OrderStopLoss() > 0.0 && OrderStopLoss() > OrderOpenPrice() + ld_24 * Point) { l_ord_open_price_16 = OrderOpenPrice(); if (Ask < OrderOpenPrice() - ld_8) { Print("Protegiendo orden de venta"); OrderModify(OrderTicket(), OrderLots(), l_ord_open_price_16, OrderTakeProfit(), 0, Red); } } } } } return (0); } double MinRecommendedObj() { double ld_0 = 0; double ld_8 = 0; double ld_16 = 0; double ld_ret_24 = 0; int l_ord_total_36 = 0; int l_count_40 = 0; l_ord_total_36 = OrdersTotal(); ld_8 = 0; l_count_40 = 0; for (int l_pos_32 = 0; l_pos_32 < l_ord_total_36; l_pos_32++) { OrderSelect(l_pos_32, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber() == g_magic_280 || OrderMagicNumber() == g_magic_284) { if (OrderStopLoss() != 0.0) { l_count_40++; ld_0 = MathAbs(OrderOpenPrice() - OrderStopLoss()) / MarketInfo(OrderSymbol(), MODE_POINT); ld_8 += NormalizeDouble(ld_0 * MarketInfo(OrderSymbol(), MODE_TICKVALUE) * OrderLots(), 2); } } } if (l_count_40 != 0) { ld_16 = ld_8 / l_count_40; if (ld_16 > AccountBalance() / 2.0) ld_ret_24 = 50; else ld_ret_24 = NormalizeDouble(100.0 * ld_16 / AccountBalance(), 2); } else ld_ret_24 = gd_180; if (ld_ret_24 < 0.1) ld_ret_24 = 0.1; return (ld_ret_24); } bool VerifOK() { return (TRUE); } int CerradoViernes() { bool li_ret_0 = FALSE; gs_432 = ""; if (AutoCerrarViernes && TimeDayOfWeek(TimeCurrent()) == 5) { if (TimeCurrent() > StrToTime(TimeYear(TimeCurrent()) + "." + TimeMonth(TimeCurrent()) + "." + TimeDay(TimeCurrent()) + " " + HoraCierreViernes)) { CloseAll(); gs_432 = "\n\nEl robot ha dejado de operar por ser Viernes y haber superado la hora de cierre indicada (" + HoraCierreViernes + ")\n"; li_ret_0 = TRUE; } } return (li_ret_0); } int GetMagic(int ai_0) { string ls_4 = ""; string ls_12 = ""; ls_4 = AccountName(); ls_12 = ""; if (ai_0 == 1) for (int li_20 = 1; li_20 <= 3; li_20++) ls_12 = ls_12 + DoubleToStr(StringGetChar(ls_4, li_20), 0); else { if (ai_0 == 2) for (li_20 = 3; li_20 >= 1; li_20--) ls_12 = ls_12 + DoubleToStr(StringGetChar(ls_4, li_20), 0); else if (ai_0 == 3) for (li_20 = 2; li_20 <= 4; li_20++) ls_12 = ls_12 + DoubleToStr(StringGetChar(ls_4, li_20), 0); } return (StrToInteger(ls_12)); }