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

Smart_Algoritm

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

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

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

О программе

Smart_Algoritm — это торговый советник для MetaTrader 4, автоматизирующий открытие и управление позициями на семи валютных парах. Советник обрабатывает событие OnTick, рассчитывает лоты в двух режимах (фиксированный или зависящий от баланса) и размещает рыночные и отложенные ордера через стандартный торговый API MetaTrader 4.

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

Все торговые операции идентифицируются магическим числом Magic, а параметры слипажа, дистанций и таймфреймов задаются через пользовательские настройки. Советник отображает на графике информацию о счёте при включённом параметре Info.

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

НастройкаОписание
t0 Описание режима расчёта лота: постоянный или зависящий от баланса.
ModeLot Режим расчёта лота: 0 — фиксированный лот (LotPost), 1 — лот рассчитывается на основе баланса и LotProc.
LotPost Фиксированный размер лота при режиме ModeLot = 0 (постоянный лот).
LotProc Процент от баланса, используемый для расчёта размера лота при режиме ModeLot = 1 (лота зависят от баланса).
t3 Описание настроек системы управления просадками.
Level Количество позиций, учитываемых при расчёте совокупного убытка для системы управления просадками.
Max Коэффициент от баланса, задающий порог совокупного убытка для принудительного закрытия позиций в системе управления просадками.
STOPmax Коэффициент от баланса, задающий порог убытка для полного закрытия всех позиций советника.
t5 Описание настроек трейлинг-стопа.
Tral Расстояние в пунктах от точки безубыточности, после которого активируется трейлинг-стоп.
TralStep Шаг в пунктах для перемещения стоп-лосса при работе трейлинг-стопа.
t6 Описание настроек доливок (дополнительных ордеров).
Lim Основание степени для расчёта размера лота при увеличении количества открытых позиций по символу.
Step Дистанция в пунктах от текущей цены для размещения рыночных ордеров при достижении условий открытия.
t7 Описание настроек отложенных ордеров.
Modify Интервал в минутах между допустимыми модификациями отложенных ордеров.
Dist Дистанция в пунктах от текущей цены для размещения и модификации отложенных ордеров (BuyLimit, SellLimit, BuyStop, SellStop).
Use_Modyfy Переключатель, включающий автоматическую модификацию отложенных ордеров при отсутствии открытых позиций по символу.
Use_Limit Переключатель, включающий размещение отложенных ордеров BuyLimit и SellLimit при отсутствии открытых позиций.
Use_Stop Переключатель, включающий размещение отложенных ордеров BuyStop и SellStop при отсутствии открытых позиций.
t8 Описание настроек торговых пар.
P1 Символ первой торговой пары (по умолчанию EURUSD).
P2 Символ второй торговой пары (по умолчанию GBPUSD).
P3 Символ третьей торговой пары (по умолчанию USDCHF).
P4 Символ четвёртой торговой пары (по умолчанию EURGBP).
P5 Символ пятой торговой пары (по умолчанию USDCAD).
P6 Символ шестой торговой пары (по умолчанию GBPCHF).
P7 Символ седьмой торговой пары (по умолчанию NZDUSD).
t9 Описание дополнительных мелких настроек.
Slip Максимально допустимое отклонение цены исполнения от запрашиваемой цены (в пунктах).
Magic Магическое число для идентификации ордеров, открытых советником, на торговом счёте.
Name Комментарий, присваиваемый ордерам при их открытии через торговый API.
Info Переключатель отображения информации о счёте (брокер, баланс, свободные средства, номер счёта) на графике через функцию Comment.
Получить полный код

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

#property strict

input string   t0          = "Лоты 0 - постоянный, 1 - зависит от баланса";
input int      ModeLot     = 1;
input double   LotPost     = 1.0;
input double   LotProc     = 2.0;
input string   t3          = "Система выхода из просадок";
input int      Level       = 1;
input double   Max         = 0.5;
input double   STOPmax     = 2.0;
input string   t5          = "Настройки Трейлинг стопа";
input int      Tral        = 250;
input int      TralStep    = 0;
input string   t6          = "Настройки доливок";
input double   Lim         = 2.0;
input int      Step        = 500;
input string   t7          = "Настройки отложек";
input int      Modify      = 60;
input int      Dist        = 250;
input bool     Use_Modyfy  = TRUE;
input bool     Use_Limit   = TRUE;
input bool     Use_Stop    = FALSE;
input string   t8          = "Настройки пар";
input string   P1          = "EURUSD";
input string   P2          = "GBPUSD";
input string   P3          = "USDCHF";
input string   P4          = "EURGBP";
input string   P5          = "USDCAD";
input string   P6          = "GBPCHF";
input string   P7          = "NZDUSD";
input string   t9          = "Мелкие настройки";
input int      Slip        = 100;
input int      Magic       = 123;
input string   Name        = "Smart_Algoritm";
input bool     Info        = TRUE;

int      G_datetime_288;
int      G_datetime_292;
int      G_datetime_296;
int      G_datetime_300;
int      Gi_304;
double   Gd_308;
double   G_lots_316;
int      Li_8;
int      ticket;
bool     modtic, closetic, deltic;

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnTick()
  {
      // код доступен только после оплаты
   }
   double lots_0 = 0;
   if(ModeLot == 0) lots_0 = LotPost;
   if(ModeLot == 1) lots_0 = NormalizeDouble(AccountBalance() / 100.0 * LotProc / (100.0 * MarketInfo(Symbol(), MODE_TICKVALUE) * Gi_304), 2);
   if(lots_0 < MarketInfo(Symbol(), MODE_MINLOT)) lots_0 = MarketInfo(Symbol(), MODE_MINLOT);
   if(MarketInfo(Symbol(), MODE_LOTSTEP) == 0.01) Li_8 = 2;
   if(MarketInfo(Symbol(), MODE_LOTSTEP) == 0.1) Li_8 = 1;
   if(MarketInfo(Symbol(), MODE_LOTSTEP) == 1.0) Li_8 = 0;
   if(Info)
     {
      Comment(""
              + "\n" 
              + "Smart_Algoritm" 
              + "\n" 
              + "________________________________" 
              + "\n" 
              + "Брокер:         " + AccountCompany() 
              + "\n" 
              + "Время брокера:  " + TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS) 
              + "\n" 
              + "________________________________" 
              + "\n" 
              + "Счёт:             " + AccountName() 
              + "\n" 
              + "Номер счёт        " + (string)AccountNumber() 
              + "\n" 
              + "_______________________________" 
              + "\n" 
              + "Баланс:                       " + DoubleToStr(AccountBalance(), 2) 
              + "\n" 
              + "Свободные средства:   " + DoubleToStr(AccountEquity(), 2) 
              + "\n"
              +"_______________________________");
     }

   double Ld_12 = AccountBalance() / 100.0 * STOPmax;
   if(f0_2(-1) >= Ld_12 && Ld_12 != 0.0) f0_9(Magic, -1);
   Gd_308 = AccountBalance() / 100.0 * Max;
   f0_5();
   if(f0_8(-1)  == 1) f0_12(Magic, P1);
   if(f0_3(-1)  == 1) f0_12(Magic, P2);
   if(f0_10(-1) == 1) f0_12(Magic, P3);
   if(f0_6(-1)  == 1) f0_12(Magic, P4);
   if(f0_15(-1) == 1) f0_12(Magic, P5);
   if(f0_4(-1)  == 1) f0_12(Magic, P6);
   if(f0_0(-1)  == 1) f0_12(Magic, P7);
   if(f0_8(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P1, MODE_ASK) + Step * MarketInfo(P1, MODE_POINT), Digits) <= f0_14(P1))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_8(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P1, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P1, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_8(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P1, MODE_BID) - Step * MarketInfo(P1, MODE_POINT), Digits) >= f0_1(P1))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_8(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P1, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P1, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_3(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P2, MODE_ASK) + Step * MarketInfo(P2, MODE_POINT), Digits) <= f0_14(P2))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_3(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P2, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P2, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_3(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P2, MODE_BID) - Step * MarketInfo(P2, MODE_POINT), Digits) >= f0_1(P2))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_3(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P2, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P2, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_10(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P3, MODE_ASK) + Step * MarketInfo(P3, MODE_POINT), Digits) <= f0_14(P3))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_10(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P3, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P3, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_10(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P3, MODE_BID) - Step * MarketInfo(P3, MODE_POINT), Digits) >= f0_1(P3))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_10(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P3, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P3, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_6(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P4, MODE_ASK) + Step * MarketInfo(P4, MODE_POINT), Digits) <= f0_14(P4))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_6(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P4, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P4, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_6(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P4, MODE_BID) - Step * MarketInfo(P4, MODE_POINT), Digits) >= f0_1(P4))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_6(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P4, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P4, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_15(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P5, MODE_ASK) + Step * MarketInfo(P5, MODE_POINT), Digits) <= f0_14(P5))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_15(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P5, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P5, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_15(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P5, MODE_BID) - Step * MarketInfo(P5, MODE_POINT), Digits) >= f0_1(P5))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_15(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P5, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P5, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_4(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P6, MODE_ASK) + Step * MarketInfo(P6, MODE_POINT), Digits) <= f0_14(P6))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_4(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P6, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P6, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_4(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P6, MODE_BID) - Step * MarketInfo(P6, MODE_POINT), Digits) >= f0_1(P6))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_4(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P6, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P6, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_0(OP_BUY) > 0 && NormalizeDouble(MarketInfo(P7, MODE_ASK) + Step * MarketInfo(P7, MODE_POINT), Digits) <= f0_14(P7))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_0(OP_BUY)) * lots_0, Li_8);
      ticket = OrderSend(P7, OP_BUY, G_lots_316, NormalizeDouble(MarketInfo(P7, MODE_ASK), Digits), Slip, 0, 0, Name, Magic, 0, Green);
     }
   if(f0_0(OP_SELL) > 0 && NormalizeDouble(MarketInfo(P7, MODE_BID) - Step * MarketInfo(P7, MODE_POINT), Digits) >= f0_1(P7))
     {
      G_lots_316 = NormalizeDouble(MathPow(Lim, f0_0(OP_SELL)) * lots_0, Li_8);
      ticket = OrderSend(P7, OP_SELL, G_lots_316, NormalizeDouble(MarketInfo(P7, MODE_BID), Digits), Slip, 0, 0, Name, Magic, 0, Red);
     }
   if(f0_8(OP_BUY)   > 0) f0_13(Magic, P1);
   if(f0_8(OP_SELL)  > 0) f0_11(Magic, P1);
   if(f0_3(OP_BUY)   > 0) f0_13(Magic, P2);
   if(f0_3(OP_SELL)  > 0) f0_11(Magic, P2);
   if(f0_10(OP_BUY)  > 0) f0_13(Magic, P3);
   if(f0_10(OP_SELL) > 0) f0_11(Magic, P3);
   if(f0_6(OP_BUY)   > 0) f0_13(Magic, P4);
   if(f0_6(OP_SELL)  > 0) f0_11(Magic, P4);
   if(f0_15(OP_BUY)  > 0) f0_13(Magic, P5);
   if(f0_15(OP_SELL) > 0) f0_11(Magic, P5);
   if(f0_4(OP_BUY)   > 0) f0_13(Magic, P6);
   if(f0_4(OP_SELL)  > 0) f0_11(Magic, P6);
   if(f0_0(OP_BUY)   > 0) f0_13(Magic, P7);
   if(f0_0(OP_SELL)  > 0) f0_11(Magic, P7);
   if(Use_Modyfy && f0_8(OP_BUY)  == 0 && f0_8(OP_SELL)  == 0) f0_7(P1);
   if(Use_Modyfy && f0_3(OP_BUY)  == 0 && f0_3(OP_SELL)  == 0) f0_7(P2);
   if(Use_Modyfy && f0_10(OP_BUY) == 0 && f0_10(OP_SELL) == 0) f0_7(P3);
   if(Use_Modyfy && f0_6(OP_BUY)  == 0 && f0_6(OP_SELL)  == 0) f0_7(P4);
   if(Use_Modyfy && f0_15(OP_BUY) == 0 && f0_15(OP_SELL) == 0) f0_7(P5);
   if(Use_Modyfy && f0_4(OP_BUY)  == 0 && f0_4(OP_SELL)  == 0) f0_7(P6);
   if(Use_Modyfy && f0_0(OP_BUY)  == 0 && f0_0(OP_SELL)  == 0) f0_7(P7);
   if(Use_Limit) {
      if(f0_8(OP_BUY)   == 0 && f0_8(OP_SELL)  == 0 && f0_8(OP_BUYLIMIT)   == 0) ticket = OrderSend(P1, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P1, MODE_ASK) - Dist * MarketInfo(P1, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_8(OP_SELL)  == 0 && f0_8(OP_BUY)   == 0 && f0_8(OP_SELLLIMIT)  == 0) ticket = OrderSend(P1, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P1, MODE_BID) + Dist * MarketInfo(P1, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
      if(f0_3(OP_BUY)   == 0 && f0_3(OP_SELL)  == 0 && f0_3(OP_BUYLIMIT)   == 0) ticket = OrderSend(P2, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P2, MODE_ASK) - Dist * MarketInfo(P2, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_3(OP_SELL)  == 0 && f0_3(OP_BUY)   == 0 && f0_3(OP_SELLLIMIT)  == 0) ticket = OrderSend(P2, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P2, MODE_BID) + Dist * MarketInfo(P2, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
      if(f0_10(OP_BUY)  == 0 && f0_10(OP_SELL) == 0 && f0_10(OP_BUYLIMIT)  == 0) ticket = OrderSend(P3, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P3, MODE_ASK) - Dist * MarketInfo(P3, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_10(OP_SELL) == 0 && f0_10(OP_BUY)  == 0 && f0_10(OP_SELLLIMIT) == 0) ticket = OrderSend(P3, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P3, MODE_BID) + Dist * MarketInfo(P3, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
      if(f0_6(OP_BUY)   == 0 && f0_6(OP_SELL)  == 0 && f0_6(OP_BUYLIMIT)   == 0) ticket = OrderSend(P4, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P4, MODE_ASK) - Dist * MarketInfo(P4, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_6(OP_SELL)  == 0 && f0_6(OP_BUY)   == 0 && f0_6(OP_SELLLIMIT)  == 0) ticket = OrderSend(P4, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P4, MODE_BID) + Dist * MarketInfo(P4, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
      if(f0_15(OP_BUY)  == 0 && f0_15(OP_SELL) == 0 && f0_15(OP_BUYLIMIT)  == 0) ticket = OrderSend(P5, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P5, MODE_ASK) - Dist * MarketInfo(P5, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_15(OP_SELL) == 0 && f0_15(OP_BUY)  == 0 && f0_15(OP_SELLLIMIT) == 0) ticket = OrderSend(P5, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P5, MODE_BID) + Dist * MarketInfo(P5, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
      if(f0_4(OP_BUY)   == 0 && f0_4(OP_SELL)  == 0 && f0_4(OP_BUYLIMIT)   == 0) ticket = OrderSend(P6, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P6, MODE_ASK) - Dist * MarketInfo(P6, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_4(OP_SELL)  == 0 && f0_4(OP_BUY)   == 0 && f0_4(OP_SELLLIMIT)  == 0) ticket = OrderSend(P6, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P6, MODE_BID) + Dist * MarketInfo(P6, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
      if(f0_0(OP_BUY)   == 0 && f0_0(OP_SELL)  == 0 && f0_0(OP_BUYLIMIT)   == 0) ticket = OrderSend(P7, OP_BUYLIMIT,  lots_0, NormalizeDouble(MarketInfo(P7, MODE_ASK) - Dist * MarketInfo(P7, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_0(OP_SELL)  == 0 && f0_0(OP_BUY)   == 0 && f0_0(OP_SELLLIMIT)  == 0) ticket = OrderSend(P7, OP_SELLLIMIT, lots_0, NormalizeDouble(MarketInfo(P7, MODE_BID) + Dist * MarketInfo(P7, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Red);
   }
   if(Use_Stop)
     {
      if(f0_8(OP_BUY)   == 0 && f0_8(OP_SELL)  == 0 && f0_8(OP_BUYSTOP)   == 0) ticket = OrderSend(P1, OP_BUYSTOP,  lots_0, NormalizeDouble(MarketInfo(P1, MODE_BID) + Dist * MarketInfo(P1, MODE_POINT), Digits), Slip, 0, 0, Name, Magic, 0, Green);
      if(f0_8(OP_SELL)  == 0 && f0_8(OP_BUY)   == 0 && f0_8(OP_SELLSTOP)  == 0) ticket = OrderSend(P1, OP_SELLSTOP, lots_0, NormalizeDouble

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

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

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

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

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

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

Стоимость полного кода
2 054,30₽ ≈ $25.11