1
0
Derivar 0
Art12900_Structs/TestMqlTick.mq5
2026-03-01 22:12:41 +07:00

267 linhas
25 KiB
MQL5

//+------------------------------------------------------------------+
//| TestMqlTick.mq5 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Объявляем динамический массив с типом MqlTick
MqlTick array[];
//--- Если последние 10 тиков в массив не получен - выводим сообщение об ошибке и уходим
if(CopyTicks(Symbol(),array,COPY_TICKS_ALL,0,4)!=4)
{
Print("CopyTicks failed, error: ",(string)GetLastError());
return;
}
Print("Last 4 tick (MqlTickPrint):");
for(int i=0;i<(int)array.Size();i++)
{
PrintFormat("Tick[%lu] %s:",i,Symbol());
MqlTickPrint(Symbol(),array[i],false,14,2);
}
/* Пример вывода:
Last 4 tick (MqlTickPrint):
Tick[0] GBPUSD:
Time: 2023.07.20 17:04:51
Bid: 1.28776
Ask: 1.28780
Time msc: 2023.07.20 17:04:51.203
Flags: BID|ASK
Tick[1] GBPUSD:
Time: 2023.07.20 17:04:51
Bid: 1.28772
Ask: 1.28776
Time msc: 2023.07.20 17:04:51.331
Flags: BID|ASK
Tick[2] GBPUSD:
Time: 2023.07.20 17:04:51
Bid: 1.28771
Ask: 1.28775
Time msc: 2023.07.20 17:04:51.378
Flags: BID|ASK
Tick[3] GBPUSD:
Time: 2023.07.20 17:04:51
Bid: 1.28772
Ask: 1.28776
Time msc: 2023.07.20 17:04:51.680
Flags: BID|ASK
*/
}
//+------------------------------------------------------------------+
//| Принимает дату в мс, возвращает время в формате Date Time.Msc |
//+------------------------------------------------------------------+
string TimeMSC(const long time_msc)
{
return StringFormat("%s.%.3hu",string((datetime)time_msc / 1000),time_msc % 1000);
/* Пример вывода:
2023.07.13 09:31:58.177
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки время последнего обновления цен |
//+------------------------------------------------------------------+
string MqlTickTime(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Time:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-s",indent,"",w,header,(string)tick.time);
/* Пример вывода:
Time: 2023.07.19 20:58:00
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену Bid |
//+------------------------------------------------------------------+
string MqlTickBid(const string symbol,const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Bid:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Получаем количество знаков после запятой
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,tick.bid);
/* Пример вывода:
Bid: 1.29237
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену Ask |
//+------------------------------------------------------------------+
string MqlTickAsk(const string symbol,const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Ask:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Получаем количество знаков после запятой
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,tick.ask);
/* Пример вывода:
Ask: 1.29231
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки цену Last |
//+------------------------------------------------------------------+
string MqlTickLast(const string symbol,const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Last:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Получаем количество знаков после запятой
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,tick.last);
/* Пример вывода:
Last: 0.00000
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки объём для цены Last |
//+------------------------------------------------------------------+
string MqlTickVolume(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Volume:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-I64u",indent,"",w,header,tick.volume);
/* Пример вывода:
Volume: 0
*/
}
//+------------------------------------------------------------------+
//| Возвращает как строку время в миллисекундах |
//+------------------------------------------------------------------+
string MqlTickTimeMSC(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Time msc:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-s",indent,"",w,header,TimeMSC(tick.time_msc));
/* Пример вывода:
Time msc: 2023.07.19 21:21:09.732
*/
}
//+------------------------------------------------------------------+
//| Возвращает как строку флаги тика |
//+------------------------------------------------------------------+
string MqlTickFlags(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Flags:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Опеределяем переменную для описания флагов тика
string flags="";
//--- Разбираем флаги тика на составляющие
if((tick.flags & TICK_FLAG_BID)==TICK_FLAG_BID)
flags+=(flags.Length()>0 ? "|" : "")+"BID";
if((tick.flags & TICK_FLAG_ASK)==TICK_FLAG_ASK)
flags+=(flags.Length()>0 ? "|" : "")+"ASK";
if((tick.flags & TICK_FLAG_LAST)==TICK_FLAG_LAST)
flags+=(flags.Length()>0 ? "|" : "")+"LAST";
if((tick.flags & TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME)
flags+=(flags.Length()>0 ? "|" : "")+"VOLUME";
if((tick.flags & TICK_FLAG_BUY)==TICK_FLAG_BUY)
flags+=(flags.Length()>0 ? "|" : "")+"BUY";
if((tick.flags & TICK_FLAG_SELL)==TICK_FLAG_SELL)
flags+=(flags.Length()>0 ? "|" : "")+"SELL";
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-s",indent,"",w,header,flags);
/* Пример вывода:
Flags: BID|ASK
*/
}
//+------------------------------------------------------------------+
//| Возвращает в виде строки объём для цены Last |
//+------------------------------------------------------------------+
string MqlTickVolumeReal(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- Определяем текст заголовка и ширину поля заголовка
//--- Если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
string header="Volume Real:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- Возвращаем значение свойства с заголовком с нужной шириной и отступом
return StringFormat("%*s%-*s%-.2f",indent,"",w,header,tick.volume_real);
/* Пример вывода:
Volume Real: 0.00
*/
}
//+------------------------------------------------------------------+
//| Выводит в журнал описание всех полей структуры MqlTick |
//| Если Last==0, то поля Last, Volume и Volume Real не выводятся |
//+------------------------------------------------------------------+
void MqlTickPrint(const string symbol,const MqlTick &tick,const bool short_entry=true,const uint header_width=0,const uint indent=0,int index=WRONG_VALUE)
{
//--- Объявляем переменную для хранения результата
string res="";
//--- Получаем количество знаков после запятой
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
string num=(index==WRONG_VALUE ? "" : StringFormat("[%ld] ",index));
//--- Если краткая запись - выводим в журнал данные тика в формате Symbol TimeMSC, Bid, Ask, Last, Vol/VolR, Flags
if(short_entry)
{
//--- Если значение Last не нулевое, будем выводить Last, Volume и Volume Real, иначе - они все нулевые и выводить их не имеет смысла
string last=(tick.last!=0 ? StringFormat(", Last: %.*f, Vol: %I64u/%.2f",dg,tick.last,tick.volume,tick.volume_real) : "");
res=StringFormat("%sTick %s Time: %s, Bid: %.*f, Ask: %.*f%s, %s",num,symbol,TimeMSC(tick.time_msc),dg,tick.bid,dg,tick.ask,last,MqlTickFlags(tick));
Print(res);
}
/* Пример вывода (если Last не нулевой):
Tick GBPUSD Time: 2023.07.20 13:57:31.376, Bid: 1.28947, Ask: 1.28951, Last: 1.28947, Vol: 33/33.45, Flags: BID|ASK
Пример вывода (если Last нулевой):
Tick GBPUSD Time: 2023.07.20 13:59:33.274, Bid: 1.28956, Ask: 1.28960, Flags: BID|ASK
*/
//--- Иначе
else
{
//--- создаём строку с описанием всех данных структуры с отступами и заданной шириной поля заголовка
res=StringFormat("%s\n%s\n%s%s%s\n%s\n%s%s",
MqlTickTime(tick,header_width,indent),
MqlTickBid(symbol,tick,header_width,indent),
MqlTickAsk(symbol,tick,header_width,indent),
(tick.last!=0 ? "\n"+MqlTickLast(symbol,tick,header_width,indent) : ""),
(tick.last!=0 ? "\n"+MqlTickVolume(tick,header_width,indent) : ""),
MqlTickTimeMSC(tick,header_width,indent),
MqlTickFlags(tick,header_width,indent),
(tick.last!=0 ? "\n"+MqlTickVolumeReal(tick,header_width,indent) : "")
);
//--- Выводим в журнал полученную строку
Print(res);
}
/* Пример вывода (если Last не нулевой):
Time: 2023.07.20 14:42:33
Bid: 1.28958
Ask: 1.28962
Last: 1.28947
Volume: 33
Time msc: 2023.07.20 14:42:33.401
Flags: BID|ASK
Volume Real: 33.45
Пример вывода (если Last нулевой):
Time: 2023.07.20 14:42:33
Bid: 1.28958
Ask: 1.28962
Time msc: 2023.07.20 14:42:33.401
Flags: BID|ASK
*/
}
//+------------------------------------------------------------------+