mt4创建智能交易系统的步骤Word格式文档下载.docx
《mt4创建智能交易系统的步骤Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《mt4创建智能交易系统的步骤Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
3.对于快速数据通道设置内部变量
4.检测交易终端–是无效的吗?
如果是:
o检测:
账户上的可用保证金...
o可能是看涨仓位(BUY)?
▪开设看涨仓位并退出
5.可能是卖空仓位(SELL)?
o开设卖空仓位并退出
退出智能交易...
∙周期循环检验先前开仓
o如果是看涨仓位
▪应该平仓?
▪应该重新设定追踪止损?
∙如果是卖空仓位
o应该平仓?
o应该重新设定追踪止损?
返回的结果很简单,只有4种。
现在让我们尝试一步一步地区完成列出的计划:
所有使用在智能交易程序中的变量必须按照MetaQuotesLanguage4要求的指定。
这就是为什么我们在程序的开始插入初始变量的原因
externdoubleTakeProfit=50;
externdoubleLots=0.1;
externdoubleTrailingStop=30;
externdoubleMACDOpenLevel=3;
externdoubleMACDCloseLevel=2;
externdoubleMATrendPeriod=26;
MetaQuotes语言4是需要“外部变量”辅助的。
外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。
提供一个额外的灵活性。
在我们的程序中,MATrendPeriod变量作为外部变量指定。
在程序开始我们插入这个变量。
2.检测初始数据
该代码部分通常使用在所有的智能交易中。
因为是一个标准的检测:
//初始数据检测
//确认智能交易运行正常非常重要
//图表和用户设置不能出现任何错误
//变量(Lots,StopLoss,TakeProfit,
//TrailingStop)我们的情况需要检测TakeProfit
//图表中少于100柱
if(Bars<
100)
{
Print("
少于100柱"
);
return(0);
}
if(TakeProfit<
10)
赢利少于10"
//检测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)
在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。
if(AccountFreeMargin()<
(1000*Lots))
没有资金.自由保证金="
AccountFreeMargin());
进入看涨仓位的条件:
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))
BUY开单:
OrderOpenPrice());
elsePrint("
错误openingBUYorder:
GetLastError());
附加的检验‘山丘’的大小上面已经给出了描述。
MACDOpenLevel变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。
在程序开始我们插入这个变量的描述。
o
能交易示范2
2010年02月18日星期四10:
15
可能是卖空仓位(SELL)?
进入卖空仓位的条件:
MACD高于零,向上并且穿过信号线向下。
注解如下:
//尽可能的检测卖空仓位(SELL)
if(MacdCurrent>
MacdCurrentSignalPrevious&
MaCurrent
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
16384,0,Red);
SELL开单:
错误SELL定单开仓:
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>
(MACDCloseLevel*Point))
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
//平仓
//退出
o应该重设追踪止损马?
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。
//检测追踪止损
if(TrailingStop>
0)
{
if(Bid-OrderOpenPrice()>
Point*TrailingStop)
if(OrderStopLoss()
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
我们停止操作符。
如果是卖空仓位
else//卖空仓位
∙应该平仓吗?
退出卖空仓位的条件:
MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。
if(MacdCurrent<
MacdPrevious(MACDCloseLevel*Point))
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
//退出
∙应该重设追踪止损吗?
if((OrderOpenPrice()-Ask)>
(Point*TrailingStop))
if((OrderStopLoss()>
(Ask+Point*TrailingStop))||(OrderStopLoss()==0))
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
关闭所有残留开仓。
}
这样一步一步地编写我们的智能交易...
智能交易示范3
16
步骤3–集中程序的结果代码
让我们打开智能交易的设定:
使用按钮打开"
属性..."
菜单。
在窗口内指定运行参量的外部设定:
从先前部分集中全部代码:
//+------------------------------------------------------------------+
//|MACDSample.mq4|
//|Copyright©
2005,MetaQuotesSoftwareCorp.|
//||
//||
intstart()
doubleMacdCurrent,MacdPrevious,SignalCurrent;
doubleSignalPrevious,MaCurrent,MaPrevious;
intcnt,ticket,total;
//检测初始化数据
//确定智能交易在图表中运行正常非常重要
//用户在外部变量交易中不会产生任何错误
//外部变量(标准手数,止损,赢利,
//追踪止损)在这种情况下,我们检测图表中赢利水平要小于100柱
//检测赢利水平
//简化代码和加速通道
//数据被放置在内部变量中
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);
total=OrdersTotal();
//没有指定开单
if(AccountFreeMargin()<
没有资金.自由保证金="
//尽可能检测看涨仓位(BUY)
MacdPrevious<
SignalPrevious&
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("
BUY定单开仓:
错误BUY定单开仓:
//尽可能检测卖空仓位(SELL)
MacdCurrent<
MacdPrevious>
MaCurrent<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"
SELL定单开仓:
//正确进入市场很重要,
//但正确退出市场更重要...
for(cnt=0;
cnt<
total;
cnt++)
//检测开仓
OrderSymbol()==Symbol())//检测货币对
if(OrderType()==OP_BUY)//看涨仓位开仓
//需要平仓吗?
//检测追踪止损
if(TrailingStop>
if(OrderStopLoss()<
Bid-Point*TrailingStop)
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
else//去卖空仓位
//平仓
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
//结束
对于最后智能交易的确认,只需要指定外部变量值"
Lots=1"
"
StopLoss(S/L)=0"
(notused),"
TakeProfit(T/P)=120"
(appropriateforone-hourintervals),"
TrailingStop(T/S)=30"
.当然,你可以使用自己的值。
按"
编写"
按钮,如果没有任何错误信息出现(你可以从MetaEditor的列表中复制),按"
保存"
键保存智能交易。
附件:
MACDSample.mq4(3.8Kb)