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

 
Yury Kirillov:

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


Дело ваше, я просто дал совет.

 
Alexey Volchanskiy:

Дело ваше, я просто дал совет.


Спасибо! Я ценю любые советы и замечания. Они позволяют взглянуть на своё чужими глазами.

 
Yury Kirillov:

Спасибо! Я ценю любые советы и замечания. Они позволяют взглянуть на своё чужими глазами.


Да, иногда самому что-то кажется очевидным, а другим нет. Тут куча людей, которые даже советник на график не могут поставить, для них нестандартные решения смерти подобны.

Я давно рассылаю клиентам zip в виде запакованной папки MQL4 или MQL5, откуда удалено все лишнее. Тогда действительно можно просто распаковать и не думать, что где должно лежать.

Лишней работы на 3 минуты, зато потом экономишь часы на нудные объяснения.

 

Доработанная версия.

Добавлено:

1. Автоматический расчет размера списков.

2. Запрет запуска двух индикаторов на одном графике.

3. Устранены обнаруженные недочеты.

Основная программа:

//============================================================================================= 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_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_Fun1_5_v1.001.mqh"      //Основные функции алгортма MQL5(Traling,Open-Close,MA,CalcSR)
#include "Include\LIP_Fun2_5_v1.001.mqh"        //Основные технические расчеты MQL5 (Calc...)
#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){
//----- Определяем имя программы   
   string   iProgramName=MQLInfoString(MQL_PROGRAM_NAME);
//----- Определяем тип программы   
   string   ProgramType="Expert";
   {switch(MQLInfoInteger(MQL_PROGRAM_TYPE))
   {
      case PROGRAM_SCRIPT:
         {
            ProgramType="Script";
            break;
         }
      case PROGRAM_EXPERT:
         {
            ProgramType="Expert";
            break;
         }
      case PROGRAM_INDICATOR:
         {
            ProgramType="Indicator";
            break;
         }
      default:
         {
            ProgramType="Expert";
         }
   }}//switch(MQLInfoInteger(MQL_PROGRAM_TYPE))
//----- Анализируем и выводим информацию о причине завершения работы
   string ReasonTxt="REASON";
   {switch(reason)
   {
      case REASON_PROGRAM:
         ReasonTxt="[REASON_PROGRAM] "+ProgramType+" terminated its operation by calling the ExpertRemove() function.";break;
      case REASON_REMOVE:
         ReasonTxt="[REASON_REMOVE] "+ProgramType+" has been removed from chart.";break;
      case REASON_RECOMPILE:
         ReasonTxt="[REASON_RECOMPILE] "+ProgramType+" has been recompiled.";break;
      case REASON_CHARTCHANGE:
         ReasonTxt="[REASON_CHARTCHANGE] Symbol or chart period has been changed.";break;
      case REASON_CHARTCLOSE:
         ReasonTxt="[REASON_CHARTCLOSE] Chart has been closed.";break;
      case REASON_PARAMETERS:
         ReasonTxt="[REASON_PARAMETERS] Input parameters have been changed by a user.";break;
      case REASON_ACCOUNT:
         ReasonTxt="[REASON_ACCOUNT] Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings.";break;
      case REASON_TEMPLATE:
         ReasonTxt="[REASON_TEMPLATE] New template was applied to chart.";break;
      case REASON_INITFAILED:
         ReasonTxt="[REASON_INITFAILED] "+ProgramType+" initialisation failed.";break;
      case REASON_CLOSE:
         ReasonTxt="[REASON_CLOSE] Terminal has been closed.";break;
      default:ReasonTxt="Another reason";
   }}//switch(reason)
   Print("Terminal Build>>",TerminalInfoInteger(TERMINAL_BUILD)," ",ProgramType,":\"",iProgramName,"\" Deinit reason [",reason,"] >> "+ReasonTxt);
//----- Удалить инфо с экрана
   GraphDelete();
   Comment("");
//----- Гасим таймер
   EventKillTimer();
//-----
   return;
}//OnDeinit()
Файлы:
LIP_v01.001.zip  129 kb
 

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

//============================================================================================= MQL5 ===
//    LibreInfoPDO Definition_5 v1.001 MQL5
//    Определения переменных и структур
//    LibreCoin (c)2014-2017      
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    INCLUDE - подключаемые модули
//------------------------------------------------------------------------------------------------------
//----- Обратные ссылки на основной файл проекта
#include "LIP_Ref_5_v1.001.mqh"
//============================================================================================= MQL5 ===
//    ENUM
//------------------------------------------------------------------------------------------------------
enum enSymSelMode
{
   SymSel_all  =  0,
   SymSel_curr =  1,
   SymSel_user =  2,
};
//============================================================================================= MQL5 ===
//    Global variable definition
//------------------------------------------------------------------------------------------------------
string   _n="\n";
//----- для событий времени и таймера
ulong    gnTimer        =  0;                //Глобальный счетчик событий Timer
ulong    gnTick         =  0;                //Глобальный счетчик событий NewTick
int      MSTimerSet     =  50;               //Установка таймера 50 миллисекунд
bool     gInTimer       =  false;            //Флаг поступления тика из таймера
long     IndHeigh       =  1050;             //Верт размер индикатора       
MqlDateTime 
         DateTimeCurrent;
datetime    
         TimeCurrentMinutes;
string   TheSymbol="EURUSD";
string   PositionDataString="";
string   OrderDataString="";
string   DealDataString="";
string   PosTypeString="";
string   OrdTypeString="";
string   DealTypeString="";
string   inSymbolSelector="EURUSD";
string   IndicatorShortName=vers;
string   ChartID_Str="";
string   ProgramName="";
string   CommentLine[2];
double   kScale=1.0;
string   sTXW="";                            //Имя для текcтового объекта
int      nRow=0;                             //Счетчик строк вывода
int      Positions_Total=0;                  //Текущие позиции
int      Orders_Total=0;                     //Текущие лимитные ордера
int      History_Orders_Total=0;             //Закрытые рыночные ордера
int      History_Deals_Total=0;              //Совершенные сделки (выполненные ордера)
int      Positions_Total_Old=0;              //Текущие позиции
int      Orders_Total_Old=0;                 //Текущие лимитные ордера
int      History_Orders_Total_Old=0;         //Закрытые рыночные ордера
int      History_Deals_Total_Old=0;          //Совершенные сделки (выполненные ордера)
int      Positions_Total_Sel=0;              //Текущие позиции
int      Orders_Total_Sel=0;                 //Текущие лимитные ордера
int      History_Orders_Total_Sel=0;         //Закрытые рыночные ордера
int      History_Deals_Total_Sel=0;          //Совершенные сделки (выполненные ордера)
int      Positions_Total_Sel_Old=0;          //Текущие позиции
int      Orders_Total_Sel_Old=0;             //Текущие лимитные ордера
int      History_Orders_Total_Sel_Old=0;     //Закрытые рыночные ордера
int      History_Deals_Total_Sel_Old=0;      //Совершенные сделки (выполненные ордера)
 

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

//============================================================================================= MQL5 ===
//    LibreInfoPDO Interface_5 v1.001 MQL5
//    Интерфейс настроек
//    LibreCoin (c)2014-2017    
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    INCLUDE - подключаемые модули
//------------------------------------------------------------------------------------------------------
//----- Обратные ссылки на основной файл проекта
#include "LIP_Ref_5_v1.001.mqh"
//============================================================================================= MQL5 ===
//    INTERFACE
//------------------------------------------------------------------------------------------------------
input    string   Sid                  =  "LIP v"+ver;   //===== Set Identifier
input enSymSelMode SymSel              =  SymSel_curr;   //SymSel Symbol Select Mode
input    string   SymbolSelector       =  "EURUSD";      //SymbolSelector for User Mode
 

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

//============================================================================================= MQL5 ===
//    LibreInfoPDO Main_5 v1.001 MQL5
//    Модуль обработки событий
//    LibreCoin (c)2014-2017      
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    INCLUDE - подключаемые модули
//------------------------------------------------------------------------------------------------------
//----- Обратные ссылки на основной файл проекта
#include "LIP_Ref_5_v1.001.mqh"
//============================================================================================= MQL5 ===
//    EVENT PROCESSING MODULE
//------------------------------------------------------------------------------------------------------
//
//============================================================================================= MQL5 ===
//    On_Init()  - инициализация советника
//------------------------------------------------------------------------------------------------------
int On_Init(){
   gnTick=0;
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----- Определяем имя программы   
   ProgramName=MQLInfoString(MQL_PROGRAM_NAME);
//----- Рассчитываем короткое имя индикатора   
   ChartID_Str=IntegerToString(ChartID());
   IndicatorShortName=vers+" "+StringSubstr(ChartID_Str,StringLen(ChartID_Str)-3);
   IndicatorSetString(INDICATOR_SHORTNAME,IndicatorShortName);
//----- Устанавливаем короткое имя индикатора   
   gInTimer=false;
   TheSymbol=Symbol();
//----- Настройки для отбора по инструменту
   {switch(SymSel)
   {
      case SymSel_curr:
         {
            inSymbolSelector=TheSymbol;
            break;
         }
      case SymSel_user:
         {
            inSymbolSelector=SymbolSelector;
            break;
         }
      case SymSel_all:
         {
            inSymbolSelector="";
            break;
         }
      default:
         {
            inSymbolSelector="";
         }
   }}//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);
   kScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
//----- Запрашиваем историю сделок и ордеров за указанный период серверного времени.
   {if(!HistorySelect(0,TimeCurrent()))
   {
      Print("HistorySelect Error!");
      return(0);
   }}//Если неудачно - выходим
//----- Определение количества ордеров, сделок, позиций
//----- Общее 
   Positions_Total=PositionsTotal();                              //Текущие позиции
   Orders_Total=OrdersTotal();                                    //Текущие лимитные ордера
   History_Orders_Total=HistoryOrdersTotal();                     //Закрытые рыночные ордера
   History_Deals_Total=HistoryDealsTotal();                       //Совершенные сделки (выполненные ордера)
//----- Отобранное
   Positions_Total_Sel=PositionsTotalSel(inSymbolSelector);       //Текущие позиции
   Orders_Total_Sel=OrdersTotalSel(inSymbolSelector);             //Текущие лимитные ордера
   History_Orders_Total_Sel=HistoryOrdersTotalSel(inSymbolSelector);//Закрытые рыночные ордера
   History_Deals_Total_Sel=HistoryDealsTotalSel(inSymbolSelector);//Совершенные сделки (выполненные ордера)
//----- Открытые позиции
   ColoLabelCreate("LIP",0,"Position="+IntegerToString(Positions_Total_Sel)+"/"+IntegerToString(Positions_Total));
   ColoCreate("LIP",0,Positions_Total);
//----- Открытые отложенные ордера
   ColoLabelCreate("LIO",300,"Order="+IntegerToString(Orders_Total_Sel)+"/"+IntegerToString(Orders_Total));
   ColoCreate("LIO",300,Orders_Total);
//----- Выполненные ордера в истории
   ColoLabelCreate("LHO",600,"History_Order="+IntegerToString(History_Orders_Total_Sel)+"/"+IntegerToString(History_Orders_Total));
   ColoCreate("LHO",600,History_Orders_Total);
//----- Сделки в истории
   ColoLabelCreate("LHD",900,"History_Deal="+IntegerToString(History_Deals_Total_Sel)+"/"+IntegerToString(History_Deals_Total));
   ColoCreate("LHD",900,History_Deals_Total);
//----- Запомним текущие количества
   Orders_Total_Old=Orders_Total;                                 //Текущие лимитные ордера
   History_Orders_Total_Old=History_Orders_Total;                 //Закрытые рыночные ордера
   History_Deals_Total_Old=History_Deals_Total;                   //Совершенные сделки (выполненные ордера)
   Positions_Total_Old=Positions_Total;                           //Текущие позиции
   Positions_Total_Sel_Old=Positions_Total_Sel;                   //Текущие позиции
   Orders_Total_Sel_Old=Orders_Total_Sel;                         //Текущие лимитные ордера
   History_Orders_Total_Sel_Old=History_Orders_Total_Sel;         //Закрытые рыночные ордера
   History_Deals_Total_Sel_Old=History_Deals_Total_Sel;           //Совершенные сделки (выполненные ордера)
//-----
   return(INIT_SUCCEEDED);
}//On_Init()
//
//============================================================================================= MQL5 ===
//  On_Tick() - Основной обработчик тиков
//------------------------------------------------------------------------------------------------------
void On_Tick(){
//----- Прерываем загрузку, если индикатор уже есть
   {if((ChartWindowFind(0,IndicatorShortName)>=0)&&(ChartWindowFind(0,ProgramName)>=0))
   {
      Print("Abort loading indicator: ",ProgramName);
      ChartIndicatorDelete(0,ChartWindowFind(0,ProgramName),ProgramName);
   }}//if(ChartWindowFind(0,IndicatorShortName)>=0)
//-----
   //{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);
//-----
   TimeToStruct(TimeCurrent(),DateTimeCurrent);
   DateTimeCurrent.sec=0;
   TimeCurrentMinutes=StructToTime(DateTimeCurrent);
   kScale=(double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
//----- Запрашиваем историю сделок и ордеров за указанный период серверного времени.
   {if(!HistorySelect(0,TimeCurrent()))
   {
      Print("HistorySelect Error!");
      return;
   }}//Если неудачно - выходим
//----- Определение количества ордеров, сделок, позиций
//----- Общее 
   Positions_Total=PositionsTotal();                             //Текущие позиции
   Orders_Total=OrdersTotal();                                   //Текущие лимитные ордера
   History_Orders_Total=HistoryOrdersTotal();                    //Закрытые рыночные ордера
   History_Deals_Total=HistoryDealsTotal();                      //Совершенные сделки (выполненные ордера)
//----- Отобранное
   Positions_Total_Sel=PositionsTotalSel(inSymbolSelector);      //Текущие позиции
   Orders_Total_Sel=OrdersTotalSel(inSymbolSelector);            //Текущие лимитные ордера
   History_Orders_Total_Sel=HistoryOrdersTotalSel(inSymbolSelector);//Закрытые рыночные ордера
   History_Deals_Total_Sel=HistoryDealsTotalSel(inSymbolSelector);//Совершенные сделки (выполненные ордера)
//-----
CommentLine[0]=""+
   "PositionsTotal="+IntegerToString(Positions_Total)+" "+
   "OrdersTotal="+IntegerToString(Orders_Total)+" "+
   "";
CommentLine[1]=""+
   "HistoryOrdersTotal="+IntegerToString(History_Orders_Total)+" "+
   "HistoryDealsTotal="+IntegerToString(History_Deals_Total)+" "+
   "";
//----- Пересчеты - перерисовки при изменении количества
//----- Список открытых позиций
   {if(Positions_Total_Sel!=Positions_Total_Sel_Old)
   {
      ColoDelete("LIP",Positions_Total_Old);                      //Колонка позиций
      ColoCreate("LIP",0,Positions_Total);
   }}//if(Positions_Total_Sel!=Positions_Total_Sel_Old)
//----- Список открытых отложенных ордеров
   {if(Orders_Total_Sel!=Orders_Total_Sel_Old)
   {
      ColoDelete("LIO",Orders_Total_Old);                         //Колонка ордеров
      ColoCreate("LIO",300,Orders_Total);
   }}//if(Orders_Total_Sel!=Orders_Total_Sel_Old)
//----- Список ордеров в истории
   {if(History_Orders_Total_Sel!=History_Orders_Total_Sel_Old)
   {
      ColoDelete("LHO",Orders_Total);                             //Колонка истории ордеров
      ColoCreate("LHO",600,Orders_Total);
   }}//if(Positions_Total_Sel!=Positions_Total_Sel_Old)
//----- Список сделок в истории
   {if(History_Deals_Total_Sel!=History_Deals_Total_Sel_Old)
   {
      ColoDelete("LHD",History_Deals_Total_Old);                  //Колонка истории позиций
      ColoCreate("LHD",900,History_Deals_Total);
   }}//if(Positions_Total_Sel!=Positions_Total_Sel_Old)
//----- Заголовки колонок
   ColoLabelMove("LIP",0,"Position="+IntegerToString(Positions_Total_Sel)+"/"+IntegerToString(Positions_Total));
   ColoLabelMove("LIO",300,"Order="+IntegerToString(Orders_Total_Sel)+"/"+IntegerToString(Orders_Total));
   ColoLabelMove("LHO",600,"History Order="+IntegerToString(History_Orders_Total_Sel)+"/"+IntegerToString(History_Orders_Total));
   ColoLabelMove("LHD",900,"History Dial="+IntegerToString(History_Deals_Total_Sel)+"/"+IntegerToString(History_Deals_Total));
//----- Формирование списков ордеров, сделок, позиций 
//----- Список открытых позиций
   {if(Positions_Total>=0)
   {
      nRow=0;
      {for(int i=Positions_Total-1;i>=0;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;}}//Не тот символ - следующий
         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=Orders_Total-1;i>=0;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;}}//Не тот символ - следующий
         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))+"]"+
                           "";
         ResetLastError();
         {if(!ObjectSetInteger(
                        0,                                        //Идентификатор чарта
                        sTXW,                                     //Имя объекта
                        OBJPROP_TIME,                             //Изменяем координату времени объекта
                        (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=Orders_Total-1;i>=0;i--)
   }}//if(Orders_Total>=0)
//----- Список ордеров в истории
   {if(History_Orders_Total>=0)
   {
      nRow=0;
      {for(int i=History_Orders_Total-1;i>=0;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;}}//Не тот символ - следующий
         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=History_Deals_Total-1;i>=0;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;}}//Не тот символ - следующий
         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=History_Deals_Total-1;i>=0;i--)
   }}//if(History_Deals_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));
//----- Запомним текущие счетчики
   Orders_Total_Old=Orders_Total;                        //Текущие лимитные ордера
   History_Orders_Total_Old=History_Orders_Total;        //Закрытые рыночные ордера
   History_Deals_Total_Old=History_Deals_Total;          //Совершенные сделки (выполненные ордера)
   Positions_Total_Old=Positions_Total;                  //Текущие позиции
   Orders_Total_Sel_Old=Orders_Total_Sel;                //Текущие лимитные ордера
   History_Orders_Total_Sel_Old=History_Orders_Total_Sel;//Закрытые рыночные ордера
   History_Deals_Total_Sel_Old=History_Deals_Total_Sel;  //Совершенные сделки (выполненные ордера)
   Positions_Total_Sel_Old=Positions_Total_Sel;          //Текущие позиции
//-----
   return;
}//On_Tick()
//
//============================================================================================= MQL5 ===
//    On_Timer - Обработка событий по таймеру
//------------------------------------------------------------------------------------------------------
void On_Timer(){
//-----
   gnTimer++;
   {if(gnTimer>4294967000)
   {
      gnTimer=100;
   }}//if(gnTimer>4294967000)
   gInTimer=true;
   On_Tick();
}//On_Timer()

 

Основные технические расчеты:

//============================================================================================= MQL5 ===
//    LibreInfoPDO Function2_5 v1.001 MQL5
//    Основные технические расчеты
//    Librecoin (c)2014-2017  
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    INCLUDE - подключаемые модули
//------------------------------------------------------------------------------------------------------
//----- Обратные ссылки на основной файл проекта
#include "LIP_Ref_5_v1.001.mqh"
//============================================================================================= MQL5 ===
//  PositionsTotalSel() - подсчет количества позиций с отбором по инструменту
//    Вход:
//       iSymbol  - инструмент
//------------------------------------------------------------------------------------------------------
int PositionsTotalSel(string iSymbol){
int 
   nPosition=0;
//-----
   {if(PositionsTotal()>0)
   {
      {for(int i=PositionsTotal()-1;i>=0;i--) 
      {
         ulong Pos_Tick=PositionGetTicket(i);                        //Выбираем ордер по номеру в списке
         {if(Pos_Tick<=0){continue;}}                                //Неудачно - следующий
         //{if(!PositionSelectByTicket(Pos_Tick)){continue;}}          //Выбор по тикету, неудачно - следующий
         {if((PositionGetString(POSITION_SYMBOL)!=iSymbol)&&(iSymbol!="")){continue;}}//Отбор по символу
         nPosition++;
      }}//for(int i=PositionsTotal()-1;i>=0;i--) 
   }}//if(PositionsTotal()>0)
   return(nPosition);
}//PositionsTotalSel()
//
//============================================================================================= MQL5 ===
//  OrdersTotalSel() - подсчет количества ордеров с отбором по инструменту
//    Вход:
//       iSymbol  - инструмент
//------------------------------------------------------------------------------------------------------
int OrdersTotalSel(string iSymbol){
int 
   nOrder=0;
//-----
   {if(OrdersTotal()>0)
   {
      {for(int i=OrdersTotal()-1;i>=0;i--) 
      {
         ulong Ord_Tick=OrderGetTicket(i);                        //Выбираем ордер по номеру в списке
         {if(Ord_Tick<=0){continue;}}                             //Неудачно - следующий
         //{if(!OrderSelect(Ord_Tick)){continue;}}                  //Выбор по тикету, неудачно - следующий
         {if((OrderGetString(ORDER_SYMBOL)!=iSymbol)&&(iSymbol!="")){continue;}}   //Отбор по символу
         nOrder++;
      }}//for(int i=OrdersTotal()-1;i>=0;i--) 
   }}//if(OrdersTotal()>0)
   return(nOrder);
}//OrdersTotalSel()
//
//============================================================================================= MQL5 ===
//  HistoryOrdersTotalSel() - подсчет количества ордеров с отбором по инструменту
//    Вход:
//       iSymbol  - инструмент
//------------------------------------------------------------------------------------------------------
int HistoryOrdersTotalSel(string iSymbol){
int 
   nOrder=0;
//-----
   {if(HistoryOrdersTotal()>0)
   {
      {for(int i=HistoryOrdersTotal()-1;i>=0;i--)
      {
         ulong Ord_Tick=HistoryOrderGetTicket(i);                 //Выбираем ордер по номеру в списке
         {if(Ord_Tick<=0){continue;}}                             //Неудачно - следующий
         //{if(!HistoryOrderSelect(Ord_Tick)){continue;}}           //Выбор по тикету, неудачно - следующий
         {if((HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL)!=iSymbol)&&(iSymbol!="")){continue;}}//Отбор по символу
         nOrder++;
      }}//for(int i=HistoryOrdersTotal()-1;i>=0;i--)
   }}//if(HistoryOrdersTotal()>0)
   return(nOrder);
}//HistoryOrdersTotalSel()
//
//============================================================================================= MQL5 ===
//  HistoryDealsTotalSel() - подсчет количества ордеров с отбором по инструменту
//    Вход:
//       iSymbol  - инструмент
//------------------------------------------------------------------------------------------------------
int HistoryDealsTotalSel(string iSymbol){
int 
   nDeal=0;
//-----
   {if(HistoryDealsTotal()>0)
   {
      {for(int i=HistoryDealsTotal()-1;i>=0;i--)
      {
         ulong Deal_Tick=HistoryDealGetTicket(i);                 //Выбираем ордер по номеру в списке
         {if(Deal_Tick<=0){continue;}}                            //Неудачно - следующий
         //{if(!HistoryDealSelect(Deal_Tick)){continue;}}           //Выбор по тикету, неудачно - следующий
         {if((HistoryDealGetString(Deal_Tick,DEAL_SYMBOL)!=iSymbol)&&(iSymbol!="")){continue;}}//Отбор по символу
         nDeal++;
      }}//for(int i=HistoryDealsTotal()-1;i>=0;i--)
   }}//if(HistoryOrdersTotal()>0)
   return(nDeal);
}//HistoryDealsTotalSel()
 

