← К каталогу
Исходный код · ID 637

sistemaea_byfreddy_mod1.mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Программа представляет собой торгового советника для MetaTrader 4, написанного на языке MQL4. Советник автоматизирует процесс открытия торговых позиций, поддерживая направления покупки и продажи с настраиваемыми параметрами объёма, стоп-лосса и тейк-профита. В коде реализована проверка минимальных уровней стоп-лосса и тейк-профита, а также нормализация объёмов сделок в соответствии с требованиями брокера.

Советник включает функциональность повторного открытия позиций при достижении заданного ценового шага, а также поддержку трейлинг-стопа для управления защитными ордерами. Время торговли может ограничиваться тремя независимыми временными интервалами с возможностью их включения и отключения. При тестировании на графике отображается информационная метка о текущем статусе торгового окна.

В качестве идентификатора ордеров используется магический номер, привязанный к текущему графику. Торговые операции выполняются через стандартный API MetaTrader 4 с обработкой ошибок и повторными попытками отправки. Советник не использует внешние библиотеки и работает как автономный модуль.

Настройки программы

НастройкаОписание
s00 s00 — Текстовый параметр-заголовок
buy buy — Разрешение на открытие позиций покупки
sell sell — Разрешение на открытие позиций продажи
repeat repeat — Разрешение на повторное открытие позиций при достижении ценового шага
SizeGrid SizeGrid — Размер ценового шага для повторного открытия позиций
s01 s01 — Текстовый параметр-заголовок
TakeProfit TakeProfit — Уровень тейк-профита для торговых позиций
StopLoss1 StopLoss1 — Уровень стоп-лосса для первой позиции
StopLoss2 StopLoss2 — Уровень стоп-лосса для второй позиции
StopLoss3 StopLoss3 — Уровень стоп-лосса для третьей позиции
s02 s02 — Текстовый параметр-заголовок
OrderLots1 OrderLots1 — Объём первой торговой позиции
OrderLots2 OrderLots2 — Объём второй торговой позиции
OrderLots3 OrderLots3 — Объём третьей торговой позиции
Slippage Slippage — Допустимое проскальгивание при отправке ордера
SecondsRepeat SecondsRepeat — Время ожидания в секундах между повторными попытками отправки ордера
sh60 sh60 — Текстовый параметр-заголовок
AlwaysEnable AlwaysEnable — Включение/отключение автоматической торговли без ограничений по времени
sh70 sh70 — Текстовый параметр-заголовок
TimeSet1 TimeSet1 — Включение первого временного интервала торговли
TimeSet1_start TimeSet1_start — Время начала первого торгового интервала
TimeSet1_stop TimeSet1_stop — Время окончания первого торгового интервала
sh80 sh80 — Текстовый параметр-заголовок
TimeSet2 TimeSet2 — Включение второго временного интервала торговли
TimeSet2_start TimeSet2_start — Время начала второго торгового интервала
TimeSet2_stop TimeSet2_stop — Время окончания второго торгового интервала
sh90 sh90 — Текстовый параметр-заголовок
TimeSet3 TimeSet3 — Включение третьего временного интервала торговли
TimeSet3_start TimeSet3_start — Время начала третьего торгового интервала
TimeSet3_stop TimeSet3_stop — Время окончания третьего торгового интервала
sh100 sh100 — Текстовый параметр-заголовок
Получить полный код

Поиск по коду файла

/*
   Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
   Website: 
   E-mail : p******m*@gmail.com
*/

#import "user32.dll"
   int PostMessageA(int a0, int a1, int a2, int a3);
#import

extern string s00 = "** ????????? ????????? **";
extern bool buy = TRUE;
extern bool sell = TRUE;
extern bool repeat = TRUE;
extern int SizeGrid = 10;
extern string s01 = "** Stops **";
int gi_108 = 0;
extern int TakeProfit = 30;
extern int StopLoss1 = 10;
extern int StopLoss2 = 20;
extern int StopLoss3 = 30;
extern string s02 = "** Order size. 0 to disable **";
extern double OrderLots1 = 0.1;
extern double OrderLots2 = 0.1;
extern double OrderLots3 = 0.1;
bool gi_160 = FALSE;
int gi_164 = 0;
int gi_168 = 100;
bool gi_unused_172 = FALSE;
string gs_176 = "JP_GRID";
string gs_184 = "v1.0";
extern int Slippage = 1;
extern int SecondsRepeat = 20;
double gd_200 = 0.0;
int gi_208 = 1;
int g_magic_212;
string gs_unused_216 = "";
string gs_dummy_224;
string gs_dummy_232;
string gs_dummy_240;
string gs_dummy_248;
string gs_dummy_256;
string gs_dummy_264;
string gs_dummy_272;
string gs_dummy_280;
string gs_dummy_288;
string gs_dummy_296;
int gi_unused_304 = 0;
int gi_unused_308 = -1;
string gs_unused_312 = "";
extern string sh60 = "*** ????? ?????? **********";
extern bool AlwaysEnable = TRUE;
extern string sh70 = "*** ????? ??????. ????????? - 1 (00:00 - 23:59) ***";
extern bool TimeSet1 = TRUE;
extern string TimeSet1_start = "07:30";
extern string TimeSet1_stop = "14:00";
extern string sh80 = "*** ????? ??????. ????????? - 2 (00:00 - 23:59) ***";
extern bool TimeSet2 = FALSE;
extern string TimeSet2_start = "14:00";
extern string TimeSet2_stop = "22:00";
extern string sh90 = "*** ????? ??????. ????????? - 3 (00:00 - 23:59) ***";
extern bool TimeSet3 = FALSE;
extern string TimeSet3_start = "22:00";
extern string TimeSet3_stop = "07:30";
extern string sh100 = "*****************************************";
string gs_horario_424 = "Horario";
int gi_unused_432 = 0;
double g_bid_436 = 0.0;
int gi_unused_444 = 0;
int g_time_448 = 0;

int comprobarStopLoss(int ai_0) {
   int l_stoplevel_4 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   if (ai_0 != 0 && ai_0 < l_stoplevel_4) {
      Alert("ERROR: The minimum StopLoss in ", Symbol(), " es: ", l_stoplevel_4);
      return (0);
   }
   return (1);
}

int comprobarTakeProfit(int ai_0) {
   int l_stoplevel_4 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   if (ai_0 != 0 && ai_0 < l_stoplevel_4) {
      Alert("ERROR: The minimum TakeProfit in ", Symbol(), " es: ", l_stoplevel_4);
      return (0);
   }
   return (1);
}

double getSL(int ai_0, int ai_4, double a_price_8 = 0.0) {
   if (ai_4 == 0) return (0);
   double ld_ret_16 = 0;
   double ld_24 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   ld_24 *= Point;
   if (ai_0 == 0 || ai_0 == 2 || ai_0 == 4) {
      if (a_price_8 == 0.0) {
         RefreshRates();
         a_price_8 = Ask;
      }
      ld_ret_16 = a_price_8 - ai_4 * Point;
      if (ld_ret_16 > a_price_8 - ld_24) ld_ret_16 = a_price_8 - ld_24;
   }
   if (ai_0 == 1 || ai_0 == 3 || ai_0 == 5) {
      if (a_price_8 == 0.0) {
         RefreshRates();
         a_price_8 = Bid;
      }
      ld_ret_16 = a_price_8 + ai_4 * Point;
      if (ld_ret_16 < a_price_8 + ld_24) ld_ret_16 = a_price_8 + ld_24;
   }
   return (ld_ret_16);
}

double getTP(int ai_0, int ai_4, double a_price_8 = 0.0) {
   if (ai_4 == 0) return (0);
   double ld_16 = 0;
   double ld_24 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   ld_24 *= Point;
   if (ai_0 == 0 || ai_0 == 2 || ai_0 == 4) {
      if (a_price_8 == 0.0) {
         RefreshRates();
         a_price_8 = Ask;
      }
      ld_16 = a_price_8 + ai_4 * Point;
      if (ld_16 < a_price_8 + ld_24) ld_16 = a_price_8 + ld_24;
   }
   if (ai_0 == 1 || ai_0 == 3 || ai_0 == 5) {
      if (a_price_8 == 0.0) {
         RefreshRates();
         a_price_8 = Bid;
      }
      ld_16 = a_price_8 - ai_4 * Point;
      if (ld_16 > a_price_8 - ld_24) ld_16 = a_price_8 - ld_24;
   }
   ld_16 = NormalizeDouble(ld_16, Digits);
   return (ld_16);
}

int abrirPosicion(int a_cmd_0, double a_price_4 = 0.0, double ad_12 = 0.0, double ad_20 = 0.0, double a_lots_28 = 0.0, string a_comment_36 = "", int a_datetime_44 = 0) {
   double l_price_48;
   color l_color_56;
   int l_ticket_60;
   int l_error_64;
   double l_price_68;
   double l_price_76;
   if (a_comment_36 == "") a_comment_36 = gs_176 + " " + gs_184 + " " + getPeriodAsString(Period()) + ";";
   double ld_84 = (MarketInfo(Symbol(), MODE_STOPLEVEL) + 1.0) * Point;
   int li_92 = SecondsRepeat * 2;
   a_price_4 = NormalizeDouble(a_price_4, Digits);
   while (li_92 > 0) {
      RefreshRates();
      if (a_cmd_0 == OP_BUY || a_cmd_0 == OP_BUYLIMIT || a_cmd_0 == OP_BUYSTOP) {
         l_price_48 = NormalizeDouble(Ask, Digits);
         l_color_56 = Green;
      }
      if (a_cmd_0 == OP_SELL || a_cmd_0 == OP_SELLLIMIT || a_cmd_0 == OP_SELLSTOP) {
         l_price_48 = NormalizeDouble(Bid, Digits);
         l_color_56 = Red;
      }
      if (a_price_4 == 0.0) a_price_4 = l_price_48;
      if (a_lots_28 == 0.0) a_lots_28 = NormalizeLots(gd_200);
      else a_lots_28 = NormalizeLots(a_lots_28);
      if (a_cmd_0 != OP_BUY && a_cmd_0 != OP_SELL) {
         if (a_price_4 < l_price_48 && a_cmd_0 == OP_BUYSTOP) a_cmd_0 = 2;
         if (a_price_4 > l_price_48 && a_cmd_0 == OP_BUYLIMIT) a_cmd_0 = 4;
         if (a_price_4 > l_price_48 && a_cmd_0 == OP_SELLSTOP) a_cmd_0 = 3;
         if (a_price_4 < l_price_48 && a_cmd_0 == OP_SELLLIMIT) a_cmd_0 = 5;
         if (a_cmd_0 == OP_BUYLIMIT || a_cmd_0 == OP_BUYSTOP || a_cmd_0 == OP_SELLLIMIT || a_cmd_0 == OP_SELLSTOP) {
            if (MathAbs(l_price_48 - a_price_4) > ld_84) l_price_48 = a_price_4;
            else {
               if (a_cmd_0 == OP_BUYLIMIT || a_cmd_0 == OP_BUYSTOP) {
                  a_cmd_0 = 0;
                  a_datetime_44 = 0;
               }
               if (a_cmd_0 == OP_SELLLIMIT || a_cmd_0 == OP_SELLSTOP) {
                  a_cmd_0 = 1;
                  a_datetime_44 = 0;
               }
            }
         }
      }
      if (ad_12 != 0.0) l_price_68 = ad_12;
      else l_price_68 = getSL(a_cmd_0, gi_108, l_price_48);
      if (ad_20 != 0.0) l_price_76 = ad_20;
      else l_price_76 = getTP(a_cmd_0, TakeProfit, l_price_48);
      if (a_cmd_0 == OP_BUY || a_cmd_0 == OP_BUYLIMIT || a_cmd_0 == OP_BUYSTOP) {
         if (l_price_68 != 0.0 && l_price_48 - l_price_68 < ld_84) {
            if (l_price_48 - l_price_68 > 0.0) {
               l_price_68 = NormalizeDouble(l_price_48 - ld_84, Digits);
               Print("Changing StopLoss to the platform minimum");
            } else {
               l_price_68 = 0;
               Print("Eliminando StopLoss incorrecto");
            }
         }
         if (l_price_76 != 0.0 && l_price_76 - l_price_48 < ld_84) {
            if (l_price_76 - l_price_48 > 0.0) {
               l_price_76 = NormalizeDouble(l_price_48 + ld_84, Digits);
               Print("Changing TakeProfit to the platform minimum");
            } else {
               l_price_76 = 0;
               Print("Eliminando TakeProfit incorrecto");
            }
         }
      }
      if (a_cmd_0 == OP_SELL || a_cmd_0 == OP_SELLLIMIT || a_cmd_0 == OP_SELLSTOP) {
         if (l_price_68 != 0.0 && l_price_68 - l_price_48 < ld_84) {
            if (l_price_68 - l_price_48 > 0.0) {
               l_price_68 = NormalizeDouble(l_price_48 + ld_84, Digits);
               Print("Changing StopLoss to the platform minimum");
            } else {
               l_price_68 = 0;
               Print("Eliminando StopLoss incorrecto");
            }
         }
         if (l_price_76 != 0.0 && l_price_48 - l_price_76 < ld_84) {
            if (l_price_48 - l_price_76 > 0.0) {
               l_price_76 = NormalizeDouble(l_price_48 - ld_84, Digits);
               Print("Changing TakeProfit to the platform minimum");
            } else {
               l_price_76 = 0;
               Print("Eliminando TakeProfit incorrecto");
            }
         }
      }
      while (!IsTradeAllowed() || IsTradeContextBusy()) Sleep(1000);
      l_ticket_60 = OrderSend(Symbol(), a_cmd_0, a_lots_28, l_price_48, Slippage, l_price_68, l_price_76, a_comment_36, g_magic_212, a_datetime_44, l_color_56);
      if (l_ticket_60 < 0) {
         l_error_64 = GetLastError();
         Print("OrderSend failed with error #", l_error_64);
         Print("Orden: ", a_cmd_0, " L=", a_lots_28, " pa=", l_price_48, " precio=" + a_price_4 + " sp=", Slippage, " sl=", l_price_68, " tp=", l_price_76, " c=", a_comment_36, " stoplevel=", ld_84, " Bid=", Bid);
         li_92--;
         Sleep(500);
      } else return (l_ticket_60);
   }
   Alert("Attempted to trade for " + SecondsRepeat + " seconds. Error #" + l_error_64);
   return (-1);
}

int getMagicNumber(bool ai_0 = FALSE) {
   int li_ret_4;
   if (!IsTesting()) li_ret_4 = WindowHandle(Symbol(), 0);
   else
      if (!IsVisualMode()) li_ret_4 = 23;
   if (ai_0) {
      for (int l_pos_8 = OrdersTotal() - 1; l_pos_8 >= 0; l_pos_8--) {
         OrderSelect(l_pos_8, SELECT_BY_POS);
         if (OrderSymbol() == Symbol()) {
            if (StringSubstr(OrderComment(), 0, StringLen(gs_176)) == gs_176 && StringFind(OrderComment(), " ", StringLen(gs_176) + 1) == -1 || StringSubstr(OrderComment(), StringFind(OrderComment(), " ", StringLen(gs_176) +
               1) + 1, StringLen(getPeriodAsString(Period()))) == getPeriodAsString(Period())) {
               Print("Retomando orden " + OrderTicket());
               li_ret_4 = OrderMagicNumber();
               break;
            }
         }
      }
   }
   return (li_ret_4);
}

void ajustarTrailingStopTodas(int ai_0, int ai_4, int ai_8 = 0) {
   for (int l_pos_12 = 0; l_pos_12 < OrdersTotal(); l_pos_12++)
      if ((OrderSelect(l_pos_12, SELECT_BY_POS) && OrderMagicNumber() == g_magic_212)) ajustarTrailingStop(OrderTicket(), ai_0, ai_4, ai_8);
}

int ajustarTrailingStop(int a_ticket_0, int ai_4, int ai_8, int ai_12 = 0) {
   int li_20;
  

Показано первые 50% кода (символов: 14489)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 448,90₽ ≈ $17.71