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

 
helping123:

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

Поставьте вызов функции BU() в тело функции OnTick(). В том коде, который привел, именно так и сделано. Вам осталось сделать по аналогии в своем коде.

 
Ihor Herasko:

Поставьте вызов функции BU() в тело функции OnTick(). В том коде, который привел, именно так и сделано. Вам осталось сделать по аналогии в своем коде.

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

#property     copyright                                                "Copyright © 2018, Maksim Khromov / "
#property     strict
#property     link                                                                  "2018"
#define MAGICMA  20110426

#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;                                            // Без убыток 0.1 1000 п 5 знак
extern double TrailingStop       = 0.005;                                            // Трейлинг 0.01 1000п 5 знак
//————————————————————————————————————|

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

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

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

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()

{

{
   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);
             }
           } 
         }
       }
}
//+------------------------------------------------------------------+  

{
   for(int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol()||OrderMagicNumber()==MAGICMA)
       if(OrderType()==OP_BUY)
         {
          if(TrailingStop>0)  
            {                 
              if(Bid-OrderOpenPrice()>TrailingStop)
               {
                 if(OrderStopLoss()<Bid-TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
         
        if(OrderType()==OP_SELL)
         {
           if(TrailingStop>0)  
            {                 
              if((OrderOpenPrice()-Ask)>TrailingStop)
               {
                 if((OrderStopLoss()>(Ask+TrailingStop)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }   
   }
}
//+------------------------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------+
//  привязка к конкретному торговому счету
  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 |———————————————————————————|

Всё получилось, спасибо но теперь существует новая проблема, если убрать трейлинг то из кода то работает без убыток, если есть трейлинг то работает трейлинг. Подскажите пожалуйста как сделать так что бы я например мог выбрать без убыток или трейлинг что то одно, а так пока работает все по отдельности если из кода убрать. Что то типа true false например на без убытке true на трейлинг false

 
Vitaly Gorbunov:

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

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

Всё получилось, спасибо но теперь существует новая проблема, если убрать трейлинг то из кода то работает без убыток, если есть трейлинг то работает трейлинг. Подскажите пожалуйста как сделать так что бы я например мог выбрать без убыток или трейлинг что то одно, а так пока работает все по отдельности если из кода убрать. Что то типа true false например на без убытке true на трейлинг false


 
helping123:

Всё получилось, спасибо но теперь существует новая проблема, если убрать трейлинг то из кода то работает без убыток, если есть трейлинг то работает трейлинг. Подскажите пожалуйста как сделать так что бы я например мог выбрать без убыток или трейлинг что то одно, а так пока работает все по отдельности если из кода убрать. Что то типа true false например на без убытке true на трейлинг false


Вы в правильном направлении думаете! В ведите переменную которая управляет включением трала и безубытка.

 
Vitaly Gorbunov:

Вы в правильном направлении думаете! В ведите переменную которая управляет включением трала и безубытка.

Вот к сожалению я не понимаю как это и мануала не могу подходящего найти, так бы может если было в чем покапаться сделал бы наверное(

 
Вот блин что я вам голову морочу? Заторговался! Теперь второй шаг объединить функцию трала и безубытка. Зачем по сто раз перебирать ордера. В объедененной функции проверяйте сколько прошла цена от открытия ордера. Если цена меньше или больше, в зависимости от типа ордера,  цены открытия то ничего не делаем, если цена дошла до уровня БУ перенсим СЛ в БУ, если цена больше или меньше  уровня БУ+трал тралим. Надеюсь что понятно объяснил! Если что непонятно спрашивайте!
Причина обращения: