外汇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,或者直接退出外汇客户端。
