Напишу советник бесплатно - страница 189

 
Alexey Viktorov #:

Так я с этого и начал


Меня-то зачем лечить?

Алексей, это Вы мне говорите поменять? Вместо того что писали раньше лучше сделать вот так:
if(OrderSelect(ticket)
 
Andrey Kuharev #:

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

Я правильно понимаю. Я увижу ошибку и после этого будет понятно что исправлять?

Выложите сюда функцию SetTakeProfit и мы ее поправим
 
Tretyakov Rostyslav #:
Выложите сюда функцию SetTakeProfit и мы ее поправим

Я правильно понял? Вот нашёл раздел где обозначается сеттейкпрофит:

//----------------------------------------------------------------------------     
void SetTakeProfit(int orderType, int orderMagic)
   {
   double avgPrice = 0;
   double sumLots  = 0;
   for (int order=OrdersTotal()-1; order >= 0; order--)
      {
      returnvalue=OrderSelect(order, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         avgPrice += OrderOpenPrice()*OrderLots();
         sumLots  += OrderLots();
         }
      }
   
   double newTakeProfit=avgPrice/sumLots;
   if (orderType==OP_BUY)
      newTakeProfit=newTakeProfit+TakeProfit*Point;
   else
      newTakeProfit=newTakeProfit-TakeProfit*Point;
   newTakeProfit=NormalizeDouble(newTakeProfit,Digits);
   
   for (order=OrdersTotal()-1; order>=0; order--)
      {
      returnvalue=OrderSelect(order, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         returnvalue=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newTakeProfit,0,clrYellow);
         }
      }
   }      
//----------------------------------------------------------------------------  

 
Andrey Kuharev #:

Я правильно понял? Вот нашёл раздел где обозначается сеттейкпрофит:


Да, Вы правильно поняли. Для удобства код на форуме вставляйте через кнопку

 
Ок.
 
Andrey Kuharev #:

Я правильно понял? Вот нашёл раздел где обозначается сеттейкпрофит:

//----------------------------------------------------------------------------     
void SetTakeProfit(int orderType, int orderMagic)
   {
   double avgPrice = 0;
   double sumLots  = 0;
   for (int order=OrdersTotal()-1; order >= 0; order--)
      {
      returnvalue=OrderSelect(order, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         avgPrice += OrderOpenPrice()*OrderLots();
         sumLots  += OrderLots();
         }
      }
   
   double newTakeProfit=avgPrice/sumLots;
   if (orderType==OP_BUY)
      newTakeProfit=newTakeProfit+TakeProfit*Point;
   else
      newTakeProfit=newTakeProfit-TakeProfit*Point;
   newTakeProfit=NormalizeDouble(newTakeProfit,Digits);
   
   for (order=OrdersTotal()-1; order>=0; order--)
      {
      returnvalue=OrderSelect(order, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         returnvalue=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newTakeProfit,0,clrYellow);
         }
      }
   }      
//----------------------------------------------------------------------------  

ещё учесть что OrderSelect часто бывает false и есть  много чего помимо OP_BUY (в вашем примере - нельзя просто тупо ставить else и аккуратнее надо считать среднюю цену)

 и ещё тьма нюансов, но чтобы на раз-два запустить можно их потом

 
Andrey Kuharev #:

Я правильно понял? Вот нашёл раздел где обозначается сеттейкпрофит:

void SetTakeProfit(int tck, int orderType, int orderMagic)
   {
   double avgPrice = 0;
   double sumLots  = 0;
   for (int order=OrdersTotal()-1; order >= 0; order--)
      {
      returnvalue=OrderSelect(tck, SELECT_BY_TICKET);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         avgPrice += OrderOpenPrice()*OrderLots();
         sumLots  += OrderLots();
         }
      }
   
   double newTakeProfit=avgPrice/sumLots;
   if (orderType==OP_BUY)
      newTakeProfit=newTakeProfit+TakeProfit*Point;
   else
      newTakeProfit=newTakeProfit-TakeProfit*Point;
   newTakeProfit=NormalizeDouble(newTakeProfit,Digits);
   
   for (order=OrdersTotal()-1; order>=0; order--)
      {
      returnvalue=OrderSelect(tck, SELECT_BY_TICKET);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newTakeProfit,0,clrYellow))
         Print("Modify OK!"); else Print(GetLastError());
         }
      }
   }
Все что выделено исправьте в этой функции

а в коде исправьте это

if (ticket>0)
{
SetTakeProfit(ticket,OP_BUY,MagicBuy);
} else Print(GetLastError());

если будут пропуски в установке ТП - смотрите журнал на наличие ошибок

 
Tretyakov Rostyslav #:
Все что выделено исправьте в этой функции

а в коде исправьте это

если будут пропуски в установке ТП - смотрите журнал на наличие ошибок

Ага. СПАСИБО!
 
Tretyakov Rostyslav #:
Все что выделено исправьте в этой функции

а в коде исправьте это

если будут пропуски в установке ТП - смотрите журнал на наличие ошибок

..теперь перестало и вовсе выставлять ТП..
 
Tretyakov Rostyslav #:
Все что выделено исправьте в этой функции

а в коде исправьте это

если будут пропуски в установке ТП - смотрите журнал на наличие ошибок

Ростислав, при более внимательном просмотре кода я вдруг обнаружил, что и мой совет и все остальные совсем не подходят. Тут сделано так, что при каждом открытии очередного ордера пересчитывается общий ТП и всем ордерам ставится новый ТП.

Тут надо разобраться в причине пропуска. Надо смотреть распечатку, но клиент, видимо, этого не умеет.

А к этому вашему коду есть такой вопрос:

   for (int order=OrdersTotal()-1; order >= 0; order--)
      {
      returnvalue=OrderSelect(tck, SELECT_BY_TICKET);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==orderMagic)
         {
         avgPrice += OrderOpenPrice()*OrderLots();
         sumLots  += OrderLots();
         }
      }

Если ордер выбирается по тикету, то зачем всё это заворачивать в цикл¿¿¿

Причина обращения: