sistemaea_byfreddy_mod1.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.