文章目录
一、账户信息
int OnStart()
{
// AccountInfoInteger()返回账户长整型属性值
long a1 = AccountInfoInteger(ACCOUNT_LOGIN); // MT5账户登录账号
long a2 = AccountInfoInteger(ACCOUNT_TRADE_MODE); // 获取当前账户的交易模式,模拟账户为0,真实账户为2
long a3 = AccountInfoInteger(ACCOUNT_LEVERAGE); // 获取账户杠杆
long a4 = AccountInfoInteger(ACCOUNT_LIMIT_ORDERS); // 请求当前账户的最大订单数量限制
long a5 = AccountInfoInteger(ACCOUNT_TRADE_EXPERT); // 是否允许智能交易
return(1);
}
int OnStart()
{
// AccountInfoDouble()返回账户双精度型属性值
double d1 = AccountInfoDouble(ACCOUNT_BALANCE); // 当前账户结余
double d2 = AccountInfoDouble(ACCOUNT_PROFIT); // 当前开仓单的盈亏总额
double d3 = AccountInfoDouble(ACCOUNT_EQUITY); // 当前账户净值
double d4 = AccountInfoDouble(ACCOUNT_MARGIN); // 当前账户占用保证金,即预付款
double d5 = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // 预付款维持率,即净值/占用保证金
return(1);
}
int OnStart()
{
// AccountInfoString()返回账户字符串型属性值
string s1 = AccountInfoString(ACCOUNT_NAME); // 用户名
string s2 = AccountInfoString(ACCOUNT_SERVER); // 交易服务器名称
string s3 = AccountInfoString(ACCOUNT_COMPANY); // 提供账户的公司名称
return(1);
}
二、终端信息
int OnStart()
{
// TerminalInfoInteger()获取与终端相关的整数类型信息
int ti1 = TerminalInfoInteger(TERMINAL_BUILD); // 获取当前 MetaTrader 终端的构建版本号
int ti2 = TerminalInfoInteger(TERMINAL_DLLS_ALLOWED); // 使用DLL许可
return(1);
}
int OnStart()
{
// TerminalInfoDouble()获取与终端相关的双精度类型信息
double td1 = TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE); // MQL5.community的结余
return(1);
}
int OnStart()
{
// TerminalInfoString()获取与终端相关的字符串类型信息
string ts1 = TerminalInfoString(TERMINAL_LANGUAGE); // 获取终端使用的语言
string ts2 = TerminalInfoString(TERMINAL_PATH); // MetaTrader 终端的安装路径
string ts3 = TerminalInfoString(TERMINAL_DATA_PATH); // 获取 MetaTrader 终端的数据文件夹路径
string ts4 = TerminalInfoString(TERMINAL_COMMONDATA_PATH); // 获取当前 MetaTrader 终端的公共数据文件夹路径
return(1);
}
三、交易品种信息
在MT5左侧市场报价窗口,先选中交易品种,再点详细,可以查到更详细的数据。
另外,在交易品种上,鼠标右击,然后选规格,可以查到其他更详细数据。
int OnStart()
{
// SymbolInfoInteger()获取指定交易品种的长整类型信息
string sy = Symbol(); // 返回当前图表的交易品种名称
long symi1 = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD); // 当前交易品种点差
long symi2 = SymbolInfoInteger(Symbol(),SYMBOL_DIGITS); // 当前交易品种的价格小数位数
datetime symi3 = (datetime) SymbolInfoInteger(Symbol(),SYMBOL_TIME); // 获取该交易品种的最新成交时间
bool symi4 = (bool) SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT); // 获取该交易品种是否为浮动点差
return(1);
}
int OnStart()
{
// SymbolInfoDouble()获取指定交易品种的双进度类型信息
double symd1 = SymbolInfoDouble(Symbol(),SYMBOL_SWAP_LONG); // 一手多单的隔夜利息
double symd2 = SymbolInfoDouble(Symbol(),SYMBOL_SWAP_SHORT); // 一手空单的隔夜利息
double symd3 = SymbolInfoDouble(Symbol(),SYMBOL_BID); // 获取当前交易品种的卖出价
double symd4 = SymbolInfoDouble(Symbol(),SYMBOL_ASK); // 获取当前交易品种的买入价
return(1);
}
int OnStart()
{
string syName;
double bid;
// SymbolsTotal(true)表示获取仅在市场报价中的交易品种的数量
for(int i=0; i<SymbolsTotal(true); i++)
{
// 返回交易品种的名字
// 参数true表示只在市场报价中的交易品种
// 参数 i 表示在市场报价中的索引
syName = SymbolName(i, true);
bid = SymbolInfoDouble(syName, SYMBOL_BID);
}
return(1);
}
int OnStart()
{
SymbolSelect("XAUUSD", true); // 将XAUUSD添加到市场报价中
// SymbolSelect("XAUUSD", false); // 将XAUUSD从市场报价中删除
return(1);
}
四、市场深度
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
MqlBookInfo book[];
// 获取市场深度数据,装到book数组中
MarketBookGet(Symbol(), book);
for(int i=0; i<ArraySize(book); i++)
{
if(book[i].type == BOOK_TYPE_SELL)
{
Print(i, " 做空:",book[i].price);
}
if(book[i].type == BOOK_TYPE_BUY)
{
Print(i, " 做多:",book[i].price);
}
}
}
int OnInit()
{
// 订阅指定货币对的市场深度,
// 只有订阅了的货币对,才能触发OnBookEvent()函数
MarketBookAdd("XAUUSD");
MarketBookAdd("EURUSD"); // 可以同时订阅多个货币对
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// 取消订阅指定货币对的市场深度
MarketBookRelease("EURUSD");
}
// 指定货币对的市场深度变化时,触发OnBookEvent()函数
void OnBookEvent(const string& symbol)
{
Print(symbol, "市场深度发生改变");
}
五、自定义类获取K线信息
自定义类:
enum ENUM_KINFO // 定义K线信息类别
{
ENUM_ASK,
ENUM_BID,
ENUM_OPEN,
ENUM_CLOSE,
ENUM_LOW,
ENUM_HIGH,
ENUM_TIME
};
class KInfo
{
public:
string symbol;
double open[];
datetime time[];
KInfo(string select_symbol)
{
this.symbol = select_symbol;
}
~KInfo()
{
}
double get_info(ENUM_KINFO enum_kinfo)
{
if(enum_kinfo == ENUM_ASK)
{
return(SymbolInfoDouble(symbol,SYMBOL_ASK));
}
else if(enum_kinfo == ENUM_BID)
{
return(SymbolInfoDouble(symbol,SYMBOL_BID));
}
return(-1); // ENUM_KINFO变量输入错误,返回-1
}
// 这里只实现了开盘价和开盘时间,最高价最低价收盘价实现方法类似
void get_info(ENUM_KINFO enum_kinfo, int count)
{
if(enum_kinfo == ENUM_OPEN)
{
ArraySetAsSeries(open, true);
// 复制开放价格的历史数据到数组open中
CopyOpen(symbol, 0, 0, count, open);
// 这里的参数第一个0表示当前图表周期
}
else if(enum_kinfo == ENUM_TIME)
{
ArraySetAsSeries(time, true);
CopyTime(symbol, 0, 0, count, time);
}
}
void get_info(ENUM_KINFO enum_kinfo,ENUM_TIMEFRAMES tf, int count)
{
if(enum_kinfo == ENUM_OPEN)
{
ArraySetAsSeries(open, true);
CopyOpen(symbol, tf, 0, count, open);
}
else if(enum_kinfo == ENUM_TIME)
{
ArraySetAsSeries(time, true);
CopyTime(symbol, tf, 0, count, time);
}
}
};
脚本:
#include <myClass/testClass.mqh>
int OnStart()
{
KInfo k_info(Symbol());
double ask = k_info.get_info(ENUM_ASK);
Print("ask:", ask);
double bid = k_info.get_info(ENUM_BID);
Print("bid:",bid);
/*
k_info.get_info(ENUM_OPEN,PERIOD_H1,5);
double op1 = k_info.open[1];
Print("open:", op1);
*/
k_info.get_info(ENUM_OPEN,5);
double op1 = k_info.open[1];
Print("open:", op1);
k_info.get_info(ENUM_TIME, PERIOD_H1, 5);
datetime t1 = k_info.time[1];
Print("opentime:", t1);
/*
k_info.get_info(ENUM_TIME,5);
datetime t1 = k_info.time[1];
Print("opentime:", t1);
*/
return(1);
}
六、自定义类获取系统指标MA信息
自定义类:
class MAClass
{
public:
MAClass()
{
}
~MAClass()
{
}
void MA(
double& ma[],
int count,
string symbol_name, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
int ma_shift, // 平移
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_PRICE applied_price // 计算的价格
)
{
// 返回指标句柄
int ma_h = iMA(symbol_name, period, ma_period, ma_shift, ma_method, applied_price);
ArraySetAsSeries(ma, true);
// 使用此指标句柄来提取数据缓冲区中的值,复制到数组ma中
CopyBuffer(ma_h, 0, 0, count, ma);
IndicatorRelease(ma_h); // 释放指标句柄,防止内存泄漏
}
};
脚本:
#include <myClass/testClass.mqh>
int OnStart()
{
MAClass sj();
double ma[];
sj.MA(ma,10,Symbol(),PERIOD_CURRENT,10,0,MODE_SMA,PRICE_CLOSE);
double ma1 = ma[1];
Print(ma1);
return(1);
}
七、自定义类获取系统指标Stochastic Oscillator信息
自定义类:
class StoClass
{
public:
StoClass()
{
}
~StoClass()
{
}
void Stochastic(
double& sto0[],
double& sto1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int Kperiod, // K线周期 (用于计算的柱数)
int Dperiod, // D线周期 (开始平滑周期)
int slowing, // 最终平滑
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_STO_PRICE price_field // 随机计算法
)
{
int sto_h = iStochastic(symbol,0,Kperiod,Dperiod,slowing,ma_method,price_field);
ArraySetAsSeries(sto0,true);
ArraySetAsSeries(sto1,true);
CopyBuffer(sto_h, 0, 0, count, sto0); // 复制指标的第一个值
CopyBuffer(sto_h, 1, 0, count, sto1); // 复制指标的第二个值
IndicatorRelease(sto_h);
}
};
脚本:
#include <myClass/testClass.mqh>
int OnStart()
{
StoClass sj();
double sto0[], sto1[];
sj.Stochastic(sto0,sto1,5,Symbol(),0,5,3,3,MODE_SMA,STO_LOWHIGH);
double sto0_1= sto0[1];
double sto1_1= sto1[1];
Print(sto0_1);
Print(sto1_1);
return(1);
}
八、调用自定义指标AD
int OnStart()
{
int cus_h;
// 如果使用自定义指标的默认参数,可省略
// 指标名字先从本程序目录下搜索,再从Indicators下搜索。
cus_h = iCustom(Symbol(),PERIOD_CURRENT,"Examples\\AD",VOLUME_TICK);
double cus[];
ArraySetAsSeries(cus, true);
CopyBuffer(cus_h,0,0,5,cus);
Print(cus[1]);
Print(cus[2]);
return(1);
}