智能交易示例
智能交易示例 [ [url=http://articles.mql4.com/84][color=#0000ff]en[/color][/url] | [url=http://articles.mql4.com/ru/82][color=#0000ff]ru[/color][/url] ][img=20,18]http://www.mql4.com/i/print.gif[/img]以 MQL4语言程序为原理展示一个以标准MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。
交易原理:
[list][*][b]Long (BUY) entry[/b] – MACD指标在零以下, 从下至上并且穿过低端的信号线。
[img=92,63]http://articles.mql4.com/c/articles/2005/12/macd_down(2).gif[/img]
[*][b]Short (SELL) entry[/b] – MACD 指标在零以上,从上至下并且穿过顶端的信号线。
[img=92,63]http://articles.mql4.com/c/articles/2005/12/macd_up(2).gif[/img]
[*][b]Long exit[/b] – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下并且穿过顶端的信号线)。
[*][b]Short exit[/b] – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD指标在零以下, 从下至上并且穿过低端的信号线)。
[/list]
[b]重要提示:[/b]从我们的分析上排除一些 MACD 指标微不足道的变化 (图表上的小 '山丘'),我们介绍一种补充检测‘山丘’大小的办法如下:指标的大小应该在最低价的最后5个单元(5*Point,对于 USD/CHF = 0.0005 和 USD/JPY = 0.05).
[align=center][img=450,300]http://articles.mql4.com/c/articles/2005/12/sample(2).gif[/img][/align][b]步骤 1 – 编写智能交易的描述[/b]
[table=98%][tr][td=1,1,207][img=271,130]http://articles.mql4.com/c/articles/2008/03/fig1.png[/img][/td][td]在智能交易的导航窗口处,点击鼠标右键并且选择在菜单中的“创建新智能交易”。创建智能交易的初始提醒将会询问你进入数据中心。在显示窗口,填写智能交易的名称(名称) - MACD Sample,作者(作者) -指出你的名字, 链接 (连接) -你网页的链接,注解 (注解) - MACD-基本智能交易的测试范例。
[/td][/tr][/table][b]步骤 2 –创建程序的基本结构[/b]
测试智能交易的源代码将只占据一点位置,但是还是有些量经常很难抓住,特别是我们不是专业的编成工作者 - 另外,我们不需要这些描述,不是吗? :)
一个标准智能交易的结构构想,让我们看看以下部分的描述:
[list=1][*]初始变量
[*]初始数据检测
[list][*]检测图表,图表中的柱数
[*]检测外部变量值:标准手, S/L, T/P, T/S
[/list][*]对于快速数据通道设置内部变量
[*]检测交易终端 – 是无效的吗?如果是:
[list][*]检测: 账户上的可用保证金...
[*]可能是看涨仓位 (BUY)?
[list][*]开设看涨仓位并退出
[/list][*]可能是卖空仓位 (SELL)?
[list][*]开设卖空仓位并退出
[/list][/list][/list]退出智能交易... [list][*]周期循环检验先前开仓
[list][*]如果是看涨仓位
[list][*]应该平仓?
[*]应该重新设定追踪止损?
[/list][*]如果是卖空仓位
[list][*]应该平仓?
[*]应该重新设定追踪止损?
[/list][/list]返回的结果很简单,只有4种。
现在让我们尝试一步一步地区完成列出的计划:
[list=1][*][b]初始变量[/b]
所有使用在智能交易程序中的变量必须按照 [url=http://docs.mql4.com/][color=#800080]MetaQuotes Language 4[/color][/url] 要求的指定。这就是为什么我们在程序的开始插入初始变量的原因
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;
MetaQuotes语言4 是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。提供一个额外的灵活性。在我们的程序中,MATrendPeriod 变量作为外部变量指定。 在程序开始我们插入这个变量。
extern double MATrendPeriod=26;[*][b]检测初始数据[/b]
该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:
// 初始数据检测
// 确认智能交易运行正常非常重要
//图表和用户设置不能出现任何错误
// 变量(Lots, StopLoss, TakeProfit,
// TrailingStop) 我们的情况需要检测TakeProfit
// 图表中少于100 柱
if(Bars<100)
{
Print("少于 100柱");
return(0);
}
if(TakeProfit<10)
{
Print("赢利少于10");
return(0); // 检测TakeProfit
}
[*][b]对于数据的快速通道设置内部变量[/b]
在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。
int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 简化代码//数据放置在内部变量中 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);现在,用 [b]iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)[/b]代替,您可以在源代码中使用 [b]MacdCurrent。[/b]
[*][b]检测交易终端 –是空的吗?如果是:[/b]
在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测:
total=OrdersTotal();
if(total<1)
{
[list][*][b]检测: 账户上的可用保证金...[/b]
在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。
if(AccountFreeMargin()<(1000*Lots))
{
Print("没有资金.自由保证金 = ", AccountFreeMargin());
return(0);
}
[*][b]可能是看涨仓位 (BUY)?[/b]
进入看涨仓位的条件: MACD 低于零, 向上并且穿过信号线向下。这就是我们在 MQL4中描述的 (注意我们在指标上的业务值保存在先前的变量中):
// 尽可能检测看涨仓位 (BUY)
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) &&
MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY 开单 : ",OrderOpenPrice());
}
else Print("错误 opening BUY order : ",GetLastError());
return(0);
}
附加的检验‘山丘’的大小上面已经给出了描述。 MACDOpenLevel变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。
[*][b]可能是卖空仓位(SELL)?[/b]
进入卖空仓位的条件: MACD高于零,向上并且穿过信号线向下。注解如下:
// 尽可能的检测卖空仓位(SELL)
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL 开单 : ",OrderOpenPrice());
}
else Print("错误SELL定单开仓 : ",GetLastError());
return(0);
}
[/list] return(0);
}[*][b]周期循环检验先前开仓[/b]
//进入市场的正确性非常重要
// 但是更重要的是安全退出...
for(cnt=0;cnt
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // 检验开仓
OrderSymbol()==Symbol()) // 检验货币对
{
"cnt" – " 是一个循环的变量必须在程序开始指定如下:
int cnt = 0; [list][*]如果是看涨仓位
if(OrderType()==OP_BUY) // 打开看张仓位
{
[list][*][b]应该平仓吗?[/b]
退出看涨仓位的条件: MACD 穿过信号线, MACD 高于零,向上并穿过信号线向下。
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
}
[*][b]应该重设追踪止损马?[/b]
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。
// 检测追踪止损
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
[/list]我们停止操作符。
}[*]如果是卖空仓位
else //卖空仓位
{
[list][*][b]应该平仓吗?[/b]
退出卖空仓位的条件: MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓
return(0); // 退出
}
[*][b]应该重设追踪止损吗?[/b]
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。
// 检测追踪止损
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
[/list]关闭所有残留开仓。
}
}
}
return(0);
}
[/list][/list][/list]这样一步一步地编写我们的智能交易...
[b]步骤3 – 集中程序的结果代码[/b]
让我们打开智能交易的设定:使用按钮打开"属性..."菜单。在窗口内指定运行参量的外部设定:
[align=center][img=620,312]http://articles.mql4.com/c/articles/2008/03/properties2.gif[/img][/align]从先前部分集中全部代码:
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| [url=http://www.metaquotes.net/][color=#0000ff]http://www.metaquotes.net/[/color][/url] |
//+------------------------------------------------------------------+
extern
double
TakeProfit = 50;
extern
double
Lots = 0.1;
extern
double
TrailingStop = 30;
extern
double
MACDOpenLevel=3;
extern
double
MACDCloseLevel=2;
extern
double
MATrendPeriod=26;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int
start()
{
double
MacdCurrent, MacdPrevious, SignalCurrent;
double
SignalPrevious, MaCurrent, MaPrevious;
int
cnt, ticket, total;
// 检测初始化数据
// 确定智能交易在图表中运行正常非常重要
// 用户在外部变量交易中不会产生任何错误
// 外部变量 (标准手数, 止损,赢利,
// 追踪止损) 在这种情况下,我们检测图表中赢利水平要小于100 柱
if(Bars<100)
{
Print("少于 100柱");
return(0);
}
if(TakeProfit<10)
{
Print("赢利少于10");
return(0); // 检测赢利水平
}
// 简化代码和加速通道
// 数据被放置在内部变量中
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
total=OrdersTotal();
if(total<1)
{
// 没有指定开单
if(AccountFreeMargin()<(1000*Lots))
{
Print("没有资金. 自由保证金 = ", AccountFreeMargin());
return(0);
}
// 尽可能检测看涨仓位 (BUY)
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY 定单开仓 : ",OrderOpenPrice());
}
else
Print("错误BUY定单开仓 : ",GetLastError());
return(0);
}
// 尽可能检测卖空仓位(SELL)
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL 定单开仓 : ",OrderOpenPrice());
}
else
Print("错误SELL定单开仓 : ",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_BUY)
// 看涨仓位开仓
{
// 需要平仓吗?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); // 退出
}
// 检测追踪止损
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
// 去卖空仓位
{
// 需要平仓吗?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // 平仓
return(0); //退出
}
// 检测追踪止损
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// 结束
对于最后智能交易的确认,只需要指定外部变量值 "Lots = 1", "Stop Loss (S/L) = 0" (not used), "Take Profit (T/P) = 120" (appropriate for one-hour intervals), "Trailing Stop (T/S) = 30". 当然,你可以使用自己的值。按 "编写"按钮,如果没有任何错误信息出现 (你可以从 MetaEditor的列表中复制), 按 "保存"键保存智能交易。
[b]附件:[/b]
[url=http://articles.mql4.com/cn/download/4310][img=17,15]http://www.mql4.com/i/ico/mq4.gif[/img][/url] [url=http://articles.mql4.com/cn/download/4310][color=#0000ff]MACD Sample.mq4[/color][/url] [size=2](3.8 Kb)[/size]
[align=right]创建: [b]2008.03.17[/b] 创建人: [url=http://www.mql4.com/cn/users/MetaQuotes][color=#0000ff]MetaQuotes Software Corp.[/color][/url][/align]
[size=2][color=#ff0000][b]警告:[/b][/color] 所有资料属MetaQuotes Software Corp版权所有. 所有资料或部分资料不得复制和转载.[/size]
[align=right][float=left][b]8 评论[/b] [/float] 添加评论, 请, [url=http://www.mql4.com/cn/users/login][b][color=#0000ff]登陆[/color][/b][/url] 或 [url=http://www.mql4.com/cn/users/register][b][color=#800080]注册[/color][/b][/url] [/align]
[url=http://docs.mql4.com/math/MathAbs][color=#0000ff]MathAbs[/color][/url] 您可以查看中文版本的参考文档!
[align=right]2008.04.04 14:30 [url=http://www.mql4.com/cn/users/di_sun][color=#0000ff]di_sun[/color][/url] [/align]
谢谢,对我很有用! 但有一个不是很懂,请问
[url=http://docs.mql4.com/math/MathAbs][color=#0000ff]MathAbs[/color][/url]
[b][color=#42639c]leven0003[/color] wrote:[/b]
非常感谢,资料很有用。
(MacdCurrent)>(MACDOpenLevel*Point) 中的point是什么意思?
[align=right]2008.03.27 15:07 [url=http://www.mql4.com/cn/users/hexinchen][color=#0000ff]hexinchen[/color][/url] [/align]
很好!看后大有收益!谢谢!
[align=right]2008.03.22 08:04 [url=http://www.mql4.com/cn/users/5125839][color=#0000ff]5125839[/color][/url] [/align]
非常感谢,学习了!
[align=right]2008.03.20 07:50 [url=http://www.mql4.com/cn/users/xzpchi][color=#0000ff]xzpchi[/color][/url] [/align]
谢谢,外部变量值在什么地方更改,找不到,谢谢
[align=right]2008.03.20 07:03 [url=http://www.mql4.com/cn/users/wucz][color=#0000ff]wucz[/color][/url] [/align]
写的好好哦,但我是一个初学者,好多不懂,您能不能帮我设计一个智能交易的程序,我想以MACD作为买卖的指标,条件是MACD9,12,26.MACD日线在0以上,4和1小时线也在0以上,MACD15分钟线从0以下上穿0线或MACD9线上穿12线做买.MACD从0以上下穿0线或MACD9线下穿12线平仓.这是先买的,先做空的刚好相反,我是一个外行,不知能不能设计出,提的不对多谅,谢谢,我的邮箱[email]wucz666@sina.com[/email]
[align=right]2008.03.20 05:39 [url=http://www.mql4.com/cn/users/wucz][color=#0000ff]wucz[/color][/url] [/align]
[b][color=#42639c]leven0003[/color] wrote:[/b]
非常感谢,资料很有用。
欢迎经常光顾!
如果文章有翻译不当的地方,还请多多指教!!
[align=right]2008.03.18 16:55 [url=http://www.mql4.com/cn/users/di_sun][color=#0000ff]di_sun[/color][/url] [/align]
非常感谢,资料很有用。
[align=right]2008.03.18 10:38 [url=http://www.mql4.com/cn/users/leven0003][color=#0000ff]leven0003[/color][/url] [/align]
页:
[1]