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

!!!9 Чудо Света.mq4

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

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

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

О программе

Советник предназначен для автоматической торговли на платформе MetaTrader 4. Он считывает сигналы до пяти пользовательских индикаторов через настраиваемые буферы и открывает позиции BUY или SELL в зависимости от направления сигнала. Каждый индикатор настраивается отдельно с указанием номеров буферов покупки и продажи, а также смещения бара для ожидания сигнала.

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

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

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

НастройкаОписание
iMaxOneDirection Максимальное количество позиций в одном направлении
INDICATOR1 Имя пользовательского индикатора 1 (буферы)
Buffer_1_BUY1 Номер буфера индикатора 1 на покупку
Buffer_1_SELL1 Номер буфера индикатора 1 на продажу
SignalBar_11 Бар, на котором ожидается сигнал индикатора 1 (0 — текущий, 1 — прошлый)
____1 Разделитель настроек индикатора 1
INDICATOR2 Имя пользовательского индикатора 2 (буферы)
Buffer_1_BUY2 Номер буфера индикатора 2 на покупку
Buffer_1_SELL2 Номер буфера индикатора 2 на продажу
SignalBar_12 Бар, на котором ожидается сигнал индикатора 2 (0 — текущий, 1 — прошлый)
____2 Разделитель настроек индикатора 2
INDICATOR3 Имя пользовательского индикатора 3 (буферы)
Buffer_1_BUY3 Номер буфера индикатора 3 на покупку
Buffer_1_SELL3 Номер буфера индикатора 3 на продажу
SignalBar_13 Бар, на котором ожидается сигнал индикатора 3 (0 — текущий, 1 — прошлый)
____3 Разделитель настроек индикатора 3
INDICATOR4 Имя пользовательского индикатора 4 (буферы)
Buffer_1_BUY4 Номер буфера индикатора 4 на покупку
Buffer_1_SELL4 Номер буфера индикатора 4 на продажу
SignalBar_14 Бар, на котором ожидается сигнал индикатора 4 (0 — текущий, 1 — прошлый)
____4 Разделитель настроек индикатора 4
INDICATOR5 Имя пользовательского индикатора 5 (буферы)
Buffer_1_BUY5 Номер буфера индикатора 5 на покупку
Buffer_1_SELL5 Номер буфера индикатора 5 на продажу
SignalBar_15 Бар, на котором ожидается сигнал индикатора 5 (0 — текущий, 1 — прошлый)
____5 Разделитель настроек индикатора 5
txt_3 Заголовок секции фильтров времени
time_type Режим фильтрации времени: разрешить или запретить торговлю в указанные периоды
hour_filtr Периоды суток для фильтрации торговли в формате ЧЧ:ММ-ЧЧ:ММ (если пусто, фильтр отключён)
____6 Разделитель перед фильтрами времени
Adding Доливка позиции на свободную освободившуюся маржу
StepType Тип доливки: true — в пунктах, false — в процентах от баланса
Step Шаг доливки в процентах от баланса
Step1 Шаг доливки в долларах от прибыли
d_type Тип расчёта шага доливки: геометрическая или арифметическая прогрессия
_____ Разделитель настроек доливки
lot_type Тип расчёта лота: от баланса, от прибыли или статический
Lot Размер лота в процентах от баланса или фиксированное значение
lot_doliv Расчёт лота доливки: умножение на коэффициент или фиксированный лот
koef_lot Коэффициент или фиксированное значение для расчёта лота доливки
______ Разделитель настроек закрытия
CloseRevers Закрытие позиций при встречном сигнале индикатора
NoLossStart Прибыль в процентах от баланса, при которой включается безубыток (0 — отключено)
MinProfitNoLoss Минимальная прибыль безубытка в валюте депозита
ProfitTral Прибыль в процентах от баланса, при которой стартует трал (0 — отключено)
TralStop Откат прибыли в процентах от максимальной, при котором останавливается трал
_______ Разделитель настроек безубытка и трала
ProfClose Прибыль в процентах от баланса, при которой закрываются все сделки (0 — отключено)
LossClose Убыток в процентах от баланса, при котором закрываются все сделки
TP Тейк-профит в пунктах от цены открытия
SL Стоп-лосс в пунктах от цены открытия
Bezubytik_Start Начальное значение безубытка в пунктах от цены открытия
Trailing_Stop Начало трейлинг-стопа в пунктах от цены открытия
Trailing_Step Шаг трейлинг-стопа в пунктах
________ Разделитель настроек ордеров
slippage Допустимое проскальзывание в пунктах
Magic Магический номер для идентификации позиций советника
AlertON Уведомление (алерт) при появлении сигнала на открытие позиции
s01 Разделитель секции отложенных ордеров
iBuyColor Цвет линии и меток Buy
iSellColor Цвет линий и меток Sell
iLineStyle Стиль линий индикатора
iLineWidth Толщина линий индикатора
Получить полный код

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

