Вообще говоря, код неверный. Написав и проверив на двух терминалах с разными ДЦ отправил на публикацию. Одновременно переслал по e-mail в офис. И уже там, запустив на офисном компе обнаружил ошибку. Она заключается в том,что при равенстве цен открытия и закрытия ордера, для закрытых ордеров создаются два объекта одного типа с одним именем: стрелка для окрытия позиции и стрелка для закрытия. В результате значок открытия заменяется значком закрытия позиции, т. е. вновь созданный объект заменяет существующий с таким же именем. Исправленную версию закачал, но здесь вижу первоначальный вариант. Достаточно добавить ещё один пробел после названий операций в описании name= для стрелки закрытия позиции и имена станут уникальными.

//+------------------------------------------------------------------+ //| Show history.mq4 | //| Valmars | //| valmars@bk.ru | //+------------------------------------------------------------------+ #property copyright "Valmars" #property link "valmars@bk.ru" #property show_inputs extern color BUYcolor=Blue; extern color SELLcolor=Red; extern color PENDINGcolor=Yellow; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { // Удаление всех стрелок сделок с графика ObjectsDeleteAll(0,OBJ_ARROW); // Удаление всех линий закрытых позиций с графика for(int i = 0; i < ObjectsTotal(); i++) { if(ObjectType(ObjectName(i)) == OBJ_TREND) if(!ObjectGet(ObjectName(i), OBJPROP_RAY)) ObjectDelete(ObjectName(i)); } string name; // Имя объекта-стрелки int Arrow; // Код стрелки double Color; // Цвет стрелки // Проверка для всех открытых и отложенных ордеров for(i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS); // Символы ордера и графика не совпадают if(OrderSymbol() != Symbol()) continue; // Следующий ордер switch(OrderType()) // Параметры стрелок { case OP_BUY: Arrow = 1; Color = BUYcolor; name = OrderTicket() + " buy " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at "+ DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELL: Arrow = 2; Color = SELLcolor; name = OrderTicket() + " sell " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYLIMIT: Arrow = 1; Color = PENDINGcolor; name = OrderTicket() + " buylimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYSTOP: Arrow = 1; Color = PENDINGcolor; name = OrderTicket() + " buystop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLLIMIT: Arrow = 2; Color = PENDINGcolor; name = OrderTicket() + " selllimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLSTOP: Arrow = 2; Color = PENDINGcolor; name = OrderTicket() + " sellstop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; } // Стрелка открытия ордера ObjectCreate(name, OBJ_ARROW, 0, OrderOpenTime(), OrderOpenPrice()); ObjectSet(name, OBJPROP_ARROWCODE, Arrow); ObjectSet(name, OBJPROP_COLOR, Color); } // Проверка для всех закрытых и удалённых ордеров for(i = 0; i < HistoryTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); // Символы ордера и графика не совпадают if(OrderSymbol() != Symbol()) continue; // Следующий ордер switch(OrderType()) { case OP_BUY: Arrow = 1; Color = BUYcolor; name = OrderTicket() + " buy " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELL: Arrow = 2; Color = SELLcolor; name = OrderTicket() + " sell " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYLIMIT: Arrow = 1; Color = PENDINGcolor; name = OrderTicket() + " buylimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYSTOP: Arrow = 1; Color = PENDINGcolor; name = OrderTicket() + " buystop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLLIMIT: Arrow = 2; Color = PENDINGcolor; name = OrderTicket() + " selllimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLSTOP: Arrow = 2; Color = PENDINGcolor; name = OrderTicket() + " sellstop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; } // Стрелка открытия ордера ObjectCreate(name, OBJ_ARROW, 0, OrderOpenTime(), OrderOpenPrice()); ObjectSet(name, OBJPROP_ARROWCODE, Arrow); ObjectSet(name, OBJPROP_COLOR, Color); switch(OrderType()) { case OP_BUY: Arrow = 1; Color = BUYcolor; name = OrderTicket() + " buy " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELL: Arrow = 2; Color = SELLcolor; name = OrderTicket() + " sell " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYLIMIT: Arrow = 1; Color = PENDINGcolor; name = OrderTicket() + " buylimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYSTOP: Arrow = 1; Color = PENDINGcolor; name = OrderTicket() + " buystop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLLIMIT: Arrow = 2; Color = PENDINGcolor; name = OrderTicket() + " selllimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLSTOP: Arrow = 2; Color = PENDINGcolor; name = OrderTicket() + " sellstop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; } // Стрелка закрытия ордера ObjectCreate(name, OBJ_ARROW, 0, OrderCloseTime(), OrderClosePrice()); ObjectSet(name, OBJPROP_ARROWCODE, 3); ObjectSet(name, OBJPROP_COLOR, Color); // Прорисовка линий закрытых позиций name = OrderTicket() + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)) + "->" + DoubleToStr(OrderClosePrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); ObjectCreate(name, OBJ_TREND, 0, OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice()); ObjectSet(name, OBJPROP_STYLE, STYLE_DOT); ObjectSet(name, OBJPROP_WIDTH, 1); ObjectSet(name, OBJPROP_RAY, false); ObjectSet(name, OBJPROP_COLOR, Color); } return(0); } //+------------------------------------------------------------------+
Как в него загрузить данные про открытые/закрытые позиции по депозиту к которому нет on-line доступа. Возможно это делать из, например, Statement'а или другого файла.

//+------------------------------------------------------------------+ //| Show history.mq4 | //| Valmars | //| valmars@bk.ru | //+------------------------------------------------------------------+ #property copyright "Valmars" #property link "valmars@bk.ru" extern color BuyColor=Blue; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { // Удаление всех стрелок сделок с графика ObjectsDeleteAll(0,OBJ_ARROW); // Удаление всех линий закрытых позиций с графика for(int i = 0; i < ObjectsTotal(); i++) { if(ObjectType(ObjectName(i)) == OBJ_TREND) if(!ObjectGet(ObjectName(i), OBJPROP_RAY)) ObjectDelete(ObjectName(i)); } string name; // Имя объекта-стрелки int Arrow; // Код стрелки double Color; // Цвет стрелки // Проверка для всех открытых и отложенных ордеров for(i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS); // Символы ордера и графика не совпадают if(OrderSymbol() != Symbol()) continue; // Следующий ордер switch(OrderType()) // Параметры стрелок { case OP_BUY: Arrow = 1; Color = BuyColor; name = OrderTicket() + " buy " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at "+ DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELL: Arrow = 2; Color = Red; name = OrderTicket() + " sell " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYLIMIT: Arrow = 1; Color = Yellow; name = OrderTicket() + " buylimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYSTOP: Arrow = 1; Color = Yellow; name = OrderTicket() + " buystop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLLIMIT: Arrow = 2; Color = Yellow; name = OrderTicket() + " selllimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLSTOP: Arrow = 2; Color = Yellow; name = OrderTicket() + " sellstop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; } // Стрелка открытия ордера ObjectCreate(name, OBJ_ARROW, 0, OrderOpenTime(), OrderOpenPrice()); ObjectSet(name, OBJPROP_ARROWCODE, Arrow); ObjectSet(name, OBJPROP_COLOR, Color); ObjectSetText(name,name+":"+TimeToStr(OrderOpenTime(),TIME_DATE|TIME_SECONDS)); } // Проверка для всех закрытых и удалённых ордеров for(i = 0; i < HistoryTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); // Символы ордера и графика не совпадают if(OrderSymbol() != Symbol()) continue; // Следующий ордер switch(OrderType()) { case OP_BUY: Arrow = 1; Color = BuyColor; name = OrderTicket() + " buy " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELL: Arrow = 2; Color = Red; name = OrderTicket() + " sell " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYLIMIT: Arrow = 1; Color = Yellow; name = OrderTicket() + " buylimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYSTOP: Arrow = 1; Color = Yellow; name = OrderTicket() + " buystop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLLIMIT: Arrow = 2; Color = Yellow; name = OrderTicket() + " selllimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLSTOP: Arrow = 2; Color = Yellow; name = OrderTicket() + " sellstop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; } // Стрелка открытия ордера ObjectCreate(name, OBJ_ARROW, 0, OrderOpenTime(), OrderOpenPrice()); ObjectSet(name, OBJPROP_ARROWCODE, Arrow); ObjectSet(name, OBJPROP_COLOR, Color); ObjectSetText(name,name+":"+TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS)); switch(OrderType()) { case OP_BUY: Arrow = 1; Color = BuyColor; name = OrderTicket() + " buy " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELL: Arrow = 2; Color = Red; name = OrderTicket() + " sell " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYLIMIT: Arrow = 1; Color = Yellow; name = OrderTicket() + " buylimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_BUYSTOP: Arrow = 1; Color = Yellow; name = OrderTicket() + " buystop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLLIMIT: Arrow = 2; Color = Yellow; name = OrderTicket() + " selllimit " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; case OP_SELLSTOP: Arrow = 2; Color = Yellow; name = OrderTicket() + " sellstop " + DoubleToStr(OrderLots(), 2) + " " + OrderSymbol() + " at " + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); break; } // Стрелка закрытия ордера ObjectCreate(name, OBJ_ARROW, 0, OrderCloseTime(), OrderClosePrice()); ObjectSet(name, OBJPROP_ARROWCODE, 3); ObjectSet(name, OBJPROP_COLOR, Color); ObjectSetText(name,name+":"+TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS)); // Прорисовка линий закрытых позиций name = OrderTicket() + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)) + "->" + DoubleToStr(OrderClosePrice(), MarketInfo(OrderSymbol(), MODE_DIGITS)); ObjectCreate(name, OBJ_TREND, 0, OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice()); ObjectSet(name, OBJPROP_STYLE, STYLE_DOT); ObjectSet(name, OBJPROP_WIDTH, 1); ObjectSet(name, OBJPROP_RAY, false); ObjectSet(name, OBJPROP_COLOR, Color); } return(0); } //+------------------------------------------------------------------+
Еще один вариант скрипта, в поле Description пишется время открытия/закрытия с точностью до секунды. На рисунке подчеркнуто розовым цветом.
а как встроить подсчет ордеров ?
с http://forum.mql4.com/ru/16946

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Show history:
Author: Валерий