告别“盯盘侠”,拥抱自动化:程序化交易的魅力与恒指突破的“敲门砖”
你是否曾经在深夜盯着屏幕,看着K线图上的一点点波动,心跳也随之起伏?是否曾经因为错过了一个绝佳的进场点而扼腕叹息,又或者因为情绪波动而错过了止盈的时机?如果是,那么你并不孤单。在瞬息万变的期货市场,尤其是像恒生指数(恒指)这样波动剧烈、机会与风险并存的品种,手动交易的挑战不言而喻。
长时间的盯盘不仅消耗精力,更常常因为疲劳、情绪干扰而导致决策失误。
但如果有一种方式,能够让你的交易策略24小时不间断地为你工作,严格按照你设定的规则执行,甚至在你熟睡时也能捕捉到市场转瞬即逝的机会,那该多好?答案是肯定的,这正是“程序化交易”的魔力所在。程序化交易,顾名思义,就是将你的交易思想、策略逻辑,通过计算机代码的形式表达出来,让电脑代替人来执行交易指令。
它消除了人为的情绪干扰,保证了策略的严格执行,能够帮助交易者更高效、更客观地参与市场。
在程序化交易的领域,有一个非常流行的工具,那就是“EA”(ExpertAdvisor),也称为“智能交易系统”。EA的核心就是一套编程脚本,能够自动分析市场数据,并根据预设的交易逻辑,自动下单、平仓、止损、止盈。而今天,我们将以许多交易者都非常熟悉的“恒指突破”策略为例,带你一步步走进EA的编写世界,让你亲手打造出属于自己的第一个EA。
恒指突破策略是一种相对直观且常见的交易方法。它的核心逻辑在于捕捉价格突破关键阻力位或支撑位时的动能,并顺势而为。例如,当恒指价格向上突破某个重要的阻力位时,市场往往会迎来一波上涨行情;反之,跌破支撑位则可能预示着下跌。这种策略的优势在于:
逻辑清晰:突破的定义相对明确,容易转化为代码逻辑。信号明确:突破的发生通常伴随着成交量的放大或K线的实体拉长,易于识别。市场适应性强:恒指本身具有较高的波动性,为突破策略提供了足够的“燃料”。易于量化:突破的条件(如价格高于前N根K线的最高价)可以通过简单的数学公式表达。
当然,任何策略都不是万能的,恒指突破策略也可能面临假突破、震荡行情中频繁止损等风险。但正是因为它的相对简单和直观,才成为了我们迈向程序化交易的理想“敲门砖”。通过为它编写EA,你不仅能掌握EA的基本框架,还能更深刻地理解策略的细节与优化方向。
在开始编写EA之前,我们需要一些基础的“装备”。幸运的是,目前市面上主流的交易软件,如MetaTrader4(MT4)和MetaTrader5(MT5),都内置了强大的EA开发环境。MT4是目前应用最广泛的平台之一,其编程语言为MQL4(MetaQuotesLanguage4)。
MQL4是一种专门为交易开发的语言,语法相对容易上手,即使是编程新手也能在短时间内掌握基础。
一个支持EA的交易平台:例如MT4。你可以从各大经纪商那里免费下载。一个代码编辑器:MT4自带了一个名为MetaEditor的编辑器,它集成了代码编写、编译、调试等功能,非常方便。一个你想自动化的交易策略:比如你熟悉的恒指突破策略。
MQL4是一种面向对象的编程语言,但它也包含了很多C语言的特性。对于初学者来说,你不需要成为编程大师,只需要理解一些基本概念和函数。一个EA程序通常包含以下几个核心部分:
OnInit():EA初始化函数,在EA加载到图表时只执行一次。常用于设置初始参数。OnDeinit():EA反初始化函数,在EA被移除或图表关闭时执行一次。常用于清理工作。OnTick():EA核心函数,每一根K线产生(或价格发生变动)时都会被调用。
所有的交易逻辑判断和执行都在这里完成。全局变量和输入参数:用于存储数据和接收用户自定义的参数。
我们即将学习的重点,就是如何在OnTick()函数中,编写逻辑来识别恒指突破信号,并执行开仓、平仓等操作。别担心,我们会从最简单的例子开始,让你感受到从“想法”到“代码”的转变。
让我们构思一个最最基础的恒指突破策略,并思考如何将其转化为MQL4代码:
策略规则:当收盘价连续X根K线高于前一根K线的最高价时,买入。当收盘价连续X根K线低于前一根K线的最低价时,卖出。进场条件:做多:如果当前K线的收盘价>前一根K线的最高价,并且这已经是连续X根K线都满足这个条件,则开仓买入。做空:如果当前K线的收盘价<前一根K线的最低价,并且这已经是连续X根K线都满足这个条件,则开仓卖出。
离场条件(为了简化,先不考虑):我们可以先不设置复杂的止损止盈,或者先用一个固定的止损止盈点。手数控制(也先简化):使用固定的手数。
听起来是不是没那么复杂?没错,程序化交易的入门,就是将这种“一点点”的思考,一步步地翻译成代码。接下来的part2,我们就将正式进入MetaEditor,开始你的第一个EA编写之旅!准备好了吗?让我们一起解锁恒指突破的秘密,让你的交易策略“活”起来!
实战演练:用MQL4编写你的第一个恒指突破EA(附代码解析)
上一部分,我们一起认识了程序化交易的魅力,了解了EA的基本概念,并为一个简单的恒指突破策略制定了初步的逻辑。现在,是时候卷起袖子,真正动手编写你的第一个EA了!我们将以MT4平台为例,使用MQL4语言,为我们之前设想的“连续X根K线突破”策略创建一个简单的EA。
打开你的MT4交易平台。点击菜单栏中的“工具”(Tools)->“MetaQuotesLanguageEditor”(或按F4键)。在打开的MetaEditor窗口左侧,右键点击“EA”(ExpertAdvisors),选择“Create”(新建)。
在弹出的“EA向导”中,选择“EATrader”,然后点击“下一步”。为你的EA取一个名字,比如“SimpleBreakoutEA”,然后点击“下一步”。接下来是一些事件函数,我们暂时保留默认的“OnTick”、“OnInit”、“OnDeinit”,然后点击“完成”。
MetaEditor会自动为你生成一个基础的EA模板。你会看到类似这样的结构:
//+------------------------------------------------------------------+//|SimpleBreakoutEA.mq4|//|Copyright2023,MetaQuotesSoftwareCorp.|//|https://www.mql5.com|//+------------------------------------------------------------------+#propertycopyright"Copyright2023,MetaQuotesSoftwareCorp."#propertylink"https://www.mql5.com"#propertyversion"1.00"#propertystrict//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+intOnInit(){//---//---return(INIT_SUCCEEDED);}//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnDeinit(constintreason){//---}//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnTick(){//---}//+------------------------------------------------------------------+
我们的策略需要一些可自定义的参数,例如用来判断突破的“连续K线数量”以及交易的手数。这些参数我们可以在EA的最上方,OnInit()函数之前定义,使用input关键字。
//+------------------------------------------------------------------+//|SimpleBreakoutEA.mq4|//|Copyright2023,MetaQuotesSoftwareCorp.|//|https://www.mql5.com|//+------------------------------------------------------------------+#propertycopyright"Copyright2023,MetaQuotesSoftwareCorp."#propertylink"https://www.mql5.com"#propertyversion"1.00"#propertystrict//---输入参数---inputintBreakoutBars=3;//突破连续K线数量(例如:3根K线)inputdoubleLots=0.01;//交易手数inputintMagicNumber=12345;//EA的唯一标识符,防止与其他EA冲突inputintSlippage=3;//允许的滑点(点)//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+intOnInit(){//---//---return(INIT_SUCCEEDED);}//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnDeinit(constintreason){//---}//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnTick(){//---}//+------------------------------------------------------------------+BreakoutBars:代表我们需要多少根连续的K线来确认突破。
Lots:我们每次开仓的手数。MagicNumber:一个非常重要的参数。当你的MT4上运行了多个EA或者手动交易时,它能帮助EA区分哪些订单是自己开的,哪些不是,避免误操作。Slippage:在市价单执行时,允许价格的最大偏离值,防止因价格快速波动导致实际成交价与预期价相差过大。
第三步:编写核心交易逻辑(在OnTick()函数中)
这是EA的核心部分。每一根新的K线产生时,OnTick()函数就会被调用,我们需要在这里进行市场分析和决策。
我们需要获取当前K线、前一根K线、前两根K线等的价格信息,以及它们的开盘价、收盘价、最高价、最低价。MQL4提供了丰富的函数来获取这些信息:
voidOnTick(){//---获取当前K线的价格信息doubleopen_curr=Open[0];//当前K线的开盘价doublehigh_curr=High[0];//当前K线的最高价doublelow_curr=Low[0];//当前K线的最低价doubleclose_curr=Close[0];//当前K线的收盘价//---获取前一根K线的价格信息doubleopen_prev=Open[1];//前一根K线的开盘价doublehigh_prev=High[1];//前一根K线的最高价doublelow_prev=Low[1];//前一根K线的最低价doubleclose_prev=Close[1];//前一根K线的收盘价//---获取前N根K线的价格信息,用于判断连续突破//(这里我们稍后会用循环来处理,先理解概念)//例如:判断连续BreakoutBars根K线是否都高于前一根K线的最高价//需要一个循环来检查K[1]到K[BreakoutBars]}
多头突破判断:检查从前一根K线(Index=1)到前BreakoutBars根K线(Index=BreakoutBars)是否都满足Close[i]>High[i+1]。空头突破判断:检查从前一根K线(Index=1)到前BreakoutBars根K线(Index=BreakoutBars)是否都满足Close[i]
voidOnTick(){//...(获取价格信息的代码,如上)//---定义一个布尔变量来记录是否满足条件boolbuy_condition_met=true;boolsell_condition_met=true;//---检查连续突破条件for(inti=1;i<=BreakoutBars;i++){//检查多头突破条件if(Close[i]<=High[i+1]){buy_condition_met=false;//不满足,跳出循环break;}}//如果满足了多头突破,我们还需要检查是否已经有多单持仓//如果没有,则开仓//---检查空头突破条件for(inti=1;i<=BreakoutBars;i++){if(Close[i]>=Low[i+1]){sell_condition_met=false;//不满足,跳出循环break;}}//如果满足了空头突破,我们还需要检查是否已经有空单持仓//如果没有,则开仓//---交易执行部分---//...(此处将添加开仓、平仓逻辑)}
当满足了交易条件,并且我们没有持有同方向的仓位时,就需要执行开仓操作。MQL4提供了OrderSend()函数来发送交易指令。
不考虑止损止盈。只允许一个多单或一个空单同时存在。voidOnTick(){//...(获取价格和判断条件的代码)//---检查当前是否有持仓(假设我们只关心MagicNumber相同的仓位)intopen_orders=0;for(inti=0;i
OP_BUY/OP_SELL:买入/卖出指令。Lots:手数。Ask/Bid:市价买入价/卖出价。Slippage:滑点。0:止损价(这里设为0,表示不设置)。0:止盈价(这里设为0,表示不设置)。"BreakoutBuy"/"BreakoutSell":订单备注。
MagicNumber:EA的标识符。0:有效期(0表示立即执行)。clrGreen/clrRed:订单箭头颜色。
保存你的EA文件(Ctrl+S)。点击MetaEditor顶部的“编译”(Compile)按钮(或按F7)。如果代码没有错误,你会在“错误”(Errors)窗口看到“0error(s),0warning(s)”。将编译好的EA从MetaEditor的左侧导航栏拖拽到MT4的“导航器”(Navigator)窗口的“EA交易”(ExpertAdvisors)列表中。
将EA添加到你想要运行的恒指图表上(通常是M15、H1或H4周期,取决于你的策略偏好)。在弹出的EA设置窗口中,勾选“允许实时交易”(Allowlivetrading),并在“输入”(Inputs)选项卡中检查你的参数是否设置正确。点击“确定”。
如果EA右侧的笑脸变成哭脸,说明EA没有启用或者有错误。如果是笑脸,就表示EA已成功加载并开始工作!
这只是一个最最基础的EA。实际应用中,你可能还需要:
添加止损止盈:使用OrderModify()函数来修改订单的止损和止盈价。考虑持仓检查:避免重复开仓,或者在已有仓位时执行其他操作(如加仓)。过滤交易信号:结合其他技术指标(如均线、MACD)来过滤假信号,提高胜率。时间过滤:只在特定的交易时段开仓。
最大持仓数量限制:避免一次性开过多仓位。回测(Backtesting):在MT4的“策略测试器”(StrategyTester)中,使用历史数据来评估EA的表现,并进行参数优化。
恭喜你!你已经成功迈出了程序化交易的第一步。从一个简单的策略构想,到一个可以自动执行的EA,你不仅学习了MQL4的基本语法和EA的框架,更重要的是,你开始用一种全新的方式来思考和执行你的交易。这只是一个开始,程序化交易的世界广阔而迷人,它能够帮助你更理性、更高效地驾驭期货市场。
Copyright © 2012-2023 某某财税公司 版权所有
备案号:粤ICP备xxxxxxxx号