Нужна Ваша помощь!

 

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

Вот мой код:


int start() {

   if(OrdersTotal() == 0) { 

    OrderSend("EURUSD.oi", OP_BUY, 0.1, Ask, 0, Bid-100*Point, Bid+100000*Point, "", 001, 0, Red);

    }      

  

   if(OrdersTotal() == 1) {        

         int TrailingStop=200;//--- модифицирует цену Stop Loss ордера на покупку           

         if(TrailingStop>0) {               

               OrderSelect(001,SELECT_BY_POS);

               if(NormalizeDouble(Bid, Digits)>OrderOpenPrice()) {

                     if(NormalizeDouble(OrderStopLoss()+Point*TrailingStop,Digits) < NormalizeDouble(Bid, Digits)) {

                     bool res=OrderModify(001,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);

                     if(!res) 

                        Print("Ошибка модификации ордера. Код ошибки=",GetLastError());

                     else 

                        Print("Цена Stop Loss ордера успешно модифицирована.");

                    }

                 }

            }          

      }

  }


У меня стоплосс постоянно скачет на определенном расстоянии от текущей цены (без фиксации). Помогите решить проблему.

 
Добавьте проверку, что новое значение стопа выше чем текущее. Для селл ещё нужно проверять что стопа может не быть и он может быть равен 0.
 
Привет. Ребят подскажите пожалуйста кто нибудь как внести денег и торговать реальным счетом
 
Alexey Valeev:
Добавьте проверку, что новое значение стопа выше чем текущее. 

Извините, не понимаю как это исполнить и как это работать будет

 
labvic:

Извините, не понимаю как это исполнить и как это работать будет

Вам нужно получить текущую цену стопа
order_sl=OrderStopLoss();

Затем вычисляете новую цену, от текущей цены, не от стопа.

new_sl=NormalizeDouble(Bid-Point*TrailingStop,Digits);

и проверяете условие

if(new_sl>order_sl) Модифицируем.

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

 
Alexey Valeev:
Вам нужно получить текущую цену стопа

Затем вычисляете новую цену, от текущей цены, не от стопа.

и проверяете условие

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


Изменил свой код, вот что получилось (однако ничего не поменялось):


double order_sl;

double new_sl;

int start() {

   if(OrdersTotal() == 0) { 

    OrderSend("EURUSD.oi", OP_BUY, 0.1, Ask, 0, Bid-100*Point, Bid+100000*Point, "", 001, 0, Red);

    }      

   if(OrdersTotal() == 1) {        

         int TrailingStop=200;//--- модифицирует цену Stop Loss ордера на покупку           

         if(TrailingStop>0) {               

               OrderSelect(001,SELECT_BY_POS);

               if(NormalizeDouble(Bid, Digits)>OrderOpenPrice()) {

                     if(NormalizeDouble(OrderStopLoss()+Point*TrailingStop,Digits) < NormalizeDouble(Bid, Digits)) {

                     

                     RefreshRates();

                     order_sl= NormalizeDouble(OrderStopLoss(), Digits);

                     new_sl=NormalizeDouble(Bid-Point*TrailingStop,Digits);                   

                     Print("order_sl - ", order_sl, "  ", "new_sl - ", new_sl); 

                  

                     if(new_sl>order_sl) {

                        bool res=OrderModify(001,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);

                        if(!res) 

                           Print("Ошибка модификации ордера. Код ошибки=",GetLastError());

                        else 

                           Print("Цена Stop Loss ордера успешно модифицирована.");

                      }

                    }

                 }

            }          

      }    

  }


Стоплосс также скачет и вверх и вниз на определенном расстоянии от цены. Я добавил Print, выводит: order_sl - 0  new_sl - 1.059 , т.е. OrderStopLoss не обновляется и всегда равен нулю, в этом проблема, как это можно исправить? Спасибо


 
 
input int Magic = 100,
          TrailingStop=200;

void start()
{
     if(OrdersTotal() == 0)
          if( OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, NormalizeDouble(Bid-100*Point, Digits), NormalizeDouble(Bid+100000*Point, Digits), "", Magic, 0, Red) ) return;
     
     for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
          if( !OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ) continue;
          if( OrderMagicNumber() != Magic ) continue;
          if( OrderType() != OP_SELL && OrderType()!= OP_BUY ) continue;

          bool res = false;
          double    order_sl  = NormalizeDouble(OrderStopLoss(), Digits),
                    new_sl    = 0.0;
          
          RefreshRates();
          switch(OrderType())
          {
               case OP_SELL:
                    new_sl = NormalizeDouble(Ask+Point*TrailingStop,Digits);
                    if(order_sl<=new_sl && order_sl!=0) break;
                    res = OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, Red);
                    break;
                     
               case OP_BUY:
                    new_sl = NormalizeDouble(Bid-Point*TrailingStop,Digits);
                    if(order_sl>=new_sl) break;
                    res = OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, Blue);
                    break;
          }
          if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
          else
               Print("Цена Stop Loss ордера успешно модифицирована.");
     }
}
 
Konstantin Nikitin:

Только я бы ещё уточнил что у позиции sell нужно проверять

if(order_sl<=new_sl && order_sl!=0) break;

Иначе при отсутствии стопа не будет работать.

 
Alexey Valeev:

Только я бы ещё уточнил что у позиции sell нужно проверять

Иначе при отсутствии стопа не будет работать.

Спасиб подправил, а то упустил. Так на коленке написал, пусть изучает )))

 
labvic:

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

У меня стоплосс постоянно скачет на определенном расстоянии от текущей цены (без фиксации). Помогите решить проблему.

Автор. Вы через день ветки создаете  на тему "Нужна помощь" Так научитесь код вставлять правильно в сообщение. 

Нажимайте ALT+S и появится окно для вставки кода  - куда его и надо вставить.

Здесь подробнее написано.

Причина обращения: