267 linhas
25 KiB
MQL5
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
|
|
*/
|
|
}
|
|
//+------------------------------------------------------------------+
|