Помогите пожалуйста добавить трейлинг стоп, и без убыток, нужно только вставить правильно(

 
Помогите пожалуйста вставить в советник без убыток и трейлинг стоп, хотя бы без убыток что при прохождении например 100 пунктов в направлении стоп лосс прыгал в без убыток ( http://mql.opentraders.ru/949.html ) 
//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
             }
           } 
         }
       }
}
//------------------------------------------------------------------+

Поставить получилось, советник работает, но те выставляет стоп лосс в без убыток не при каких значениях( может есть проще функции. Вся информация была взята с сайта http://mql.opentraders.ru/949.html

 
helping123:
Помогите пожалуйста вставить в советник без убыток и трейлинг стоп, хотя бы без убыток что при прохождении например 100 пунктов в направлении стоп лосс прыгал в без убыток ( http://mql.opentraders.ru/949.html ) 

Поставить получилось, советник работает, но те выставляет стоп лосс в без убыток не при каких значениях( может есть проще функции. Вся информация была взята с сайта http://mql.opentraders.ru/949.html

А какое значение у BULevel? Подозреваю, что там значение 100. Тогда все верно - цена (по крайней мере, для валют-мажоров) не может пройти в своей категории такую огромную величину. Категория цены - стотысячные доли единицы.

P. S. Вставьте код правильно (кнопка "</>" или Alt+S)

 
Ihor Herasko:

А какое значение у BULevel? Подозреваю, что там значение 100. Тогда все верно - цена (по крайней мере, для валют-мажоров) не может пройти в своей категории такую огромную величину. Категория цены - стотысячные доли единицы.

P. S. Вставьте код правильно (кнопка "</>" или Alt+S)

//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
             }
           } 
         }
       }
}
//------------------------------------------------------------------+
extern double BULevel            = 0.001; То есть при прохождении даже 1000 пунктов на 5 знаке, стоп лосс в без убыток не переходит
 
helping123:

Тогда все работает. Проверил таким кодом:

input double BULevel            = 0.001;

int OnInit()
{
   int nTicket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, Ask - 300 * Point, 0.0);
   nTicket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 0, Bid + 300 * Point, 0.0);
   return INIT_SUCCEEDED;
}

void OnTick()
{
   BU();   
}

void BU()
{
   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
             }
           } 
         }
       }
}

Результат:

2       10:36:09.314    2018.06.01 00:00:00  Test inputs: i_nMagicNumber=12876; BULevel=0.001; 
2       10:36:09.347    2018.06.01 00:00:00  Test EURUSD,M5: open #1 buy 0.10 EURUSD at 1.16929 sl: 1.16629 ok
2       10:36:09.347    2018.06.01 00:00:00  Test EURUSD,M5: open #2 sell 0.10 EURUSD at 1.16909 sl: 1.17209 ok
2       10:36:12.769    2018.06.01 01:43:02  Test EURUSD,M5: modify #1 buy 0.10 EURUSD at 1.16929 sl: 1.16929 tp: 0.00000 ok
0       10:36:12.792    2018.06.01 02:57:21  Tester: stop loss #1 at 1.16929 (1.16929 / 1.16949)
2       10:36:12.878    2018.06.01 06:24:12  Test EURUSD,M5: modify #2 sell 0.10 EURUSD at 1.16909 sl: 1.16909 tp: 0.00000 ok
0       10:36:12.963    2018.06.01 10:19:07  Tester: stop loss #2 at 1.16909 (1.16889 / 1.16909)
 
Ihor Herasko:

Тогда все работает. Проверил таким кодом:

Результат:

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

////////////\\\\\\\\\\\
//////  BB_MACD  \\\\\\
/////  Fillellin  \\\\\
////////////\\\\\\\\\\\

#property     copyright                                                "Copyright © 2017, Alexander Voronkov / Fillellin"
#property     strict
#property     link                                                                  "https://www.mql5.com/ru/users/fillellin"

#include     <stdlib.mqh>

