Помочь с создадинием двух независемых трейлинг стопов

 

Идея такая, нужно сделать так.

Открылся один ордер его тралим допустим первым трейлинг стопом с его индивидуальными параметрами, и открылась еще одна такая же позиция и ее надо тралить трелингом но уже с другими параметрами трала.

Как осущиствить???

У меня в советнике обычный трал вот такой?

{
//---------------------------------
   double buy_last_price  = -1;
   double sell_last_price  = -1;

   for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
   {
      if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
      if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice();}
       }

       //TrailingStart//
  for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
   {
     if (Trailing>0 && (Bid-buy_last_price)>=StartTrailing*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-Trailing *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
     int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing *Point,Digits), OrderTakeProfit(), 0, Blue);
     if (Trailing>0 && (sell_last_price-Ask)>=StartTrailing*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+Trailing *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing *Point,Digits), OrderTakeProfit(), 0, Red);
     }  //TrailingEnd//
     }
 

...потом появится мысль про отдельные стоплоссы и тейкпрофиты)

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

То есть получается неограниченное число советников в одном... 

 
Artem Ashikhmin:

Элементарно, пользуйтесь на здоровье))

extern int StartTrailing1 = 250;
extern int Trailing1 = 100;
extern int StartTrailing2 = 150;
extern int Trailing2  = 50;

{
//---------------------------------
   double buy_last_price  = -1;
   double sell_last_price = -1;
   double buy_orders      = 0;
   double sell_orders     = 0;

   for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
   {
      if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice(); buy_orders++;}
      if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice(); sell_orders++;}
       }

       //TrailingStart//
  for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
   {
     if (buy_orders==1){ //если в рынке 1 ордер buy
     if (Trailing1>0 && (Bid-buy_last_price)>=StartTrailing1*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing1 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-Trailing1 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
     int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing1 *Point,Digits), OrderTakeProfit(), 0, Blue);
       }
     if (sell_orders==1){ //если в рынке 1 ордер sell
     if (Trailing1>0 && (sell_last_price-Ask)>=StartTrailing1*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing1 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+Trailing1 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing1 *Point,Digits), OrderTakeProfit(), 0, Red);
       }
//------------------------------------------------------------+
     if (buy_orders>=2){ //если в рынке 2 и больше ордера buy
     if (Trailing2>0 && (Bid-buy_last_price)>=StartTrailing2*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing2 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-Trailing2 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing2 *Point,Digits), OrderTakeProfit(), 0, Blue);
       }
     if (sell_orders>=2){ //если в рынке 2 и больше ордера sell
     if (Trailing2>0 && (sell_last_price-Ask)>=StartTrailing2*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing2 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+Trailing2 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing2 *Point,Digits), OrderTakeProfit(), 0, Red);
       }
     }  //TrailingEnd//
   }


 

абау))) спасибо большое))) а можно как то привязать к 1 ордеру и к второму, просто у меня одновременно 2 ордера открываются на бай, и получается для первого ордера свои значения будут а для 2 и 3 ордер если 3 ордер откроется, значения будут как у второго? правильно понял?

 
Artem Ashikhmin:

Оооо, это уже другая история, тут надо с циклом ордеров работать, искать последний ордер, потом предпоследний.
Проще поставить дистанцию следующего ордера, например 2-ой ордер откроется на расстоянии 10-15пп от предыдущего.
Там где условия для открытия ордера надо поставить:

extern int     DistDopOrder = 100;

условия бай && MathAbs(Ask-buy_last_price)>=DistDopOrder*Point
условия селл && MathAbs(Bid-sell_last_price)>=DistDopOrder*Point

 Правильно, 2-ой, 3-ий и последующие ордера будут по значениям Trailing2 работать.

а если магик номер для 1 типа ордеров и для 2типа ордеров разные сделать?
 
Artem Ashikhmin:

Ну можно и так, ток это будет ужас в коде.
Будет тогда всё по 2 (циклы, траллы, OrderSend и модификации)

Проще найти пример цикла где определяются ордера по порядку от последнего  
Что то вроде этого:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES) //последний ордер
и
OrderSelect(OrdersTotal()-2,SELECT_BY_POS,MODE_TRADES) //предыдущий от последнего ордера


 

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

extern int  StartTrailing=5;     // трейлинг для 1 типа ордеров(кол-во пнуктов для начала)
extern int  Trailing=10;         // трейлинг для 1 типа (диапазонтрейлинга
extern int  StartTrailing2=20;    // трейлинг для 2 типа ордеров(кол-во пнуктов для начала)
extern int  Trailing2=50;        // трейлинг для 2 типа (диапазонтрейлинга


{
      // Трейлинг стоп для 1 типа ордеров
      double buy_last_price=-1;
      double sell_last_price=-1;

      for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
        {
         if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
         if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice();}
        }

      //TrailingStart//
      for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
        {
         if(Trailing>0 && (Bid-buy_last_price)>=StartTrailing*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing+1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
            && NormalizeDouble(Bid-Trailing *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
            int modify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Trailing *Point,Digits),OrderTakeProfit(),0,Blue);
         if(Trailing>0 && (sell_last_price-Ask)>=StartTrailing*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing+1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
            && NormalizeDouble(Ask+Trailing *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
            modify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Trailing *Point,Digits),OrderTakeProfit(),0,Red);
        }  //TrailingEnd//
     }

     {
      // трейлинг стоп для 2 типа ордеров
      double buy_last_price2=-1;
      double sell_last_price2=-1;

      for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY) {if(buy_last_price2==-1) buy_last_price2=OrderOpenPrice();}
         if(OrderType()==OP_SELL){if(sell_last_price2==-1)sell_last_price2=OrderOpenPrice();}
        }

      //TrailingStart//
      for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(Trailing2>0 && (Bid-buy_last_price2)>=StartTrailing2*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing2+1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
            && NormalizeDouble(Bid-Trailing2 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
            int modify2=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Trailing2 *Point,Digits),OrderTakeProfit(),0,Blue);
         if(Trailing2>0 && (sell_last_price2-Ask)>=StartTrailing2*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing+1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
            && NormalizeDouble(Ask+Trailing2 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
            modify2=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Trailing2 *Point,Digits),OrderTakeProfit(),0,Red);
        }  //TrailingEnd//
     }


 
Artem Ashikhmin:

extern int StartTrailing1 = 250;
extern int Trailing1 = 100;
extern int Magik1  = 1

extern int StartTrailing2 = 150;
extern int Trailing2  = 50;
extern int Magik2  = 2;


//---------------------------------
   double buy_last_price  = -1;
   double sell_last_price = -1;
   double buy_orders      = 0;
   double sell_orders     = 0;

   for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik1)
   {
      if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice(); buy_orders++;}
      if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice(); sell_orders++;}
       }
   for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik2)
   {
      if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice(); buy_orders++;}
      if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice(); sell_orders++;}
       }

       //TrailingStart//
  for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik1)
   {
     if (Trailing1>0 && (Bid-buy_last_price)>=StartTrailing1*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing1 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-Trailing1 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
     int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing1 *Point,Digits), OrderTakeProfit(), 0, Blue);
      
     if (Trailing1>0 && (sell_last_price-Ask)>=StartTrailing1*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing1 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+Trailing1 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing1 *Point,Digits), OrderTakeProfit(), 0, Red);
     }
//------------------------------------------------------------+
  for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik2)
   {
     if (Trailing2>0 && (Bid-buy_last_price)>=StartTrailing2*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing2 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-Trailing2 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing2 *Point,Digits), OrderTakeProfit(), 0, Blue);
    
     if (Trailing2>0 && (sell_last_price-Ask)>=StartTrailing2*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing2 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+Trailing2 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing2 *Point,Digits), OrderTakeProfit(), 0, Red);
     }
//------------------------------------------------------------------------------------|
//И добавить магик в условия для открытия ордеров
if (Условия для бай && buy_orders==0) OrderSend(OP_BUY, Lot, -, -, -, -, Magik1, -);
if (Условия для бай && buy_orders==0) OrderSend(OP_BUY, Lot, -, -, -, -, Magik2, -);

if (Условия для бай && sell_orders==0) OrderSend(OP_SELL, Lot, -, -, -, -, Magik1, -);
if (Условия для бай && sell_orders==0) OrderSend(OP_SELL, Lot, -, -, -, -, Magik2, -);
Вроде так, пробуй.
получилось!!! Работает
 
Kirill Andreev:
получилось!!!

Читаю эту ветку и заранее извеняюсь....о.....ю. 

1.Делаем через функцию

2. далее есть два способа "А" и "Б"

А- геморойный

Б -Простой, по крайней мере для меня

Вам какой? 

 
Artem Ashikhmin:
 интересно было бы подробней узнать про А и Б, а то ж все мы тут учимся на ошибках и стараемся осуществить новые для себя идеи

Вы видимо про существование функций не слышали? 

1 Функцию проще проверить

2 Удобней использовать

3 Можно передать переменные Не просто F() , а F(x) , F(x,y,z)

Так не проще? 

 
Evgeny Belyaev:

Вы видимо про существование функций не слышали? 

1 Функцию проще проверить

2 Удобней использовать

3 Можно передать переменные Не просто F() , а F(x) , F(x,y,z)

Так не проще? 

могли бы пример привести, буду знать на будущее как проще!!!

жду вашего ответа

 
Kirill Andreev:

могли бы пример привести, буду знать на будущее как проще!!!

жду вашего ответа

Я сказал что мне проще. В школе учились? Не знаете что такое функция?

Математика 8 класс наверное.

Проще в функцию передать параметры чем 2 раза дублировать трейлинг.

Длина трейлинга , для примера 15 строк.

И в он тик вызываем 2 раза функцию с разными параметрами. (1 строка) 

Как вы делаете фигачите 2 трейлинга по 30 строк, итого 60 строк.

Как проще? 

 
Evgeny Belyaev:

Я сказал что мне проще. В школе учились? Не знаете что такое функция?

Математика 8 класс наверное.

Проще в функцию передать параметры чем 2 раза дублировать трейлинг.

Длина трейлинга , для примера 15 строк.

И в он тик вызываем 2 раза функцию с разными параметрами. (1 строка) 

Как вы делаете фигачите 2 трейлинга по 30 строк, итого 60 строк.

Как проще? 

...так и до структур с классами можно докатиться %)