стратегия доработка советника - страница 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:
Пока он хочет иметь, а не уметь!

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

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

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

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

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

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

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

 
IRIP:

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

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


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

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

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