extern string ————————————————————————1———————————————————————— = "————————|  Настройки времени торговли";
input         string              StartTrade                    =  "00:00";          // Начало торговли:
input         string              StopTrade                     =  "23:59";          // Конец торговли:

extern string ————————————————————————2———————————————————————— = "————————|  Общие параметры советника";
extern        double              Lots                          =  0.01;             // Размер лота:
extern        int                 StopLoss                      =  0;                // Размер стопа в пунктах:
extern        int                 TakeProfit                    =  0;                // Размер тейка в пунктах:
extern        int                 Slippage                      =  2;                // Проскальзывание цены - уровень допустимого реквота:
extern        int                 MagicNumber                   =  0;                // Идентификатор позиции - Магик номер:

extern string ————————————————————————3———————————————————————— = "————————|  Настройки индикатора  (BBands_Stop)";
input        int                  Length                        =  20;               // Bollinger Bands Period:
input        int                  Deviation                     =  2;                // Deviation was 2:

extern string ————————————————————————4———————————————————————— = "————————|  Настройки индикатора  (MACD)";
input        int                  InpFastEMA                    =  12;               // Fast EMA Period:
input        int                  InpSlowEMA                    =  26;               // Slow EMA Period:
input        int                  InpSignalSMA                  =  9;                // Signal SMA Period:
extern double BULevel            = 0.001;

//————————————————————————————————————|

bool          TradeSg=false;
bool          upFlags=false;
bool          dnFlags=false;

int           ord,ticketbuy,ticketsell;
double        SL,TP;
datetime      lasttimebuy, lasttimesell;

//———————————————————————————————————————————————|
//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
             }
           } 
         }
       }
}
//------------------------------------------------------------------+
int OnInit()
{
   if(_Digits == 3||
      _Digits == 5){
      Slippage*=10; TakeProfit*=10; StopLoss*=10;}

   lasttimebuy  = 0;
   lasttimesell = 0;

   return(INIT_SUCCEEDED);
}

//——————| the beginning of the algorithm |———————|

bool TradeStop = true;

void OnTick(){
//---------------------------------------------------------------------------------------------------------------+
//  привязка к конкретному торговому счету
  if(AccountNumber() != 7236301){ 
     Comment("Invalid account... forex-time@mail.ru");
  if(TradeStop) Alert("Invalid account... forex-time@mail.ru"); TradeStop=false; return;}
//---------------------------------------------------------------------------------------------------------------+ 
   double stoplossBUY, takeprofitBUY,
          stoplossSELL, takeprofitSELL;

   int Days = DayOfWeek();
   datetime TimeCurr = TimeCurrent();

   datetime Start = StrToTime(StartTrade);
   datetime Stop  = StrToTime(StopTrade);

//—————————————————————————————————————————————————|

   if(StopLoss == 0){stoplossBUY=0; stoplossSELL=0;}
   else
   {
      stoplossBUY  = NormalizeDouble(Bid - StopLoss*Point,Digits);
      stoplossSELL = NormalizeDouble(Ask + StopLoss*Point,Digits);
   }

   if(TakeProfit == 0){takeprofitBUY=0; takeprofitSELL=0;}
   else
   {
      takeprofitBUY  = NormalizeDouble(Ask + TakeProfit*Point,Digits);
      takeprofitSELL = NormalizeDouble(Bid - TakeProfit*Point,Digits);
   }

//—————————————————————————————————————————————————————————————————————————————————————————————|

  double currenMacd = iMACD(NULL,0, InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,1);
  double previoMacd = iMACD(NULL,0, InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,2);

  double currUpBand = iCustom(NULL,0, "BBands_Stop_v1", Length,Deviation, 2,1);
  double currDnBand = iCustom(NULL,0, "BBands_Stop_v1", Length,Deviation, 3,1);

  if(((previoMacd <= 0 && currenMacd > 0)||(previoMacd >= 0&&
       currenMacd < 0))&& TradeSg==false) TradeSg=true;
  if(100 < 0 && TradeSg==true) TradeSg=false;

//———————————————————————————————————————————————————————————————————|

   if(TradeSg &&((Days == 1 && TimeCurr >= Start && TimeCurr < Stop)||
                 (Days == 2 && TimeCurr >= Start && TimeCurr < Stop)||
                 (Days == 3 && TimeCurr >= Start && TimeCurr < Stop)||
                 (Days == 4 && TimeCurr >= Start && TimeCurr < Stop)||
                 (Days == 5 && TimeCurr >= Start && TimeCurr < Stop))){

//————————————————————————————————————————————————————————————————————————————————————————|

      if(currenMacd > 0 && currUpBand != 0 && upFlags==false){upFlags=true; dnFlags=false;}
      if(currenMacd < 0 && currDnBand != 0 && dnFlags==false){dnFlags=true; upFlags=false;}

//————————————————————————————————————————————————————————————————————————————————————————|

      int ordbuy  = CountBuy();
      int ordsell = CountSell();

      datetime time = iTime(Symbol(),PERIOD_CURRENT,0);

//————————————————————————————————————————————————————|

      if(upFlags)
      {
         if(ordsell > 0) ord = CloseOrder(ticketsell,0);

         if(lasttimebuy != time && ordbuy == 0)
         {
            ord = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, stoplossBUY, takeprofitBUY, NULL, MagicNumber, 0, clrNONE);

            if(ord < 0) Print("Ошибка при открытии позиции BUY (", ErrorDescription(GetLastError()), ")");
            else lasttimebuy = time;
         }
      }

//———————————————————————————————————————————————————|

      if(dnFlags)
      {
         if(ordbuy > 0) ord = CloseOrder(ticketbuy,0);

         if(lasttimesell != time && ordsell == 0)
         {
             ord = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, stoplossSELL, takeprofitSELL, NULL, MagicNumber, 0, clrNONE);

             if(ord < 0) Print("Ошибка при открытии позиции Sell (", ErrorDescription(GetLastError()), ")");
             else lasttimesell = time;
         }
      }
   }
}

//——————————————————————————————————————————————————————|

int CountBuy()
{
   int count = 0;

   for(int trade = OrdersTotal()-1; trade >= 0; trade --)
   {
      ord = OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);

      if(OrderSymbol()== Symbol()&& OrderMagicNumber()==
         MagicNumber)
      {
         if(OrderType()== OP_BUY)
         {
            count++;
            ticketbuy = OrderTicket();
         }
      }
   }
   return(count);
}

//——————————————————————————————————————————————————————|

int CountSell()
{
   int count = 0;

   for(int trade = OrdersTotal()-1; trade >= 0; trade --)
   {
      ord = OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);

      if(OrderSymbol()== Symbol()&& OrderMagicNumber()==
         MagicNumber)
      {
         if(OrderType()== OP_SELL)
         {
            count++;
            ticketsell = OrderTicket();
         }
      }
   }
   return(count);
}

//————————————————————————————————————|

int CloseOrder(int ticket, double lots)
{
   int err = 0, f = 0;
   double price = 0;

   bool chk = OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

   if(lots == 0) lots = OrderLots();
   if(lots < MarketInfo(OrderSymbol(),MODE_MINLOT))
      lots = MarketInfo(OrderSymbol(),MODE_MINLOT);

   while(f < 10)
   {
      RefreshRates();

      if(OrderType()== 0)  price = Bid;
      if(OrderType()== 1)  price = Ask;
      if(OrderType()>  1)
      {
         chk = OrderDelete(ticket);
         return(0);
      }

      chk = OrderClose(ticket,lots,NormalizeDouble(price,Digits),1,clrGoldenrod);
      err = GetLastError();

      if(err == 0) break;
      Print(OrderSymbol(), "  при закрытии ордера.");

      f ++;
      Sleep(1000);
   }

   return(0);
}

//———————————————————————————| end of the algorithm |———————————————————————————|
Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
Процедура BU ни где не вызывается естественно она не будет работать!
 
Vitaly Gorbunov:
Процедура BU ни где не вызывается естественно она не будет работать!

Вот я по этому и попросил помощи) 

 
helping123:

Вот я по этому и попросил помощи) 

Ну так по логике на каждом тике и надо проверять!

Поставте вызов процедуры в OnTick проверьте как она работает. 

 
Vitaly Gorbunov:

Ну так по логике на каждом тике и надо проверять!

Поставте вызов процедуры в OnTick проверьте как она работает. 

Всё ровно не понимаю, не получается, мне хотя бы просто чтобы при прохождения 100 пунктов стоп лосс переходил в без убыток, 10 пунктов, то есть не как трал а просто как 100 пунктов цена прошла без убыток был на +10 от цены открытия и все(

 
//+------------------------------------------------------------------+
//| set_outloss() установка SL на уровень безубытка
//+------------------------------------------------------------------+
void set_outloss() {  
   string _Function = "set_outloss():";
//-----------------
   double _SL;
   int  _Сommision_Pip,
        _Dist_OutLoss,
        _Profit_for_OutLoss; 
//-----------------
   if(!SET_OUTLOSS)  return;
   for(int _i=OrdersTotal()-1; _i>=0; _i--) {  
      OrderSelect(_i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol() && check_magic(OrderMagicNumber(),_Function)){
//---- проверка корректности уровней outloss с учётом комиссии -------
         _Dist_OutLoss = check_dist_outloss(OrderTicket());
         _Profit_for_OutLoss = check_profit_for_outloss(_Dist_OutLoss); 
//--------------------------------------------------------------------
         if(OrderType() == OP_BUY){  
            //---- проверка внешних сигналов управляющих OutLoss -----------------
            if(GlobalVariableGet(GV_Ignore_Tral_SL_BUY) == YES)continue;
            //--------------------------------------------------------------------
            if(OrderStopLoss() < OrderOpenPrice()){ // в том числе если OrderStopLoss == 0
               if(Ask - OrderOpenPrice() >= _Profit_for_OutLoss*Point) {  
                  _SL = NormalizeDouble(OrderOpenPrice() + _Dist_OutLoss*Point,Digits);
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),_SL,OrderTakeProfit(),0,CLR_NONE)){
                     int _Dist = (Ask - OrderOpenPrice())/Point;
                     output_mov_string("SL OP_BUY "+OrderTicket()+" в безубытке. Дист.установки= " + _Dist, Clr_Report);
                     output_sound(Name_Sound_OutLoss);
                  }
               }
            }
         }  
         if(OrderType() == OP_SELL){  
            //---- проверка внешних сигналов управляющих OutLoss -----------------
            if(GlobalVariableGet(GV_Ignore_Set_Outloss_SELL) == YES)continue;         
            //--------------------------------------------------------------------
            if(OrderStopLoss() > OrderOpenPrice() || OrderStopLoss() == 0) {  
               if(OrderOpenPrice() - Bid >= _Profit_for_OutLoss*Point){  
                  _SL = NormalizeDouble(OrderOpenPrice() - _Dist_OutLoss*Point,Digits);
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),_SL,OrderTakeProfit(),0,CLR_NONE)){
                     _Dist = (OrderOpenPrice() - Bid)/Point;
                     output_mov_string("SL OP_SELL "+OrderTicket()+" в безубытке. Дист.установки= " + _Dist, Clr_Report);
                     output_sound(Name_Sound_OutLoss);
                  }
               }
            }
         }
      }
   }
//-----------------   
   return;
}
//+------------------------------------------------------------------+
//+-------

Нашёл код, но не могу прикрепить к своему, не хватает именно грамотности в коде mql4

 
helping123:

Всё ровно не понимаю, не получается, мне хотя бы просто чтобы при прохождения 100 пунктов стоп лосс переходил в без убыток, 10 пунктов, то есть не как трал а просто как 100 пунктов цена прошла без убыток был на +10 от цены открытия и все(

Вы вызов прцедуры в OnTick вставили? Что после этого происходит с ордрами?

helping123:

Нашёл код, но не могу прикрепить к своему, не хватает именно грамотности в коде mql4

Очень навороченный код, да ещё с глобальными переменными терминала. Я бы не советовал его использовать!
Причина обращения: