Как перевести в без убыток по общему профиту?

 

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

     Подскажите где ошибка в коде.Есть несколько 3-5 открытых ордеров на покупку.При достижении общего профита в 1%-1,5%, нужно запомнить цену.И когда профит будет от 3-3,5% перевести стоплосс последнего ордера на запомненную цену в 1%.

В коде ниже советник работает, но переводит в без убыток в 2%.И в журнале ошибка 130 неправильные стопы и 4051 недопустимое значение параметра функции.Когда ошибка 130 переводит в безубыток, когда 4051 нет.

//в интстарт modifTP();
//+------------------------------------------------------------------+

  void modifTP()
{  
   double p=0; //профит всех ордеров
   datetime o;  
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol()  &&  OrderMagicNumber() == Magic)
         {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL)
          {        
          if (OrderMagicNumber()==Magic)
             p+=OrderProfit(); //находим общий профит всех ордеров
             {
              if (o<OrderOpenTime())
              {
                o=OrderOpenTime();   //находим самый последний открытый ордер            
                
                double balans=AccountBalance();                
                {
                if(p*100/balans>1 && p*100/balans<1.5)//относительно баланса находим интервал профита от 1% до 1,5%
                double odinprocent=Bid;   //запоминаем цену в данный момент            
                }
               }          
                 //------------------------------модификация ордера на покупку
                  if (OrderType()  ==  OP_BUY)          
                   {                                    
                    if ( p*100/balans>=3 && p*100/balans<=3.5)//если профит ордеров от 3-3,5% то переносим стоплосс на запомненную  цену в 1%              
                      {
                      TP = NormalizeDouble(OrderOpenPrice()+0.03000,5);
                      SL = NormalizeDouble(odinprocent-0.00070,5);
                      OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);        
                      }                
                   }
                //------------------------------модификация ордера на продажу    
                   if (OrderType()  ==  OP_SELL )
                    {                                
                    if (  p*100/balans>=3 && p*100/balans<=3.5 )
                        {
                      TP = NormalizeDouble(OrderOpenPrice()-0.03000,5);
                      SL = NormalizeDouble(odinprocent+0.00070,5);
                      OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
                       }              
                     }          
                 }
                }
    
              }
            }
         }      
}
//--------------------------------------------------------------------+

 Через принт в журнале смотрел "odinprocent" показывает десятки разных цен в диапазоне от 1%-1,5%. Пробывал через цикл по времени найти самую последнюю цену,  виснет. 

 
Dima DD:

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

     Подскажите где ошибка в коде.Есть несколько 3-5 открытых ордеров на покупку.При достижении общего профита в 1%-1,5%, нужно запомнить цену.И когда профит будет от 3-3,5% перевести стоплосс последнего ордера на запомненную цену в 1%.

В коде ниже советник работает, но переводит в без убыток в 2%.И в журнале ошибка 130 неправильные стопы и 4051 недопустимое значение параметра функции.Когда ошибка 130 переводит в безубыток, когда 4051 нет.

Ваша постановка задачи не всегда имеет решение. Ставьте лимитный стоп на продажу на весь объем.
 
Dima DD:

   При достижении общего профита в 1%-1,5%, нужно запомнить цену.И когда профит будет от 3-3,5% перевести стоплосс последнего ордера на запомненную цену в 1%.

Функция NoLoss вам поможет !!

extern int     NoLoss = 3;
extern int     NoLossStart = 10;
//-----------------------------+

int i,modify;
double Pp;
string Symb;

void init() {
   Pp=Point;
   Symb=Symbol();
   return;
}
void start() {      
   double  profit=0, buy_last_price= -1, sell_last_price= -1;
   for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
      profit+=OrderProfit()+OrderSwap()+OrderCommission();
      if(OrderType()==0) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}              
      if(OrderType()==1) {if(sell_last_price==-1) sell_last_price=OrderOpenPrice();}
      }      
//----------------------------------------------------------------------------------------------------------------------------------------+
   for(i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
     if(NoLossStart>0 && OrderType()==0 && profit>0 && NormalizeDouble(buy_last_price,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-NoLossStart*Pp,Digits)>=NormalizeDouble(buy_last_price,Digits))
     modify=OrderModify(OrderTicket(),OrderOpenPrice(),buy_last_price+NoLoss*Pp,OrderTakeProfit(),0,DarkGray);

     if(NoLossStart>0 && OrderType()==1 && profit>0 && (NormalizeDouble(sell_last_price,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+NoLossStart*Pp,Digits)<=NormalizeDouble(sell_last_price,Digits))
     modify=OrderModify(OrderTicket(),OrderOpenPrice(),sell_last_price-NoLoss*Pp,OrderTakeProfit(),0,DarkGray);
       }
 
Natalya Dzerzhinskaya:

Функция NoLoss вам поможет !!

extern int     NoLoss = 3;
extern int     NoLossStart = 10;
//-----------------------------+

int i,modify;
double Pp;
string Symb;

void init() {
   Pp=Point;
   Symb=Symbol();
   return;
}
void start() {      
   double  profit=0, buy_last_price= -1, sell_last_price= -1;
   for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
      profit+=OrderProfit()+OrderSwap()+OrderCommission();
      if(OrderType()==0) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}              
      if(OrderType()==1) {if(sell_last_price==-1) sell_last_price=OrderOpenPrice();}
      }      
//----------------------------------------------------------------------------------------------------------------------------------------+
   for(i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
     if(NoLossStart>0 && OrderType()==0 && profit>0 && NormalizeDouble(buy_last_price,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-NoLossStart*Pp,Digits)>=NormalizeDouble(buy_last_price,Digits))
     modify=OrderModify(OrderTicket(),OrderOpenPrice(),buy_last_price+NoLoss*Pp,OrderTakeProfit(),0,DarkGray);

     if(NoLossStart>0 && OrderType()==1 && profit>0 && (NormalizeDouble(sell_last_price,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+NoLossStart*Pp,Digits)<=NormalizeDouble(sell_last_price,Digits))
     modify=OrderModify(OrderTicket(),OrderOpenPrice(),sell_last_price-NoLoss*Pp,OrderTakeProfit(),0,DarkGray);
       }

 Спасибо.

В коде переписал две строчки, ошибки  исчезли.

 

                string com=OrderComment();    
                double balans=StrToDouble(OrderComment());                
                {
                double profit=NormalizeDouble(p*100/balans,1);//с такой записью нет ошибки в журнале 130 и 4051
                if(profit>0.2 && profit<0.6) double odinprocent=Bid;                
                }