mt4创建智能交易系统步骤.docx

上传人:b****4 文档编号:27517932 上传时间:2023-07-02 格式:DOCX 页数:14 大小:50.91KB
下载 相关 举报
mt4创建智能交易系统步骤.docx_第1页
第1页 / 共14页
mt4创建智能交易系统步骤.docx_第2页
第2页 / 共14页
mt4创建智能交易系统步骤.docx_第3页
第3页 / 共14页
mt4创建智能交易系统步骤.docx_第4页
第4页 / 共14页
mt4创建智能交易系统步骤.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

mt4创建智能交易系统步骤.docx

《mt4创建智能交易系统步骤.docx》由会员分享,可在线阅读,更多相关《mt4创建智能交易系统步骤.docx(14页珍藏版)》请在冰豆网上搜索。

mt4创建智能交易系统步骤.docx

mt4创建智能交易系统步骤

以MQL4语言程序为原理展示一个以标准MACD指标为基础简单的智能交易系统的创建。

在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。

在我们的范例中,通过开仓和管理仓位来完成交易。

交易原理:

∙Long(BUY)entry–MACD指标在零以下,从下至上并且穿过低端的信号线。

∙Short(SELL)entry–MACD指标在零以上,从上至下并且穿过顶端的信号线。

∙Longexit–赢利上限的执行,追踪止损的执行或当穿过MACD的信号线(MACD指标在零以上,从上至下并且穿过顶端的信号线)。

∙Shortexit–赢利上限的执行,追踪止损的执行或当穿过MACD的信号线(MACD指标在零以下,从下至上并且穿过低端的信号线)。

重要提示:

从我们的分析上排除一些MACD指标微不足道的变化(图表上的小'山丘'),我们介绍一种补充检测‘山丘’大小的办法如下:

指标的大小应该在最低价的最后5个单元(5*Point,对于USD/CHF=0.0005和USD/JPY=0.05).

步骤1–编写智能交易的描述

在智能交易的导航窗口处,点击鼠标右键并且选择在菜单中的“创建新智能交易”。

创建智能交易的初始提醒将会询问你进入数据中心。

在显示窗口,填写智能交易的名称(名称)-MACDSample,作者(作者)-指出你的名字,链接(连接)-你网页的链接,注解(注解)-MACD-基本智能交易的测试范例。

步骤2–创建程序的基本结构

测试智能交易的源代码将只占据一点位置,但是还是有些量经常很难抓住,特别是我们不是专业的编成工作者-另外,我们不需要这些描述,不是吗?

:

一个标准智能交易的结构构想,让我们看看以下部分的描述:

1.初始变量

2.初始数据检测

o检测图表,图表中的柱数

o检测外部变量值:

标准手,S/L,T/P,T/S

3.对于快速数据通道设置内部变量

4.检测交易终端–是无效的吗?

如果是:

o检测:

账户上的可用保证金...

o可能是看涨仓位(BUY)?

▪开设看涨仓位并退出

5.可能是卖空仓位(SELL)?

o开设卖空仓位并退出

退出智能交易...

∙周期循环检验先前开仓

o如果是看涨仓位

▪应该平仓?

▪应该重新设定追踪止损?

∙如果是卖空仓位

o应该平仓?

o应该重新设定追踪止损?

返回的结果很简单,只有4种。

现在让我们尝试一步一步地区完成列出的计划:

1.初始变量

所有使用在智能交易程序中的变量必须按照MetaQuotesLanguage4要求的指定。

这就是为什么我们在程序的开始插入初始变量的原因

externdoubleTakeProfit=50;

externdoubleLots=0.1;

externdoubleTrailingStop=30;

externdoubleMACDOpenLevel=3;

externdoubleMACDCloseLevel=2;

externdoubleMATrendPeriod=26;

MetaQuotes语言4是需要“外部变量”辅助的。

外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。

提供一个额外的灵活性。

在我们的程序中,MATrendPeriod变量作为外部变量指定。

在程序开始我们插入这个变量。

externdoubleMATrendPeriod=26;

2.检测初始数据

该代码部分通常使用在所有的智能交易中。

因为是一个标准的检测:

//初始数据检测

//确认智能交易运行正常非常重要

//图表和用户设置不能出现任何错误

//变量(Lots,StopLoss,TakeProfit,

//TrailingStop)我们的情况需要检测TakeProfit

//图表中少于100柱

if(Bars<100)

{

Print("少于100柱");

return(0);

}

if(TakeProfit<10)

{

Print("赢利少于10");

return(0);//检测TakeProfit

}

3.对于数据的快速通道设置内部变量

在源代码中经常需要注意指标值或计算值。

简化代码和数据放置在内部变量中。

4.intstart()

5.{

6.doubleMacdCurrent,MacdPrevious,SignalCurrent;

7.doubleSignalPrevious,MaCurrent,MaPrevious;

8.intcnt,ticket,total;

9.

10.//简化代码

11.//数据放置在内部变量中

12.MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

13.MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);

14.SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

15.SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

16.MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

现在,用iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用MacdCurrent。

17.检测交易终端–是空的吗?

如果是:

在我们的智能交易中,我们仅使用开单和操作挂单。

不过,使更安全,我们来认识一种对于先前定单交易终端检测:

total=OrdersTotal();

if(total<1)

{

o检测:

账户上的可用保证金...

在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。

if(AccountFreeMargin()<(1000*Lots))

{

Print("没有资金.自由保证金=",AccountFreeMargin());

return(0);

}

o可能是看涨仓位(BUY)?

进入看涨仓位的条件:

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,

"macdsample",16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY开单:

",OrderOpenPrice());

}

elsePrint("错误openingBUYorder:

",GetLastError());

return(0);

}

附加的检验‘山丘’的大小上面已经给出了描述。

MACDOpenLevel变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。

在程序开始我们插入这个变量的描述。

o

能交易示范2

2010年02月18日星期四10:

15

可能是卖空仓位(SELL)?

进入卖空仓位的条件:

MACD高于零,向上并且穿过信号线向下。

注解如下:

//尽可能的检测卖空仓位(SELL)

if(MacdCurrent>0&&MacdCurrentSignalPrevious&&

MacdCurrent>(MACDOpenLevel*Point)&&MaCurrent

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,

"macdsample",16384,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL开单:

",OrderOpenPrice());

}

elsePrint("错误SELL定单开仓:

",GetLastError());

return(0);

}

return(0);

}

周期循环检验先前开仓

//进入市场的正确性非常重要

//但是更重要的是安全退出...

for(cnt=0;cnt

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if(OrderType()<=OP_SELL&&//检验开仓

OrderSymbol()==Symbol())//检验货币对

{

"cnt"–"是一个循环的变量必须在程序开始指定如下:

intcnt=0;

∙如果是看涨仓位

if(OrderType()==OP_BUY)//打开看张仓位

{

o应该平仓吗?

退出看涨仓位的条件:

MACD穿过信号线,MACD高于零,向上并穿过信号线向下。

if(MacdCurrent>0&&MacdCurrentSignalPrevious&&

MacdCurrent>(MACDCloseLevel*Point))

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);//平仓

return(0);//退出

}

o应该重设追踪止损马?

我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。

//检测追踪止损

if(TrailingStop>0)

{

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

{

if(OrderStopLoss()

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,

OrderTakeProfit(),0,Green);

return(0);

}

}

}

我们停止操作符。

}

如果是卖空仓位

else//卖空仓位

{

∙应该平仓吗?

退出卖空仓位的条件:

MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。

if(MacdCurrent<0&&MacdCurrent>SignalCurrent&&

MacdPrevious(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);

}

这样一步一步地编写我们的智能交易...

智能交易示范3

2010年02月18日星期四10:

16

步骤3–集中程序的结果代码

让我们打开智能交易的设定:

使用按钮打开"属性..."菜单。

在窗口内指定运行参量的外部设定:

从先前部分集中全部代码:

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

//|MACDSample.mq4|

//|Copyright©2005,MetaQuotesSoftwareCorp.|

//||

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

externdoubleTakeProfit=50;

externdoubleLots=0.1;

externdoubleTrailingStop=30;

externdoubleMACDOpenLevel=3;

externdoubleMACDCloseLevel=2;

externdoubleMATrendPeriod=26;

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

//||

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

intstart()

{

doubleMacdCurrent,MacdPrevious,SignalCurrent;

doubleSignalPrevious,MaCurrent,MaPrevious;

intcnt,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

MathAbs(MacdCurrent)>(MACDOpenLevel*Point)&&MaCurrent>MaPrevious)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macdsample",16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY定单开仓:

",OrderOpenPrice());

}

elsePrint("错误BUY定单开仓:

",GetLastError());

return(0);

}

//尽可能检测卖空仓位(SELL)

if(MacdCurrent>0&&MacdCurrentSignalPrevious&&

MacdCurrent>(MACDOpenLevel*Point)&&MaCurrent

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macdsample",16384,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("SELL定单开仓:

",OrderOpenPrice());

}

elsePrint("错误SELL定单开仓:

",GetLastError());

return(0);

}

return(0);

}

//正确进入市场很重要,

//但正确退出市场更重要...

for(cnt=0;cnt

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if(OrderType()<=OP_SELL&&//检测开仓

OrderSymbol()==Symbol())//检测货币对

{

if(OrderType()==OP_BUY)//看涨仓位开仓

{

//需要平仓吗?

if(MacdCurrent>0&&MacdCurrentSignalPrevious&&

MacdCurrent>(MACDCloseLevel*Point))

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);//平仓

return(0);//退出

}

//检测追踪止损

if(TrailingStop>0)

{

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

{

if(OrderStopLoss()

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else//去卖空仓位

{

//需要平仓吗?

if(MacdCurrent<0&&MacdCurrent>SignalCurrent&&

MacdPrevious(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","StopLoss(S/L)=0"(notused),"TakeProfit(T/P)=120"(appropriateforone-hourintervals),"TrailingStop(T/S)=30".当然,你可以使用自己的值。

按"编写"按钮,如果没有任何错误信息出现(你可以从MetaEditor的列表中复制),按"保存"键保存智能交易。

附件:

MACDSample.mq4(3.8Kb)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1