外汇EA自动交易系统原理详解

随着国内金融市场的不断开放与发展,投资者在投资上投入的时间与精力日益增多,而投资本身就伴随着风险。单纯依靠人工盯盘分析行情进行交易,已经越来越难以应对市场中持续变化的海量数据。可以想象,一个不使用任何投资辅助工具的投资者,想要在市场中长期稳定获利,难度是相当大的。

此外,如果一个人将大量时间都耗费在数据分析和盯盘上,生活与投资的平衡也可能因此受到影响。因此,越来越多的人开始认识到投资工具的重要性。一款合适的工具,能够帮助我们从繁杂的数据中梳理出清晰的交易思路,提高决策效率。未来能够持续获得收益的投资者,往往是那些善于借助工具,但又不完全依赖工具的人。

需要说明的是,任何投资工具都只是辅助手段,并不保证绝对盈利。然而,一个连基本工具都无法熟练使用的人,想要实现稳定盈利也很困难。工具本身具有两面性,就像一把枪,对于会用的人来说,是得力的助手;对于不会用的人来说,不仅发挥不了作用,还可能带来风险。

外汇EA作为一种较为新颖的投资工具,自然也不例外。正确认识EA及其在整个交易体系中的定位,对于合理使用这一工具有着重要意义。下面将围绕EA的概念及其工作原理展开介绍。

EA是什么?以及它的工作原理

EA 即 Expert Advisors 的英文缩写,中文通常译为“智能交易系统”或“专家顾问”,它通过电脑程序模拟交易员的决策与下单操作,实现全自动或半自动的交易过程。

一、人工操盘过程

以MT4外汇客户端为例,一个外汇交易员手工进行外汇交易时,通常遵循以下步骤:

1.打开外汇交易客户端,选定一种货币对图表;

2.监视该货币对的K线趋势图(俗称盯盘),寻找开仓或平仓的时机,即满足相应条件;

3.如果条件满足,进行下单开仓(做多或做空)或平仓;

4.重复第二步,继续盯盘,假设第二步是开仓,则接下来寻找平仓的条件;

5.如果平仓条件满足,进行平仓操作并计算盈亏,完成一次完整的交易循环;

6.若继续交易,重复步骤2至5;

7.若不交易,则退出外汇客户端。

二、机器操盘过程

了解了人工交易的完整流程,我们就能够理解一个完整的智能交易系统(俗称EA)在运行后需要实现的基本功能,即上述步骤1至5的自动化。EA的工作原理是由程序员使用计算机编程语言,将交易逻辑编写成程序指令,从而模拟交易员的下单行为,实现机器自动交易。其主要执行过程可概括为:盯盘-开仓-再盯盘-平仓,如此循环往复。

目前,外汇市场上主流的支持自动交易的平台是MetaQuotes公司的MT4平台。该平台内置了MQL4编程语言,为程序交易者提供了访问服务器数据及进行交易操作的接口。交易者可以根据自己的策略编写自动交易程序,让机器代替人工进行盯盘与交易,这不仅能减少人工的工作量,还有助于克服交易中常见的情绪波动。不过,目前EA的开发仍处于发展初期,部分程序可能还存在一些缺陷。但随着技术的不断进步,机器自动交易有望逐步成为越来越多交易者的选择。

三、相关MQL语言知识

为了实现机器操作,我们需要了解MQL4语言的相关知识:

1. 掌握MQL4语言的基本语法、程序构成及运行流程

关于语法细节,此处不再赘述,读者可以参考相关学习资料。对于EA程序而言,其基本结构主要由三个函数构成:

init():初始化函数,负责程序变量及数据的初始输入,仅在程序加载时执行一次,通常不需要重写内容。

deinit():反初始化函数,负责在程序退出时清除内存中的数据,仅在程序退出时执行一次,一般无需修改。

start():开始函数,也是程序的主函数,负责执行EA的全部交易逻辑,是交易管理和执行的核心。它每隔几秒循环执行一次,直到程序退出。

运行流程:启动EA后,init()先执行一次,随后start()循环执行,最后在退出时deinit()执行一次。

2. MQL4中与交易相关的函数

开仓函数:OrderSend(),用于开仓或挂单交易。其主要参数包括:

symbol - 交易货币对;

cmd - 购买方式(买入或卖出);

volume - 购买手数;

price - 收盘价格;

slippage - 最大允许滑点数;

stoploss - 止损水平;

takeprofit - 盈利水平;

comment - 注解文本;

magic - 订单指定码,可作为用户识别码使用;

expiration - 订单有效时间(仅限挂单);

arrow_color - 图表上箭头颜色,若省略或设为CLR_NONE,价格值不会在图表中画出。

平仓函数:OrderClose(),用于对订单进行平仓操作。如果函数成功,返回真值;失败则返回假值,可通过GetLastError()获取详细错误信息。其参数包括:

ticket - 订单编号;

lots - 手数;

price - 收盘价格;

