Art12900_Structs/TestMqlTick.mq5

268 行
25 KiB
MQL5

2026-03-01 22:12:41 +07:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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()
{
//--- 1JO2;O5< 48=0<8G5A:89 <0AA82 A B8?>< MqlTick
MqlTick array[];
//--- A;8 ?>A;54=85 10 B8:>2 2 <0AA82 =5 ?>;CG5= - 2K2>48< A>>1I5=85 >1 >H81:5 8 CE>48<
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);
}
/* @8<5@ 2K2>40:
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
*/
}
//+------------------------------------------------------------------+
//| @8=8<05B 40BC 2 <A, 2>72@0I05B 2@5<O 2 D>@<0B5 Date Time.Msc |
//+------------------------------------------------------------------+
string TimeMSC(const long time_msc)
{
return StringFormat("%s.%.3hu",string((datetime)time_msc / 1000),time_msc % 1000);
/* @8<5@ 2K2>40:
2023.07.13 09:31:58.177
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B 2 2845 AB@>:8 2@5<O ?>A;54=53> >1=>2;5=8O F5= |
//+------------------------------------------------------------------+
string MqlTickTime(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Time:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-s",indent,"",w,header,(string)tick.time);
/* @8<5@ 2K2>40:
Time: 2023.07.19 20:58:00
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B 2 2845 AB@>:8 F5=C Bid |
//+------------------------------------------------------------------+
string MqlTickBid(const string symbol,const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Bid:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >;CG05< :>;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,tick.bid);
/* @8<5@ 2K2>40:
Bid: 1.29237
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B 2 2845 AB@>:8 F5=C Ask |
//+------------------------------------------------------------------+
string MqlTickAsk(const string symbol,const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Ask:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >;CG05< :>;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,tick.ask);
/* @8<5@ 2K2>40:
Ask: 1.29231
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B 2 2845 AB@>:8 F5=C Last |
//+------------------------------------------------------------------+
string MqlTickLast(const string symbol,const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Last:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >;CG05< :>;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-.*f",indent,"",w,header,dg,tick.last);
/* @8<5@ 2K2>40:
Last: 0.00000
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B 2 2845 AB@>:8 >1JQ< 4;O F5=K Last |
//+------------------------------------------------------------------+
string MqlTickVolume(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Volume:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-I64u",indent,"",w,header,tick.volume);
/* @8<5@ 2K2>40:
Volume: 0
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B :0: AB@>:C 2@5<O 2 <8;;8A5:C=40E |
//+------------------------------------------------------------------+
string MqlTickTimeMSC(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Time msc:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-s",indent,"",w,header,TimeMSC(tick.time_msc));
/* @8<5@ 2K2>40:
Time msc: 2023.07.19 21:21:09.732
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B :0: AB@>:C D;038 B8:0 |
//+------------------------------------------------------------------+
string MqlTickFlags(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Flags:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- ?5@545;O5< ?5@5<5==CN 4;O >?8A0=8O D;03>2 B8:0
string flags="";
//--- 0718@05< D;038 B8:0 =0 A>AB02;ONI85
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";
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-s",indent,"",w,header,flags);
/* @8<5@ 2K2>40:
Flags: BID|ASK
*/
}
//+------------------------------------------------------------------+
//| >72@0I05B 2 2845 AB@>:8 >1JQ< 4;O F5=K Last |
//+------------------------------------------------------------------+
string MqlTickVolumeReal(const MqlTick &tick,const uint header_width=0,const uint indent=0)
{
//--- ?@545;O5< B5:AB 703>;>2:0 8 H8@8=C ?>;O 703>;>2:0
//--- A;8 H8@8=0 703>;>2:0 ?5@540=0 2 DC=:F8N @02=>9 =C;N, B> H8@8=>9 1C45B @07<5@ AB@>:8 703>;>2:0 + 1
string header="Volume Real:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- >72@0I05< 7=0G5=85 A2>9AB20 A 703>;>2:>< A =C6=>9 H8@8=>9 8 >BABC?><
return StringFormat("%*s%-*s%-.2f",indent,"",w,header,tick.volume_real);
/* @8<5@ 2K2>40:
Volume Real: 0.00
*/
}
//+------------------------------------------------------------------+
//| K2>48B 2 6C@=0; >?8A0=85 2A5E ?>;59 AB@C:BC@K MqlTick |
//| A;8 Last==0, B> ?>;O Last, Volume 8 Volume Real =5 2K2>4OBAO |
//+------------------------------------------------------------------+
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)
{
//--- 1JO2;O5< ?5@5<5==CN 4;O E@0=5=8O @57C;LB0B0
string res="";
//--- >;CG05< :>;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
string num=(index==WRONG_VALUE ? "" : StringFormat("[%ld] ",index));
//--- A;8 :@0B:0O 70?8AL - 2K2>48< 2 6C@=0; 40==K5 B8:0 2 D>@<0B5 Symbol TimeMSC, Bid, Ask, Last, Vol/VolR, Flags
if(short_entry)
{
//--- A;8 7=0G5=85 Last =5 =C;52>5, 1C45< 2K2>48BL Last, Volume 8 Volume Real, 8=0G5 - >=8 2A5 =C;52K5 8 2K2>48BL 8E =5 8<55B A<KA;0
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);
}
/* @8<5@ 2K2>40 (5A;8 Last =5 =C;52>9):
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
@8<5@ 2K2>40 (5A;8 Last =C;52>9):
Tick GBPUSD Time: 2023.07.20 13:59:33.274, Bid: 1.28956, Ask: 1.28960, Flags: BID|ASK
*/
//--- =0G5
else
{
//--- A>740Q< AB@>:C A >?8A0=85< 2A5E 40==KE AB@C:BC@K A >BABC?0<8 8 7040==>9 H8@8=>9 ?>;O 703>;>2:0
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) : "")
);
//--- K2>48< 2 6C@=0; ?>;CG5==CN AB@>:C
Print(res);
}
/* @8<5@ 2K2>40 (5A;8 Last =5 =C;52>9):
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
@8<5@ 2K2>40 (5A;8 Last =C;52>9):
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
*/
}
//+------------------------------------------------------------------+