#property version   "9.00"
#property strict
#property description "Советник для любого индикатора"
#property description "Советник работает бесплатно в тестере, на всех демо счетах и на реальных счетах с депозитом до 100 usd. На более крупные депозиты можно купить советник без ограничений."

/*1) при определенном % прибыли что бы он выставлял без убыток и тралил в % по нарастающему %?.
True/false
2) Доливал позицию на свободную освободившеюся маржу
True /false
3)Открывал по сигналу сделку и закрывал по сигналу сделку
True /false
.4)Фиксация прибыли в % ограничение потерь в %*/

enum TYPE_D
 { 
   MULT,     // геометрическая прогрессия
   SUMM      // арифмитическая прогрессия
 };

enum type_time
 { 
   en_time,       // разрешить торговлю
   dis_time       // запретить торговлю
 };

enum type_lot
 { 
   balance,     // баланса
   profit,       // профита
   standard     // статика
 };

enum doliv_lot
 { 
   koef,     // умножать на коэффициент
   fix       // фиксированный лот
 };

input int      iMaxOneDirection      = 1000;          //макс. в одном направлении

extern string  INDICATOR1            = "HGI_v16.09";          //индикатор буферов #1
extern int     Buffer_1_BUY1         = 0;           //номер буфера на покупку
extern int     Buffer_1_SELL1        = 1;           //номер буфера на продажу
extern int     SignalBar_11          = 1;           //бар на котором ждем сигнал (0- текущий  1 - прошлый)
extern string  ____1                 = "";//___
extern string  INDICATOR2            = "";          //индикатор буферов #2
extern int     Buffer_1_BUY2         = 2;           //номер буфера на покупку
extern int     Buffer_1_SELL2        = 3;           //номер буфера на продажу
extern int     SignalBar_12          = 1;           //бар на котором ждем сигнал (0- текущий  1 - прошлый)
extern string  ____2                 = "";//___
extern string  INDICATOR3            = "";          //индикатор буферов #3
extern int     Buffer_1_BUY3         = 0;           //номер буфера на покупку
extern int     Buffer_1_SELL3        = 1;           //номер буфера на продажу
extern int     SignalBar_13          = 1;           //бар на котором ждем сигнал (0- текущий  1 - прошлый)
extern string  ____3                 = "";//___
extern string  INDICATOR4            = "";          //индикатор буферов #4
extern int     Buffer_1_BUY4         = 0;           //номер буфера на покупку
extern int     Buffer_1_SELL4        = 1;           //номер буфера на продажу
extern int     SignalBar_14          = 1;           //бар на котором ждем сигнал (0- текущий  1 - прошлый)
extern string  ____4                 = "";//___
extern string  INDICATOR5            = "";          //индикатор буферов #5
extern int     Buffer_1_BUY5         = 0;           //номер буфера на покупку
extern int     Buffer_1_SELL5        = 1;           //номер буфера на продажу
extern int     SignalBar_15          = 1;           //бар на котором ждем сигнал (0- текущий  1 - прошлый)
extern string  ____5                 = "";//___
extern string  txt_3                 = "______ФИЛЬТРЫ ВРЕМЕНИ_______";//.
extern type_time time_type           = en_time;     // В указаные ниже периоды...
extern string hour_filtr             = "";          // Периоды суток формата ЧЧ:ММ-ЧЧ:ММ (если пусто, то фильтр откл.)
extern string  ____6                 = "";//___
extern bool    Adding               = true;         //Доливал позицию на свободную освободившеюся маржу
extern bool    StepType             = true;        //Тип доливки (true - пункты, false - % от баланса)
extern int     Step                 = 30;           //шаг доливки (% от баланса)
extern int     Step1                = 100;           //шаг доливки ($ от прибыли)
extern TYPE_D  d_type               = SUMM;         //тип шага доливки

extern string  _____                = "";
extern type_lot lot_type            = standard;      //Расчет лота от ...
extern double  Lot                  = 0.1;         //лот в %
extern doliv_lot lot_doliv          = koef;         //Расчет лота доливки
extern double  koef_lot             = 0.4;          //Значение для расчета лота доливки (коэфф. или фикс.)

extern string  ______               = "";
extern bool    CloseRevers          = false ;       //закрывать ордера при встречном сигнале
extern double  NoLossStart          = 0;         //безубыток в % от Баланса (0- откл)
extern double  MinProfitNoLoss      = 0;         //минимальная прибыль безубытка в валюте депозита

extern double  ProfitTral           = 0;         //прибыль в % от Баланса при котором стартует трал (0- откл)
extern double  TralStop             = 0;        //откат прибыли в % от максимальной
extern string  _______              = "";
extern double  ProfClose            = 0;        //прибыль в % от Баланса при которой закрываем все сделки (0- откл)
extern double  LossClose            = 0;        //убыток в % от Баланса при котором закрываем все сделки (0- откл)
extern int     TP = 0;
extern int     SL = 0;
extern int     Bezubytik_Start = 200;
extern int     Trailing_Stop = 200;
extern int     Trailing_Step = 10;

extern string  ________             = "";
extern int     slippage             = 0;          // проскальзывание
extern int     Magic                = 12345;           
int     Orders               = 1000;    //максимальное кол-во открытых позиций       
extern bool    AlertON              = true;       //алерт при появлении сигнала на открытие позиции

input string   s01                  = "-----";     //Отложенные ордера
input color    iBuyColor            = clrLime;     //Цвет Buy
input color    iSellColor           = clrRed;      //Цвет Sell
input ENUM_LINE_STYLE iLineStyle    = STYLE_DASH;  //Стиль линии
input int      iLineWidth           = 1;           //Толщина

datetime TimeBar;
double STOPLEVEL;
string val;
double ProfitTrallStart=0;
bool Trall=false;
bool NoLoss=false;
int step_dolivka = 0;
int step_dolivka1 = Step1;
ushort u_sep;                  // код символа разделителя
string result[];
int k;
double _lot;

int CountBuy;
int CountSell;

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

void OnTick()
{
      // код доступен только после оплаты
   }
   Comment(txt,"\nProfit = ",DoubleToString(Profit,2)," (",DoubleToString(((Profit/AB)*100),1),"%)",
               "\nBalance = ",DoubleToString(AB,2),
               "\nEquity = ",DoubleToString(AccountEquity(),2),
               "\nFreeMargin = ",DoubleToString(AccountFreeMargin(),2),
               "\n",IntegerToString(b)," buy  ",IntegerToString(s)," sell",
               "\n",DoubleToStr(lot_buy,2)," lots buy",
                "\n",DoubleToStr(lot_sell,2)," lots sell");
   if(!IsNewOrderAllowed()) return;

   if(S1!=0 && !timetrade()) {S1 = 0; TimeBar=Time[0];}

   if ((S1>0 && CountBuy < iMaxOneDirection) || (Adding && ProfitB>0 && b>0))
   {

      if (CloseRevers && s>0) 
      {
          if (AlertON) Alert("Закрытие SELL на обратном сигнале ");
          CLOSEORDER(OP_SELL);
          _lot = LOT();
          step_dolivka = 0;

      }
      if(StepType)

      {
         step_dolivka1 = Step1 * OrdersTotal();
         if (step_dolivka1 == 0)
            step_dolivka1 = Step1;
         if (b<Orders && (ProfitB)>= step_dolivka1)
         {
            if (AlertON) Alert(Symbol()," Сигнал на доливку BUY");
            if (lot_doliv==koef) _lot*=koef_lot;
            else _lot=koef_lot;
            _lot = CheckVolumeValue(_lot);
            if(SendOrder(OP_BUY, _lot, NormalizeDouble(Ask,Digits))) {return;}
         }
      }
      else
         if (b<Orders && (ProfitB+AB)>=calc_step(step_dolivka))
         {
            if (AlertON) Alert(Symbol()," Сигнал на доливку BUY");
            if (lot_doliv==koef) _lot*=koef_lot;
            else _lot=koef_lot;
            _lot = CheckVolumeValue(_lot);
            if(SendOrder(OP_BUY, _lot, NormalizeDouble(Ask,Digits))) {step_dolivka++; return;}
         }

      if (b<Orders && S1>0 && TimeBar!=Time[0])
      {
         CountBuy++;
         CountSell = 0;

         if (AlertON) Alert(Symbol()," Сигнал от индикатора на открытие BUY");
         _lot = LOT();
         TimeBar=Time[0];
         if(SendOrder(OP_BUY, _lot, NormalizeDouble(Ask,Digits))) return;
      }
   }
   if ((S1<0 && CountSell < iMaxOneDirection) || (Adding && ProfitS>0 && s>0))
   {

      if (CloseRevers && b>0) 
      {
          if (AlertON) Alert("Закрытие BUY на обратном сигнале ");
         CLOSEORDER(OP_BUY);
         _lot = LOT();
         step_dolivka = 0;

      }
      if(StepType)

      {
         step_dolivka1 = Step1 * OrdersTotal();
         if (step_dolivka1 == 0)
            step_dolivka1 = Step1;
         if (s<Orders && (ProfitS)>=step_dolivka1)
         {
            if (AlertON) Alert(Symbol()," Сигнал на доливку SELL");
            if (lot_doliv==koef) _lot*=koef_lot;
            else _lot=koef_lot;
            _lot = CheckVolumeValue(_lot);
            if(SendOrder(OP_SELL, _lot, NormalizeDouble(Bid,Digits))) {return;} 
         }
      }
      else
         if (s<Orders && (ProfitS+AB)>=calc_step(step_dolivka))
         {
            if (AlertON) Alert(Symbol()," Сигнал на доливку SELL");
            if (lot_doliv==koef) _lot*=koef_lot;
            else _lot=koef_lot;
            _lot = CheckVolumeValue(_lot);
            if(SendOrder(OP_SELL, _lot, NormalizeDouble(Bid,Digits))) {step_dolivka++; return;} 
         }
      if (s<Orders && S1<0 && TimeBar!=Time[0])
      {
         CountSell++;
         CountBuy = 0;
         if (AlertON) Alert(Symbol()," Сигнал от индикатора на открытие SELL");
         _lot = LOT();
         TimeBar=Time[0];
         if(SendOrder(OP_SELL, _lot, NormalizeDouble(Bid,Digits))) return; 
      }
   }
}

double FirstOrderOpenPrice(int type, int mn, string sym)
{

   datetime time=TimeCurrent();
   int i;
   double profit = -1;
   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if( OrderType() == type && OrderSymbol()==sym && OrderMagicNumber()==mn)
         {
            if(OrderOpenTime() < time)
            {
               time=OrderOpenTime();
               profit= OrderOpenPrice();
            }
         }
      }
   }

   return(profit);
}

bool timetrade()
 { 
   if(k<1) return(true);
   int index_hour;
   datetime start_time, end_time;

   for(index_hour=0; index_hour<k; index_hour++)
       {
        start_time = StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+StringSubstr(result[index_hour],0,5));
        end_time   = StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+StringSubstr(result[index_hour],6,5));

        if(time_type==0) //если разрешить
           {
            if( TimeCurrent()>=start_time && TimeCurrent()<=end_time ) return(true); else return(false);
            }
        if(time_type==1) //если запретить
           {
            if( TimeCurrent()>=start_time && TimeCurrent()<=end_time ) return(false); else return(true);
            }
        }
   return(false);
  }

double calc_step(int st)
 {
  double calc = AccountBalance();
  for(int i=0; i<=st; i++)
   {
    if(d_type==SUMM) calc+=(AccountBalance()*Step/100);
    else             calc+=(calc*Step/100);
    }
  return(NormalizeDouble(calc,2));
  }

bool SendOrder(int tip, double lots, double price, double sl=0, double tp=0)
{
   if (tip<2)
   {
      if (AccountFreeMarginCheck(Symbol(),tip,lots)<0)
      {
         Alert("Недостаточно средств");
         return(false);
      }
   }

   double tmp_tp = 0.0;
   double tmp_sl = 0.0;
   for (int i=0; i<10; i++)
   {

      if( SL > 0)
      {
         if( tip == OP_BUY )
         {    
            tmp_sl = 0.0;
            if( SL > 0 )
            {
               tmp_sl = FirstOrderOpenPrice( OP_BUY, Magic, Symbol());
               if( tmp_sl > 0 )
                  tmp_sl = NormalizeDouble( tmp_sl - SL*Point, Digits);
               else
                  tmp_sl = NormalizeDouble( Bid - SL*Point, Digits);
            }
         }
         if( tip == OP_SELL )
         {
            tmp_sl = 0.0;
            if( SL > 0 )
            {
               tmp_sl = FirstOrderOpenPrice( OP_SELL, Magic, Symbol());
               if( tmp_sl > 0 )
                  tmp_sl = NormalizeDouble( tmp_sl + SL*Point, Digits);
               else
                  tmp_sl = NormalizeDouble( Ask + SL*Point, Digits);
            }
         }
      }
      if (OrderSend(Symbol(),tip, lots,price,slippage,tmp_sl,0.0,NULL,Magic,0,clrNONE)!=-1) return(true);
         Alert(" попытка ",i," Ошибка открытия ордера ",Strtip(tip)," <<",Error(GetLastError()),">>  lot=",lots,"  pr=",price," sl=",sl," tp=",tp);
      Sleep(500);
      RefreshRates();
      if (IsStopped()) return(false);
   }
   return(false);
}