slippage - 最高划点数;

Color - 图表中标记颜色,若省略,CLR_NONE值不会在图表中画出。

订单修改函数:OrderModify(),用于修改已开仓或挂单的订单属性。成功时返回TRUE,失败返回FALSE,LMAX Group错误信息可通过GetLastError()获取。其参数包括:

ticket - 订单编号;

price - 收盘价格;

stoploss - 新止损水平;

takeprofit - 新盈利水平;

expiration - 挂单有效时间;

arrow_color - 图表中允许对止损/盈利颜色进行修改,若省略或设为CLR_NONE,图表中将不显示。

四、源码的交易流程分析

下面的源码是一个基于移动平均线的智能交易系统示例,程序简洁但功能齐全,实现了完全由电脑自动下单和平仓,整个程序仅通过一个start()函数实现。

程序代码分析

请参考代码中的注释进行理解。

//---- input parameters

extern double TakeProfit = 20;

extern double StopLoss = 30;

extern double Lots = 2;

extern double TrailingStop = 50;

extern int ShortEma = 5;

extern int LongEma = 60;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return (0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return (0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

int cnt, ticket, total;

double SEma, LEma;

//----

if (Bars < 100)

{

Print("bars less than 100");

return (0);

}

//----

if (TakeProfit < 10)

{

Print("TakeProfit less than 10");

return (0); // check TakeProfit

}

//----

SEma = iMA(NULL, 0, ShortEma, 0, MODE_EMA, PRICE_CLOSE, 0);

LEma = iMA(NULL, 0, LongEma, 0, MODE_EMA, PRICE_CLOSE, 0);

//----

static int isCrossed = 0;

isCrossed = Crossed(LEma, SEma);

//----

total = OrdersTotal();

if (total < 1)

{

if (isCrossed == 1) // 满足空仓条件,开空仓

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Bid + StopLoss * Point,

Bid - TakeProfit * Point, "EMA_CROSS", 12345, 0, Green);

if (ticket > 0)

{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

Print("SELL order opened : ", OrderOpenPrice());

} else

Print("Error opening SELL order : ", GetLastError());

return (0);

}

if (isCrossed == 2) // 满足多仓条件,开多仓

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss * Point,

Ask + TakeProfit * Point, "EMA_CROSS", 12345, 0, Red);

if (ticket > 0)

{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

Print("BUY order opened : ", OrderOpenPrice());

} else

Print("Error opening BUY order : ", GetLastError());

return (0);

}

return (0);

}

//---- 订单修改,实现动态止盈止损跟踪

for (cnt = 0; cnt < total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (OrderType() <= OP_SELL && OrderSymbol() == Symbol())

{

if (OrderType() == OP_SELL) // long position is opened

{

// check for trailing stop

if (TrailingStop > 0)

{

if (Bid - OrderOpenPrice() > Point * TrailingStop)

{

if (OrderStopLoss() < Bid - Point * TrailingStop)

{

OrderModify(OrderTicket(), OrderOpenPrice(),

Bid - Point * TrailingStop,

OrderTakeProfit(), 0, Green);

return (0);

}

}

}

} else // go to short position

{

// check for trailing stop

if (TrailingStop > 0)

{

if ((OrderOpenPrice() - Ask) > (Point * TrailingStop))

{

if ((OrderStopLoss() > (Ask + Point * TrailingStop)))

{

OrderModify(OrderTicket(), OrderOpenPrice(),

Ask + Point * TrailingStop,

OrderTakeProfit(), 0, Red);

return (0);

}

}

}

}

}

}

//----

return (0);

}

//+------------------------------------------------------------------+

// 移动平均线多空条件判断

int Crossed(double line1, double line2)

{

static int last_direction = 0;

static int current_direction = 0;

//Don't work in the first load, wait for the first cross!

static bool first_time = true;

if (first_time == true)

{

first_time = false;

return (0);

}

//----

if (line1 > line2)

current_direction = 2; //up 多头市场 上穿做多

if (line1 < line2)

current_direction = 1; //down 空头市场 下穿做空

//----

if (current_direction != last_direction) //changed 多空改变

{

last_direction = current_direction;

return (last_direction);

}

else return (0); //not changed

}

五、本文结论

综上所述,所谓EA,就是由电脑模拟交易员的下单操作来实现机器自动交易的过程。具体步骤如下:

1. 当用户打开外汇客户端程序后,客户端会加载用户预设的EA交易程序;

2. EA程序启动后,开始监视图表中货币对的K线趋势,寻找开仓条件;

3. 如果条件满足,则进行下单开仓(做多或做空);

4. 重复第二步,继续盯盘,若第二步是开仓,则接下来寻找平仓条件;

5. 如果平仓条件满足,则进行平仓操作,并计算盈亏,完成一次交易循环;

6. 若继续交易,EA会重复步骤2至5;

7. 用户若不想让EA交易,可以通过相关菜单设置禁用EA,或者直接退出外汇客户端。