Помогите впихнуть трал!

 

Помогите! Как в этот код можно вставить трал по ATR из https://www.mql5.com/ru/code/7108 ???



// Код такой:


//-----------------------------------------------------------
int start()
  {
   int
  
   Total,                           // Количество ордеров в окне 
   Tip=-1,                          // Тип выбран. ордера (B=0,S=1)
   Ticket;                          // Номер ордера
  
   double
   Lot,                             // Колич. лотов в выбран.ордере
   Lts,                             // Колич. лотов в открыв.ордере
   lot,
   Min_Lot,                         // Минимальное количество лотов
   Step,                            // Шаг изменения размера лота
   Free,                            // Текущие свободные средства
   One_Lot,                         // Стоимость одного лота
   Price,                           // Цена выбранного ордера
   SL,                              // SL выбранного ордера 
   TP,                              // TP выбранного ордера
   //--
   ma_By,ma_Sell,Stoh_By,Stoh_Sell,AO_By,AO_Sell,AC_By,AC_Sell,Cls_ma_Sell,Cls_ma_By,Cls_Stoh_Sell,Cls_Stoh_By,
   Cls_AO_Sell,Cls_AO_By,Cls_AC_Sell,Cls_AC_By,Dema_By,Cls_Dema_Sell,Dema_Sell,Cls_Dema_By,CCI_By,CCI_Sell,Cls_CCI_Sell,Cls_CCI_By;
   
 bool
   Modific=true,
   Ans  =false,                     // Ответ сервера после закрытия
   Cls_B=false,                     // Критерий для закрытия  Buy
   Cls_S=false,                     // Критерий для закрытия  Sell
   Opn_B=false,                     // Критерий для открытия  Buy
   Opn_S=false,                     // Критерий для открытия  Sell
   S_Bar=false;                 // Критерий для Sleep Bar
   
//------------------------------------------------------------------------------ 
   
  
   
     
  
  
//-----------------------------Закрытие ордеров---------------------------------- 6 --
  
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..Условия закрытия 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..Условия закрытия 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();                              // Обновление данных   
 
    int time = 0;double profit = 0;           //обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордера
 
for(int t = OrdersHistoryTotal();t>=0;t--)   // Перебираем все закрытые ордера
{
  if(OrderSelect(t,SELECT_BY_POS,MODE_HISTORY))//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом)
  {
    if(OrderSymbol() == Symbol())       //если выбранный ордер был открыт по нашей валютной паре
    {
      if(time<OrderCloseTime())        //(сравниваем его с хранящимся в пероеменной time)
       
      {
        time=OrderCloseTime();          //если время закрытия ордера больше - ложим его в переменную
        profit=OrderProfit();          //и заодно запоминаем прибыль ордера
        lot   =OrderLots();                    // Количество лотов
        
  
      }
    }
  }
}
 
if(profit == 0)  {Lts=Lts0;}     //действия если история чиста         
if(profit >= 0)  {Lts=Lts0;}     //действия если последний ордер был прибыльным, или нулевы
if(profit <  0)  {Lts=lot*IK;}   //действия если последний ордер был убыточным
 
    
         if (Lts*One_Lot > Free)                      // Лот дороже свободн.     
         {     
          Alert(" Не хватает денег на ", Lts," лотов");      
          return;                                   // Выход из start()     
          }
   
//------------------------------------------------------------------------------ 
 
 
//------------------------------Открытие ордеров--------------------------------- 8 --
 
   while(true)                                  // Цикл открытия орд.
   
     {
      if (Total==0 && Opn_B==true && Cls_B==false)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,3,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 && Cls_S==false)              // Открытых орд. нет +
        {                                       // критерий откр. 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,3,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
   return;                                      // Выход из start()
  }
  
//------------------------------------------------------------------------------   
 


А то иникаторов полно, а тралинга нет и нет...

 

Такой подойдёт?

int StopLoss()                                  // Функция изменения стопов у открытых ордеров
  {
   string Symb=Symbol();                        // Финанс. инструмент
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         int Tip=OrderType();                   // Тип ордера
         if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
         double SL=OrderStopLoss();             // SL выбранного орд.
         //------------------------------------------------------ 3 --
         while(true)                            // Цикл модификации
           {
            double TS=Tral_Stop;                // Исходное значение
            int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист
            if (TS < Min_Dist)                  // Если меньше допуст.
               TS=Min_Dist;                     // Новое значение TS
            //--------------------------------------------------- 4 --
            bool Modify=false;                  // Не назначен к модифи
            switch(Tip)                         // По типу ордера
              {
               case 0 :                         // Ордер Buy
                  if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
                     NormalizeDouble(Bid-TS*Point,Digits))
                    {
                     SL=Bid-TS*Point;           // то модифицируем его
                     string Text="Buy ";        // Текст для Buy 
                     Modify=true;               // Назначен к модифи.
                    }
                  break;                        // Выход из switch
               case 1 :                         // Ордер Sell
                  if (NormalizeDouble(SL,Digits)> // Если выше желаем.
                     NormalizeDouble(Ask+TS*Point,Digits)
                     || NormalizeDouble(SL,Digits)==0)//или равно нулю
                    {
                     SL=Ask+TS*Point;           // то модифицируем его
                     Text="Sell ";              // Текст для Sell 
                     Modify=true;               // Назначен к модифи.
                    }
              }                                 // Конец switch
            if (Modify==false)                  // Если его не модифи
               break;                           // Выход из while
            //--------------------------------------------------- 5 --
            double TP    =OrderTakeProfit();    // TP выбранного орд.
            double Price =OrderOpenPrice();     // Цена выбранн. орд.
            int    Ticket=OrderTicket();        // Номер выбранн. орд.
 
            //Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
            bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
            //--------------------------------------------------- 6 --
            if (Ans==true)                      // Получилось :)
              {
               //Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
              }
            //--------------------------------------------------- 7 --
            int Error=GetLastError();           // Не получилось :(
            switch(Error)                       // Преодолимые ошибки
              {
               case 130:Alert("Неправильные стопы. Пробуем ещё раз.");
                  RefreshRates();               // Обновим данные
                  continue;                     // На след. итерацию
               case 136:Alert("Нет цен. Ждём новый тик..");
                  while(RefreshRates()==false)  // До нового тика
                     Sleep(1);                  // Задержка в цикле
                  continue;                     // На след. итерацию
               case 146:Alert("Подсистема торгов занята.Пробуем ещё");
                  Sleep(500);                   // Простое решение
                  RefreshRates();               // Обновим данные
                  continue;                     // На след. итерацию
                  // Критические ошибки
               case 2 : Alert("Общая ошибка.");
                  break;                        // Выход из switch
               case 5 : Alert("Старая версия клиентского терминала.");
                  break;                        // Выход из switch
               case 64: Alert("Счет заблокирован.");
                  break;                        // Выход из switch
               case 133:Alert("Торговля запрещена");
                  break;                        // Выход из switch
               default: Alert("Возникла ошибка ",Error);//Др. ошибки
              }
            break;                              // Из цикла модифи.
           }                                    // Конец цикла модифи.
         //------------------------------------------------------ 8 --
        }                                       // Конец анализа орд.
     }                                          // Конец перебора орд.