string StrPer(int per)
{
   if (per == PERIOD_CURRENT) per=Period();
   if (per == PERIOD_M1) return("M1");
   if (per == PERIOD_M5) return("M5");
   if (per == PERIOD_M15) return("M15");
   if (per == PERIOD_M30) return("M30");
   if (per == PERIOD_H1) return("H1");
   if (per == PERIOD_H4) return("H4");
   if (per == PERIOD_D1) return("D1");
   if (per == PERIOD_W1) return("W1");
   if (per == PERIOD_MN1) return("MN1");
return("ошибка периода");
}

string Strtip(int tip)
{
   switch(tip) 
   { 
   case OP_BUY:
      return("BUY"); 
   case OP_SELL:
      return("SELL"); 
   case OP_BUYSTOP:
      return("BUYSTOP"); 
   case OP_SELLSTOP:
      return("SELLSTOP"); 
   case OP_BUYLIMIT:
      return("BUYLIMIT"); 
   case OP_SELLLIMIT:
      return("SELLLIMIT"); 
   }
   return("error"); 
}

bool CLOSEORDER(int ord=-1)
{
   bool error=true;
   int j,err,nn=0,OT,OMN;
   while (!IsStopped())
   {
      for (j = OrdersTotal()-1; j >= 0; j--)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            OMN = OrderMagicNumber();
            if (OrderSymbol() == Symbol() && OMN == Magic)
            {
               OT = OrderType();
               if (OT==OP_BUY && (ord == OT || ord == -1)) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,Blue);
               }
               if (OT==OP_SELL &&  (ord == OT || ord == -1)) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,Red);
               }
               if (!error) 
               {
                  err = GetLastError();
                  if (err<2) continue;
                  if (err==129) 
                  {
                     RefreshRates();
                     continue;
                  }
                  if (err==146) 
                  {
                     if (IsTradeContextBusy()) Sleep(2000);
                     continue;
                  }
               }
            }
         }
      }
      int n=0;
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            OMN = OrderMagicNumber();
            if (OrderSymbol() == Symbol() && OMN == Magic)
            {
               OT = OrderType();
               if ((OT==OP_BUY &&  (ord == OT || ord == -1)) || (OT==OP_SELL &&  (ord == OT || ord == -1))) n++;
            }
         }  
      }
      if (n==0) return(true);
      nn++;
      if (nn>10) {Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);return(false);}
      Sleep(1000);
      RefreshRates();
   }
   return(true);
}

color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}

void DrawLABEL(string name, string Name, int X, int Y, color clr)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 1);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}

string Error(int code)
{
   switch(code)
   {
      case 0:   return("Нет ошибок");
      case 1:   return("Нет ошибки, но результат неизвестен");                            
      case 2:   return("Общая ошибка");                                                   
      case 3:   return("Неправильные параметры");                                         
      case 4:   return("Торговый сервер занят");                                          
      case 5:   return("Старая версия клиентского терминала");                            
      case 6:   return("Нет связи с торговым сервером");                                  
      case 7:   return("Недостаточно прав");                                              
      case 8:   return("Слишком частые запросы");                                         
      case 9:   return("Недопустимая операция нарушающая функционирование сервера");      
      case 64:  return("Счет заблокирован");                                              
      case 65:  return("Неправильный номер счета");                                       
      case 128: return("Истек срок ожидания совершения сделки");                          
      case 129: return("Неправильная цена");                                              
      case 130: return("Неправильные стопы");                                             
      case 131: return("Неправильный объем");                                             
      case 132: return("Рынок закрыт");                                                   
      case 133: return("Торговля запрещена");                                               
      case 134: return("Недостаточно денег для совершения операции");                     
      case 135: return("Цена изменилась");                                                
      case 136: return("Нет цен");                                                        
      case 137: return("Брокер занят");                                                   
      case 138: return("Новые цены");                                                     
      case 139: return("Ордер заблокирован и уже обрабатывается");                        
      case 140: return("Разрешена только покупка");                                       
      case 141: return("Слишком много запросов");                                         
      case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");    
      case 146: return("Подсистема торговли занята");                                     
      case 147: return("Использование даты истечения ордера запрещено брокером");         
      case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");
      case 4000: return("Нет ошибки");                                                      
      case 4001: return("Неправильный ук

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

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

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

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

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

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

Стоимость полного кода
4 803₽ ≈ $58.70