Графика:

//============================================================================================= MQL5 ===
//    LibreInfoPDO Function3_5 v1.001 MQL5
//    Графика, вывод на чарт и преобразования вывода
//    Librecoin (c)2014-2017
//======================================================================================================
#property strict
//============================================================================================= MQL5 ===
//    INCLUDE - подключаемые модули
//------------------------------------------------------------------------------------------------------
//----- Обратные ссылки на основной файл проекта
#include "LIP_Ref_5_v1.001.mqh"
//============================================================================================= MQL5 ===
//  ColoLabelCreate() - Создание колонтитула (заголовка колонки)
//    Вход:
//       iGName      -  имя граф объекта
//       iShift      -  сдвиг по горизонтали
//       iColoText   -  текст метки колонки
//------------------------------------------------------------------------------------------------------
void ColoLabelCreate(string   iGName,
                     int      iShift,
                     string   iColoText){
//-----
   string isTXW=iGName+"_C";
   {if(ObjectCreate(
                        0,
                        isTXW,
                        OBJ_TEXT,
                        1,
                        (datetime)(TimeCurrentMinutes-(-3*kScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-(iShift+100)*kScale)*PeriodSeconds(PERIOD_CURRENT)),
                        IndHeigh
                     )
       )
   {
      ObjectSetString(0,isTXW,OBJPROP_TEXT,iColoText); //выводим текст
      ObjectSetString(0,isTXW,OBJPROP_FONT,"Arial"); // установим шрифт текста 
      ObjectSetInteger(0,isTXW,OBJPROP_FONTSIZE,8); // установим размер шрифта
      ObjectSetDouble(0,isTXW,OBJPROP_ANGLE,0.0); // установим угол наклона текста
      ObjectSetInteger(0,isTXW,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);// установим способ привязки 
      ObjectSetInteger(0,isTXW,OBJPROP_COLOR,clrAqua); // установим цвет
      ObjectSetInteger(0,isTXW,OBJPROP_BACK,false); // отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(0,isTXW,OBJPROP_SELECTABLE,false); // включим (true) или отключим (false) режим перемещения объекта мышью 
      ObjectSetInteger(0,isTXW,OBJPROP_SELECTED,false); 
      ObjectSetInteger(0,isTXW,OBJPROP_HIDDEN,false); // скроем (true) или отобразим (false) имя графического объекта в списке объектов
      ObjectSetInteger(0,isTXW,OBJPROP_ZORDER,0); // установим приоритет на получение события нажатия мыши на графике 
   }}//if(!ObjectCreate(...
}//ColoLabelCreate()
//
//============================================================================================= MQL5 ===
//  ColoCreate() - Создание колонки
//    Вход:
//       iGName      -  имя граф объекта
//       iShift      -  сдвиг по горизонтали
//       nTotal       -  количество объектов
//------------------------------------------------------------------------------------------------------
void ColoCreate(  string   iGName,
                  int      iShift,
                  int      nTotal){
//-----
   string isTXW="";
   {for(int i=0;i<=nTotal-1;i++)
   {
      isTXW=iGName+"_"+IntegerToString(i);//Устанавливаем имя для текстового объекта
      //Создание (пересоздание) объекта, позиция привязки
      ResetLastError();
      {if(!ObjectCreate(
                           0,
                           isTXW,
                           OBJ_TEXT,
                           1,
                           (datetime)(TimeCurrentMinutes-(-3*kScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-iShift*kScale)*PeriodSeconds(PERIOD_CURRENT)),
                           IndHeigh-11.0*(i+1)
                        )
          )
      {
         Print("ObjectCreate0 Error=",GetLastError());
         continue;
      }}//if(!ObjectCreate(...
      ObjectSetString(0,isTXW,OBJPROP_TEXT," "); //выводим текст
      ObjectSetString(0,isTXW,OBJPROP_FONT,"Arial"); // установим шрифт текста 
      ObjectSetInteger(0,isTXW,OBJPROP_FONTSIZE,8); // установим размер шрифта
      ObjectSetDouble(0,isTXW,OBJPROP_ANGLE,0.0); // установим угол наклона текста
      ObjectSetInteger(0,isTXW,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);// установим способ привязки 
      ObjectSetInteger(0,isTXW,OBJPROP_COLOR,clrAqua); // установим цвет
      ObjectSetInteger(0,isTXW,OBJPROP_BACK,false); // отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(0,isTXW,OBJPROP_SELECTABLE,false); // включим (true) или отключим (false) режим перемещения объекта мышью 
      ObjectSetInteger(0,isTXW,OBJPROP_SELECTED,false); 
      ObjectSetInteger(0,isTXW,OBJPROP_HIDDEN,false); // скроем (true) или отобразим (false) имя графического объекта в списке объектов
      ObjectSetInteger(0,isTXW,OBJPROP_ZORDER,0); // установим приоритет на получение события нажатия мыши на графике 
   }}//for(int i=0;i<nOrderList;i++)
}//ColoCreate()
//
//============================================================================================= MQL5 ===
//  ColoLabelMove() - Перемещение заголовка колонки
//    Вход:
//       iGName      -  имя граф объекта
//       iShift      -  сдвиг по горизонтали
//       iColoText   -  текст метки колонки
//------------------------------------------------------------------------------------------------------
void ColoLabelMove(  string   iGName,
                     int      iShift,
                     string   iColoText){
//-----
   string isTXW=iGName+"_C";
   {if(ObjectSetInteger(
                  0,                                                             //Идентификатор чарта
                  isTXW,                                                         //Имя объекта
                  OBJPROP_TIME,                                                  //Изменяем координату времени объекта
                  (datetime)(TimeCurrentMinutes-(-3*kScale+ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,1)-(iShift+100)*kScale)*PeriodSeconds(PERIOD_CURRENT))
                ))
   {
      {if(ObjectSetDouble(
                     0,                                                             //Идентификатор чарта
                     isTXW,                                                          //Имя объекта
                     OBJPROP_PRICE,                                                 //Изменяем координату времени объекта
                     IndHeigh
                   ))
      {
         ObjectSetString(0,isTXW,OBJPROP_TEXT,iColoText);
      }}//if(ObjectSetDouble(...
   }}//if(ObjectSetInteger(...
}//ColoLabelMove()
//
//============================================================================================= MQL5 ===
//  ColoDelete() - Удаление колонки
//    Вход:
//       iGName       -  имя граф объекта
//       nTotal       -  количество объектов
//------------------------------------------------------------------------------------------------------
void ColoDelete(  string   iGName,
                  int      nTotal){
//-----
   {for(int i=0;i<=nTotal-1;i++)
   {
      ObjectDelete(0,iGName+"_"+IntegerToString(i));//Устанавливаем имя для текстового объекта
   }}//for(int i=0;i<=nOrderList-1;i++)
}//ColoDelete()
//
//============================================================================================= MQL5 ===
//  GraphDelete() - Удаление колонки
//------------------------------------------------------------------------------------------------------
void GraphDelete(){
//-----
   ObjectDelete(0,"LIP_C");                  //Position
   ObjectDelete(0,"LIO_C");                  //Order
   ObjectDelete(0,"LHO_C");                  //History order
   ObjectDelete(0,"LHD_C");                  //History deal
   ColoDelete("LIP",Positions_Total);        //Колонка позиций
   ColoDelete("LIO",Orders_Total);           //Колонка ордеров
   ColoDelete("LHO",History_Orders_Total);   //Колонка истории ордеров
   ColoDelete("LHD",History_Deals_Total);    //Колонка сделок
}//GraphDelete()
 

Очередная доработка.

Изменения:

1. Изменен расчет горизонтальных координат вывода колонок.
Теперь корректно работает и на рваных по времени графиках.

2. Шаг вывода колонок теперь можно устанавливать в настройках.

3. Интервал таймера теперь можно задавать в настройках.

LIP_v01.001

Файлы:
LIP_v01.001.zip  74 kb
Причина обращения: