Безубыток

Обсуждаем вопросы связанные с разработкой программного кода.
Aleksandr906
Сообщения: 2
Зарегистрирован: 10 апр 2017, 16:26

Безубыток

Сообщение Aleksandr906 » 10 апр 2017, 18:10

Здравствуйте Валентин!
Недавно приобрел курс "Мастерская Forex роботов". Большое спасибо Вам, Владу и всей вашей команде. Просто здорово, именно то, что нужно начинающему. У меня вопрос. Хотелось бы, что бы стоплосы ордеров передвигались вслед за ценой (в безубыток).
Можно ли сделать это таким образом (доработав блок " void Process() "?
С уважунием Симаков Александр, г.Тверь.

Код: Выделить всё

void Process(){   
           ControlOpenOrders();
 //-------- обрабатываем Buy ордера ---------------------------------
           if(OrderBuy[0]>0) {TPBuy(MA_Plus_2,id_[0]);SLBuy(MA_Minus_1,id_[0]);}   //если есть ордер Buy с индексом 0, вызываем функцию коррекции SL и TP     
           if(OrderBuy[1]>0, Price<= MA_Plus_3) {TPBuy(MA_Plus_3,id_[1]);SLBuy(MA_Minus_1,id_[1]);}   //если есть ордер Buy с индексом 1, вызываем функцию коррекции SL и TP
           if(OrderBuy[1]>0, Price>  MA_Plus_3) {TPBuy(MA_Plus_3,id_[1]);SLBuy(MA_Plus_2,id_[1]);}
           if(OrderBuy[2]>0, Price<= MA_Plus_3) {TPBuy(MA_Plus_4,id_[2]);SLBuy(MA_Minus_1,id_[2]);}   //если есть ордер Buy с индексом 2, вызываем функцию коррекции SL и TP
           if(OrderBuy[2]>0, Price>  MA_Plus_3) {TPBuy(MA_Plus_4,id_[1]);SLBuy(MA_Plus_2,id_[1]);}
     
           if(OrderBuy[0]==True) {OpenBuy(Lots_0,id_[0],MA_Minus_1,MA_Plus_2);}  //если команда установки Buy ордера 0 активна, вызываем функцию установки
           if(OrderBuy[1]==True) {OpenBuy(Lots_1,id_[1],MA_Minus_1,MA_Plus_3);}  //если команда установки Buy ордера 1 активна, вызываем функцию установки
           if(OrderBuy[2]==True) {OpenBuy(Lots_2,id_[2],MA_Minus_1,MA_Plus_4);}  //если команда установки Buy ордера 2 активна, вызываем функцию установки

 //-------- обрабатываем Sell ордера------------------------------
           if(OrderSell[0]>0) {TPSell(MA_Minus_2,id_[0]);SLSell(MA_Plus_1,id_[0]);}  //если есть ордер Sell с индексом 0, вызываем функцию коррекции SL и TP
           if(OrderSell[1]>0, Price>= MA_Minus_3) {TPSell(MA_Minus_3,id_[1]);SLSell(MA_Plus_1,id_[1]);}  //если есть ордер Sell с индексом 1, вызываем функцию коррекции SL и TP
           if(OrderSell[1]>0, Price<  MA_Minus_3) {TPSell(MA_Minus_3,id_[1]);SLSell(MA_Minus_2,id_[1]);}
           if(OrderSell[2]>0, Price>= MA_Minus_3) {TPSell(MA_Minus_4,id_[2]);SLSell(MA_Plus_1,id_[2]);}  //если есть ордер Sell с индексом 2, вызываем функцию коррекции SL и TP
           if(OrderSell[2]>0, Price<  MA_Minus_3) {TPSell(MA_Minus_4,id_[1]);SLSell(MA_Minus_2,id_[1]);}
     
           if(OrderSell[0]==True) {OpenSell(Lots_0,id_[0],MA_Plus_1,MA_Minus_2);}  //если команда установки Sell ордера 0 активна, вызываем функцию установки
           if(OrderSell[1]==True) {OpenSell(Lots_1,id_[1],MA_Plus_1,MA_Minus_3);}  //если команда установки Sell ордера 1 активна, вызываем функцию установки
           if(OrderSell[2]==True) {OpenSell(Lots_2,id_[2],MA_Plus_1,MA_Minus_4);}  //если команда установки Sell ордера 2 активна, вызываем функцию установки
           ControlOpenOrders();
      }

Аватара пользователя
Valentin
Администратор
Сообщения: 22
Зарегистрирован: 13 ноя 2016, 22:42

Re: Безубыток

Сообщение Valentin » 13 апр 2017, 10:13

Здравствуйте!
К этому курсу прикладывались советники, в коде которых была реализована поставленная задача.
Вот, например, отдельная функция трала из советника ForexSlide (в коде советника строки 808-841):

Код: Выделить всё

 //======================= Сопровождение ордера тралом =======================================
 void Trall(){
 
    if (Bid-LineCloseBuy>(TrailingDistance+TrailingStep)*Point){LineCloseBuy=Bid-TrailingDistance*Point;}
    if (LineCloseSell-Ask>(TrailingDistance+TrailingStep)*Point||LineCloseSell==0) {LineCloseSell=Ask+TrailingDistance*Point;}   
   
    if(CountOrderBuy==0){LineCloseBuy=0;}
    if(CountOrderSell==0){LineCloseSell=0;}


    for(int i=OrdersTotal(); i>=0; i--){ //перебираем все ордера
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ //ордер есть
          if(OrderMagicNumber()==id||OrderMagicNumber()==id_1){
             if(OrderSymbol()==SymbolScan){ //ордер наш
                if (OrderType()==OP_BUY) { //ордер Buy
                   if ((NormalizeDouble(LineCloseBuy,Digits)!=NormalizeDouble(OrderStopLoss(),Digits))){ //если между текущим и рассчетным ТР больше 0 пункта
                      if ((Bid-LineCloseBuy)>(MarketInfo(SymbolScan,MODE_SPREAD)+DistanceSl_Tp)*Point){//если расстояние от цены до требуемого уровня SL больше спреда плюс 5 пункта
                         bool result_b=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(LineCloseBuy,Digits),OrderTakeProfit(),0,CLR_NONE); 
                         if(!result_b){Alert("Функция Trall","\n","Команда: установить SL_BUY= " , LineCloseBuy ,"\n"," Ответ сервера: " ,errors(GetLastError()));}           
                      }
                   }
                }
                if (OrderType()==OP_SELL) { //ордер Sell
                   if ((NormalizeDouble(LineCloseSell,Digits))!=(NormalizeDouble(OrderStopLoss(),Digits))||OrderStopLoss()==0){ //если между текущим и рассчетным ТР больше 1 пункта
                      if ((LineCloseSell-Ask)>(MarketInfo(SymbolScan,MODE_SPREAD)+DistanceSl_Tp)*Point){//если расстояние от цены до требуемого уровня SL больше спреда плюс 5 пункта
                         bool result_s=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(LineCloseSell,Digits),OrderTakeProfit(),0,CLR_NONE);
                         if(!result_s){Alert("Функция Trall","\n","Команда: установить SL_SELL= " , LineCloseSell ,"\n"," Ответ сервера: " ,errors(GetLastError()));}   
                      }
                   }
                }
             }   
          }           
       }
    } 
 }   
