стратегия доработка советника - страница 5

 
https://www.mql5.com/ru/code/7108 Вот тоже интересный материал по траллам
 

3. Трейлинг стандартный-'ступенчатый'.

void TrailingStairs(int ticket,int trldistance,int trlstep)

Данный вид трейлинга является доработкой стандартного. Если не ошибаюсь, в своё время похожий был написан KimIV'ом (но поскольку "свое - роднее",... :) Отличается от стандартного трейлинга тем, что перенос стоплосса осуществляется не "попунктово" (например, при трейлинге на расстоянии 30 пунктов при +31 стоплосс будет пенемещен на +1, при +32 - на +2 и т.д.), а "шагами" заданной длины (например, при трейлинге на расстоянии в 40 пунктов и "шаге" в 10 при достижении +40 стоплосс будет перемещен на +10, дальше до момента достижения профитом +50 (40 п. + шаг) ничего не поменяется (т.о. мы даём цене определённую свободу, в чем, собственно, и суть данного алгоритма), и только при +50 стоплосс с +10 будет перенесен на шаг - с +10 на +20, при +60 - на +30 п. и т.д.

Параметры:
ticket - 
уникальный порядковый номер ордера (выбранный перед вызовом функции с помощьюOrderSelect());
trldistance - расстояние от текущего курса (пунктов), на котором "тралим" (не меньше MarketInfo(Symbol(),MODE_STOPLEVEL));
trlstep - "шаг" изменения стоплосса (пунктов) (не меньше 1).

При trlstep=1 данная функция не будет отличаться от стандартного трейлинга. Основная "фишка" данного алгоритма, повторюсь, в предоставлении курсу некоторой "свободы движений" - стоплосс подтягивается только после того, как цена "побродив, определилась". Данный алгоритм трейлинга я впервые встретил в описании правил тактики "Скользящие каналы" уже упоминавшегося В.Баришпольца.

 

=================

Интересен вот этот в советнике 

 
//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ                                |
//| Функции передаётся тикет позиции, расстояние от курса открытия,  |
//| на котором трейлинг запускается (пунктов) и "шаг", с которым он  |
//| переносится (пунктов)                                            |
//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д.        |
//+------------------------------------------------------------------+
 
void TrailingStairs(int ticket,int trldistance,int trlstep)
   { 
   
   double nextstair; // ближайшее значение курса, при котором будем менять стоплосс
 
   // проверяем переданные значения
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
      nextstair = OrderOpenPrice() + trldistance*Point;
         
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() + trldistance*Point;
 
      // если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Bid>=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) 
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
      nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
       
      // если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Ask<=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }      
   }

Вот его полный код, который нужно вставить вместо 

 

//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance)
   {
    int Spred=Ask - Bid;
    if (OrderType()==OP_BUY)
      {
       if((Bid-OrderOpenPrice())>(Point*trldistance))
         {
          if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
            {
             OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Green);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Ask,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Ask,3,Green);
               }
            }
         }
       }
     else
       {
        if((OrderOpenPrice()-Ask)>(Point*trldistance))
          {
           if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Bid,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Bid,3,Green);
               }
             }
          }
        }
    }


этого 

 

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

Кроме того, умение читать и понимать ЧУЖОЙ код очень пригодится...

 
ktest0:

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

Кроме того, умение читать и понимать ЧУЖОЙ код очень пригодится...

Пока он хочет иметь, а не уметь!
 
borilunad:
Пока он хочет иметь, а не уметь!

))) С этого все начинают... А потом - чем дальше в лес, тем толще партизаны... 
 

Подскажите пожалуйста чайнику, как написать код в советнике,
Который бы формировал High и Low за определенный период(например 10.45 - 11.15)?

Чтоб он вкл советник в это время.То есть я вкл терминал в 9.00 -> когда подошло время 10.45 он вкл и погнал отслеживать.Когда закрылся бар(напр. на 15мин графике) 11.15 он снял показания и продолжил вычесления.К примеру определил High и Low и отложил ордера не далеко от этих линий.

Спасибо заранее за ответ. 

 
Ну можно покрутить советника....
 

Никак не пойму, по какому принципу подключается треллинг. 

Ведь должен он по сути, просто работать 

 
IRIP:

Никак не пойму, по какому принципу подключается треллинг. 

Ведь должен он по сути, просто работать 


"Просто работать" никто и ничто не будет.

Нужно разобрать что данный конкретный трейл ищет, на каких условиях тралит, с каким шагом, есть ли какие либо дополнительные условия.

Разбираете код трала и становится все понятно, а принцип "воткнул и выпучил глаза" к хорошему результату не приводит....