Скачать MetaTrader 5

Traling Stop нескольких позицый

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ищешь единомышленников? На форуме их много!
ivan
313
ivan 2015.02.11 07:45 

Доброго времени суток! Помогите разобрать. Желательно кодом или примером. Суть проблемы следующая:

Советник открывает некую позицию при наличие сигнала.

ticket = OrderSend(Symbol(),OP_SELLSTOP,lots,selp-spred,0,up1,0, "Продаем "+FRUP1B+"/"+FRDN1B+"/"+FRUP2B,Magic,0,Red);
               Last_Max2=selp;
                  t1 = iTime(NULL,0,val1);
                  t2 = iTime(NULL,0,val2);
                  ObjectCreate(ticket,OBJ_TREND,0,t1,up1,t2,dn1);
                  ObjectSetInteger(0,ticket,OBJPROP_RAY_LEFT,false);
                  ObjectSetInteger(0,ticket,OBJPROP_RAY_RIGHT,false);
                  ObjectSet(ticket,OBJPROP_COLOR,Red);
                  ObjectSet(ticket,OBJPROP_WIDTH,3); 

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

Трейлинг осуществил следующим образом:

                  if(OrderType() == OP_SELL){
                     if (OrderTicket() == ticket){
                        double pr1=0, pr2=0,hl=Low[0],lvls;
                        pr1 = ObjectGet(ticket,OBJPROP_PRICE1);
                        pr2 = ObjectGet(ticket,OBJPROP_PRICE2);
                        if (Low[0]<hl) hl=Low[0];
                        lvls = hl-pr2+pr1;
                        if((OrderOpenPrice()-Ask) > (Point*TrailingStop)){ 
                           if((OrderStopLoss() > (lvls)) || (OrderStopLoss()==0)){
                              OrderModify(OrderTicket(),OrderOpenPrice(),lvls,OrderTakeProfit(),0,Red);
                           }
                        }
                     }
 

Смысл такой реализации следующий: для ТС важны 2 контрольные точки при открытии и трейлинг должен осуществляться относительно данных этих 2х точек. Не судите строго мою реализацию.

Все работает как нужно. Но если есть одна позиция и открывается вторая, то трал забывает про ту которая открыта ранее...

Как мне решить эту проблемму.

ivan
313
ivan 2015.02.11 09:19  

немного переделал блок трала, но ничего не помогло. вот весь код блока:

//=======================================TrallingStop=======================================+
      for ( int v = OrdersTotal() - 1; v >= 0; v -- ){       
         if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES)){           
            if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){ 
               
               //+=================================================================================+
               ///+================================Обычный трал ====================================+
               if (TralSimple){
                  if(OrderType() == OP_SELL){
                     ticket = OrderTicket();
                     double pr1=0, pr2=0,hl=Low[0],lvls;
                     pr1 = ObjectGet(ticket,OBJPROP_PRICE1);
                     pr2 = ObjectGet(ticket,OBJPROP_PRICE2);
                     if (Low[0]<hl) hl=Low[0];
                     lvls = hl-pr2+pr1;
                     if((OrderOpenPrice()-Ask) > (Point*TrailingStop)){ 
                        if((OrderStopLoss() > (lvls)) || (OrderStopLoss()==0)){
                           OrderModify(OrderTicket(),OrderOpenPrice(),lvls,OrderTakeProfit(),0,Red);
                        }
                     }
                  }
                  //+=================================================================================+
                  if(OrderType() == OP_BUY){
                     ticket = OrderTicket();
                     double pb1=0, pb2=0, hh=High[0],lvlb;
                     pb1 = ObjectGet(ticket,OBJPROP_PRICE1);
                     pb2 = ObjectGet(ticket,OBJPROP_PRICE2);
                     if (High[0]>hh) hh=High[0];
                     lvlb = hh-pb2+pb1;
                     if((Bid-OrderOpenPrice()) > (Point*TrailingStop)){
                        if(OrderStopLoss() < lvlb || (OrderStopLoss()==0)){
                           OrderModify(OrderTicket(),OrderOpenPrice(),lvlb,OrderTakeProfit(),0,Blue);  
                        }
                     }
                  }
               }                                   
 
ivan
313
ivan 2015.02.13 06:10  
Ну что, никто с таким не сталкивался?
Alexey Viktorov
6921
Alexey Viktorov 2015.02.13 06:56  
ObjectGet(ticket,OBJPROP_PRICE1)

Откуда ticket сюда берётся?

Вот тебе и ответ...

ivan
313
ivan 2015.02.13 07:21  
Может конечно и не правильно. Подскажите тогда как мне взять/выбрать тикет обрабатываемой позиции?
Alexey Viktorov
6921
Alexey Viktorov 2015.02.13 08:20  
berezhnuy:
Может конечно и не правильно. Подскажите тогда как мне взять/выбрать тикет обрабатываемой позиции?

Я был не внимателен. Есть там всё что надо.

Попробуй перевести ticket из int в string

ObjectGet((string)ticket, OBJPROP_PRICE1);

Да и при создании объектов в качестве имени используешь переменную int

соответственно надо ещё посмотреть с каким именем линии создаются.

ivan
313
ivan 2015.02.13 08:48  

Вот как было:


Да и у меня тикет интом задается

int ticket=0,type,total;
ivan
313
ivan 2015.02.13 08:55  
Подправил как вы посоветовали, все отлично заработало. Благодарю за помощь.
Alexey Viktorov
6921
Alexey Viktorov 2015.02.13 09:20  

Странно что не даёт ошибок при компиляции. Ну раз создаёт, пусть создаёт. Со временем придёшь к решению использовать переменные соответствующего типа.

Тогда пересчитай что получится в этой строке

lvls = hl-pr2+pr1;

Если для ордеров Buy может и пойдёт то что посчитается, то для ордеров Sell получится отрицательное число.

ivan
313
ivan 2015.02.13 09:46  
Так там же данные разные для Buy и для Sell. Ну а вообще да (hl1-pr2) в основном отрицательное значение имеет. Ну это простое расширение фибы 100%. разница точки 1 и 3 прибавляется к  точке 2. 
Alexey Viktorov
6921
Alexey Viktorov 2015.02.13 10:32  
А ты проверял что получаешь на выходе от такой фибы? Хотя я второй раз не прав, где мне померещились скобки? Спрашиваю потому, что считать не охота.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий