Советник, рисующий позиции на чарте у MT инвестора ...

 
Не знаю как сделать чтобы у пользователя с инвесторским паролем рисовались позиции на чарте как из истории так и открытые в данный момент.
Может быть уже есть для этого какой то советник. а пока предлагаю свой.
Советы и исправления ошибок, если такие найдутся, принимаются.
Похоже что можно добавить не много символов для всплывающей подсказки для объекта. Может быть это как-нибудь решается?
Я имею ввиду функцию ОbjectSetText

#property copyright ""
#property link      ""
 
int PosCnt, PosType, DrawnHistPosCnt = 0, p, d;
string ObjName, PosTypeStr;
 
int init()
{
   ObjectsDeleteAll();
   DisplayPositions();
   return(0);
}
 
int deinit()
{
   return(0);
}
 
int start()
{
   DisplayPositions();
   return(0);
}
 
void DisplayPositions() {
   PosCnt = OrdersTotal();
   DisplayHistoryPositions();
   for(p = 0; p < PosCnt; p++) {
      OrderSelect(p, SELECT_BY_POS);
      ObjName = "opn " + OrderTicket();
      if(ObjectFind(ObjName) != -1) continue;
      ObjectCreate(ObjName, OBJ_ARROW, 0, OrderOpenTime(), OrderOpenPrice());
      ObjectSet(ObjName, OBJPROP_ARROWCODE, 2);
      if(OrderType() == OP_BUY) { ObjectSet(ObjName, OBJPROP_COLOR, ForestGreen); PosTypeStr = "buy"; }
      else { ObjectSet(ObjName, OBJPROP_COLOR, Red); PosTypeStr = "sell"; }
      ObjectSetText(ObjName, "t: "  + PosTypeStr +  "\r\nl: " + DoubleToStr(OrderLots(), 2) +
                    "\r\nprf: " + DoubleToStr(OrderProfit(), 2) + "\r\nt:\r\n" + TimeToStr(OrderOpenTime()) +
                    "\r\npr:");
   }
}
 
void DisplayHistoryPositions() {
   if(DrawnHistPosCnt == OrdersHistoryTotal()) return; 
   for(p = DrawnHistPosCnt; p < OrdersHistoryTotal(); p++) {
      OrderSelect(p, SELECT_BY_POS, MODE_HISTORY);
      ObjName = "opn " + OrderTicket();
      if(ObjectFind(ObjName) == -1) {
         ObjectCreate(ObjName, OBJ_ARROW, 0, OrderOpenTime(), OrderOpenPrice());
         ObjectSet(ObjName, OBJPROP_ARROWCODE, 2);
         if(OrderType() == OP_BUY) { ObjectSet(ObjName, OBJPROP_COLOR, ForestGreen); PosTypeStr = "buy"; }
         else { ObjectSet(ObjName, OBJPROP_COLOR, Red); PosTypeStr = "sell"; }
         ObjectSetText(ObjName, "t: "  + PosTypeStr +  "\r\nl: " + DoubleToStr(OrderLots(), 2) +
                    "\r\nprf: " + DoubleToStr(OrderProfit(), 2) + "\r\nt:\r\n" + TimeToStr(OrderOpenTime()) +
                    "\r\npr:");
      }
      ObjName = "line " + OrderTicket();
      ObjectCreate(ObjName, OBJ_TREND, 0, OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice());
      ObjectSet(ObjName, OBJPROP_RAY, false);
      ObjectSet(ObjName, OBJPROP_STYLE, STYLE_DOT);
      if(OrderType() == OP_BUY) ObjectSet(ObjName, OBJPROP_COLOR, LimeGreen);
      else ObjectSet(ObjName, OBJPROP_COLOR, Red);
      ObjName = "cls " + OrderTicket();
      ObjectCreate(ObjName, OBJ_ARROW, 0, OrderCloseTime(), OrderClosePrice());
      ObjectSet(ObjName, OBJPROP_ARROWCODE, 3);
      ObjectSet(ObjName, OBJPROP_COLOR, Red);
      if(OrderType() == OP_BUY) ObjectSet(ObjName, OBJPROP_COLOR, ForestGreen);
      else ObjectSet(ObjName, OBJPROP_COLOR, Red);
      ObjectSetText(ObjName, "t: "  + PosTypeStr +  "\r\nl: " + DoubleToStr(OrderLots(), 2) +
                    "\r\nprf: " + DoubleToStr(OrderProfit(), 2) + "\r\nt:\r\n" + TimeToStr(OrderCloseTime()) +
                    "\r\npr:");
   }
   DrawnHistPosCnt = OrdersHistoryTotal();
   WindowRedraw();
}
 
посмотри вот это 'History_Draw'
 
drknn:
посмотри вот это 'History_Draw'
Спасибо, посмотрю как он сделал. Только у него скрипт а у меня советник, который обновляет постоянно исторические позиции на экране и так же те которые открыты. Как они будут закрыты, то нарисует законченную связку для позиции.
Причина обращения: