Скачать MetaTrader 5

Дайте оценку ниже приведённому коду

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
snowman
648
snowman  
  • 15%
    (10)
  • 6%
    (4)
  • 13%
    (9)
  • 7%
    (5)
  • 9%
    (6)
  • 50%
    (34)
Всего проголосовало: 68
snowman
648
snowman  

Дайте оценку ниже приведённому коду.


вот смотрите задание:

Открытие бай, при открытии выставляются ТП и СЛ или не выставляются:
пересечение быстрой МА медленную снизу вверх.
Открытие селл, при открытии выставляются ТП и СЛ или не выставляются:
пересечение быстрой МА медленную сверху вниз.

Закрытие позиции либо по обратному сигналу, либо по тейку, либо по стопу.

нужен трейлин стандартный.

и вот исполнение:

//+------------------------------------------------------------------+
//|                                                     snowman .mq4 |
//|                                                        ForTrader |
//|                        https://www.mql5.com/ru/users/ForTrader |
//+------------------------------------------------------------------+
#property copyright "ForTrader"
#property link      "https://www.mql5.com/ru/users/ForTrader"
//--------------------------------------------------------------- 1 --

extern string Q  = "Период усреднения.";
extern int Period_MA_1=11;      // Период МА 1
extern int Period_MA_2=31;      // Период МА 2

extern string Q1 = "Сдвиг индикатора.";
extern int ma_shift_1 = 0;
extern int ma_shift_2 = 0;

extern string Q2 = "Метод усреднения.";
extern int ma_method_1 = 1;
extern int ma_method_2 = 1;

extern string Q3 = "Используемая цена.";
extern int applied_price_1 = 0;
extern int applied_price_2 = 0;

extern string Q4 = "Индекс получаемого значения.";
extern int shift_1 = 1;
extern int shift_2 = 1;
                                
extern double StopLoss   =400;     // SL для открываемого ордера
extern double TakeProfit =200;      // ТР для открываемого ордера

extern double Lots       =0.1;     // Жестко заданное колич. лотов
extern double Prots      =0.07;    // Процент свободных средств
extern int    TralingStop=0;

int
   Total,                           // Количество ордеров в окне 
   Tip=-1,                          // Тип выбран. ордера (B=0,S=1)
   Level_new,
   Ticket;                          // Номер ордера
double
   Price,                           // Цена выбранного ордера
   SL,                              // SL выбранного ордера 
   TP;                              // TP выбранного ордера
bool Opn_B2=false,                     // Критерий для открытия  Buy
     Opn_S2=false,                     // Критерий для открытия  Sell 
     Work=true;                    // Эксперт будет работать.
   
string Symb;                       // Название финанс. инструмента
//--------------------------------------------------------------- 2 --
int start()
  {

   double
   MA_1_t,                          // Значен. МА_1 текущее
   MA_2_t,                          // Значен. МА_2 текущее 
   MA_1_prev,                       // Значен. МА_1 
   MA_2_prev,                       // Значен. МА_2  
   Lot,                             // Колич. лотов в выбран.ордере
   Lts,                             // Колич. лотов в открыв.ордере
   Min_Lot,                         // Минимальное количество лотов
   Step,                            // Шаг изменения размера лота
   Free,                            // Текущие свободные средства
   One_Lot;                         // Стоимость одного лота
   bool
   Ans  =false,                     // Ответ сервера после закрытия
   Cls_B=false,                     // Критерий для закрытия  Buy
   Cls_S=false,                     // Критерий для закрытия  Sell
   Opn_B=false,                     // Критерий для открытия  Buy
   Opn_S=false;                     // Критерий для открытия  Sell
//--------------------------------------------------------------- 3 --
   // Предварит.обработка
   if(Bars < Period_MA_2)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
         if(OrderTakeProfit()>0 && TralingStop>0) Tral_Stop(Tip);
        }
     }
//--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t   =iMA(NULL,0,Period_MA_1,ma_shift_1,ma_method_1,applied_price_1,shift_1); // МА_1
   MA_2_t   =iMA(NULL,0,Period_MA_2,ma_shift_2,ma_method_2,applied_price_2,shift_1); // МА_2
   MA_1_prev=iMA(NULL,0,Period_MA_1,ma_shift_1,ma_method_1,applied_price_1,shift_1+1); // МА_1
   MA_2_prev=iMA(NULL,0,Period_MA_2,ma_shift_2,ma_method_2,applied_price_2,shift_2+1); // МА_2

   if (MA_1_t > MA_2_t && MA_1_prev < MA_2_prev && Opn_B2==false) 
     {                                          
      Opn_B=true;                               // Критерий откр. Buy
      Opn_B2=true;                               // Критерий закр.
      Opn_S2=false;
     }
   if (MA_1_t < MA_2_t && MA_1_prev > MA_2_prev && Opn_S2==false) 
     {                                          
      Opn_S =true;                               // Критерий откр. Sell
      Opn_S2=true;
      Opn_B2=false;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --
   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }

      if (Tip==1 && Cls_S==true)                // Открыт ордер Sell..
        {                                       // и есть критерий закр
         Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Sell ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         if(StopLoss>0)
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
           else SL=0;
         if(TakeProfit>0)
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
           else TP=0;
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=Ask + New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок
  {
   switch(Error)
     {                                          // Преодолимые ошибки            
      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");
         Sleep(3000);                           // Простое решение
         return(1);                             // Выход из функции
      case 135:Alert("Цена изменилась. Пробуем ещё раз..");
         RefreshRates();                        // Обновим данные
         return(1);                             // Выход из функции
      case 136:Alert("Нет цен. Ждём новый тик..");
         while(RefreshRates()==false)           // До нового тика
            Sleep(1);                           // Задержка в цикле
         return(1);                             // Выход из функции
      case 137:Alert("Брокер занят. Пробуем ещё раз..");
         Sleep(3000);                           // Простое решение
         return(1);                             // Выход из функции
      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
         Sleep(500);                            // Простое решение
         return(1);                             // Выход из функции
         // Критические ошибки
      case  2: Alert("Общая ошибка.");
         return(0);                             // Выход из функции
      case  5: Alert("Старая версия терминала.");
         Work=false;                            // Больше не работать
         return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
         Work=false;                            // Больше не работать
         return(0);                             // Выход из функции
      case 133:Alert("Торговля запрещена.");
         return(0);                             // Выход из функции
      case 134:Alert("Недостаточно денег для совершения операции.");
         return(0);                             // Выход из функции
      default: Alert("Возникла ошибка ",Error); // Другие варианты   
         return(0);                             // Выход из функции
     }
  }
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr)                      // Проверка стоп-прик.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if (Parametr<Min_Dist)                       // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//-------------------------------------------------------------- 12 --

// Mas_Ord_New             Массив ордеров последний известный
// int TralingStop         Значение TralingStop(количество пунктов)
//--------------------------------------------------------------- 13 --
int Tral_Stop(int Tip)
  {
   double TS;                       // TralingStop (относит.знач.цены)
   bool Modify;                     // Признак необходимости модифи.
//--------------------------------------------------------------- 14 --
   for(int i=1;i<=OrdersTotal();i++)  // Цикл по всем ордерам
     {                                    // Ищем ордера задан. типа
      Modify=false;                       // Пока не назначен к модифи

      //if (TralingStop<Level_new)          // Если меньше допустимого..
      //   TralingStop=Level_new;           // .. то допустимый
      TS=TralingStop*Point;               // То же в относит.знач.цены
      //--------------------------------------------------------- 15 --
      switch(Tip)                         // Переход на тип ордера
        {
         case 0 :                         // Ордер Buy
            if (NormalizeDouble(SL,Digits)<// Если ниже желаемого..
               NormalizeDouble(Bid-TS,Digits))
              {                           // ..то модифицируем его:
               SL=Bid-TS;                 // Новый его StopLoss
               Modify=true;               // Назначен к модифи.
              }
            break;                        // Выход из switch
         case 1 :                         // Ордер Sell
            if (NormalizeDouble(SL,Digits)>// Если выше желаемого..
               NormalizeDouble(Ask+TS,Digits)||
               NormalizeDouble(SL,Digits)==0)//.. или нулевой(!)
              {                           // ..то модифицируем его
               SL=Ask+TS;                 // Новый его StopLoss
               Modify=true;               // Назначен к модифи.
              }
        }                                 // Конец switch
      if (Modify==false)                  // Если его не надо модифи..
         continue;                        // ..то идём по циклу дальше
      bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифицируем его!
      //--------------------------------------------------------- 16 --
     }
   return;                                // Выход из пользов. функции
  }
//--------------------------------------------------------------- 17 --
Igor Konyashin
3182
Igor Konyashin  
Опять будет шоу? )) Ну ваще....
Andrey F. Zelinsky
33645
Andrey F. Zelinsky  
snowman:
А зачем нужна оценка? Чей это код?
Vladislav Andruschenko
112418
Vladislav Andruschenko  
         if(OrderTakeProfit()>0 && TralingStop>0) Tral_Stop(Tip);

а если тейкпрофита нет то траллинг не пашет? 

Этот код из учебника! Для новичков супер.  

 

snowman
648
snowman  
буду рад если голосующие прокомментируют свою оценку.
snowman
648
snowman  
abolk:
А зачем нужна оценка? Чей это код?

не считаю что автора кода нужно указывать, мне интересно мнение спецов.

У меня были претензии по коду но исполнитель не захотел исправлять, вот и подумал: быть может не прав я?

Vladislav Andruschenko
112418
Vladislav Andruschenko  
snowman:

не считаю что автора кода нужно указывать, мне интересно мнение спецов.

У меня были претензии по коду но исполнитель не захотел исправлять, вот и подумал: быть может не прав я?

кстати а что в Вашем задании нужен трейлин стандартный 

мне для себя интересно, кем определен стандарт? и где он стандартный трелйинг? где расписан его алгоритма для стандартного трейлинга?  

snowman
648
snowman  
Vladon:

а если тейкпрофита нет то траллинг не пашет? 

Этот код из учебника! Для новичков супер.  

 

да в том-то и дело, что тут целая сокровешница говонокода
Andrey F. Zelinsky
33645
Andrey F. Zelinsky  
snowman:

не считаю что автора кода нужно указывать, мне интересно мнение спецов.

У меня были претензии по коду но исполнитель не захотел исправлять, вот и подумал: быть может не прав я?

Тогда какие были претензии? А то нападать на исполнителей все мастера. Для претензий есть арбитраж. Почему бы в арбитраж не обратиться и не решить там все вопросы?

Это эта работа? https://www.mql5.com/ru/job/7572 - тут тоже на МА

MQL5 работа: Сов на машках
MQL5 работа: Сов на машках
  • www.mql5.com
Нужен советник не сложный. Входим верх если цена пробивает МА снизу вверх Входим вниз если МА сверху вниз пересекла. + трейлинг позиции  и несклько доп условий. Подробное задание исполнителю при согласвании прилгается. 
Maxim Khrolenko
7958
Maxim Khrolenko  
На мыло автора за такой опрос.