//==========================================================================================================

Аватара пользователя
Valentin
Администратор
Сообщения: 22
Зарегистрирован: 13 ноя 2016, 22:42

Re: Безубыток

Сообщение Valentin » 13 апр 2017, 10:19

Вот альтернативный вариант трала нашел в интернете, легко встроить в любой советник:

Код: Выделить всё

//------- Внешние параметры советника ----------------------------------
extern string _P_Trailing = "---------- Параметры трала";
extern bool UseTrailing      = true;        // Использовать трал
extern bool ProfitTrailing   = true;        // Тралить только профит
extern int  TrailingStopBuy  = 50;          // Фиксированный размер трала
extern int  TrailingStopSell = 50;           // Фиксированный размер трала
extern int  TrailingStep     = 5;              // Шаг трала
//+----------------------------------------------------------------------------
//|  Сопровождение позиции простым тралом                                     
//|  Параметры:                                                               
//|    sy - наименование инструмента   ("" - текущий символ)                   
//|    op - операция                   (-1 - любая позиция)                   
//|    mn - MagicNumber                (-1 - любой магик)                     
//+----------------------------------------------------------------------------
void TrailingPositions(string sy="", int op=-1, int mn=-1) {
  double p, pp;
  int    i, k=OrdersTotal();

  if (sy=="") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(sy, MODE_BID);
            if (!ProfitTrailing || (pp-OrderOpenPrice())>TrailingStopBuy*p) {
              if (OrderStopLoss()<pp-(TrailingStopBuy+TrailingStep-1)*p) {
                ModifyOrder(sy, -1, pp-TrailingStopBuy*p, 0, clModifyBuy);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(sy, MODE_ASK);
            if (!ProfitTrailing || OrderOpenPrice()-pp>TrailingStopSell*p) {
              if (OrderStopLoss()>pp+(TrailingStopSell+TrailingStep-1)*p || OrderStopLoss()==0) {
                ModifyOrder(sy, -1, pp+TrailingStopSell*p, 0, clModifySell);
              }
            }
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+

Aleksandr906
Сообщения: 2
Зарегистрирован: 10 апр 2017, 16:26

Re: Безубыток

Сообщение Aleksandr906 » 13 апр 2017, 17:38

Здравствуйте Валентин!
Большое спасибо за ответ.
Аleksandr906.


Вернуться в «В помощь программисту.»

Кто сейчас на конференции

Сейчас этот форум просматривают: Alexa [Bot] и 0 гостей