Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Задействуй с пользой свободные компьютеры. Подключись к MQL5 Cloud Network!
diamon1985
171
diamon1985 2014.06.12 18:51 

Здравствуйте.

Необходимо внести изменения в робота. В настоящий момент робот открывает сделку со СЛ=0. Нужно, чтобы открывалось со СЛ и затем, как только цена отходит в плюс на нужное количество пунктов, робот сразу переводит в БУ.

Вот сижу и не могу понять где именно модифицировать.

 Буду признателен за помощь.

//====================================================================\\
// Modtc                                                              ||
//====================================================================//
bool CAllinSave::Modtc()
  {
   if((NormalizeDouble(sl_md,_digits)!=NormalizeDouble(last_sl,_digits) || (last_sl==0 && sl_md>0)) || 
      (NormalizeDouble(tp_md,_digits)!=NormalizeDouble(last_tp,_digits) || (last_tp==0 && tp_md>0))) {}
      else return true;
   if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return false;
//---
   StopLevel=(int)MarketInfo(_symbol,MODE_STOPLEVEL);
   if(type==0)
     {
      if(sl_md!=0 && last_sl!=sl_md)
        {
         if(Bid>(sl_md+StopLevel*_point)) {}
         else
           {
            Print("Error sl(for BUY) modification, SL-price ("+DoubleToStr(sl_md,_digits)+") in invalid zone");
            return false;
           }
        }
      if(tp_md!=0 && last_tp!=tp_md)
        {
         if(Ask<(tp_md-StopLevel*_point)) {}
         else
           {
            Print("Error tp(for BUY) modification, TP-price ("+DoubleToStr(tp_md,_digits)+") in invalid zone");
            return false;
           }
        }
     }
   if(type==1)
     {
      if(sl_md!=0 && last_sl!=sl_md)
        {
         if(Ask<(sl_md-StopLevel*_point)) {}
         else
           {
            Print("Error sl(for SELL) modification, SL-price ("+DoubleToStr(sl_md,_digits)+") in invalid zone");
            return false;
           }
        }
      if(tp_md!=0 && last_tp!=tp_md)
        {
         if(Bid>(tp_md+StopLevel*_point)) {}
         else
           {
            Print("Error tp(for SELL) modification, TP-price ("+DoubleToStr(tp_md,_digits)+") in invalid zone");
            return false;
           }
        }
     }
//---
   bool rere=OrderModify(ticket,open,sl_md,tp_md,0,White);
   int err=GetLastError();

for(int t=OrdersTotal()-1; t>=0; t--)
                    {
                     if(OrderSelect(t,SELECT_BY_POS))
                       {
                        type=OrderType();
                        ticket=OrderTicket();
                        if(OrderSymbol()==_symbol && OrderMagicNumber()==Magic && type<2)
                          {
                           last_tp=OrderTakeProfit();
                           last_sl=OrderStopLoss();
                           open=OrderOpenPrice();
                           new_tp=(type==0?Value[1]:Value[2]);
                           if(NormalizeDouble(last_tp,_digits)!=NormalizeDouble(new_tp,_digits) &&
                              (type==0?NormalizeDouble(new_tp,_digits)>NormalizeDouble(last_tp,_digits):NormalizeDouble(new_tp,_digits)<NormalizeDouble(last_tp,_digits)))
                             {
                              sl_md=last_sl;
                              tp_md=NormalizeDouble(new_tp,_digits);
                              if(sv.Modtc()) continue;

//====================================================================\\
// Open_position                                                      ||
//====================================================================//
bool CAllinSave::Open_position(int sym,double mode_tp)
  {
   ticket=0;
   color clr=clrBlue;
   double Price=0;
   sl_md=0;
   tp_md=mode_tp;
   if(sym==0)
     {
      Price=NormalizeDouble(Ask,_digits);
      clr=Blue;
     }
   if(sym==1)
     {
      Price=NormalizeDouble(Bid,_digits);
      clr=Red;
     }
//---
   double nlt=Lot;
   
//---
   if((MarketInfo(_symbol,MODE_MARGINREQUIRED)*nlt)>AccountEquity())
     {
      Alert("Not enough money ("+DoubleToStr(AccountEquity(),2)+") "+
            " | required minimum : "+DoubleToStr(MarketInfo(_symbol,MODE_MARGINREQUIRED)*nlt,2));
      return false;
     }
//---
   Print("Started opening position "+(sym==0?"BUY":"SELL")+" at:",_symbol," | Price:",DoubleToStr(Price,_digits)," | SL:",DoubleToStr(sl_md,_digits)," | TP:",DoubleToStr(tp_md,_digits)," | lot:",DoubleToStr(nlt,2));
   ticket=OrderSend(_symbol,sym,nlt,Price,Slippage,sl_md,tp_md,"",Magic,0,clr);
   int err=GetLastError();

 Как я понимаю, что появился просто СЛ, мне нужно превратить строчку sl_md=0; в double sl_md=10;??? Не пойдет ли это в разрез с блоком "Modtc"? И что если что нужно там поменять?

А чтобы ордер модифицировался на б/у нужно строчку: bool rere=OrderModify(ticket,open,sl_md,tp_md,0,White); изменить на OrderModify(ticket,open,OrderOpenPrice(),tp_md,0,White?

 

Буду признателен за помощь. Благодарю. 

diamon1985
171
diamon1985 2014.06.12 19:26  

У меня по идее не трейлинг, а разовый перевод в б/у. Но спасибо за материал.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий