简介:MetaQuotes公式编写语言(MQL)是专为MetaTrader 4和MetaTrader 5平台开发的编程语言。MQL允许开发者创建自定义的技术指标、智能交易系统(EA)、脚本以及使用内置函数实现自动交易策略。MQL4专为MT4设计,而MQL5针对MT5有更多功能。学习MQL需要基本编程知识和金融市场知识,开发者可利用MT4内置工具测试和优化代码。MQL教程文件和社区论坛为交易者提供编程指南和交流平台。掌握MQL可以帮助交易者设计个性化的交易工具和策略,但需注意风险管理。
1. MetaTrader平台与MQL概述
MetaTrader(MT)平台是金融市场交易中最受欢迎的交易平台之一,由MetaQuotes软件公司开发。它支持MQL(MetaQuotes Language)编程语言,专为交易自动化和策略开发设计。MetaTrader 4(MT4)与MetaTrader 5(MT5)是这个系列中最知名的产品,它们为交易者提供了强大的交易和分析工具。
1.1 MQL的起源与发展
MQL语言最初是为MT4设计,随着市场对更高性能和更多功能的需求,MQL5应运而生。虽然二者在语法上有很多相似之处,但MQL5提供了更高级的特性,包括多线程处理、更复杂的交易功能等。
1.2 MQL与交易策略
MQL允许交易者编写、测试和运行自动化交易策略(Expert Advisors,EAs),这些策略可以是基于指标的简单交易系统,也可以是基于复杂算法的高阶量化模型。MQL脚本可以用来执行诸如打开或关闭订单、管理交易组合等任务。
1.3 MQL的社区与资源
一个活跃的社区支持MQL开发者,提供了大量的共享脚本和EAs。此外,MetaQuotes公司提供的MetaEditor IDE是编写和编译MQL代码的理想工具。社区分享的资源、教程和论坛讨论使得学习和掌握MQL变得更加容易。
通过本章,我们将深入了解MT平台和MQL的细节,为后文的深入探讨打下坚实的基础。
2. MQL4与MQL5的对比及特点
2.1 MQL4与MQL5核心差异
2.1.1 语言结构和性能对比
MQL4和MQL5是专门为MetaTrader 4和MetaTrader 5交易平台开发的编程语言。它们在语言结构和性能上存在显著差异。MQL4专为MT4设计,主要面向外汇市场,而MQL5则为MT5提供了更广泛的金融市场支持,包括股票、期货和期权等。
语法层面:
MQL5语言结构更加现代化,支持如lambda表达式、模板、范围基的for循环等现代编程特性。MQL4的语法较为传统,但由于其成熟度高,它拥有大量的代码库和社区支持。
性能层面:
MQL5优化了性能,特别是在多线程处理方面。MQL5支持多核心处理,允许在多个时间帧上同时运行EA,这在MQL4中是受限的。通过使用MQL5的这些特性能显著提升EA的执行速度和效率。
// MQL5多线程示例代码块
void OnTick()
{
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "MQL5 Test", 0, 0, clrNONE);
if(ticket < 0)
{
Print("OrderSend failed with error #", GetLastError());
}
else
{
Print("OrderSend successfully completed with ticket #", ticket);
}
// 异步操作,不需要等待该订单完成即可继续其他操作
}
2.1.2 新增功能和改进点
MQL5相较于MQL4引入了一系列的新功能和改进,包括但不限于:
- 内置的市场和代码库 :MQL5为开发者提供了集成的市场和代码库,可以方便地购买或下载其他开发者的作品。
- 优化的交易模拟器 :MQL5的交易模拟器拥有更高级的性能和更真实的模拟。
- 脚本和指标 :MQL5的脚本和指标功能得到了增强,提供了更多内置的图表分析工具。
// MQL5市场下载示例代码块
ImportPackage("MarketPackage"); // 导入市场包
PackageInfo packageInfo = MarketPackages.GetPackageInfo("MQL5 Version Package");
if(packageInfo.Name == "MQL5 Version Package")
{
string info = "Name: " + packageInfo.Name + "\nVersion: " + packageInfo.Version + "\nDate: " + packageInfo.Date;
Print(info);
}
2.2 MQL4和MQL5的特点
2.2.1 MQL4的特点和适用场景
MQL4是MetaTrader 4平台的专用脚本语言,它的特点包括:
- 专一性 :主要适用于外汇市场和CFD。
- 成熟度 :拥有庞大的用户社区和丰富的代码库。
- 易用性 :相对简单易学,适合初学者。
MQL4通常适用于那些对执行速度和多线程处理没有太高要求的交易策略,以及那些更侧重于脚本化和快速开发的用户。
// MQL4用于简单交易策略的代码示例
if(Close[0] > Open[0])
{
// 如果收盘价高于开盘价,则买入
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "MQL4 Simple Strategy", 0, clrNONE);
}
2.2.2 MQL5的特点和适用场景
MQL5是MetaTrader 5平台的专用脚本语言,它的特点包括:
- 多市场支持 :可用于股票、期货和期权等其他金融市场。
- 高级特性 :提供对象导向编程、多线程、事件驱动等高级特性。
- 性能优势 :对性能进行了优化,适用于复杂和资源密集型的交易策略。
MQL5适用于需要执行复杂算法、多市场交易以及需要高级编程技术的应用场景。
// MQL5用于复杂交易策略的代码示例
void OnTick()
{
if(CopyClose(Symbol(), 0, 0, PERIOD_M1, Close[0], 10, CLONE_PORTFOLIO) > 0)
{
// 如果最近10个M1周期的收盘价上升,则卖出
OrderSend(Symbol(), OP_SELL, 0.1, Close[0], 3, 0, 0, "MQL5 Complex Strategy", 0, clrNONE);
}
}
2.3 选择MQL4或MQL5的策略考量
2.3.1 基于平台兼容性的考量
在选择MQL4或MQL5时,需要首先考虑MetaTrader平台的兼容性。如果您的经纪商只支持MT4平台,那么应选择MQL4。相反,如果经纪商支持MT5,则应优先考虑使用MQL5来利用其更广泛的金融工具覆盖和性能优势。
2.3.2 基于策略复杂性的考量
策略复杂性是另一个重要的考量因素。对于那些需要高度定制化和高度计算密集型的交易策略,MQL5由于其先进的功能和性能,通常是更好的选择。而对于那些相对简单、执行速度快的策略,或者主要交易外汇市场,MQL4会是一个更合适的选择。
flowchart LR
A[开始选择] --> B[检查平台兼容性]
B -->|支持MT4| C[选择MQL4]
B -->|支持MT5| D[选择MQL5]
C --> E[考虑策略复杂性]
D --> F[考虑策略复杂性]
E -->|简单策略| G[适合MQL4]
E -->|复杂策略| H[考虑MQL5]
F -->|简单策略| I[选择MQL4]
F -->|复杂策略| J[考虑MQL5]
G --> K[结束选择过程]
J --> K[结束选择过程]
在实际决策过程中,应当根据具体需求进行分析,权衡两者之间的利弊,从而选择最适合您的交易平台和编程语言。
3. 技术指标和Expert Advisors(EA)的实现
3.1 技术指标的编程
3.1.1 技术指标的数学原理和编程模型
在金融市场中,技术指标是分析市场动向、决定交易时机和策略的重要工具。技术指标通常由数学公式计算得出,并在价格图表上以线、条形图、柱状图等形式表现出来。例如,移动平均线(MA)是通过计算一定周期内的平均价格来平滑价格波动的指标。
在MQL编程中,技术指标的实现需要遵循特定的数学原理。每一个指标公式都需要转化成MQL代码,并遵循MetaTrader平台的指标编程模型。这些模型通常包括初始化( Init
)、绘制( Draw
)、计算( Calculate
)等函数。开发者需要在这些函数内按照指标的数学原理编写相应的算法。
以下是移动平均线的简单实现示例:
//+------------------------------------------------------------------+
//| MovingAverages.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property version "1.00"
#property indicator_chart_window
//--- indicator buffers
double MaSlow[];
double MaFast[];
//--- indicator parameters
input int FastMAPeriod = 5; // Fast MA period
input int SlowMAPeriod = 10; // Slow MA period
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, MaSlow);
SetIndexBuffer(1, MaFast);
//--- set default parameters
SetIndexStyle(0, DRAW_LINE);
SetIndexStyle(1, DRAW_LINE);
//--- name for DataWindow and indicator subwindow label
IndicatorShortName("Custom MA Fast");
SetIndexLabel(0, "MA Fast");
IndicatorShortName("Custom MA Slow");
SetIndexLabel(1, "MA Slow");
//--- check for at least 20 bars for correct calculation
if( Bars < 20 )
{
Print("Not enough data. Please, open at least 20 bars chart.");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- check for at least FastMAPeriod bars
if(rates_total < FastMAPeriod)
return(0);
//--- main calculation loop
for(int i=0; i < rates_total; i++)
{
if(i >= FastMAPeriod)
{
MaFast[i] = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
MaSlow[i] = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
}
else
{
MaFast[i] = 0;
MaSlow[i] = 0;
}
}
return(rates_total);
}
//+------------------------------------------------------------------+
在此示例中, iMA
函数是MQL提供的内置函数,用于计算移动平均值。通过调整 FastMAPeriod
和 SlowMAPeriod
参数,可以定制不同周期的移动平均线。
3.1.2 常用技术指标的MQL实现
MQL可以实现几乎所有的标准技术指标。下面通过表格列出一些常用的技术指标及其MQL实现的关键点:
技术指标 | 描述 | MQL实现的关键点 |
---|---|---|
移动平均线 | 反映趋势的指标,有简单移动平均(SMA)、指数移动平均(EMA)等 | 使用 iMA 函数计算平均值,调整类型参数 |
相对强弱指数 | 衡量股票或货币对相对于过去价格表现的指标 | 使用 iRSI 函数计算RSI值 |
布林带 | 表示价格波动范围的指标,由中线(移动平均线)和上下两条带组成 | 使用 iBands 函数计算布林带 |
随机指标 | 衡量收盘价相对于价格范围的指标 | 使用 iStochastic 函数计算随机指标 |
MACD | 衡量两个移动平均线之间差异的指标 | 使用 iMACD 函数计算MACD线,信号线,柱状图 |
ADX | 用于评估趋势强度的指标 | 使用 iADX 函数计算DX值,然后计算ADI |
ATR | 衡量价格变动的指标,用来衡量市场波动性 | 使用 iATR 函数计算真实波动范围 |
通过上述表格,我们可以看到每个指标的MQL实现的关键点,以及如何使用MQL内置函数进行计算。例如,使用 iRSI
函数实现相对强弱指数时,需要指定时间周期、价格类型等参数。根据指标的数学模型和MQL的函数库,开发者可以创建属于自己的技术指标,并在MetaTrader平台上展示。
3.2 Expert Advisors(EA)的开发
3.2.1 EA的结构和运作机制
Expert Advisors(EA),即专家顾问,是一种用于自动化交易的程序。EA可以在MetaTrader平台上根据预设的交易策略自动进行交易。其核心包括三个主要功能模块:分析模块、交易执行模块和风险管理模块。
分析模块负责行情分析,决定何时进行交易。它基于技术指标、图表形态或自定义的数学模型来分析市场。
交易执行模块负责执行交易,包括下单、平仓、修改止损/止盈等操作。在MQL编程中,这一模块会使用平台提供的函数如 OrderSend
、 OrderClose
等进行实际操作。
风险管理模块负责管理交易风险,包括决定每个交易的仓位大小以及设置止损和止盈。风险控制方法有多种,如固定金额、百分比风险模型、波动性适应模型等。
以下是一个简单的EA结构示例:
//+------------------------------------------------------------------+
//| SimpleEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property version "1.00"
//--- indicator buffers
double MaSlow[];
double MaFast[];
//--- indicator parameters
input int FastMAPeriod = 5;
input int SlowMAPeriod = 10;
input double TakeProfit = 10;
input double StopLoss = 10;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, MaSlow);
SetIndexBuffer(1, MaFast);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double currentFast, currentSlow, price;
currentFast = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
currentSlow = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
price = Ask; // Assuming this is a simple trend-following EA
//--- trade execution logic
if(currentFast > currentSlow && OrdersTotal() == 0)
{
// Buy trade
OrderSend(Symbol(), OP_BUY, 0.1, price, 3, price - StopLoss * Point, price + TakeProfit * Point, "EA Buy Order", 0, clrNONE);
}
else if(currentFast < currentSlow && OrdersTotal() == 0)
{
// Sell trade
OrderSend(Symbol(), OP_SELL, 0.1, price, 3, price + StopLoss * Point, price - TakeProfit * Point, "EA Sell Order", 0, clrNONE);
}
}
//+------------------------------------------------------------------+
在这个示例中,EA利用简单的移动平均线交叉逻辑来决定买入或卖出。它会计算当前快速和慢速移动平均线的值,并根据它们的关系决定交易方向。如果快速移动平均线高于慢速移动平均线且当前没有开放的订单,则进行买入操作;反之,则进行卖出操作。同时,EA设置了止损(StopLoss)和止盈(TakeProfit)。
3.2.2 从策略到EA的转化流程
从交易策略到EA的转化流程主要分为以下几个步骤:
- 确定策略规则:这包括入场信号、出场信号、止损和止盈规则。在上一小节中,我们已经定义了一个简单的基于移动平均线的交易策略。
- 编写EA代码:根据策略规则,利用MQL语言编写EA代码。这一步需要将策略逻辑转化成MQL语句,并确保代码可以正确执行。
- 回测和优化:在历史数据上进行测试,通过调整参数找到最优的策略表现。
- 资金管理:确保EA具有良好的风险控制和资金管理功能。
- 实盘测试:在实盘或模拟账户中进行测试,观察EA在真实市场条件下的表现。
- 持续优化和更新:根据测试结果和市场反馈不断优化EA。
每个步骤都需要仔细和有条理地进行,以确保最终的EA在实际交易中能够可靠地执行策略,并在各种市场条件下都能稳定运行。
3.3 案例分析:实现自定义EA
3.3.1 案例研究:趋势追踪EA
在这个案例中,我们将探讨如何开发一个基于趋势追踪的EA。该EA将使用简单移动平均线交叉策略,即当快速移动平均线穿越慢速移动平均线时,EA将会执行交易。同时,该EA将使用相对强弱指数(RSI)来过滤市场噪声,只有当RSI值在30到70之间时才允许交易。
以下是趋势追踪EA的MQL伪代码示例:
//伪代码,用于说明EA开发逻辑,并非完整的可运行代码
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 初始化指标缓冲区等操作
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 计算移动平均线和RSI值
double maFastCurrent = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double maSlowCurrent = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double rsiValue = iRSI(Symbol(), PERIOD_M1, RSIPeriod, PRICE_CLOSE, 0);
// 交易逻辑判断
if(maFastCurrent > maSlowCurrent && rsiValue > 30 && rsiValue < 70 && OrdersTotal() == 0)
{
// 买入逻辑
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Trend Buy Order", 0, clrNONE);
}
else if(maFastCurrent < maSlowCurrent && rsiValue > 30 && rsiValue < 70 && OrdersTotal() == 0)
{
// 卖出逻辑
OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "Trend Sell Order", 0, clrNONE);
}
}
在这个案例中,我们使用了两个指标(移动平均线和RSI)作为交易决策的基础,并在 OnTick
函数中实现了基本的交易逻辑。EA的代码结构应该包含适当的错误检查和交易执行的安全机制。
3.3.2 案例研究:网格交易EA
网格交易是一种对冲策略,它通过在一定的价格区间内建立买卖订单网格来捕捉价格波动。网格交易EA不依赖于单一的市场方向,它可以在市场震荡时获得利润,因此适合用在波动性大的市场。
以下是网格交易EA的MQL伪代码示例:
//伪代码,用于说明EA开发逻辑,并非完整的可运行代码
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 初始化网格参数
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 对于每个网格位置,检查是否可以进行交易
if(CanOpenBuyAtGridLevel() && !IsBuyOrderOpen())
{
// 执行买入网格交易
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Grid Buy Order", 0, clrNONE);
}
else if(CanOpenSellAtGridLevel() && !IsSellOrderOpen())
{
// 执行卖出网格交易
OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "Grid Sell Order", 0, clrNONE);
}
}
在此案例中, CanOpenBuyAtGridLevel
和 CanOpenSellAtGridLevel
是自定义函数,用于判断是否满足网格交易的条件。 IsBuyOrderOpen
和 IsSellOrderOpen
函数用于检查买卖订单是否已经存在。
网格交易EA的实现可能会更复杂,因为它涉及到管理多个订单,并且需要对每个网格点的盈利能力进行持续的监控和管理。在实际编码中,开发者需要考虑订单管理、资金管理和风险控制等多方面因素。
在实际应用中,网格交易EA可以进一步细化,例如加入动态网格调整机制以适应市场的变化,或者在特定的市场条件下自动关闭网格交易等。这些高级功能需要在EA的基础框架上进行扩展和优化。
4. 脚本编写及其在MT4中的应用
4.1 MQL脚本的快速入门
4.1.1 脚本与EA的区别和应用场景
脚本(Script)和Expert Advisors(EA)是两种在MetaTrader平台上广泛使用的技术。它们的主要区别在于执行和目的。脚本是单次运行的小段代码,主要用于执行一些简单的自动化任务,如关闭所有订单、删除所有指标或更改图表设置等。脚本只执行一次就停止,不能进行持续的决策或监控交易环境。
相对而言,EA是连续运行的程序,可以实现复杂的策略和交易逻辑。EA能够根据设定的规则不断分析市场数据,并在符合预定条件时自动进行交易。它可以执行开仓、平仓、修改止损、获利等操作,并能根据市场动态和预设条件进行决策调整。
应用场景方面,脚本通常用于简化日常交易操作或进行一次性的数据处理,例如批量修改止损和获利点,或在特定时间执行某些操作。而EA适用于开发自动交易系统,进行策略测试或实时交易。
4.1.2 脚本的编写和执行流程
编写脚本时,首先需要确定脚本的具体任务和目标。一旦明确了脚本需求,就可以开始编写MQL代码。MQL脚本通常由初始化部分( init
函数)和执行部分( start
函数)组成。 init
函数仅在脚本首次加载时执行一次,而 start
函数则在每次图表更新时执行。
下面是一个简单的示例,展示如何编写一个脚本,用于在图表上显示“Hello, World!”的消息:
//+------------------------------------------------------------------+
//| HelloWorld.mq4|
//| Copyright 2023, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(60);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- print "Hello, World!" to the Experts log
Print("Hello, World!");
//--- stop the timer
EventKillTimer();
}
//+------------------------------------------------------------------+
在此脚本中, OnTimer
函数每60秒被调用一次,并向MetaTrader的专家日志打印消息“Hello, World!”。一旦消息被打印,计时器将停止,这意味着脚本将不再执行。这个例子演示了脚本的基本结构和逻辑。
4.2 脚本在自动化交易中的作用
4.2.1 脚本用于订单管理
脚本可以有效地管理订单,减少交易者的工作负担。例如,你可能需要关闭所有赢利的订单或者关闭特定货币对的所有订单。使用MQL脚本,这些任务可以迅速完成。
以下是一个关闭所有赢利订单的脚本示例:
//+------------------------------------------------------------------+
//| CloseProfit.mq4|
//+------------------------------------------------------------------+
#property strict
void OnTick()
{
for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderType() == OP_BUY)
{
if(OrderProfit() > 0) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, clrNONE);
}
}
}
//+------------------------------------------------------------------+
在此代码中,我们遍历所有订单并检查是否有赢利的订单(OrderProfit() > 0),如果有,就关闭它。这简化了订单管理过程,特别是对于有多个交易账户或使用大量EA的交易者来说非常有用。
4.2.2 脚本用于图表分析和数据获取
通过脚本,我们可以自动化图表分析流程,比如,可以自动为多个货币对创建图表,并安装相同的指标。此外,脚本还可以用来获取历史数据、计算指标、生成信号等。
下面是一个脚本示例,用于批量创建特定货币对的图表:
//+------------------------------------------------------------------+
//| CreateCharts.mq4|
//+------------------------------------------------------------------+
#property strict
void OnStart()
{
string chart_name;
for(int i=0; i<25; i++)
{
chart_name = "EURUSD";
if(i>0) chart_name += IntegerToString(i);
if(!ChartCreate(0, chart_name, 0, 0, 0))
{
Print("Error creating chart: ", chart_name);
return;
}
}
}
//+------------------------------------------------------------------+
此脚本会自动创建多个图表,为每个图表指定一个货币对名称,如果无法创建图表,脚本会输出错误信息。通过这种方式,可以轻松地批量加载图表,进行进一步的数据分析。
4.3 深入案例:脚本在实际交易中的应用
4.3.1 案例研究:自动化图表分析脚本
在实际交易中,交易者常常需要分析多个图表以寻找交易机会。手动操作耗时且容易出错。因此,通过编写自动化脚本,可以快速获取和展示信息,为交易决策提供支持。
以下是使用MQL脚本进行自动化图表分析的一个例子:
//+------------------------------------------------------------------+
//| AutoAnalysis.mq4|
//+------------------------------------------------------------------+
#property strict
void OnTick()
{
//--- declare the index of Moving Average indicator
int ma_handle = iMA(0, 0, 14, 0, MODE_SMA, PRICE_CLOSE, 0);
//--- check if indicator data is available
if(ma_handle == INVALID_HANDLE) return;
//--- get indicator value at the latest bar
double ma_value = iMA(0, 0, 14, 0, MODE_SMA, PRICE_CLOSE, PERIOD_CURRENT);
//--- print the Moving Average value to the log
Print("Current MA value on EURUSD is: ", ma_value);
}
//+------------------------------------------------------------------+
在此脚本中,我们使用内置的 iMA
函数计算14期简单移动平均线(SMA)的值,并将其打印到日志中。这个脚本可以安装到任何货币对图表上,自动提供移动平均线的实时值。
4.3.2 案例研究:交易信号生成脚本
在交易策略中,生成交易信号是一个关键环节。一个脚本可以检查特定条件,并在满足这些条件时生成信号。这可以用于回测策略,也可以作为实时交易决策的辅助。
下面的脚本示例展示了如何根据简单的条件生成交易信号:
//+------------------------------------------------------------------+
//| SignalGen.mq4|
//+------------------------------------------------------------------+
#property strict
//--- define signal conditions
double upper_band = iBands(0, 0, 20, 0, 2, PRICE_CLOSE, MODE_UPPER, 0);
double lower_band = iBands(0, 0, 20, 0, 2, PRICE_CLOSE, MODE_LOWER, 0);
double current_price = Ask;
//--- generate buy signal if the price crosses above the upper band
bool buy_signal = (current_price > upper_band && Low[1] <= upper_band);
//--- generate sell signal if the price crosses below the lower band
bool sell_signal = (current_price < lower_band && High[1] >= lower_band);
//--- print signals to the log
if(buy_signal) Print("Buy signal generated!");
if(sell_signal) Print("Sell signal generated!");
//+------------------------------------------------------------------+
此脚本使用布林带指标来确定交易信号。如果当前价格上穿上轨,并且前一根K线的最低价低于上轨,则生成买入信号;类似地,如果价格下穿下轨,并且前一根K线的最高价高于下轨,则生成卖出信号。这个脚本是交易信号生成的起点,可以进一步根据策略需求定制化和复杂化。
通过这些脚本的应用案例,我们可以看到MQL脚本如何在实际交易中发挥作用,提高效率,并帮助交易者更好地分析市场和管理交易。
5. 内置函数库及其用途
5.1 MQL函数库概述
在MQL编程中,函数库是一组预定义函数的集合,可以帮助交易者实现复杂的操作,无需从零开始编写所有代码。MQL提供了多种函数库,每种都有其特定的功能和用途。
5.1.1 标准函数库和专业函数库的区别
标准函数库包含一系列基础函数,适用于大多数MT4/MT5应用程序。而专业函数库则提供了更为专门的工具集,它们专注于特定任务,如统计分析、数学计算、历史数据访问等。
5.1.2 函数库的分类和功能
函数库按照功能大致可以分为以下几类:
- 数学函数库:用于执行各种数学运算,如三角函数、对数函数等。
- 字符串函数库:处理文本数据,如字符串拼接、转换、截取等。
- 数组函数库:管理数组,包括数组的添加、删除、排序等操作。
- 交易函数库:执行交易操作,如订单发送、修改、关闭等。
- 文件操作函数库:用于读写本地文件和来自服务器的数据文件。
5.2 掌握核心函数库的使用
5.2.1 数学函数库的实战应用
数学函数库是交易者在处理技术分析指标时最为常用的。例如,在编写一个自定义的移动平均线指标时,需要用到 iMA
函数:
// 计算简单移动平均线
double SimpleMA(int start_bar, int bars_count, int ma_shift, int ma_period)
{
return iMA(NULL, 0, ma_period, 0, MODE_SMA, PRICE_CLOSE, ma_shift, start_bar);
}
此函数返回指定 ma_period
周期的简单移动平均值,并允许偏移。
5.2.2 交易函数库的实战应用
交易函数库使得交易者能够控制交易流程。比如,利用 OrderSend
函数进行自动交易:
// 发送市价买卖订单
void SendMarketOrder(string symbol, int type, double volume)
{
double slippage = 3;
int deviation = 3; // 允许的点差
int slippage_set = 0; // 不设置滑点
datetime expiration = 0; // 非到期订单
color arrow_color = clrNONE;
int ticket = OrderSend(
symbol, // 交易品种
type, // 订单类型: 0-买入,1-卖出
volume, // 交易数量
Ask, // 买入价
slippage, // 允许滑点
deviation, // 允许点差
slippage_set, // 不设置滑点
expiration, // 过期时间
"MyOrder", // 订单注释
arrow_color // 箭头颜色
);
if(ticket < 0)
Print("OrderSend failed with error #", GetLastError());
else
Print("OrderSend succeeded with ticket #", ticket);
}
这段代码尝试在当前市场价发送一个交易订单,并通过错误代码处理可能发生的错误。
5.3 函数库优化交易策略的案例
5.3.1 案例研究:使用函数库优化网格EA
网格EA是一种常见的自动交易策略,它在市场不同水平上放置多张订单,形成一个“网格”。通过使用交易函数库中的 OrderSend
和 OrderClose
函数,可以高效地管理这些订单。
// 用于关闭网格中所有订单的函数
void CloseAllOrders()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, clrNONE);
}
}
}
这段代码遍历所有订单并关闭它们,为网格EA策略提供了一个简洁的退出机制。
5.3.2 案例研究:提高交易脚本的性能
在交易脚本中,例如一个自动平仓脚本,使用适当的函数库可以提高执行效率。例如, ArraySetAsSeries
函数可以用于调整数组方向以匹配时间序列数据。
// 用于反转数组顺序以匹配时间序列的函数
void ReverseArray(double &array[])
{
int size = ArraySize(array);
double temp;
for(int i = 0; i < size / 2; i++)
{
temp = array[i];
array[i] = array[size - i - 1];
array[size - i - 1] = temp;
}
}
这使得脚本在处理历史数据时更为高效,尤其是在需要反向分析市场行为时。
通过上述案例,我们可以看到函数库在优化MQL脚本和EA中扮演的重要角色,以及如何针对实际交易需求选择并应用它们。
简介:MetaQuotes公式编写语言(MQL)是专为MetaTrader 4和MetaTrader 5平台开发的编程语言。MQL允许开发者创建自定义的技术指标、智能交易系统(EA)、脚本以及使用内置函数实现自动交易策略。MQL4专为MT4设计,而MQL5针对MT5有更多功能。学习MQL需要基本编程知识和金融市场知识,开发者可利用MT4内置工具测试和优化代码。MQL教程文件和社区论坛为交易者提供编程指南和交流平台。掌握MQL可以帮助交易者设计个性化的交易工具和策略,但需注意风险管理。