//--------------------------------------------------------------- 9 --
  }
//+------------------------------------------------------------------+
 
26994:

Помогите! Как в этот код можно вставить трал по ATR из https://www.mql5.com/ru/code/7108 ???




А то иникаторов полно, а тралинга нет и нет...



Разберитесь с работой ф-ий - самим не составит труда "вставить"...
 

Вставьте перед, например, "-------------Стоимость ордеров-----------" саму функцию (по ссылке)

//-----------------------------Трейлинг по ATR ордеров-------------------------- 6.6 --
TrailingByATR (Ticket, ATR_TF, ATR_Period1, ATR_shift1, ATR_Period2, ATR_shift2, ATR_coeff, trlinloss);
//-----------------------------Стоимость ордеров---------------------------------- 7 --

И во внешние настройки советника добавьте настройки по трейлингу:

extern string   Setup_TrailATR    = "----------------- Traiiling ATR -----------------";
extern int      ATR_TF              = 0;      // Таймфрейм ATR
extern int      ATR_Period1         = 5;      // период первого ATR (больше 0; может быть равен atr2_period, но лучше отличен от последнего, почему - см. выше);
extern int      ATR_shift1          = 2;      // для первого ATR сдвиг "окна" (неотрицательное целое число);
extern int      ATR_Period2         = 9;      // период второго ATR (больше 0);
extern int      ATR_shift2          = 2;      // для второго ATR сдвиг "окна", (неотрицательное целое число);
extern double   ATR_coeff           = 0.5;    // 
extern bool     trlinloss           =  true;  // указатель того, следует ли передвигать стоплосс на "лоссовом" участке

Ну, и, конечно, не забудьте в код советника добавить код самой функции трейлинга.

 
Спасибо!
Причина обращения: