Информационный индикатор позиций, сделок и ордеров.

 

Выкладываю на всеобщее обозрение индикатор выводящий информацию о позициях, сделках и ордерах. 
Написано на скорую руку для упрощения анализа работы советников.

Основной модуль:

//============================================================================================= MQL5 ===
//    LibreInfoPDO v1.001 MQL5
//    Главный модуль обработки событий
//    Librecoin(c)2014-2017
//============================================================================================= MQL5 ===
//    REVIEWS
//------------------------------------------------------------------------------------------------------
//    Вывод инфо об активных и исторических позициях, сделках, ордерах.
//============================================================================================= MQL5 ===
//    PROPERTY
//------------------------------------------------------------------------------------------------------
#define     ver            "1.001"
#property   copyright      "Librecoin(c)2014-2017"
#property   link           "https://www.mql5.com/ru/users/kirillovyv"
#property   strict
#property   description    "**************************************************"
#property   description    "  Positions info v"+ver+" (MQL5)" 
#property   description    "  Positions, deals, orders info" 
#property   description    "  From Russia with Love!  :-)"
#property   description    "  https://www.mql5.com/ru/users/kirillovyv"
#property   description    "**************************************************"
#property   version        ver
const       string         vers  =  "LiBREiNFOPDO v"+ver;    //Version
//============================================================================================= MQL5 ===
//    INDICATOR PROPERTY
//------------------------------------------------------------------------------------------------------
#property   indicator_separate_window
#property   indicator_label1 "LiBREiNFOPDO"
#property   indicator_buffers 1
#property   indicator_plots   1
//============================================================================================= MQL5 ===
//    INCLUDE
//------------------------------------------------------------------------------------------------------
//----- Определения переменных и структур
#include "Include\LIP_Def_5_v1.001.mqh"         //Определения переменных и структур MQL5
//----- Интерфейс настроек
#include "Include\LIP_Int_5_v1.001.mqh"         //Интерфейс настроек MQL4/5
//----- Главный алгоритм
#include "Include\LIP_Man_5_v1.001.mqh"         //Главный алгоритм MQL5
//----- Прочее (функции, расчеты, графика)
#include "Include\LIP_Fun3_5_v1.001.mqh"        //Графика, вывод на чарт и преобразования вывода MQL5
//
//============================================================================================= MQL5 ===
//    MAIN EVENT HANDLERS
//------------------------------------------------------------------------------------------------------
//
//============================================================================================= MQL5 ===
//    OnInit()
//------------------------------------------------------------------------------------------------------
int OnInit()
{
   On_Init();
//-----
   return(INIT_SUCCEEDED);
}//OnInit()
//
//============================================================================================= MQL5 ===
//    OnCalculate()
//------------------------------------------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
//-----
   On_Tick();   
//-----
   return(rates_total);
}//OnCalculate()
//
//============================================================================================= MQL5 ===
//    OnTimer()
//------------------------------------------------------------------------------------------------------
void OnTimer(){
//-----
   On_Timer();   
//-----
   return;
}//OnTimer()
//
//============================================================================================= MQL5 ===
//    OnDeinit()
//------------------------------------------------------------------------------------------------------
void OnDeinit(const int reason){
//-----
//Удалить инфо с экрана
   ObjectDelete(0,"LIP_C");//Position
   ObjectDelete(0,"LIO_C");//Order
   ObjectDelete(0,"LHO_C");//History order
   ObjectDelete(0,"LHD_C");//History deal
   ColoDelete("LIP");//Колонка позиций
   ColoDelete("LIO");//Колонка ордеров
   ColoDelete("LHO");//Колонка истории ордеров
   ColoDelete("LHD");//Колонка сделок
   Comment("");
   EventKillTimer();
//-----
   return;
}//OnDeinit()

Определения переменных:

//============================================================================================= MQL5 ===
//    LibreInfoPDO Definition_5 v1.001 MQL5
//    Определения переменных и структур
//    LibreCoin (c)2014-2017      
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    ENUM
//------------------------------------------------------------------------------------------------------
enum enSymSelMode
{
   SymSel_all  =  0,
   SymSel_curr =  1,
   SymSel_user =  2,
};
//============================================================================================= MQL5 ===
//    Global variable definition
//------------------------------------------------------------------------------------------------------
string   _n="\n";
string   _s="\n                               ";
string   _f="\n";
//----- для событий времени и таймера
ulong    gnTimer        =  0;                                                          //Глобальный счетчик событий Timer
ulong    gnTick         =  0;                                                          //Глобальный счетчик событий NewTick
int      MSTimerSet     =  50;                                                         //Установка таймера 15 миллисекунд
bool     gInTimer       =  false;                                                      //Флаг поступления тика из таймера
long     IndHeigh       =  1050;                   //Верт размер индикатора       
//int      nOrderList     =  1000;                   //Размер списка ордеров (сделок,позиций)          
MqlDateTime 
         DateTimeCurrent;
datetime    
         TimeCurrentMinutes;
string   PositionDataString="";
string   OrderDataString="";
string   DealDataString="";
string   PosTypeString="";
string   OrdTypeString="";
string   DealTypeString="";
string   inSymbolSelector="EURUSD";

Интерфейс настроек:

//============================================================================================= MQL5 ===
//    LibreInfoPDO Interface_5 v1.001 MQL5
//    Интерфейс настроек
//    LibreCoin (c)2014-2017    
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    INTERFACE
//------------------------------------------------------------------------------------------------------
input    string   Sid                  =  "LIP v"+ver;   //===== Set Identifier
//input    string   TradeComment         =  "LN v"+ver; //Comment
input enSymSelMode SymSel              =  SymSel_curr;   //SymSel Symbol Select Mode
input    string   SymbolSelector       =  "EURUSD";      //SymbolSelector for User Mode
input    int      nOrderList           =  250;           //nOrderList Размер списка ордеров (сделок,позиций)          


Файлы:
 

Главный алгоритм:

//============================================================================================= MQL5 ===
//    LibreInfoPDO Main_5 v1.001 MQL5
//    Модуль обработки событий
//    LibreCoin (c)2014-2017      
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    EVENT PROCESSING MODULE
//------------------------------------------------------------------------------------------------------
//
//============================================================================================= MQL5 ===
//    On_Init()  - инициализация советника
//------------------------------------------------------------------------------------------------------
int On_Init(){
   gnTick=0;
   gInTimer=false;
//----- Настройки для отбора по инструменту
   {switch(SymSel)
   {
      case SymSel_curr:
         {
            inSymbolSelector=Symbol();
            break;
         }
      case SymSel_user:
         {
            inSymbolSelector=SymbolSelector;
            break;
         }
      case SymSel_all:
         {
            inSymbolSelector="";
            break;
         }
      default:
         {
            inSymbolSelector="";
            break;
         }
   }}//switch(SymSel)
//----- Настройки таймера и глобальных счетчиков
   //onTimer=false;                                   //флаг нахождения в обработчике таймера - для блокировки других обработчиков
   MSTimerSet=200;                                     //Установка таймера XXX миллисекунд
   {if(!MQLInfoInteger(MQL_TESTER))//Не тестирование
   { 
      int err=-1;
      int count=50;
      {while((err!=0)&&(count>0))
      {
         ResetLastError();
         EventSetMillisecondTimer(MSTimerSet);        //Установка таймера XXX миллисекунд
         err=GetLastError();
         {if(err!=0)
         {
            Sleep(50);
            Print("EventSetMillisecondTimer n=",count," err >>",err);
         }}//if(err!=0)
         count--;
      }}//while((err!=0)&&(count>0))
   }}//if(!MQLInfoInteger(MQL_TESTER))
//-----
   IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,1);
   IndicatorSetDouble(INDICATOR_MINIMUM,0.0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh);
//-----   
   TimeToStruct(TimeCurrent(),DateTimeCurrent);
   DateTimeCurrent.sec=0;
   TimeCurrentMinutes=StructToTime(DateTimeCurrent);
   double kScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
//-----
   //string sTXW="";//Имя для текcтового объекта
//----- Открытые позиции
   ColoLabelCreate("LIP",0);//Устанавливаем имя для текстового объекта
   ColoCreate("LIP",0);
//----- Открытые отложенные ордера
   ColoLabelCreate("LIO",300);//Устанавливаем имя для текстового объекта
   ColoCreate("LIO",300);
//----- Выполненные ордера в истории
   ColoLabelCreate("LHO",600);//Устанавливаем имя для текстового объекта
   ColoCreate("LHO",600);
//----- Сделки
   ColoLabelCreate("LHD",900);//Устанавливаем имя для текстового объекта
   ColoCreate("LHD",900);
//-----
   return(INIT_SUCCEEDED);
}//On_Init()
//
//============================================================================================= MQL5 ===
//  On_Tick() - Основной обработчик тиков
//------------------------------------------------------------------------------------------------------
void On_Tick(){
   //Print(IntegerToString(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS))+" "+IntegerToString(ChartGetInteger(0,CHART_WIDTH_IN_BARS)));
//-----
string CommentLine[10];
//-----
   //{if(!gInTimer)
   //{
      gnTick++;
   //   gInTimer=false;
   //}}//if(!InTimer)
   {if(gnTick>4294967000)
   {
      gnTick=100;
   }}//if(gnTick>4294967000)
//-----   
   IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,1);
   IndicatorSetDouble(INDICATOR_MINIMUM,0.0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh);//32x32
//----- Запрашиваем историю сделок и ордеров за указанный период серверного времени.
   {if(!HistorySelect(0,TimeCurrent()))
   {
      Print("HistorySelect Error!");
      return;
   }}//Если неудачно - выходим
//----- Определение количества ордеров, сделок, позиций
int Orders_Total=OrdersTotal();                    //Текущие лимитные ордера
int History_Orders_Total=HistoryOrdersTotal();     //Закрытые рыночные ордера
int History_Deals_Total=HistoryDealsTotal();       //Совершенные сделки (выполненные ордера)
int Positions_Total=PositionsTotal();              //Текущие позиции
//-----
//CommentLine[0]=""+
//   "OrdersTotal="+IntegerToString(Orders_Total)+" "+
//   "PositionsTotal="+IntegerToString(Positions_Total)+" "+
//   "";
//CommentLine[1]=""+
//   "HistoryOrdersTotal="+IntegerToString(History_Orders_Total)+" "+
//   "HistoryDealsTotal="+IntegerToString(History_Deals_Total)+" "+
//   "";
//----- Формирование списков ордеров, сделок, позиций 
   TimeToStruct(TimeCurrent(),DateTimeCurrent);
   DateTimeCurrent.sec=0;
   TimeCurrentMinutes=StructToTime(DateTimeCurrent);
   string sTXW="";//Имя для текcтового объекта
   int   nRow=0;//Счетчик строк вывода
   double kScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
   //Заголовки колонок
   ColoLabelMove("LIP",0,"Position");
   ColoLabelMove("LIO",300,"Order");
   ColoLabelMove("LHO",600,"History Order");
   ColoLabelMove("LHD",900,"History Dial");
//----- Список открытых позиций
   {if(Positions_Total>=0)
   {
      nRow=0;
      {for(int i=nOrderList-1;i>=0;i--)
      //{for(int i=0;i<=nOrderList-1;i++)
      {
         sTXW="LIP_"+IntegerToString(i);//Устанавливаем имя для текcтового объекта
         ObjectSetString(0,sTXW,OBJPROP_TEXT," ");
         ulong Pos_Tick=PositionGetTicket(i);//Выбираем позицию по номеру в списке
         {if(Pos_Tick<=0){continue;}}//Неудачно - следующий
         {if((SymSel!=SymSel_all)&&(inSymbolSelector!=PositionGetString(POSITION_SYMBOL))){continue;}}//Не тот символ - следующий
         //{if(!PositionSelectByTicket(Pos_Tick)){continue;}}//Выбираем позицию по тикету? Неудачно - следующий
         ENUM_POSITION_TYPE OrdType=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         PosTypeString=EnumToString(OrdType);
         StringReplace(PosTypeString,"POSITION_TYPE_","");
         PositionDataString=  "    "+
                              IntegerToString(i)+"."+
                              PositionGetString(POSITION_SYMBOL)+" "+
                              PosTypeString+" ["+
                              IntegerToString(Pos_Tick)+"-"+
                              IntegerToString(PositionGetInteger(POSITION_MAGIC))+"-"+
                              DoubleToString(PositionGetDouble(POSITION_VOLUME),2)+"-"+
                              DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),
                                             (int)SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_DIGITS))+"]="+
                              DoubleToString(PositionGetDouble(POSITION_PROFIT),2)+" "+
                              "";
         ResetLastError();
         {if(!ObjectSetInteger(
                        0,                                                             //Идентификатор чарта
                        sTXW,                                                          //Имя объекта
                        OBJPROP_TIME,                                                  //Изменяем координату времени объекта
                        (datetime)(TimeCurrentMinutes-(-3*kScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1))*PeriodSeconds(PERIOD_CURRENT))
                      ))
         {
            Print("ObjectSetInteger0 Error=",GetLastError());
            continue;
         }}//if(!ObjectSetInteger(...
         ResetLastError();
         {if(!ObjectSetDouble(
                        0,                                                             //Идентификатор чарта
                        sTXW,                                                          //Имя объекта
                        OBJPROP_PRICE,                                                 //Изменяем координату времени объекта
                        IndHeigh-11*(nRow+1)
                      ))
         {
            Print("ObjectSetDouble0 Error=",GetLastError());
            continue;
         }else{
            nRow++;
         }}//if(!ObjectSetDouble(...
         ObjectSetString(0,sTXW,OBJPROP_TEXT,PositionDataString+"");
      }}//for(int i=1;i<=nOrderList;i++)
   }}//if(Positions_Total>=0)
//----- Список открытых отложенных ордеров
   {if(Orders_Total>=0)
   {
      nRow=0;
      {for(int i=nOrderList-1;i>=0;i--)
      //{for(int i=0;i<=nOrderList-1;i++)
      {
         sTXW="LIO_"+IntegerToString(i);//Устанавливаем имя для текcтового объекта
         ObjectSetString(0,sTXW,OBJPROP_TEXT," ");
         ulong Ord_Tick=OrderGetTicket(i);//Выбираем ордер по номеру в списке
         {if(Ord_Tick<=0){continue;}}//Неудачно - следующий
         {if((SymSel!=SymSel_all)&&(inSymbolSelector!=OrderGetString(ORDER_SYMBOL))){continue;}}//Не тот символ - следующий
         //{if(!OrderSelect(Ord_Tick)){continue;}}//Выбираем ордер по тикету? Неудачно - следующий
         ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
         OrdTypeString=EnumToString(OrdType);
         StringReplace(OrdTypeString,"ORDER_TYPE_","");
         OrderDataString=  "    "+
                           IntegerToString(i)+"."+
                           OrderGetString(ORDER_SYMBOL)+" "+
                           OrdTypeString+" ["+
                           IntegerToString(Ord_Tick)+"-"+
                           IntegerToString(OrderGetInteger(ORDER_MAGIC))+"-"+
                           DoubleToString(OrderGetDouble(ORDER_VOLUME_CURRENT),2)+"-"+
                           DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),(int)SymbolInfoInteger(OrderGetString(ORDER_SYMBOL),SYMBOL_DIGITS))+"]"+
                           //DoubleToString(OrderGetDouble(POSITION_PROFIT),2)+" "+
                           "";
         ResetLastError();
         {if(!ObjectSetInteger(
                        0,                                                             //Идентификатор чарта
                        sTXW,                                                          //Имя объекта
                        OBJPROP_TIME,                                                  //Изменяем координату времени объекта
                        //(datetime)(TimeCurrentMinutes-(1+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-300)*PeriodSeconds(PERIOD_CURRENT))//CHART_WIDTH_IN_PIXELS CHART_WIDTH_IN_BARS
                        (datetime)(TimeCurrentMinutes-(ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-300*kScale)*PeriodSeconds(PERIOD_CURRENT))//CHART_WIDTH_IN_PIXELS CHART_WIDTH_IN_BARS
                      ))
         {
            Print("ObjectSetInteger1 Error=",GetLastError());
            continue;
         }}//if(!ObjectSetInteger(...
         ResetLastError();
         {if(!ObjectSetDouble(
                        0,                     //Идентификатор чарта
                        sTXW,                  //Имя объекта
                        OBJPROP_PRICE,         //Изменяем координату времени объекта
                        IndHeigh-11*(nRow+1)
                      ))
         {
            Print("ObjectSetDouble1 Error=",GetLastError());
            continue;
         }else{
            nRow++;
         }}//if(!ObjectSetDouble(...
         ObjectSetString(0,sTXW,OBJPROP_TEXT,OrderDataString+"");
      }}//for(int i=1;i<=nOrderList;i++)
   }}//if(Positions_Total>=0)
//----- Список ордеров в истории
   {if(History_Orders_Total>=0)
   {
      nRow=0;
      {for(int i=nOrderList-1;i>=0;i--)
      //{for(int i=0;i<=nOrderList-1;i++)
      {
         sTXW="LHO_"+IntegerToString(i);//Устанавливаем имя для текcтового объекта
         ObjectSetString(0,sTXW,OBJPROP_TEXT," ");
         ulong Ord_Tick=HistoryOrderGetTicket(i);//Выбираем ордер по номеру в списке
         {if(Ord_Tick<=0){continue;}}//Неудачно - следующий
         {if((SymSel!=SymSel_all)&&(inSymbolSelector!=HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL))){continue;}}//Не тот символ - следующий
         //{if(!HistoryOrderSelect(Ord_Tick)){continue;}}//Выбираем ордер по тикету? Неудачно - следующий
         ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(Ord_Tick,ORDER_TYPE);
         OrdTypeString=EnumToString(OrdType);
         StringReplace(OrdTypeString,"ORDER_TYPE_","");
         OrderDataString=  "    "+
                           IntegerToString(i)+"."+
                           HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL)+" "+
                           OrdTypeString+" ["+
                           IntegerToString(Ord_Tick)+"-"+
                           IntegerToString(HistoryOrderGetInteger(Ord_Tick,ORDER_MAGIC))+"-"+
                           DoubleToString(HistoryOrderGetDouble(Ord_Tick,ORDER_VOLUME_INITIAL),2)+"-"+
                           DoubleToString(HistoryOrderGetDouble(Ord_Tick,ORDER_PRICE_OPEN),
                                          (int)SymbolInfoInteger(HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL),SYMBOL_DIGITS))+"]"+
                           //DoubleToString(HistoryOrderGetDouble(ORDER_PROFIT),2)+" "+
                           "";
         ResetLastError();
         {if(!ObjectSetInteger(
                        0,                       //Идентификатор чарта
                        sTXW,                    //Имя объекта
                        OBJPROP_TIME,            //Изменяем координату времени объекта
                        (datetime)(TimeCurrentMinutes-(ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-600*kScale)*PeriodSeconds(PERIOD_CURRENT))
                      ))
         {
            Print("ObjectSetInteger2 Error=",GetLastError());
            continue;
         }}//if(!ObjectSetInteger(...
         ResetLastError();
         {if(!ObjectSetDouble(
                        0,                       //Идентификатор чарта
                        sTXW,                    //Имя объекта
                        OBJPROP_PRICE,           /Изменяем координату времени объекта
                        IndHeigh-11*(nRow+1)
                      ))
         {
            Print("ObjectSetDouble2 Error=",GetLastError());
            continue;
         }else{
            nRow++;
         }}//if(!ObjectSetDouble(...
         ObjectSetString(0,sTXW,OBJPROP_TEXT,OrderDataString+"");
      }}//for(int i=1;i<=nOrderList;i++)
   }}//if(Positions_Total>=0)
//----- Список сделок в истории
   {if(History_Deals_Total>=0)
   {
      nRow=0;
      {for(int i=nOrderList-1;i>=0;i--)
      //{for(int i=0;i<=nOrderList-1;i++)
      {
         sTXW="LHD_"+IntegerToString(i);//Устанавливаем имя для текcтового объекта
         ObjectSetString(0,sTXW,OBJPROP_TEXT," ");
         ulong Deal_Tick=HistoryDealGetTicket(i);//Выбираем ордер по номеру в списке
         {if(Deal_Tick<=0){continue;}}//Неудачно - следующий
         {if((SymSel!=SymSel_all)&&(inSymbolSelector!=HistoryDealGetString(Deal_Tick,DEAL_SYMBOL))){continue;}}//Не тот символ - следующий
         //{if(!HistoryDealSelect(Ord_Tick)){continue;}}//Выбираем ордер по тикету? Неудачно - следующий При таком выборе история сбрасывается!!!
         ENUM_DEAL_TYPE DealType=(ENUM_DEAL_TYPE)HistoryDealGetInteger(Deal_Tick,DEAL_TYPE);
         DealTypeString=EnumToString(DealType);
         StringReplace(DealTypeString,"DEAL_TYPE_","");
         DealDataString=  "    "+
                           IntegerToString(i)+"."+
                           HistoryDealGetString(Deal_Tick,DEAL_SYMBOL)+" "+
                           DealTypeString+" ["+
                           IntegerToString(Deal_Tick)+"-"+
                           IntegerToString(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC))+"-"+
                           DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_VOLUME),2)+"-"+
                           DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_PRICE),
                                          (int)SymbolInfoInteger(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),SYMBOL_DIGITS))+"]="+
                           DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_PROFIT),2)+" "+
                           "";
         ResetLastError();
         {if(!ObjectSetInteger(
                        0,                    //Идентификатор чарта
                        sTXW,                 //Имя объекта
                        OBJPROP_TIME,         //Изменяем координату времени объекта
                        (datetime)(TimeCurrentMinutes-(ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-900*kScale)*PeriodSeconds(PERIOD_CURRENT))
                      ))
         {
            Print("ObjectSetInteger3 Error=",GetLastError());
            continue;
         }}//if(!ObjectSetInteger(...
         ResetLastError();
         {if(!ObjectSetDouble(
                        0,                    //Идентификатор чарта
                        sTXW,                 //Имя объекта
                        OBJPROP_PRICE,        //Изменяем координату времени объекта
                        IndHeigh-11*(nRow+1)
                      ))
         {
            Print("ObjectSetDouble3 Error=",GetLastError());
            continue;
         }else{
            nRow++;
         }}//if(!ObjectSetDouble(...
         ObjectSetString(0,sTXW,OBJPROP_TEXT,DealDataString+"");
      }}//for(int i=1;i<=nOrderList;i++)
   }}//if(Positions_Total>=0)
//----- 
   ChartRedraw();
   //Comment( CommentLine[0]+" "+CommentLine[1]+" "+
   //         (string)(datetime)(TimeCurrent()-ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0)*PeriodSeconds(PERIOD_CURRENT))+" "+
   //         _n+"Ticks>>"+IntegerToString(gnTick)+" Tims>>"+IntegerToString(gnTimer));
//-----
   return;
}//On_Tick()
//
//============================================================================================= MQL5 ===
//    On_Timer - Обработка событий по таймеру
//------------------------------------------------------------------------------------------------------
void On_Timer(){
//-----
   gnTimer++;
   {if(gnTimer>4294967000)
   {
      gnTimer=100;
   }}//if(gnTimer>4294967000)
   gInTimer=true;
   On_Tick();   
}//On_Timer()
 

Графика:

//======================================================================================================
//    LibreInfoPDO Function3_5 v1.001 MQL5
//    Графика, вывод на чарт и преобразования вывода
//    Librecoin (c)2014-2017
//======================================================================================================
#property strict
//======================================================================================================
//  ColoLabelCreate() - Создание колонтитула
//    Вход:
//       iGName      -  имя граф объекта
//       iShift      -  сдвиг по горизонтали
//======================================================================================================
void ColoLabelCreate(string   iGName,
                     int      iShift){
//-----
   string sTXW=iGName+"_C";
   double ikScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
   {if(ObjectCreate(
                        0,
                        sTXW,
                        OBJ_TEXT,
                        1,
                        (datetime)(TimeCurrentMinutes-(-3*ikScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-(iShift+100)*ikScale)*PeriodSeconds(PERIOD_CURRENT)),
                        IndHeigh
                     )
       )
   {
      ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //выводим текст
      ObjectSetString(0,sTXW,OBJPROP_FONT,"Arial"); // установим шрифт текста 
      ObjectSetInteger(0,sTXW,OBJPROP_FONTSIZE,8); // установим размер шрифта
      ObjectSetDouble(0,sTXW,OBJPROP_ANGLE,0.0); // установим угол наклона текста
      ObjectSetInteger(0,sTXW,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);// установим способ привязки 
      ObjectSetInteger(0,sTXW,OBJPROP_COLOR,clrAqua); // установим цвет
      ObjectSetInteger(0,sTXW,OBJPROP_BACK,false); // отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(0,sTXW,OBJPROP_SELECTABLE,false); // включим (true) или отключим (false) режим перемещения объекта мышью 
      ObjectSetInteger(0,sTXW,OBJPROP_SELECTED,false); 
      ObjectSetInteger(0,sTXW,OBJPROP_HIDDEN,false); // скроем (true) или отобразим (false) имя графического объекта в списке объектов
      ObjectSetInteger(0,sTXW,OBJPROP_ZORDER,0); // установим приоритет на получение события нажатия мыши на графике 
   }}//if(!ObjectCreate(...
}//ColoLabelCreate()
//
//======================================================================================================
//  ColoCreate() - Создание колонки
//    Вход:
//       iGName      -  имя граф объекта
//       iShift      -  сдвиг по горизонтали
//======================================================================================================
void ColoCreate(  string   iGName,
                  int      iShift){
//-----
   string sTXW="";
   double ikScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
   {for(int i=0;i<=nOrderList-1;i++)
   {
      sTXW=iGName+"_"+IntegerToString(i);//Устанавливаем имя для текстового объекта
      //Создание (пересоздание) объекта, позиция привязки
      ResetLastError();
      {if(!ObjectCreate(
                           0,
                           sTXW,
                           OBJ_TEXT,
                           1,
                           (datetime)(TimeCurrentMinutes-(-3*ikScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-iShift*ikScale)*PeriodSeconds(PERIOD_CURRENT)),
                           IndHeigh-11.0*(i+1)
                        )
          )
      {
         Print("ObjectCreate0 Error=",GetLastError());
         continue;
      }}//if(!ObjectCreate(...
      ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //выводим текст
      ObjectSetString(0,sTXW,OBJPROP_FONT,"Arial"); // установим шрифт текста 
      ObjectSetInteger(0,sTXW,OBJPROP_FONTSIZE,8); // установим размер шрифта
      ObjectSetDouble(0,sTXW,OBJPROP_ANGLE,0.0); // установим угол наклона текста
      ObjectSetInteger(0,sTXW,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);// установим способ привязки 
      ObjectSetInteger(0,sTXW,OBJPROP_COLOR,clrAqua); // установим цвет
      ObjectSetInteger(0,sTXW,OBJPROP_BACK,false); // отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(0,sTXW,OBJPROP_SELECTABLE,false); // включим (true) или отключим (false) режим перемещения объекта мышью 
      ObjectSetInteger(0,sTXW,OBJPROP_SELECTED,false); 
      ObjectSetInteger(0,sTXW,OBJPROP_HIDDEN,false); // скроем (true) или отобразим (false) имя графического объекта в списке объектов
      ObjectSetInteger(0,sTXW,OBJPROP_ZORDER,0); // установим приоритет на получение события нажатия мыши на графике 
   }}//for(int i=0;i<nOrderList;i++)
}//ColoCreate()
//
//======================================================================================================
//  ColoLabelMove() - Перемещение заголовка
//    Вход:
//       iGName       -  имя граф объекта
//       iShift     -  сдвиг по горизонтали
//======================================================================================================
void ColoLabelMove(  string   iGName,
                     int      iShift,
                     string   iLabel){
//-----
   string sTXW=iGName+"_C";
   double ikScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
   {if(ObjectSetInteger(
                  0,                                                             //Идентификатор чарта
                  sTXW,                                                         //Имя объекта
                  OBJPROP_TIME,                                                  //Изменяем координату времени объекта
                  (datetime)(TimeCurrentMinutes-(-3*ikScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-(iShift+100)*ikScale)*PeriodSeconds(PERIOD_CURRENT))
                ))
   {
      {if(ObjectSetDouble(
                     0,                                                             //Идентификатор чарта
                     sTXW,                                                          //Имя объекта
                     OBJPROP_PRICE,                                                 //Изменяем координату времени объекта
                     IndHeigh
                   ))
      {
         ObjectSetString(0,sTXW,OBJPROP_TEXT,iLabel);
      }}//if(ObjectSetDouble(...
   }}//if(ObjectSetInteger(...
}//ColoLabelMove()
//
//============================================================================================= MQL5 ===
//  ColoDelete() - Удаление колонки
//    Вход:
//       iGName       -  имя граф объекта
//======================================================================================================
void ColoDelete(string iGName){
//-----
   {for(int i=0;i<=nOrderList-1;i++)
   {
      ObjectDelete(0,iGName+"_"+IntegerToString(i));//Устанавливаем имя для текстового объекта
   }}//for(int i=0;i<=nOrderList-1;i++)
}//ColoDelete()

Буду рад любым замечаниям и предложениям.

LIP_v01.001


 
Yury Kirillov:

Графика:

Буду рад любым замечаниям и предложениям.




Предложение пока одно - укажите, что папку Include надо создать в нетрадиционном месте \MQL5\Indicators\Include, а то тут не все программисты, многие просто не смогут по коду понять, что к чему

 

И на выходные не проверить, надо специально советник писать для тестера. Пока показывает пустое подокно

 
Alexey Volchanskiy:

И на выходные не проверить, надо специально советник писать для тестера. Пока показывает пустое подокно


У Вас есть позиции, ордера и сделки по инструменту на котором вы установили индикатор?

По умолчанию информация выдается по текущему инструменту, режим отбора SymSel_curr.

У меня приведённый выше скриншот получен сегодня в режиме отбора SymSel_all.

 
Yury Kirillov:

У Вас есть позиции, ордера и сделки по инструменту на котором вы установили индикатор?

У меня приведённый выше скриншот получен сегодня.


Рыночных нет, только история. Обнаружил интересный эффект. Если стоит параметр SumSel_all, то исторические ордера и сделки показываются, при двух других значениях нет.


 
Alexey Volchanskiy:

Рыночных нет, только история. Обнаружил интересный эффект. Если стоит параметр SumSel_all, то исторические ордера и сделки показываются, при двух других значениях нет.



Это связано с тем, что у вас много (более 250) ордеров (сделок) в истории. Попробуйте увеличить параметр nOrderList.
Дело в том, что вывод списков идёт от последних номеров к первым. В этом случае без отбора просто выводятся nOrderList первых ордеров (сделок).
А при отборе среди первых nOrderList может не оказаться ордеров по данному инструменту. Конечно можно определять размер списка автоматически.
Но для моих целей достаточно вручную устанавливать nOrderList.

 
Alexey Volchanskiy:

Предложение пока одно - укажите, что папку Include надо создать в нетрадиционном месте \MQL5\Indicators\Include, а то тут не все программисты, многие просто не смогут по коду понять, что к чему


В приложенном архиве уже есть вложенная папка Include.

 
Yury Kirillov:

В приложенном архиве уже есть вложенная папка Include.


Я же написал, она должна быть размещена в нетрадиционном месте \MQL5\Indicators, а не в стандартном пути \MQL5. Я сначала переместил файлы .mqh в \MQL5\Include, в результате ошибки компиляции. Залез в исходник, понял, гду они должны быть. Непрограммист не догадается так сделать.

 
Alexey Volchanskiy:

Я же написал, она должна быть размещена в нетрадиционном месте \MQL5\Indicators, а не в стандартном пути \MQL5. Я сначала переместил файлы .mqh в \MQL5\Include, в результате ошибки компиляции. Залез в исходник, понял, гду они должны быть. Непрограммист не догадается так сделать.


Если распаковать приложенный архив, то структура файлов создается таким образом, что компиляция программы должна проходить нормально.