MQL4关键函数

如何抓取价格数据
1 如何获得本货币对的买价、卖价
double ask = Ask; // Ask是关键字,表示本货币对买价;
double bid = Bid; // Bid是关键字,表示本货币对卖价;

2 如何获得任意货币对的买价、卖价
double MarketInfo(string symbol, int type);
MarketInfo("EURUSD", MODE_ASK); // 获得欧元的买价
MarketInfo("EURUSD", MODE_BID); // 获得欧元的卖价

3 如何获得本货币对,本时间周期,任意K线的开盘价、收盘价、最高价、最低价
double Open[]; // 开盘价
double Close[]; // 收盘价
double High[]; // 最高价
double Low[]; // 最低价
// 序号从最后一根K线开始按照0、1、2编号。

4 如何获取任意货币对,任意时间周期,任意K线的开盘价、收盘价、最高价、最低价
double iOpen(string symbol, int timeframe, int shift)
double iClose(string symbol, int timeframe, int shift)
double iHigh(string symbol, int timeframe, int shift)
double iLow(string symbol, int timeframe, int shift)
// symbol,货币对名称;
// timeframe,时间周期;
// shift,K线序号;

如何调用指标数据
1 调用MT4自带指标
直接调用函数字典“Technical indicators”里面系统自带的指标函数即可。
比如均线:double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift) 计算移动平均指标并返回它的值。
参数:
symbol   -   计算指标数据上的货币对名称。NULL表示当前货币对。
timeframe   -   时间周期。可以时间周期列举任意值。0表示当前图表的时间周期。
period   -   平均周期计算。
ma_shift   -   MA转移。指标线垂直与图表的时间周期。
ma_method   -   MA方法。它可以是其中任意 滑动平均值列举值。
applied_price   -   应用的价格。它可以是应用价格列举的任意值。
shift   -   K线索引序列(最后一根为0)。

KD指标:iStochastic;
布林指标:iBands;
MACD指标:iMacd;

2 调用自定义指标或者第三方指标
保证自定义指标*.ex4已经放入安装目录experts\indicators目录。
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift) 计算指定的客户指标并且退回它的值。
参数:
symbol   -   计算指标数据上的货币对名称。NULL表示当前货币对。
timeframe   -   时间周期。 可以时间周期列举任意值. 0表示当前图表的时间周期。
name   -   客户指标完成程序名称。
...   -   参量设置(如果需要)。通过的参量和他们的顺序必须与desclaration命令和客户指标的外部可变物的种类对应。
mode   -   索引行。 从0到7并且必须对应以其中一个使用的索引的 SetIndexBuffer 函数。打开数据窗口可以看到画线的列表,从0开始。
shift   -   K线索引序列(最后一根为0)。

如何调用下单、操作订单函数
1
如何下市价单及挂单
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, void comment, void magic, void

expiration, void arrow_color)
参数:
symbol   -   交易货币对。
cmd   -   下单类型。
volume   -   下单手数。
price   -   开仓价格。
slippage   -   最大允许滑点数。
stoploss   -   止损价格。
takeprofit   -   止盈价格。
comment   -   订单注释。
magic   -   订单指定码。可以作为用户指定识别码使用。
expiration   -   订单有效时间(只限挂单)(不指定时间输入0)。
arrow_color   -   图表上箭头颜色。

下单类型:
OP_BUY 0 买仓
OP_SELL 1 卖仓
OP_BUYLIMIT 2 买挂单交易 (低价买入,常规的。)
OP_SELLLIMIT 3 卖挂单交易 (高价卖出,常规的。)
OP_BUYSTOP 4 买停挂单交易(高价买入)
OP_SELLSTOP 5 卖停挂单交易 (低价卖出)

示例:
// 市价买入
int ticket;
ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "my_buy", 1001, 0, Red);
if(ticket < 0) {
    Print("OrderSend 失败错误 #", GetLastError());
    return(0);
}
// 市价卖出
int ticket;
ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "my_sell", 1001, 0, Green);
if(ticket < 0) {
    Print("OrderSend 失败错误 #", GetLastError());
    return(0);

2 如何调用订单函数
bool OrderSelect(int index, int select, void pool) 函数选择定单。如果函数成功,返回的值为TRUE。如果函数失败,返回的值为FALSE。
参数:
index   -   定单索引(订单序列或订单编号)。
select   -   选定模式。可以为以下的任意值: SELECT_BY_POS(按照序列)、SELECT_BY_TICKET(按照订单编号)。
pool   -   可选择定单索引。当选择SELECT_BY_POS参量时使用。可以为以下的任意值: MODE_TRADES (default)- 来自交易的定单(开单和挂单),MODE_HISTORY - 来自历史的定

单(平仓和取消定单)。

3 如何修改市价单和挂单的止损、止盈,以及如何修改挂单的价格
bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color) 对于先前的开仓或挂单进行特性修改。如果

函数成功,返回的值为 TRUE。如果函数失败,返回的值为FALSE。
参数:
ticket   -   定单编号。
price   -   新的挂单价格,不想修改就输入原先的价格。
stoploss   -   新止损价格,不想修改就输入原先的价格。
takeprofit   -   新盈利价格,不想修改就输入原先的价格。
expiration   -   新挂单有效时间。
arrow_color   -   图表中标价挂单箭头的颜色。

4 如何市价平仓
bool OrderClose( int ticket, double lots, double price, int slippage, void Color) 对定单进行平仓操作。如果函数成功,返回的值是真实的。如果函数失败,返回的值

是假的。
参数:
ticket   -   订单编号。
lots   -   平仓的手数。
price   -   平仓的价格。
slippage   -   最大允许滑点数。
Color   -   图表中平仓箭头的标记颜色。

注意:OrdersTotal()函数获取的是所有的订单包括不同品种跟未成交的挂单统统包括在内;
// 全部平仓
int cnt, total;
total = OrdersTotal();
for(cnt=total-1; cnt>=0; cnt--) {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderType()==OP_SELL) {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
    }
    if(OrderType()==OP_BUY) {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
    }

5 如何删除挂单
bool OrderDelete(int ticket, void Color) 删除先前打开挂单。成功返回true,失败返回false。

// 删除所有挂单
int total = OrdersTotal();
for(int i=total-1; i>=0; i--) {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();
    bool result = false;
    switch(type) {
      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    if(result == false) {
      Print("Order " + OrderTicket() + " failed to close. Error:" + GetLastError());
    }
}

不允许评论