简介
很多开发人员已经累积了很多用 MQL4 编写的指标和交易策略。要在 Metatrader 5 中使用它们,应将它们转换为 MQL5。用 MQL5 重写所有程序并不是如此容易。如果有转换参考,则进行转换会容易得多,最好以例子说明。
在本文中,我愿意推荐我自己的有关从 MQL4 迁移 MQL5 的指南。
1. 图表周期
在 MQL5 图表中,周期常量出现改变,并且添加了一些新的时间周期(M2、M3、M4、M6、M10、M12、H2、H3、H6、H8、H12)。要转换 MQL4 时间周期,您可以使用以下函数:
ENUM_TIMEFRAMES TFMigrate(int tf) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60: return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1); case 2: return(PERIOD_M2); case 3: return(PERIOD_M3); case 4: return(PERIOD_M4); case 6: return(PERIOD_M6); case 10: return(PERIOD_M10); case 12: return(PERIOD_M12); case 16385: return(PERIOD_H1); case 16386: return(PERIOD_H2); case 16387: return(PERIOD_H3); case 16388: return(PERIOD_H4); case 16390: return(PERIOD_H6); case 16392: return(PERIOD_H8); case 16396: return(PERIOD_H12); case 16408: return(PERIOD_D1); case 32769: return(PERIOD_W1); case 49153: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }
应注意,在 MQL5 中,图表时间框架常量的数值(从 H1 起)不等于柱的分钟数(例如,在 MQL5 中,常量 PERIOD_H1 的数值 =16385,但是在 MQL4 中,PERIOD_H1=60)。如果在 MQL4 程序中使用了 MQL4 常量的数值,则在转换到 MQL5 时应考虑到这一点。
要确定图表的指定时间周期的分钟数,将函数 PeriodSeconds 返回的值除以 60。
2. 声明常量
在 MQL5 中缺少某些标准 MQL4 常量,因此应声明它们:
//+------------------------------------------------------------------ //| InitMQL4.mqh | //| Copyright DC2008 | //| https://www.mql5.com | //+------------------------------------------------------------------ #property copyright "keiji" #property copyright "DC2008" #property link "https://www.mql5.com" //---- 声明常量 #define OP_BUY 0 //买 #define OP_SELL 1 //卖 #define OP_BUYLIMIT 2 //BUY LIMIT 挂单类型 #define OP_SELLLIMIT 3 //SELL LIMIT 挂单类型 #define OP_BUYSTOP 4 //BUY STOP 挂单类型 #define OP_SELLSTOP 5 //SELL STOP 挂单类型 //--- #define MODE_OPEN 0 #define MODE_CLOSE 3 #define MODE_VOLUME 4 #define MODE_REAL_VOLUME 5 #define MODE_TRADES 0 #define MODE_HISTORY 1 #define SELECT_BY_POS 0 #define SELECT_BY_TICKET 1 //--- #define DOUBLE_VALUE 0 #define FLOAT_VALUE 1 #define LONG_VALUE INT_VALUE //--- #define CHART_BAR 0 #define CHART_CANDLE 1 //--- #define MODE_ASCEND 0 #define MODE_DESCEND 1 //--- #define MODE_LOW 1 #define MODE_HIGH 2 #define MODE_TIME 5 #define MODE_BID 9 #define MODE_ASK 10 #define MODE_POINT 11 #define MODE_DIGITS 12 #define MODE_SPREAD 13 #define MODE_STOPLEVEL 14 #define MODE_LOTSIZE 15 #define MODE_TICKVALUE 16 #define MODE_TICKSIZE 17 #define MODE_SWAPLONG 18 #define MODE_SWAPSHORT 19 #define MODE_STARTING 20 #define MODE_EXPIRATION 21 #define MODE_TRADEALLOWED 22 #define MODE_MINLOT 23 #define MODE_LOTSTEP 24 #define MODE_MAXLOT 25 #define MODE_SWAPTYPE 26 #define MODE_PROFITCALCMODE 27 #define MODE_MARGINCALCMODE 28 #define MODE_MARGININIT 29 #define MODE_MARGINMAINTENANCE 30 #define MODE_MARGINHEDGED 31 #define MODE_MARGINREQUIRED 32 #define MODE_FREEZELEVEL 33 //--- #define EMPTY -1
注:MQl4 中的常量和 MQL5 中的常量不同,因此最好在一个单独的文件 initMQ4.mqh 中声明它们以备将来使用。
3. 预定义变量
MQL4 | MQL5 | 说明 |
---|---|---|
double Ask
|
MqlTick last_tick; SymbolInfoTick(_Symbol,last_tick); double Ask=last_tick.ask; |
Ask 最新知道的当前交易品种的询价。 SymbolInfoTick |
int Bars |
int Bars=Bars(_Symbol,_Period); |
Bars
当前图表中的柱的数量。 |
double Bid
|
MqlTick last_tick; SymbolInfoTick(_Symbol,last_tick); double Bid=last_tick.bid; |
Bid 最新知道的当前交易品种的出价。 SymbolInfoTick |
double Close[]
|
double Close[]; int count; // 复制元素的数量 ArraySetAsSeries(Close,true); CopyClose(_Symbol,_Period,0,count,Close); |
Close
包含当前图表的每一根柱的收盘价的序列数组。 |
int Digits |
int Digits=_Digits; |
Digits
当前交易品种的价格的小数位数。 |
double High[]
|
double High[]; int count; // 复制元素的数量 ArraySetAsSeries(High,true); CopyHigh(_Symbol,_Period,0,count,High); |
High
包含当前图表的每一根柱的最高价的序列数组。 |
double Low[]
|
double Low[]; int count; // 复制元素的数量 ArraySetAsSeries(Low,true); CopyLow(_Symbol,_Period,0,count,Low); |
Low
包含当前图表的每一根柱的最低价的序列数组。 |
double Open[]
|
double Open[]; int count; // 复制元素的数量 ArraySetAsSeries(Open,true); CopyOpen(_Symbol,_Period,0,count,Open); |
Open
包含当前图表的每一根柱的开盘价的序列数组。 |
double Point |
double Point=_Point; |
Point
以报价货币表示的当前交易品种的点值。 |
datetime Time[]
|
datetime Time[]; int count; // 复制元素的数量 ArraySetAsSeries(Time,true); CopyTime(_Symbol,_Period,0,count,Time); |
Time
包含当前图表的每一根柱的开盘时间的序列数组。datetime 等数据以秒为单位表示从 1970 年 1 月 1 日凌晨 00:00 起经过的时间。 |
double Volume[]
|
long Volume[]; int count; // 复制元素的数量 ArraySetAsSeries(Volume,true); CopyTickVolume(_Symbol,_Period,0,count,Volume); |
Volume
包含当前图表的每一根柱的价格变动量的序列数组。 |
4. 帐户信息
MQL4 | MQL5 | 说明 |
---|---|---|
double AccountBalance()
|
double AccountInfoDouble(ACCOUNT_BALANCE) |
AccountBalance 返回当前帐户的余额值(帐户中的资金量)。 AccountInfoDouble |
double AccountCredit()
|
double AccountInfoDouble(ACCOUNT_CREDIT) |
AccountCredit 返回当前帐户的信用值。 AccountInfoDouble |
string AccountCompany()
|
string AccountInfoString(ACCOUNT_COMPANY) |
AccountCompany 返回当前帐户注册所在的经纪公司的名称。 AccountInfoString |
string AccountCurrency()
|
string AccountInfoString(ACCOUNT_CURRENCY) |
AccountCurrency 返回当前帐户的货币名称。 AccountInfoString |
double AccountEquity()
|
double AccountInfoDouble(ACCOUNT_EQUITY) |
AccountEquity 返回当前帐户的净资产值。净资产计算取决于交易服务器设置。 AccountInfoDouble |
double AccountFreeMargin()
|
double AccountInfoDouble(ACCOUNT_FREEMARGIN) |
AccountFreeMargin 返回当前帐户的可用预付款值。 AccountInfoDouble |
double AccountFreeMarginCheck(string symbol, int cmd, double volume) |
– | AccountFreeMarginCheck 返回当前帐户中以当前价格建立指定仓位之后剩下的可用预付款。 |
double AccountFreeMarginMode()
|
– | AccountFreeMarginMode 允许在当前帐户中建仓的可用预付款的计算模式。 |
int AccountLeverage()
|
int AccountInfoInteger(ACCOUNT_LEVERAGE) |
AccountLeverage 返回当前帐户的杠杆。 AccountInfoInteger |
double AccountMargin()
|
double AccountInfoDouble(ACCOUNT_MARGIN) |
AccountMargin 返回当前帐户的预付款值。 AccountInfoDouble |
string AccountName()
|
string AccountInfoString(ACCOUNT_NAME) |
AccountName 返回当前帐户的名称。 AccountInfoString |
int AccountNumber()
|
int AccountInfoInteger(ACCOUNT_LOGIN) |
AccountNumber 返回当前帐户的帐号。 AccountInfoInteger |
double AccountProfit()
|
double AccountInfoDouble(ACCOUNT_PROFIT) |
AccountProfit 返回当前帐户的盈利值。 AccountInfoDouble |
string AccountServer()
|
string AccountInfoString(ACCOUNT_SERVER) |
AccountServer 返回所连接服务器的名称。 AccountInfoString |
int AccountStopoutLevel()
|
double AccountInfoDouble(ACCOUNT_MARGIN_SO_SO) |
AccountStopoutLevel 返回止损离场水平值。 AccountInfoDouble |
int AccountStopoutMode()
|
int AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE) |
AccountStopoutMode 返回止损离场水平的计算模式。 AccountInfoInteger |
5. 数组函数
MQL4 | MQL5 | 说明 |
---|---|---|
int ArrayBsearch(double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND) |
int ArrayBsearch(double array[], double searched_value ) |
ArrayBsearch 函数在一维数字数组中搜索指定的值。 ArrayBsearch |
int ArrayCopy(object&dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY) |
int ArrayCopy(void dst_array[], void src_array[], int dst_start=0, int src_start=0, int cnt=WHOLE_ARRAY ) |
ArrayCopy 将数组复制为另一个数组。数组必须是相同的类型,但是类型为 double[], int[]、datetime[]、color[] 和 bool[] 的数组可以复制为相同类型的数组。返回复制元素的数量。 ArrayCopy |
int ArrayCopyRates(double&dest_array[], string symbol=NULL, int timeframe=0) |
– | ArrayCopyRates 将当前图表柱的数据复制到类型为 RateInfo[][6] 的两维数组,并返回复制的柱数,或者在失败时返回 -1。 |
int ArrayCopySeries(double&array[], int series_index, string symbol=NULL, int timeframe=0) |
int ArrayCopySeriesMQL4(double &array[], int series_index, string symbol=NULL, int tf=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int count=Bars(symbol,timeframe); switch(series_index) { case MODE_OPEN: return(CopyOpen(symbol,timeframe,0,count,array)); case MODE_LOW: return(CopyLow(symbol,timeframe,0,count,array)); case MODE_HIGH: return(CopyHigh(symbol,timeframe,0,count,array)); case MODE_CLOSE: return(CopyClose(symbol,timeframe,0,count,array)); default: return(0); } return(0); } |
ArrayCopySeries 将一个时间序列数组复制到一个自定义数组,并返回复制元素的数量。 CopyOpen、CopyLow、CopyHigh、CopyClose、Bars |
int ArrayDimension( object array[])
|
– | ArrayDimension 返回数组的维度。 |
bool ArrayGetAsSeries( object array[]) |
bool ArrayGetAsSeries(void array) |
ArrayGetAsSeries 如果数组是按时间序列数组组织的,则返回 TRUE(数组元素是从最后一个到第一个索引的),否则返回 FALSE。 ArrayGetAsSeries |
int ArrayInitialize(double &array[], double value) |
int ArrayInitializeMQL4(double &array[], double value) { ArrayInitialize(array,value); return(ArraySize(array)); } |
ArrayInitialize 将数字数组的所有元素设置为相同的值。返回被初始化的元素的数量。 ArrayInitialize、ArraySize |
bool ArrayIsSeries( object array[]) |
bool ArrayIsSeries(void array[]) |
ArrayIsSeries 如果正在检查的数组是时间序列数组(Time[]、Open[]、Close[]、High[]、Low[] 或 Volume[]),则返回 TRUE,否则返回 FALSE。 ArrayIsSeries |
int ArrayMaximum(double array[], int count=WHOLE_ARRAY, int start=0) |
int ArrayMaximumMQL4(double &array[], int count=WHOLE_ARRAY, int start=0) { return(ArrayMaximum(array,start,count)); } |
ArrayMaximum 搜索具有最大值的元素。函数返回此最大值元素在数组中的位置。 ArrayMaximum |
int ArrayMinimum(double array[], int count=WHOLE_ARRAY, int start=0) |
int ArrayMinimumMQL4(double &array[], int count=WHOLE_ARRAY, int start=0) { return(ArrayMinimum(array,start,count)); } |
ArrayMinimum 搜索具有最小值的元素。函数返回此最小值元素在数组中的位置。 ArrayMinimum |
int ArrayRange(object array[], int range_index) |
int ArrayRange(void array[], int rank_index ) |
ArrayRange 返回数组指定维度中元素的数量。 ArrayRange |
int ArrayResize(object &array[], int new_size) |
int ArrayResize(void array[], int new_size, int allocated_size=0 ) |
ArrayResize 为第一维设置一个新的大小。 ArrayResize |
bool ArraySetAsSeries(double &array[], bool set) |
bool ArraySetAsSeries(void array[], bool set ) |
ArraySetAsSeries 返回数组指定维度中的元素数量。因为索引是基于零的,维的大小比最大索引大 1。 ArraySetAsSeries |
int ArraySize( object array[]) |
int ArraySize(void array[]) |
ArraySize 返回数组包含的元素的数量。 ArraySize |
int ArraySort(double &array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND) |
int ArraySortMQL4(double &array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND) { switch(sort_dir) { case MODE_ASCEND: ArraySetAsSeries(array,true); case MODE_DESCEND: ArraySetAsSeries(array,false); default: ArraySetAsSeries(array,true); } ArraySort(array); return(0); } |
ArraySort 按第一维对数字数组排序。不能通过 ArraySort() 对序列数组进行排序。 ArraySort、ArraySetAsSeries |
6. 检查
MQL4 | MQL5 | 说明 |
---|---|---|
int GetLastError() |
int GetLastError() |
GetLastError 函数返回最后一次发生的错误,然后是特殊变量 last_error 的值,其中,存储的最后一个错误的代码将被归零。 GetLastError |
bool IsConnected()
|
bool TerminalInfoInteger(TERMINAL_CONNECTED) |
IsConnected 函数返回客户端与执行数据泵功能的服务器之间的主连接的状态。如果成功建立到服务器的连接,则返回 TRUE,否则返回 FALSE。 TerminalInfoInteger |
bool IsDemo()
|
bool IsDemoMQL4() { if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_DEMO) return(true); else return(false); } |
IsDemo 如果 EA 交易程序在一个演示帐户中运行,则返回 TRUE,否则返回 FALSE。 AccountInfoInteger |
bool IsDllsAllowed()
|
bool TerminalInfoInteger(TERMINAL_DLLS_ALLOWED) |
IsDllsAllowed 如果允许针对 EA 交易程序调用函数 DLL,则返回 TRUE,返回否则 FALSE。 TerminalInfoInteger |
bool IsExpertEnabled()
|
bool AccountInfoInteger(ACCOUNT_TRADE_EXPERT) |
IsExpertEnabled 如果在客户端中允许使用 EA 交易程序,则返回 TRUE,否则返回 FALSE。 AccountInfoInteger |
bool IsLibrariesAllowed()
|
bool MQLInfoInteger(MQL5_DLLS_ALLOWED) |
IsLibrariesAllowed 如果 EA 交易程序能够调用库函数,则返回 TRUE,否则返回 FALSE。 MQLInfoInteger |
bool IsOptimization()
|
bool MQLInfoInteger(MQL5_OPTIMIZATION) |
IsOptimization 如果 EA 交易程序在策略测试程序的优化模式中运行,则返回 TRUE,否则返回 FALSE。 MQLInfoInteger |
bool IsStopped() |
bool IsStopped() |
IsStopped 如果程序(EA 交易程序或脚本)被命令停止其操作,则返回 TRUE,否则返回 FALSE。 IsStopped |
bool IsTesting()
|
bool MQLInfoInteger(MQL5_TESTING) |
IsTesting 如果 EA 交易程序在测试模式中运行,则返回 TRUE,否则返回 FALSE。 MQLInfoInteger |
bool IsTradeAllowed()
|
bool MQLInfoInteger(MQL5_TRADE_ALLOWED) |
IsTradeAllowed 如果允许用 EA 交易程序进行交易并且交易线程未被占用,则返回 TRUE,否则返回 FALSE。 MQLInfoInteger |
bool IsTradeContextBusy()
|
– | IsTradeContextBusy 如果交易线程被另一 EA 交易程序占用,则返回 TRUE,否则返回 FALSE。 |
bool IsVisualMode()
|
bool MQLInfoInteger(MQL5_VISUAL_MODE) |
IsVisualMode 如果 EA 交易模式在选中了 “Visual Mode”(可视模式)按钮的情况下测试,则返回 TRUE,否则返回 FALSE。 MQLInfoInteger |
int UninitializeReason() |
int UninitializeReason() |
UninitializeReason 返回 EA 交易程序、自定义指标和脚本未初始化的原因代码。 UninitializeReason |
7. 客户端
MQL4 | MQL5 | 说明 |
---|---|---|
string TerminalCompany()
|
string TerminalInfoString(TERMINAL_COMPANY) |
TerminalCompany 返回拥有客户端的公司的名称。 TerminalInfoString |
string TerminalName()
|
string TerminalInfoString(TERMINAL_NAME) |
TerminalName 返回客户端名称。 TerminalInfoString |
string TerminalPath()
|
string TerminalInfoString(TERMINAL_PATH) |
TerminalPath 返回客户端的启动目录。 TerminalInfoString |
8. 公共函数
MQL4 | MQL5 | 说明 |
---|---|---|
void Alert(...) |
void Alert(argument,...) |
Alert 显示一个含有用户定义数据的对话框。参数可以是任意类型。 Alert |
void Comment(...) |
void Comment(argument,...) |
Comment 函数在图表的左上角输出用户定义的备注。 Comment |
int GetTickCount() |
uint GetTickCount() |
GetTickCount GetTickCount() 函数获取系统启动后经过的毫秒数。 GetTickCount |
double MarketInfo(string symbol, int type) |
double MarketInfoMQL4(string symbol, int type) { switch(type) { case MODE_LOW: return(SymbolInfoDouble(symbol,SYMBOL_LASTLOW)); case MODE_HIGH: return(SymbolInfoDouble(symbol,SYMBOL_LASTHIGH)); case MODE_TIME: return(SymbolInfoInteger(symbol,SYMBOL_TIME)); case MODE_BID: return(Bid); case MODE_ASK: return(Ask); case MODE_POINT: return(SymbolInfoDouble(symbol,SYMBOL_POINT)); case MODE_DIGITS: return(SymbolInfoInteger(symbol,SYMBOL_DIGITS)); case MODE_SPREAD: return(SymbolInfoInteger(symbol,SYMBOL_SPREAD)); case MODE_STOPLEVEL: return(SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL)); case MODE_LOTSIZE: return(SymbolInfoDouble(symbol,SYMBOL_TRADE_CONTRACT_SIZE)); case MODE_TICKVALUE: return(SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE)); case MODE_TICKSIZE: return(SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE)); case MODE_SWAPLONG: return(SymbolInfoDouble(symbol,SYMBOL_SWAP_LONG)); case MODE_SWAPSHORT: return(SymbolInfoDouble(symbol,SYMBOL_SWAP_SHORT)); case MODE_STARTING: return(0); case MODE_EXPIRATION: return(0); case MODE_TRADEALLOWED: return(0); case MODE_MINLOT: return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN)); case MODE_LOTSTEP: return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP)); case MODE_MAXLOT: return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX)); case MODE_SWAPTYPE: return(SymbolInfoInteger(symbol,SYMBOL_SWAP_MODE)); case MODE_PROFITCALCMODE: return(SymbolInfoInteger(symbol,SYMBOL_TRADE_CALC_MODE)); case MODE_MARGINCALCMODE: return(0); case MODE_MARGININIT: return(0); case MODE_MARGINMAINTENANCE: return(0); case MODE_MARGINHEDGED: return(0); case MODE_MARGINREQUIRED: return(0); case MODE_FREEZELEVEL: return(SymbolInfoInteger(symbol,SYMBOL_TRADE_FREEZE_LEVEL)); default: return(0); } return(0); } |
MarketInfo 返回在 Market Watch(市场观察)窗口中列出的证券的各种数据。 SymbolInfoInteger、SymbolInfoDouble、Bid、Ask |
int MessageBox(string text=NULL, string caption=NULL, int flags=EMPTY) |
int MessageBox(string text, string caption=NULL, int flags=0) |
MessageBox MessageBox 函数创建、显示和操作消息框。 MessageBox |
void PlaySound(string filename) |
bool PlaySound(string filename) |
PlaySound 函数播放一个声音文件。 PlaySound |
void Print(...) |
void Print(argument,...) |
Print 将一条消息打印到 EA 交易程序的日志。 |
bool SendFTP(string filename, string ftp_path=NULL) |
bool SendFTP(string filename, string ftp_path=NULL) |
SendFTP 将文件发送到在 Tools(工具)->Options(选项)->Publisher(发布者)选项卡中设置的 FTP 服务器。如果尝试失败,则返回 FALSE。 SendFTP |
void SendMail(string subject, string some_text) |
bool SendMail(string subject, string some_text) |
SendMail 向在 Tools(工具)->Options(选项)->EMail(电子邮件)选项卡中设置的电子邮件地址发送一封邮件。 SendMail |
void Sleep(int milliseconds) |
void Sleep(int milliseconds) |
Sleep Sleep() 函数在指定间隔内暂停当前 EA 交易程序的执行。 Sleep |
9. 转换函数
MQL4 | MQL5 | 说明 |
---|---|---|
string CharToStr(int char_code) |
string CharToString(int char_code) |
CharToStr 将符号代码转换为单字符的字符串。 CharToString |
string DoubleToStr(double value, int digits) |
string DoubleToString(double value, int digits=8) |
DoubleToStr 返回含有转换为指定精度格式的数字值的文本字符串。 DoubleToString |
double NormalizeDouble(double value, int digits) |
double NormalizeDouble(double value, int digits) |
NormalizeDouble 将浮点值四舍五入到指定精度。返回双精度类型的标准化值。 NormalizeDouble |
double StrToDouble(string value) |
double StringToDouble(string value) |
StrToDouble 将数字的字符串表示转换为双精度类型(具有浮点的双精度格式)。 StringToDouble |
int StrToInteger(string value) |
long StringToInteger(string value) |
StrToInteger 将含有数值字符表示的字符串转换为 int(整数)类型的值。 StringToInteger |
datetime StrToTime(string value) |
datetime StringToTime(string value) |
StrToTime 将格式为 “yyyy.mm.dd hh:mi” 的字符串转换为 datetime 类型(从 1970 年 1 月 1 日起经过的秒数)。 StringToTime |
string TimeToStr(datetime value, int mode=TIME_DATE|TIME_MINUTES) |
string TimeToString(datetime value, int mode=TIME_DATE|TIME_MINUTES) |
TimeToStr 将含有从 1970 年 1 月 1 日起经过的秒数的值转换为 “yyyy.mm.dd hh:mi” 格式的字符串。 TimeToString |
10. 自定义指标
MQL4 | MQL5 | 说明 |
---|---|---|
void IndicatorBuffers(int count) |
– | IndicatorBuffers 为用于自定义指标计算的缓存分配内存。 |
int IndicatorCounted()
|
int IndicatorCountedMQL4() { if(prev_calculated>0) return(prev_calculated-1); if(prev_calculated==0) return(0); return(0); } |
IndicatorCounted 函数返回在上一次启动指标之后没有改变的柱的数量。 OnCalculate |
void IndicatorDigits(int digits) |
bool IndicatorSetInteger(INDICATOR_DIGITS,digits) |
IndicatorDigits 设置用于虚拟化指标值的精度格式(小数点后面的位数)。 IndicatorSetInteger |
void IndicatorShortName(string name) |
bool IndicatorSetString(INDICATOR_SHORTNAME,name) |
IndicatorShortName 设置在数据窗口和图表子窗口中显示自定义指标的“短”名称。 IndicatorSetString |
void SetIndexArrow(int index, int code) |
bool PlotIndexSetInteger(index,PLOT_ARROW,code) |
SetIndexArrow 为 DRAW_ARROW 类型的指标线设置一个箭头符号。 PlotIndexSetInteger |
bool SetIndexBuffer(int index, double array[]) |
bool SetIndexBuffer(index,array,INDICATOR_DATA) |
SetIndexBuffer 在将全局水平声明的数组变量绑定到自定义指标的预定义缓存。 SetIndexBuffer |
void SetIndexDrawBegin(int index, int begin) |
bool PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,begin) |
SetIndexDrawBegin 设置绘制指定指标线必须从其开始的柱号(从数据开始)。 PlotIndexSetInteger |
void SetIndexEmptyValue(int index, double value) |
bool PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,value) |
SetIndexEmptyValue 将绘制线设置为空值。 PlotIndexSetDouble |
void SetIndexLabel(int index, string text) |
bool PlotIndexSetString(index,PLOT_LABEL,text) |
SetIndexLabel 设置要显示在数据窗口和工具提示中的绘制线说明。 PlotIndexSetString |
void SetIndexShift(int index, int shift) |
bool PlotIndexSetInteger(index,PLOT_SHIFT,shift) |
SetIndexShift 设置绘制线的偏移。 PlotIndexSetInteger |
void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) |
void SetIndexStyleMQL4(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) { if(width>-1) PlotIndexSetInteger(index,PLOT_LINE_WIDTH,width); if(clr!=CLR_NONE) PlotIndexSetInteger(index,PLOT_LINE_COLOR,clr); switch(type) { case 0: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); case 1: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_SECTION); case 2: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); case 3: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_ARROW); case 4: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_ZIGZAG); case 12: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_NONE); default: PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); } switch(style) { case 0: PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_SOLID); case 1: PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DASH); case 2: PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DOT); case 3: PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DASHDOT); case 4: PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DASHDOTDOT); default: return; } |
SetIndexStyle 为指定的指标线设置新的类型、样式、宽度和颜色。 PlotIndexSetInteger |
void SetLevelStyle(int draw_style, int line_width, color clr=CLR_NONE) |
void SetLevelStyleMQL4(int draw_style, int line_width, color clr=CLR_NONE) { IndicatorSetInteger(INDICATOR_LEVELWIDTH,line_width); if(clr!=CLR_NONE) IndicatorSetInteger(INDICATOR_LEVELCOLOR,clr); switch(draw_style) { case 0: IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_SOLID); case 1: IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DASH); case 2: IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT); case 3: IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DASHDOT); case 4: IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DASHDOTDOT); default: return; } } |
SetLevelStyle 函数设置要在单独的窗口中输出的指标的水平线的新样式、宽度和颜色。 IndicatorSetInteger |
void SetLevelValue(int level, double value) |
bool IndicatorSetDouble(INDICATOR_LEVELVALUE,level,value) |
SetLevelValue 函数设置要在单独的窗口中输出的指标的指定水平线的值。 IndicatorSetDouble |
11. 日期与时间函数
MQL4 | MQL5 | 说明 |
---|---|---|
int Day()
|
int DayMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.day); } |
Day 返回一个月中的当前日期,即最新已知服务器时间的一个月中的日期。 TimeCurrent、MqlDateTime |
int DayOfWeek()
|
int DayOfWeekMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.day_of_week); } |
DayOfWeek 返回最新已知服务器时间的当前基于零的星期几(0-星期天、1、2、3、4、5、6)。 TimeCurrent, MqlDateTime |
int DayOfYear()
|
int DayOfYearMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.day_of_year); } |
DayOfYear 返回一年中的当前日期(1 表示 1 月 1 日,… ,365(6) 表示 12 月 31 日),即最新已知服务器时间的一年中的日期。 TimeCurrent, MqlDateTime |
int Hour()
|
int HourMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.hour); } |
Hour 返回程序启动时最新已知服务器时间的小时 (0,1,2,..23)(此值在程序执行期间不会改变)。 TimeCurrent、MqlDateTime |
int Minute()
|
int MinuteMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.min); } |
Minute 返回程序启动时最新已知服务器时间的当前分钟 (0,1,2,..59)(此值在程序执行期间不会改变)。 TimeCurrent、MqlDateTime |
int Month()
|
int MonthMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.mon); } |
Month 作为数字返回当前月份(1- 1 月、2、3、4、5、6、7、8、9、10、11、12),即最新已知服务器时间的月份。 TimeCurrent、MqlDateTime |
int Seconds()
|
int SecondsMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.sec); } |
Seconds 返回程序启动时从最新已知服务器时间的当前分钟开始过去的秒数(此值在程序执行期间不会改变)。 TimeCurrent、MqlDateTime |
datetime TimeCurrent() |
datetime TimeCurrent() |
TimeCurrent 作为从 1970 年 1 月 1 日 00:00 起过去的秒数返回最新已知服务器时间(最新报价的到达时间)。 TimeCurrent |
int TimeDay(datetime date) |
int TimeDayMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.day); } |
TimeDay 返回指定日期的一月中的日期 (1 – 31)。 TimeToStruct、MqlDateTime |
int TimeDayOfWeek(datetime date) |
int TimeDayOfWeekMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.day_of_week); } |
TimeDayOfWeek 返回指定日期的基于零的星期几(0 表示星期天、1、2、3、4、5、6)。 TimeToStruct、MqlDateTime |
int TimeDayOfYear(datetime date) |
int TimeDayOfYearMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.day_of_year); } |
TimeDayOfYear 返回指定日期的一年中的天数(1 表示 1 月 1 日,…,365(6) 表示 12 月 31 日)。 TimeToStruct、MqlDateTime |
int TimeHour(datetime time) |
int TimeHourMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.hour); } |
TimeHour 返回指定时间的小时。 TimeToStruct、MqlDateTime |
datetime TimeLocal() |
datetime TimeLocal() |
TimeLocal 作不从 1970 年 1 月 1 日 00:00 起经过的秒数返回本地计算机时间。 TimeLocal |
int TimeMinute(datetime time) |
int TimeMinuteMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.min); } |
TimeMinute 返回指定时间的分钟。 TimeToStruct、MqlDateTime |
int TimeMonth(datetime time) |
int TimeMonthMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.mon); } |
TimeMonth 返回指定时间的月份。 TimeToStruct、MqlDateTime |
int TimeSeconds(datetime time) |
int TimeSecondsMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.sec); } |
TimeSeconds 返回指定时间从分钟开始时过去的秒数。 TimeToStruct、MqlDateTime |
int TimeYear(datetime time) |
int TimeYearMQL4(datetime date) { MqlDateTime tm; TimeToStruct(date,tm); return(tm.year); } |
TimeYear 返回指定日期的年份。返回的值在 1970 至 2037 的范围内。 TimeToStruct、MqlDateTime |
int Year()
|
int YearMQL4() { MqlDateTime tm; TimeCurrent(tm); return(tm.year); } |
Year 返回当前年份,即最后已知服务器时间的年份。 TimeCurrent、MqlDateTime |
12. 文件函数
MQL4 | MQL5 | 说明 |
---|---|---|
void FileClose(int handle) |
void FileClose(int file_handle) |
FileClose 关闭先前通过 FileOpen() 函数打开的文件。 FileClose |
void FileDelete(string filename) |
bool FileDelete(string file_name int common_flag=0) |
FileDelete 删除指定文件名。 FileDelete |
void FileFlush(int handle) |
void FileFlush(int file_handle) |
FileFlush 将存储在文件缓存中的所有数据刷新到磁盘。 FileFlush |
bool FileIsEnding(int handle) |
bool FileIsEnding(int file_handle) |
FileIsEnding 如果文件指针处于文件末尾,则返回逻辑 true,否则返回 false。 FileIsEnding |
bool FileIsLineEnding(int handle) |
bool FileIsLineEnding(int file_handle) |
FileIsLineEnding 对于 CSV 文件,如果文件指针在行的末尾,则返回逻辑 true,否则返回 false。 FileIsLineEnding |
int FileOpen(string filename, int mode, int delimiter=';') |
int FileOpen(string ile_name, int pen_flags, short delimiter='/t' uint codepage=CP_ACP) |
FileOpen 打开用于输入和/或输出的文件。返回打开文件的文件句柄,失败时则返回 -1。 FileOpen |
int FileOpenHistory(string filename, int mode, int delimiter=';') |
– | FileOpenHistory 打开当前历史记录目录 (terminal_directory/history/server_name) 或其子文件夹中的文件。返回打开文件的文件句柄。如果函数失败,返回值为 -1。 |
int FileReadArray(int handle, object &array[], int start, int count) |
uint FileReadArray(int file_handle, void array[], int start_item=0, int items_count=WHOLE_ARRAY) |
FileReadArray 将指定数量的元素从二进制文件读入数组。 FileReadArray |
double FileReadDouble(int handle, int size=DOUBLE_VALUE) |
double FileReadDoubleMQL4(int handle, int size=DOUBLE_VALUE) { return(FileReadDouble(handle)); } |
FileReadDouble 从当前二进制文件位置读取具有浮点的双精度数字。 FileReadDouble |
int FileReadInteger(int handle, int size=LONG_VALUE) |
int FileReadInteger(int file_handle, int size=INT_VALUE) |
FileReadInteger 从当前二进制文件位置读取整数。 FileReadInteger |
double FileReadNumber(int handle) |
double FileReadNumber(int file_handle) |
FileReadNumber 从当前文件位置读取分隔符前的数字。仅适用于 CSV 文件。 FileReadNumber |
string FileReadString(int handle, int length=0) |
string FileReadString(int file_handle, int size=-1) |
FileReadString 函数从当前文件位置读取一个字符串。 FileReadString |
bool FileSeek(int handle, int offset, int origin) |
bool FileSeekMQL4(long handle, int offset, ENUM_FILE_POSITION origin) { FileSeek(handle,offset,origin); return(true); } |
FileSeek 函数将文件指针从开头、末尾或当前文件位置移动一个新位置,偏移量以字节为单位。 FileSeek |
int FileSize(int handle) |
ulong FileSize(int file_handle) |
FileSize 函数以字节为单位返回文件大小。 FileSize |
int FileTell(int handle) |
ulong FileTell(int file_handle) |
FileTell 返回文件指针的当前位置。 FileTell |
int FileWrite(int handle,...) |
uint FileWrite(int file_handle,...) |
FileWrite 函数用于将数据写入一个 CSV 文件,自动插入分隔符。 FileWrite |
int FileWriteArray(int handle, object array[], int start, int count) |
int FileWriteArray(int file_handle, void array[], int start_item=0, int items_count=WHOLE_ARRAY) |
FileWriteArray 函数将数组写入一个二进制文件。 FileWriteArray |
int FileWriteDouble(int handle, double value, int size=DOUBLE_VALUE) |
uint FileWriteDouble(int file_handle, double dvalue) |
FileWriteDouble 函数将一个具有浮点的双精度值写入一个二进制文件。 FileWriteDouble |
int FileWriteInteger(int handle, int value, int size=LONG_VALUE) |
uint FileWriteInteger(int file_handle, int ivalue, int size=INT_VALUE) |
FileWriteInteger 函数将整数值写入一个二进制文件。 FileWriteInteger |
int FileWriteString(int handle, string value, int size) |
uint FileWriteString(int file_handle, string svalue, int size=-1) |
FileWriteString 函数从当前文件位置将字符串写入一个二进制文件。 FileWriteString |
13. 全局变量
MQL4 | MQL5 | 说明 |
---|---|---|
bool GlobalVariableCheck(string name) |
bool GlobalVariableCheck(string name) |
GlobalVariableCheck 如果全局变量存在,则返回 TRUE,否则返回 FALSE。 GlobalVariableCheck |
bool GlobalVariableDel(string name) |
bool GlobalVariableDel(string name) |
GlobalVariableDel 删除全局变量。 GlobalVariableDel |
double GlobalVariableGet(string name) |
double GlobalVariableGet(string name) |
GlobalVariableGet 返回现有全局变量的值,出错时返回 0。 GlobalVariableGet |
string GlobalVariableName(int index) |
string GlobalVariableName(int index) |
GlobalVariableName 函数通过全局变量在全局变量列表中的索引返回全局变量的名称。 GlobalVariableName |
datetime GlobalVariableSet(string name, double value) |
datetime GlobalVariableSet(string name, double value) |
GlobalVariableSet 将全局变量设置为新值。如果全局变量不存在,则系统创建一个新的全局变量。 GlobalVariableSet |
bool GlobalVariableSetOnCondition(string name, double value, double check_value) |
bool GlobalVariableSetOnCondition(string name, double value, double check_value) |
GlobalVariableSetOnCondition 如果当前值等于第三个参数 check_value 的值,则将现有全局变量设置为新值。 GlobalVariableSetOnCondition |
int GlobalVariablesDeleteAll(string prefix_name=NULL) |
int GlobalVariablesDeleteAll(string prefix_name=NULL datetime limit_data=0) |
GlobalVariablesDeleteAll 删除全局变量。 GlobalVariablesDeleteAll |
int GlobalVariablesTotal() |
int GlobalVariablesTotal() |
GlobalVariablesTotal 函数返回全局变量的总数。 GlobalVariablesTotal |
14. 数学函数
MQL4 | MQL5 | 说明 |
---|---|---|
double MathAbs(double value) |
double MathAbs(double value) |
MathAbs 返回指定数值的绝对值(模数)。 MathAbs |
double MathArccos(double x) |
double MathArccos(double val) |
MathArccos MathArccos 函数返回 0 至 Pi(弧度)内 x 的反余弦值。 MathArccos |
double MathArcsin(double x) |
double MathArcsin(double val) |
MathArcsin MathArcsin 函数返回 -Pi/2 至 Pi/2 弧度内 x 的反正弦值。 MathArcsin |
double MathArctan(double x) |
double MathArctan(double value) |
MathArctan MathArctan 返回 x 的反正切值。 MathArctan |
double MathCeil(double x) |
double MathCeil(double val) |
MathCeil MathCeil 函数返回表示大于或等于 x 的最小整数的数值。 MathCeil |
double MathCos(double value) |
double MathCos(double value) |
MathCos 返回指定角度的余弦值。 MathCos |
double MathExp(double d) |
double MathExp(double value) |
MathExp 返回 e 的 d 次幂。 MathExp |
double MathFloor(double x) |
double MathFloor(double val) |
MathFloor MathFloor 函数返回表示小于或等于 x 的最大整数的数值。 MathFloor |
double MathLog(double x) |
double MathLog(double val) |
MathLog 如果成功,MathLog 函数返回 x 的自然对数。 MathLog |
double MathMax(double value1, double value2) |
double MathMax(double value1, double value2) |
MathMax 返回两个数值中的最大值。 MathMax |
double MathMin(double value1, double value2) |
double MathMin(double value1, double value2) |
MathMin 返回两个数值中的最小值。 MathMin |
double MathMod(double value1, double value2) |
double MathMod(double value1, double value2) |
MathMod 函数返回两个数相除后的浮点余数。 MathMod |
double MathPow(double base, double exponent) |
double MathPow(double base, double exponent) |
MathPow 返回底表达式的指定幂的值(指数值)。 MathPow |
int MathRand() |
int MathRand() |
MathRand MathRand 函数返回 0 至 32767 内的伪随机数。 MathRand |
double MathRound(double value) |
double MathRound(double value) |
MathRound 返回指定数值最接近整数的四舍五入值。 MathRound |
double MathSin(double value) |
double MathSin(double value) |
MathSin 返回指定角度的正弦值。 MathSin |
double MathSqrt(double x) |
double MathSqrt(double value) |
MathSqrt MathSqrt 函数返回 x 的平方根。 MathSqrt |
void MathSrand(int seed) |
void MathSrand(int seed) |
MathSrand MathSrand() 函数设置用于生成一系列伪随机整数的起点。 MathSrand |
double MathTan(double x) |
double MathTan(double rad) |
MathTan MathTan 返回 x 的正切值。 MathTan |
15. 对象函数
MQL4 | MQL5 | 说明 |
---|---|---|
bool ObjectCreate(string name, int type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0) |
bool ObjectCreateMQL4(string name, ENUM_OBJECT type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0) { return(ObjectCreate(0,name,type,window, time1,price1,time2,price2,time3,price3)); } |
ObjectCreate 在指定窗口中创建一个具有指定名称、类型和初始坐标的对象。 ObjectCreate |
bool ObjectDelete(string name) |
bool ObjectDeleteMQL4(string name) { return(ObjectDelete(0,name)); } |
ObjectDelete 删除具有指定名称的对象。 ObjectDelete |
string ObjectDescription(string name) |
string ObjectDescriptionMQL4(string name) { return(ObjectGetString(0,name,OBJPROP_TEXT)); } |
ObjectDescription 返回对象说明。 ObjectGetString |
int ObjectFind(string name) |
int ObjectFindMQL4(string name) { return(ObjectFind(0,name)); } |
ObjectFind 搜索具有指定名称的对象。 ObjectFind |
double ObjectGet(string name, int prop_id) |
double ObjectGetMQL4(string name, int index) { switch(index) { case OBJPROP_TIME1: return(ObjectGetInteger(0,name,OBJPROP_TIME)); case OBJPROP_PRICE1: return(ObjectGetDouble(0,name,OBJPROP_PRICE)); case OBJPROP_TIME2: return(ObjectGetInteger(0,name,OBJPROP_TIME,1)); case OBJPROP_PRICE2: return(ObjectGetDouble(0,name,OBJPROP_PRICE,1)); case OBJPROP_TIME3: return(ObjectGetInteger(0,name,OBJPROP_TIME,2)); case OBJPROP_PRICE3: return(ObjectGetDouble(0,name,OBJPROP_PRICE,2)); case OBJPROP_COLOR: return(ObjectGetInteger(0,name,OBJPROP_COLOR)); case OBJPROP_STYLE: return(ObjectGetInteger(0,name,OBJPROP_STYLE)); case OBJPROP_WIDTH: return(ObjectGetInteger(0,name,OBJPROP_WIDTH)); case OBJPROP_BACK: return(ObjectGetInteger(0,name,OBJPROP_WIDTH)); case OBJPROP_RAY: return(ObjectGetInteger(0,name,OBJPROP_RAY_RIGHT)); case OBJPROP_ELLIPSE: return(ObjectGetInteger(0,name,OBJPROP_ELLIPSE)); case OBJPROP_SCALE: return(ObjectGetDouble(0,name,OBJPROP_SCALE)); case OBJPROP_ANGLE: return(ObjectGetDouble(0,name,OBJPROP_ANGLE)); case OBJPROP_ARROWCODE: return(ObjectGetInteger(0,name,OBJPROP_ARROWCODE)); case OBJPROP_TIMEFRAMES: return(ObjectGetInteger(0,name,OBJPROP_TIMEFRAMES)); case OBJPROP_DEVIATION: return(ObjectGetDouble(0,name,OBJPROP_DEVIATION)); case OBJPROP_FONTSIZE: return(ObjectGetInteger(0,name,OBJPROP_FONTSIZE)); case OBJPROP_CORNER: return(ObjectGetInteger(0,name,OBJPROP_CORNER)); case OBJPROP_XDISTANCE: return(ObjectGetInteger(0,name,OBJPROP_XDISTANCE)); case OBJPROP_YDISTANCE: return(ObjectGetInteger(0,name,OBJPROP_YDISTANCE)); case OBJPROP_FIBOLEVELS: return(ObjectGetInteger(0,name,OBJPROP_LEVELS)); case OBJPROP_LEVELCOLOR: return(ObjectGetInteger(0,name,OBJPROP_LEVELCOLOR)); case OBJPROP_LEVELSTYLE: return(ObjectGetInteger(0,name,OBJPROP_LEVELSTYLE)); case OBJPROP_LEVELWIDTH: return(ObjectGetInteger(0,name,OBJPROP_LEVELWIDTH)); } } |
ObjectGet 函数返回指定对象属性的值。 ObjectGetInteger、ObjectGetDouble |
string ObjectGetFiboDescription(string name, int index) |
string ObjectGetFiboDescriptionMQL4(string name, int index) { return(ObjectGetString(0,name,OBJPROP_LEVELTEXT,index)); } |
ObjectGetFiboDescription 函数返回斐波纳契对象的层级说明。 ObjectGetString |
int ObjectGetShiftByValue(string name, double value) |
int ObjectGetShiftByValueMQL4(string name, double value) { ENUM_TIMEFRAMES timeframe=TFMigrate(PERIOD_CURRENT); datetime Arr[]; int shift; MqlRates mql4[]; if(ObjectGetTimeByValue(0,name,value)<0) return(-1); CopyRates(NULL,timeframe,0,1,mql4); if(CopyTime(NULL,timeframe,mql4[0].time, ObjectGetTimeByValue(0,name,value),Arr)>0) return(ArraySize(Arr)-1); else return(-1); } |
ObjectGetShiftByValue 函数计算并返回指定价格的柱索引(相对于当前柱的偏移)。 MqlRates、ObjectGetTimeByValue、CopyRates、CopyTime、ArraySize |
double ObjectGetValueByShift(string name, int shift) |
double ObjectGetValueByShiftMQL4(string name, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(PERIOD_CURRENT); MqlRates mql4[]; CopyRates(NULL,timeframe,shift,1,mql4); return(ObjectGetValueByTime(0,name,mql4[0].time,0)); } |
ObjectGetValueByShift 函数计算并返回指定柱(相对于当前柱的偏移)的价格值。 MqlRates、CopyRates、ObjectGetValueByTime |
bool ObjectMove(string name, int point, datetime time1, double price1) |
bool ObjectMoveMQL4(string name, int point, datetime time1, double price1) { return(ObjectMove(0,name,point,time1,price1)); } |
ObjectMove 函数在图表中移动对象坐标。视它们的类型而定,对象可以有一至三个坐标。 ObjectMove |
string ObjectName(int index) |
string ObjectNameMQL4(int index) { return(ObjectName(0,index)); } |
ObjectName 函数按对象在对象列表中的索引返回对象名称。 ObjectName |
int ObjectsDeleteAll(int window=EMPTY, int type=EMPTY) |
int ObjectsDeleteAllMQL4(int window=EMPTY, int type=EMPTY) { return(ObjectsDeleteAll(0,window,type)); } |
ObjectsDeleteAll 在指定的图表子窗口中删除指定类型的所有对象。 ObjectsDeleteAll |
bool ObjectSet(string name, int prop_id, double value) |
bool ObjectSetMQL4(string name, int index, double value) { switch(index) { case OBJPROP_TIME1: ObjectSetInteger(0,name,OBJPROP_TIME,(int)value);return(true); case OBJPROP_PRICE1: ObjectSetDouble(0,name,OBJPROP_PRICE,value);return(true); case OBJPROP_TIME2: ObjectSetInteger(0,name,OBJPROP_TIME,1,(int)value);return(true); case OBJPROP_PRICE2: ObjectSetDouble(0,name,OBJPROP_PRICE,1,value);return(true); case OBJPROP_TIME3: ObjectSetInteger(0,name,OBJPROP_TIME,2,(int)value);return(true); case OBJPROP_PRICE3: ObjectSetDouble(0,name,OBJPROP_PRICE,2,value);return(true); case OBJPROP_COLOR: ObjectSetInteger(0,name,OBJPROP_COLOR,(int)value);return(true); case OBJPROP_STYLE: ObjectSetInteger(0,name,OBJPROP_STYLE,(int)value);return(true); case OBJPROP_WIDTH: ObjectSetInteger(0,name,OBJPROP_WIDTH,(int)value);return(true); case OBJPROP_BACK: ObjectSetInteger(0,name,OBJPROP_BACK,(int)value);return(true); case OBJPROP_RAY: ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,(int)value);return(true); case OBJPROP_ELLIPSE: ObjectSetInteger(0,name,OBJPROP_ELLIPSE,(int)value);return(true); case OBJPROP_SCALE: ObjectSetDouble(0,name,OBJPROP_SCALE,value);return(true); case OBJPROP_ANGLE: ObjectSetDouble(0,name,OBJPROP_ANGLE,value);return(true); case OBJPROP_ARROWCODE: ObjectSetInteger(0,name,OBJPROP_ARROWCODE,(int)value);return(true); case OBJPROP_TIMEFRAMES: ObjectSetInteger(0,name,OBJPROP_TIMEFRAMES,(int)value);return(true); case OBJPROP_DEVIATION: ObjectSetDouble(0,name,OBJPROP_DEVIATION,value);return(true); case OBJPROP_FONTSIZE: ObjectSetInteger(0,name,OBJPROP_FONTSIZE,(int)value);return(true); case OBJPROP_CORNER: ObjectSetInteger(0,name,OBJPROP_CORNER,(int)value);return(true); case OBJPROP_XDISTANCE: ObjectSetInteger(0,name,OBJPROP_XDISTANCE,(int)value);return(true); case OBJPROP_YDISTANCE: ObjectSetInteger(0,name,OBJPROP_YDISTANCE,(int)value);return(true); case OBJPROP_FIBOLEVELS: ObjectSetInteger(0,name,OBJPROP_LEVELS,(int)value);return(true); case OBJPROP_LEVELCOLOR: ObjectSetInteger(0,name,OBJPROP_LEVELCOLOR,(int)value);return(true); case OBJPROP_LEVELSTYLE: ObjectSetInteger(0,name,OBJPROP_LEVELSTYLE,(int)value);return(true); case OBJPROP_LEVELWIDTH: ObjectSetInteger(0,name,OBJPROP_LEVELWIDTH,(int)value);return(true); default: return(false); } return(false); } |
ObjectSet 更改指定对象属性的值。 ObjectSetInteger、ObjectSetDouble |
bool ObjectSetFiboDescription(string name, int index, string text) |
bool ObjectSetFiboDescriptionMQL4(string name, int index, string text) { return(ObjectSetString(0,name,OBJPROP_LEVELTEXT,index,text)); } |
ObjectSetFiboDescription 函数将新的说明指定到斐波纳契对象的层级。 ObjectSetString |
bool ObjectSetText(string name, string text, int font_size, string font_name=NULL, color text_color=CLR_NONE) |
bool ObjectSetTextMQL4(string name, string text, int font_size, string font="", color text_color=CLR_NONE) { int tmpObjType=(int)ObjectGetInteger(0,name,OBJPROP_TYPE); if(tmpObjType!=OBJ_LABEL && tmpObjType!=OBJ_TEXT) return(false); if(StringLen(text)>0 && font_size>0) { if(ObjectSetString(0,name,OBJPROP_TEXT,text)==true && ObjectSetInteger(0,name,OBJPROP_FONTSIZE,font_size)==true) { if((StringLen(font)>0) && ObjectSetString(0,name,OBJPROP_FONT,font)==false) return(false); if(text_color>-1 && ObjectSetInteger(0,name,OBJPROP_COLOR,text_color)==false) return(false); return(true); } return(false); } return(false); } |
ObjectSetText 更改对象说明。 ObjectGetInteger、ObjectSetString、ObjectSetInteger、StringLen |
int ObjectsTotal(int type=EMPTY) |
int ObjectsTotalMQL4(int type=EMPTY, int window=-1) { return(ObjectsTotal(0,window,type)); } |
ObjectsTotal 返回图表中指定类型的对象总数。 ObjectsTotal |
int ObjectType(string name) |
int ObjectTypeMQL4(string name) { return((int)ObjectGetInteger(0,name,OBJPROP_TYPE)); } |
ObjectType 函数返回对象类型值。 ObjectGetInteger |
16. 字符串函数
MQL4 | MQL5 | 说明 |
---|---|---|
string StringConcatenate(...) |
int StringConcatenate(string &string_var, void argument1 void argument2 ...) |
StringConcatenate 构建所传递数据的字符串,并返回该字符串。 StringConcatenate |
int StringFind(string text, string matched_text, int start=0) |
int StringFind(string string_value, string match_substring, int start_pos=0) |
StringFind 搜索子字符串。返回搜索的子字符串在字符串中的开始位置,如果找不到子字符串,则返回 -1。 StringFind |
int StringGetChar(string text, int pos) |
ushort StringGetCharacter(string string_value, int pos) |
StringGetChar 返回字符串中指定位置的字符(代码)。 StringGetCharacter |
int StringLen(string text) |
int StringLen(string string_value) |
StringLen 返回字符串中的字符数量。 StringLen |
string StringSetChar(string text, int pos, int value) |
bool StringSetCharacter(string &string_var, int pos, ushort character) |
StringSetChar 返回在指定位置更改了字符的字符串副本。 StringSetCharacter |
string StringSubstr(string text, int start, int length=0) |
string StringSubstr(string string_value, int start_pos, int length=-1) |
StringSubstr 在文本字符串中从指定位置开始提取子字符串。 StringSubstr |
string StringTrimLeft(string text) |
int StringTrimLeft(string& string_var) |
StringTrimLeft 函数截去字符串左侧的换行符、空格和制表符。 StringTrimLeft |
string StringTrimRight(string text) |
int StringTrimRight(string& string_var) |
StringTrimRight 函数截去字符串右侧的换行符、空格和制表符。 StringTrimRight |
17. 技术指标
在“MQL5 初学者:在‘EA 交易’中使用技术指标的指南”一文中考虑了在 EA 交易程序中使用技术指标的原则。在该参考中使用的方法足以为指定的价格获得指标计算结果。要使用此方法,我们需要辅助函数:
double CopyBufferMQL4(int handle,int index,int shift) { double buf[]; switch(index) { case 0: if(CopyBuffer(handle,0,shift,1,buf)>0) return(buf[0]); break; case 1: if(CopyBuffer(handle,1,shift,1,buf)>0) return(buf[0]); break; case 2: if(CopyBuffer(handle,2,shift,1,buf)>0) return(buf[0]); break; case 3: if(CopyBuffer(handle,3,shift,1,buf)>0) return(buf[0]); break; case 4: if(CopyBuffer(handle,4,shift,1,buf)>0) return(buf[0]); break; default: break; } return(EMPTY_VALUE); }
让我们声明以下常量:
ENUM_MA_METHOD MethodMigrate(int method) { switch(method) { case 0: return(MODE_SMA); case 1: return(MODE_EMA); case 2: return(MODE_SMMA); case 3: return(MODE_LWMA); default: return(MODE_SMA); } } ENUM_APPLIED_PRICE PriceMigrate(int price) { switch(price) { case 1: return(PRICE_CLOSE); case 2: return(PRICE_OPEN); case 3: return(PRICE_HIGH); case 4: return(PRICE_LOW); case 5: return(PRICE_MEDIAN); case 6: return(PRICE_TYPICAL); case 7: return(PRICE_WEIGHTED); default: return(PRICE_CLOSE); } } ENUM_STO_PRICE StoFieldMigrate(int field) { switch(field) { case 0: return(STO_LOWHIGH); case 1: return(STO_CLOSECLOSE); default: return(STO_LOWHIGH); } } //+------------------------------------------------------------------ enum ALLIGATOR_MODE { MODE_GATORJAW=1, MODE_GATORTEETH, MODE_GATORLIPS }; enum ADX_MODE { MODE_MAIN, MODE_PLUSDI, MODE_MINUSDI }; enum UP_LOW_MODE { MODE_BASE, MODE_UPPER, MODE_LOWER }; enum ICHIMOKU_MODE { MODE_TENKANSEN=1, MODE_KIJUNSEN, MODE_SENKOUSPANA, MODE_SENKOUSPANB, MODE_CHINKOUSPAN }; enum MAIN_SIGNAL_MODE{ MODE_MAIN, MODE_SIGNAL };
MQL4 | MQL5 | 说明 |
---|---|---|
double iAC(string symbol, int timeframe, int shift) |
double iACMQL4(string symbol, int tf, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iAC(symbol,timeframe); if(handle<0) { Print("此 iAC 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iAC 计算 Bill Williams 的加速/减速振荡技术指标。 iAC |
double iAD(string symbol, int timeframe, int shift) |
double iADMQL4(string symbol, int tf, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=(int)iAD(symbol,timeframe,VOLUME_TICK); if(handle<0) { Print("此 iAD 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iAD 计算累积分布指标并返回其值。 iAD |
double iAlligator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift) |
double iAlligatorMQL4(string symbol, int tf, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int method, int price, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iAlligator(symbol,timeframe,jaw_period,jaw_shift, teeth_period,teeth_shift, lips_period,lips_shift, ma_method,applied_price); if(handle<0) { Print("此 iAlligator 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode-1,shift)); } |
iAlligator 计算 Bill Williams 的鳄鱼指标并返回其值。 iAlligator |
double iADX(string symbol, int timeframe, int period, int applied_price, int mode, int shift) |
double iADXMQL4(string symbol, int tf, int period, int price, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iADX(symbol,timeframe,period); if(handle<0) { Print("此 iADX 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode,shift)); } |
iADX 计算趋向指标并返回其值。 iADX |
double iATR(string symbol, int timeframe, int period, int shift) |
double iATRMQL4(string symbol, int tf, int period, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iATR(symbol,timeframe,period); if(handle<0) { Print("此 iATR 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iATR 计算平均真实波动范围指标并返回其值。 iATR |
double iAO(string symbol, int timeframe, int shift) |
double iAOMQL4(string symbol, int tf, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iAO(symbol,timeframe); if(handle<0) { Print("此 iAO 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iAO 计算 Bill Williams 的动量振荡指标并返回其值。 iAO |
double iBearsPower(string symbol, int timeframe, int period, int applied_price, int shift) |
double iBearsPowerMQL4(string symbol, int tf, int period, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iBearsPower(symbol,timeframe,period); if(handle<0) { Print("此 iBearsPower 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iBearsPower 计算熊市力量动量指标并返回其值。 iBearsPower |
double iBands(string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int shift) |
double iBandsMQL4(string symbol, int tf, int period, double deviation, int bands_shift, int method, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); int handle=iBands(symbol,timeframe,period, bands_shift,deviation,ma_method); if(handle<0) { Print("此 iBands 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode,shift)); } |
iBands 计算布林带指标并返回其值。 iBands |
double iBandsOnArray(double array[], int total, int period, int deviation, int bands_shift, int mode, int shift) |
– | iBandsOnArray 用存储在数字数组中的数据计算布林带指标。 |
double iBullsPower(string symbol, int timeframe, int period, int applied_price, int shift) |
double iBullsPowerMQL4(string symbol, int tf, int period, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iBullsPower(symbol,timeframe,period); if(handle<0) { Print("此 iBullsPower 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iBullsPower 计算牛市力量动量指标并返回其值。 iBullsPower |
double iCCI(string symbol, int timeframe, int period, int applied_price, int shift) |
double iCCIMQL4(string symbol, int tf, int period, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iCCI(symbol,timeframe,period,price); if(handle<0) { Print("此 iCCI 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iCCI 计算顺市指标并返回其值。 iCCI |
double iCCIOnArray(double array[], int total, int period, int shift) |
– | iCCIOnArray 用存储在数字数组中的数据计算顺市指标。 |
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift) |
int iCustom(string symbol, ENUM_TIMEFRAMES period, string name ...) |
iCustom 计算指定的自定义指标并返回其值。 iCustom |
double iDeMarker(string symbol, int timeframe, int period, int shift) |
double iDeMarkerMQL4(string symbol, int tf, int period, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iDeMarker(symbol,timeframe,period); if(handle<0) { Print("此 iDeMarker 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iDeMarker 计算 DeMarker 指标并返回其值。 iDeMarker |
double iEnvelopes(string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, double deviation, int mode, int shift) |
double EnvelopesMQL4(string symbol, int tf, int ma_period, int method, int ma_shift, int price, double deviation, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iEnvelopes(symbol,timeframe, ma_period,ma_shift,ma_method, applied_price,deviation); if(handle<0) { Print("此 iEnvelopes 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode-1,shift)); } |
iEnvelopes 计算包络线指标并返回其值。 iEnvelopes |
double iEnvelopesOnArray(double array[], int total, int ma_period, int ma_method, int ma_shift, double deviation, int mode, int shift) |
– | iEnvelopesOnArray 用存储在数字数组中的数据计算包络线指标。 |
double iForce(string symbol, int timeframe, int period, int ma_method, int applied_price, int shift) |
double iForceMQL4(string symbol, int tf, int period, int method, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); int handle=iForce(symbol,timeframe,period,ma_method,VOLUME_TICK); if(handle<0) { Print("此 iForce 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iForce 计算强力指数并返回其值。 iForce |
double iFractals(string symbol, int timeframe, int mode, int shift) |
double iFractalsMQL4(string symbol, int tf, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iFractals(symbol,timeframe); if(handle<0) { Print("此 iFractals 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode-1,shift)); } |
iFractals 计算分形指标并返回其值。 iFractals |
double iGator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift) |
double iGatorMQL4(string symbol, int tf, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int method, int price, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iGator(symbol,timeframe,jaw_period,jaw_shift, teeth_period,teeth_shift, lips_period,lips_shift, ma_method,applied_price); if(handle<0) { Print("此 iGator 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode-1,shift)); } |
iGator 计算鳄鱼振荡指标。 iGator |
double iIchimoku(string symbol, int timeframe, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift) |
double iIchimokuMQL4(string symbol, int tf, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iIchimoku(symbol,timeframe, tenkan_sen,kijun_sen,senkou_span_b); if(handle<0) { Print("此 iIchimoku 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode-1,shift)); } |
iIchimoku 计算 Ichimoku Kinko Hyo 指标并返回其值。 iIchimoku |
double iBWMFI(string symbol, int timeframe, int shift) |
double iBWMFIMQL4(string symbol, int tf, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=(int)iBWMFI(symbol,timeframe,VOLUME_TICK); if(handle<0) { Print("此 iBWMFI 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iBWMFI 计算 Bill Williams 市场促进指数并返回其值。 iBWMFI |
double iMomentum(string symbol, int timeframe, int period, int applied_price, int shift) |
double iMomentumMQL4(string symbol, int tf, int period, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iMomentum(symbol,timeframe,period,applied_price); if(handle<0) { Print("此 iMomentum 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iMomentum 计算动量指标并返回其值。 iMomentum |
double iMomentumOnArray(double array[], int total, int period, int shift) |
– | iMomentumOnArray 用存储在数字数组中的数据计算动量指标。 |
double iMFI(string symbol, int timeframe, int period, int shift) |
double iMFIMQL4(string symbol, int tf, int period, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=(int)iMFI(symbol,timeframe,period,VOLUME_TICK); if(handle<0) { Print("此 iMFI 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iMFI 计算资金流向指标并返回其值。 iMFI |
double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift) |
double iMAMQL4(string symbol, int tf, int period, int ma_shift, int method, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iMA(symbol,timeframe,period,ma_shift, ma_method,applied_price); if(handle<0) { Print("此 iMA 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iMA 计算移动平均线指标并返回其值。 iMA |
double iMAOnArray(double array[], int total, int period, int ma_shift, int ma_method, int shift) |
double iMAOnArrayMQL4(double &array[], int total, int period, int ma_shift, int ma_method, int shift) { double buf[],arr[]; if(total==0) total=ArraySize(array); if(total>0 && total<=period) return(0); if(shift>total-period-ma_shift) return(0); switch(ma_method) { case MODE_SMA : { total=ArrayCopy(arr,array,0,shift+ma_shift,period); if(ArrayResize(buf,total)<0) return(0); double sum=0; int i,pos=total-1; for(i=1;i<period;i++,pos--) sum+=arr[pos]; while(pos>=0) { sum+=arr[pos]; buf[pos]=sum/period; sum-=arr[pos+period-1]; pos--; } return(buf[0]); } case MODE_EMA : { if(ArrayResize(buf,total)<0) return(0); double pr=2.0/(period+1); int pos=total-2; while(pos>=0) { if(pos==total-2) buf[pos+1]=array[pos+1]; buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr); pos--; } return(buf[shift+ma_shift]); } case MODE_SMMA : { if(ArrayResize(buf,total)<0) return(0); double sum=0; int i,k,pos; pos=total-period; while(pos>=0) { if(pos==total-period) { for(i=0,k=pos;i<period;i++,k++) { sum+=array[k]; buf[k]=0; } } else sum=buf[pos+1]*(period-1)+array[pos]; buf[pos]=sum/period; pos--; } return(buf[shift+ma_shift]); } case MODE_LWMA : { if(ArrayResize(buf,total)<0) return(0); double sum=0.0,lsum=0.0; double price; int i,weight=0,pos=total-1; for(i=1;i<=period;i++,pos--) { price=array[pos]; sum+=price*i; lsum+=price; weight+=i; } pos++; i=pos+period; while(pos>=0) { buf[pos]=sum/weight; if(pos==0) break; pos--; i--; price=array[pos]; sum=sum-lsum+price*period; lsum-=array[i]; lsum+=price; } return(buf[shift+ma_shift]); } default: return(0); } return(0); } |
|
double iOsMA(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int shift) |
double iOsMAMQL4(string symbol, int tf, int fast_ema_period, int slow_ema_period, int signal_period, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iOsMA(symbol,timeframe, fast_ema_period,slow_ema_period, signal_period,applied_price); if(handle<0) { Print("此 iOsMA 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iOsMA 计算移动平均线动量指标并返回其值。 iOsMA |
double iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift) |
double iMACDMQL4(string symbol, int tf, int fast_ema_period, int slow_ema_period, int signal_period, int price, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iMACD(symbol,timeframe, fast_ema_period,slow_ema_period, signal_period,applied_price); if(handle<0) { Print("此 iMACD 对象不能创建: 错误 ",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode,shift)); } |
iMACD 计算平滑异动移动平均线动量指标并返回其值。 iMACD |
double iOBV(string symbol, int timeframe, int applied_price, int shift) |
double iOBVMQL4(string symbol, int tf, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iOBV(symbol,timeframe,VOLUME_TICK); if(handle<0) { Print("此 iOBV 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iOBV 计算平衡交易量指标并返回其值。 iOBV |
double iSAR(string symbol, int timeframe, double step, double maximum, int shift) |
double iSARMQL4(string symbol, int tf, double step, double maximum, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iSAR(symbol,timeframe,step,maximum); if(handle<0) { Print("此 iSAR 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iSAR 计算抛物线停止和反向系统指标并返回其值。 iSAR |
double iRSI(string symbol, int timeframe, int period, int applied_price, int shift) |
double iRSIMQL4(string symbol, int tf, int period, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iRSI(symbol,timeframe,period,applied_price); if(handle<0) { Print("此 iRSI 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iRSI 计算相对强弱指数并返回其值。 iRSI |
double iRSIOnArray(double array[], int total, int period, int shift) |
– | iRSIOnArray 用存储在数字数组中的数据计算相对强弱指数。 |
double iRVI(string symbol, int timeframe, int period, int mode, int shift) |
double iRVIMQL4(string symbol, int tf, int period, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iRVI(symbol,timeframe,period); if(handle<0) { Print("此 iRVI 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode,shift)); } |
iRVI 计算相对能量指数并返回其值。 iRVI |
double iStdDev(string symbol, int timeframe, int ma_period, int ma_shift, int ma_method, int applied_price, int shift) |
double iStdDevMQL4(string symbol, int tf, int ma_period, int ma_shift, int method, int price, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); ENUM_APPLIED_PRICE applied_price=PriceMigrate(price); int handle=iStdDev(symbol,timeframe,ma_period,ma_shift, ma_method,applied_price); if(handle<0) { Print("此 iStdDev 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iStdDev 计算标准方差指标并返回其值。 iStdDev |
double iStdDevOnArray(double array[], int total, int ma_period, int ma_shift, int ma_method, int shift) |
– | iStdDevOnArray 用存储在数字数组中的数据计算标准方差指标。 |
double iStochastic(string symbol, int timeframe, int%Kperiod, int%Dperiod, int slowing, int method, int price_field, int mode, int shift) |
double iStochasticMQL4(string symbol, int tf, int Kperiod, int Dperiod, int slowing, int method, int field, int mode, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); ENUM_MA_METHOD ma_method=MethodMigrate(method); ENUM_STO_PRICE price_field=StoFieldMigrate(field); int handle=iStochastic(symbol,timeframe,Kperiod,Dperiod, slowing,ma_method,price_field); if(handle<0) { Print("此 iStochastic 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,mode,shift)); } |
iStochastic 计算随机动量指标并返回其值。 iStochastic |
double iWPR(string symbol, int timeframe, int period, int shift) |
double iWPRMQL4(string symbol, int tf, int period, int shift) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); int handle=iWPR(symbol,timeframe,period); if(handle<0) { Print("此 iWPR 对象不能创建: 错误",GetLastError()); return(-1); } else return(CopyBufferMQL4(handle,0,shift)); } |
iWPR 计算 Larry William 百分比范围指标并返回其值。 iWPR |
18. 时间序列访问
MQL4 | MQL5 | 说明 |
---|---|---|
int iBars(string symbol, int timeframe) |
int iBarsMQL4(string symbol,int tf) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); return(Bars(symbol,timeframe)); } |
int iBarsMQL4(string symbol,int tf) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); return(Bars(symbol,timeframe)); } Bars |
int iBarShift(string symbol, int timeframe, datetime time, bool exact=false |
int iBarShiftMQL4(string symbol, int tf, datetime time, bool exact=false) { if(time<0) return(-1); ENUM_TIMEFRAMES timeframe=TFMigrate(tf); datetime Arr[],time1; CopyTime(symbol,timeframe,0,1,Arr); time1=Arr[0]; if(CopyTime(symbol,timeframe,time,time1,Arr)>0) { if(ArraySize(Arr)>2) return(ArraySize(Arr)-1); if(time<time1) return(1); else return(0); } else return(-1); } |
iBarShift 按建立时间搜索柱。 CopyTime、ArraySize |
double iClose(string symbol, int timeframe, int shift) |
double iCloseMQL4(string symbol,int tf,int index){ if(index < 0) return(-1); double Arr[]; ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(CopyClose(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } |
Close 返回具有指定时间框架和偏移的指定交易品种的柱的收盘价。如果本地历史记录是空的(未加载),则函数返回 0。 CopyRates、MqlRates |
double iHigh(string symbol, int timeframe, int shift) |
double iHighMQL4(string symbol,int tf,int index) { if(index < 0) return(-1); double Arr[]; ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(CopyHigh(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } |
High 返回具有指定时间框架和偏移的指定交易品种的柱的最高价。如果本地历史记录是空的(未加载),则函数返回 0。 CopyRates、MqlRates |
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) |
int iHighestMQL4(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { if(start<0) return(-1); ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(count<=0) count=Bars(symbol,timeframe); if(type<=MODE_OPEN) { double Open[]; ArraySetAsSeries(Open,true); CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMaximum(Open,0,count)+start); } if(type==MODE_LOW) { double Low[]; ArraySetAsSeries(Low,true); CopyLow(symbol,timeframe,start,count,Low); return(ArrayMaximum(Low,0,count)+start); } if(type==MODE_HIGH) { double High[]; ArraySetAsSeries(High,true); CopyHigh(symbol,timeframe,start,count,High); return(ArrayMaximum(High,0,count)+start); } if(type==MODE_CLOSE) { double Close[]; ArraySetAsSeries(Close,true); CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,0,count)+start); } if(type==MODE_VOLUME) { long Volume[]; ArraySetAsSeries(Volume,true); CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMaximum(Volume,0,count)+start); } if(type>=MODE_TIME) { datetime Time[]; ArraySetAsSeries(Time,true); CopyTime(symbol,timeframe,start,count,Time); return(ArrayMaximum(Time,0,count)+start); //--- } return(0); } |
iHighest 视类型而定,返回指定的若干周期内最高价的偏移。 CopyOpen、CopyLow、CopyHigh、CopyClose、CopyTickVolume、CopyTime、ArrayMaximum |
double iLow(string symbol, int timeframe, int shift) |
double iLowMQL4(string symbol,int tf,int index) { if(index < 0) return(-1); double Arr[]; ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(CopyLow(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } |
iLow 返回具有指定时间框架和偏移的指定交易品种的柱的最低价。如果本地历史记录是空的(未加载),则函数返回 0。 CopyRates、MqlRates |
int iLowest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) |
int iLowestMQL4(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { if(start<0) return(-1); ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(count<=0) count=Bars(symbol,timeframe); if(type<=MODE_OPEN) { double Open[]; ArraySetAsSeries(Open,true); CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMinimum(Open,0,count)+start); } if(type==MODE_LOW) { double Low[]; ArraySetAsSeries(Low,true); CopyLow(symbol,timeframe,start,count,Low); return(ArrayMinimum(Low,0,count)+start); } if(type==MODE_HIGH) { double High[]; ArraySetAsSeries(High,true); CopyHigh(symbol,timeframe,start,count,High); return(ArrayMinimum(High,0,count)+start); } if(type==MODE_CLOSE) { double Close[]; ArraySetAsSeries(Close,true); CopyClose(symbol,timeframe,start,count,Close); return(ArrayMinimum(Close,0,count)+start); } if(type==MODE_VOLUME) { long Volume[]; ArraySetAsSeries(Volume,true); CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMinimum(Volume,0,count)+start); } if(type>=MODE_TIME) { datetime Time[]; ArraySetAsSeries(Time,true); CopyTime(symbol,timeframe,start,count,Time); return(ArrayMinimum(Time,0,count)+start); } //--- return(0); } |
iLowest 视类型而定,返回指定的若干周期内最低价的偏移。 CopyOpen、CopyLow、CopyHigh、CopyClose、CopyTickVolume、CopyTime、ArrayMinimum |
double iOpen(string symbol, int timeframe, int shift) |
double iOpenMQL4(string symbol,int tf,int index) { if(index < 0) return(-1); double Arr[]; ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(CopyOpen(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } |
iOpen 返回具有指定时间框架和偏移的指定交易品种的柱的开盘价。如果本地历史记录是空的(未加载),则函数返回 0。 CopyRates、MqlRates |
datetime iTime(string symbol, int timeframe, int shift) |
datetime iTimeMQL4(string symbol,int tf,int index) { if(index < 0) return(-1); ENUM_TIMEFRAMES timeframe=TFMigrate(tf); datetime Arr[]; if(CopyTime(symbol, timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } |
iTime 返回具有指定时间框架和偏移的指定交易品种的柱的时间值。如果本地历史记录是空的(未加载),则函数返回 0。 CopyRates、MqlRates |
double iVolume(string symbol, int timeframe, int shift) |
int iVolumeMQL4(string symbol,int tf,int index) { if(index < 0) return(-1); long Arr[]; ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(CopyTickVolume(symbol, timeframe, index, 1, Arr)>0) return(Arr[0]); else return(-1); } |
iVolume 返回具有指定时间框架和偏移的指定交易品种的柱的价格变动量值。如果本地历史记录是空的(未加载),则函数返回 0。 CopyRates、MqlRates |
19. 图表操作
MQL4 | MQL5 | 说明 |
---|---|---|
void HideTestIndicators(bool hide) |
– | HideTestIndicators 函数设置一个用于隐藏 EA 交易程序所调用的指标的标记。 |
int Period() |
ENUM_TIMEFRAMES Period() |
Period 返回确定使用的周期(图表时间框架)的分钟数。 Period |
bool RefreshRates()
|
– | RefreshRates 刷新预定义的变量和序列数组中的数据。 |
string Symbol() |
string Symbol() |
Symbol 返回含有当前金融工具的名称的文本字符串。 Symbol |
int WindowBarsPerChart()
|
int ChartGetInteger(0,CHART_VISIBLE_BARS,0) |
WindowBarsPerChart 函数返回在图表上显示的柱的数量。 ChartGetInteger |
string WindowExpertName()
|
string MQLInfoString(MQL5_PROGRAM_NAME) |
WindowExpertName 视 MQL4 程序而定,返回调用该函数的所执行 EA 交易程序、脚本、自定义指标或库的名称。 MQLInfoString |
int WindowFind(string name) |
int WindowFindMQL4(string name) { int window=-1; if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); } else { window=ChartWindowFind(0,name); if(window==-1) Print(__FUNCTION__+"(): 错误 = ",GetLastError()); } return(window); } |
WindowFind 如果找到具有指定名称的指标,则函数返回包含此指定指标的窗口索引,否则返回 -1。 ChartWindowFind、MQLInfoInteger |
int WindowFirstVisibleBar()
|
int ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0) |
WindowFirstVisibleBar 函数返回当空图表窗口中第一个可见柱的编号。 ChartGetInteger |
int WindowHandle(string symbol, int timeframe) |
int WindowHandleMQL4(string symbol, int tf) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); long currChart,prevChart=ChartFirst(); int i=0,limit=100; while(i<limit) { currChart=ChartNext(prevChart); if(currChart<0) break; if(ChartSymbol(currChart)==symbol && ChartPeriod(currChart)==timeframe) return((int)currChart); prevChart=currChart; i++; } return(0); } |
WindowHandle 返回指定图表的系统窗口句柄。 ChartFirst、ChartNext、ChartSymbol, ChartPeriod |
bool WindowIsVisible(int index) |
bool ChartGetInteger(0,CHART_WINDOW_IS_VISIBLE,index) |
WindowIsVisible 如果图表子窗口可见,则返回 TRUE,否则返回 FALSE。 ChartGetInteger |
int WindowOnDropped()
|
int ChartWindowOnDropped() |
WindowOnDropped 返回 EA 交易程序、自定义指标或脚本所在的窗口的索引。 ChartWindowOnDropped |
double WindowPriceMax(int index=0) |
double ChartGetDouble(0,CHART_PRICE_MAX,index) |
WindowPriceMax 返回当前图表的指定子窗口的垂直刻度的最大值(0-主图表窗口,指标的子窗口从 1 开始编号)。 ChartGetDouble |
double WindowPriceMin(int index=0) |
double ChartGetDouble(0,CHART_PRICE_MIN,index) |
WindowPriceMin 返回当前图表的指定子窗口的垂直刻度的最小值(0-主图表窗口,指标的子窗口从 1 开始编号)。 ChartGetDouble |
double WindowPriceOnDropped()
|
double ChartPriceOnDropped() |
WindowPriceOnDropped 返回 EA 交易程序或脚本所在的图表点的价格部分。 ChartPriceOnDropped |
void WindowRedraw()
|
void ChartRedraw(0) |
WindowRedraw 强制重绘当前图表。 ChartRedraw |
bool WindowScreenShot(string filename, int size_x, int size_y, int start_bar=-1, int chart_scale=-1, int chart_mode=-1) |
bool WindowScreenShotMQL4(string filename, int size_x, int size_y, int start_bar=-1, int chart_scale=-1, int chart_mode=-1) { if(chart_scale>0 && chart_scale<=5) ChartSetInteger(0,CHART_SCALE,chart_scale); switch(chart_mode) { case 0: ChartSetInteger(0,CHART_MODE,CHART_BARS); case 1: ChartSetInteger(0,CHART_MODE,CHART_CANDLES); case 2: ChartSetInteger(0,CHART_MODE,CHART_LINE); } if(start_bar<0) return(ChartScreenShot(0,filename,size_x,size_y,ALIGN_RIGHT)); else return(ChartScreenShot(0,filename,size_x,size_y,ALIGN_LEFT)); } |
WindowScreenShot 作为 GIF 文件保存当前图表屏幕的截图。 ChartSetInteger, ChartScreenShot |
datetime WindowTimeOnDropped()
|
datetime ChartTimeOnDropped() |
WindowTimeOnDropped 返回 EA 交易程序或脚本所在的图表点的时间部分。 ChartTimeOnDropped |
int WindowsTotal()
|
int ChartGetInteger(0,CHART_WINDOWS_TOTAL) |
WindowsTotal 返回图表上指标窗口的数量(包括主图表)。 ChartGetInteger |
int WindowXOnDropped()
|
int ChartXOnDropped() |
WindowXOnDropped 返回 EA 交易程序或脚本所在的图表窗口客户端区域点的 X 轴的值(以像素为单位)。 ChartXOnDropped |
int WindowYOnDropped()
|
int ChartYOnDropped() |
WindowYOnDropped 返回 EA 交易程序或脚本所在的图表窗口客户端区域点的 Y 轴的值(以像素为单位)。 ChartYOnDropped |
总结
- 我们没有考虑交易函数,因为在 MQL5 中概念有所不同,并且应该使用原来的概念!可以转换它们,但是交易逻辑应改变。换言之,转换它们没有意义。
- 从一种语言将程序转换为另一种语言始终伴随着功能和性能的损失。因此,请将本指南用于快速搜索对等函数。
- 我计划开发 MQL4 仿真程序,让您能够在新的 MetaTrader 5 客户端中运行您的 MQL4 程序。
鸣谢:keiji、A. Williams。
本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/81
MyFxtop迈投-靠谱的外汇跟单社区,免费跟随高手做交易!
免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。