论坛全局菜单下方 - TICKMILL 285X70论坛全局菜单下方 - ThinkMarkets285X70论坛全局菜单下方 - 荔枝返现285X70论坛全局菜单下方 -  icmarkets285X70
查看:911回复:0
老正
注册时间2003-09-21
365热心助人奖
[MT4相关]智能交易示例
楼主发表于:2013-11-11 18:23只看该作者倒序浏览
1楼 电梯直达
电梯直达
[backcolor=rgb(251, 251, 252)]以 MQL4语言程序为原理展示一个以标准MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。[/backcolor]
[backcolor=rgb(251, 251, 252)]交易原理: [list] [*]Long (BUY) entry – MACD指标在零以下, 从下至上并且穿过低端的信号线。 http://c.mql4.com/articles/2005/12/macd_down_2_.gif [*]Short (SELL) entry – MACD 指标在零以上,从上至下并且穿过顶端的信号线。 http://c.mql4.com/articles/2005/12/macd_up_2_.gif [*]Long exit – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下并且穿过顶端的信号线)。 [*]Short exit – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD指标在零以下, 从下至上并且穿过低端的信号线)。 [/list] 重要提示:从我们的分析上排除一些 MACD 指标微不足道的变化 (图表上的小 '山丘'),我们介绍一种补充检测‘山丘’大小的办法如下:指标的大小应该在最低价的最后5个单元(5*Point,对于 USD/CHF = 0.0005 和 USD/JPY = 0.05).[/backcolor]
[backcolor=rgb(251, 251, 252)]http://c.mql4.com/articles/2005/12/sample_2_.gif[/backcolor]
[backcolor=rgb(251, 251, 252)]步骤 1 – 编写智能交易的描述
http://c.mql4.com/articles/2008/03/fig1.png在智能交易的导航窗口处,点击鼠标右键并且选择在菜单中的“创建新智能交易”。创建智能交易的初始提醒将会询问你进入数据中心。在显示窗口,填写智能交易的名称(名称) - MACD Sample,作者(作者) -指出你的名字, 链接 (连接) -你网页的链接,注解 (注解) - MACD-基本智能交易的测试范例。
步骤 2 –创建程序的基本结构测试智能交易的源代码将只占据一点位置,但是还是有些量经常很难抓住,特别是我们不是专业的编成工作者 - 另外,我们不需要这些描述,不是吗? :)一个标准智能交易的结构构想,让我们看看以下部分的描述:[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] [*]初始变量 所有使用在智能交易程序中的变量必须按照 MetaQuotes Language 4
要求的指定。这就是为什么我们在程序的开始插入初始变量的原因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
;
[*]检测初始数据 该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:// 初始数据检测
// 确认智能交易运行正常非常重要
//图表和用户设置不能出现任何错误
// 变量(Lots, StopLoss, TakeProfit,
// TrailingStop) 我们的情况需要检测TakeProfit
// 图表中少于100 柱
if
(
Bars
<
100
)
{
Print
(
"
少于 100柱
"
)
;
return
(
0
)
;
}
if
(
TakeProfit
<
10
)
{
Print
(
"
赢利少于10
"
)
;
return
(
0
)
;
// 检测TakeProfit
}
[*]对于数据的快速通道设置内部变量 在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。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
)
;
现在,用 iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用 MacdCurrent。 [*]检测交易终端 –是空的吗?如果是: 在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测: total
=
OrdersTotal
()
;
if
(
total
<
1
)
{
[list] [*]检测: 账户上的可用保证金... 在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。 if
(
AccountFreeMargin
()
<
(
1000
*
Lots
))
{
Print
(
"
没有资金.自由保证金 =
"
,
AccountFreeMargin
())
;
return
(
0
)
;
}
[*]可能是看涨仓位 (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
,
"
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变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。 [*]可能是卖空仓位(SELL)? 进入卖空仓位的条件: 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); } [*]周期循环检验先前开仓//进入市场的正确性非常重要
// 但是更重要的是安全退出...
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] [*]应该平仓吗? 退出看涨仓位的条件: MACD 穿过信号线, MACD 高于零,向上并穿过信号线向下。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
)
;
}
} }
[/list]我们停止操作符。 }
[*]如果是卖空仓位else
//卖空仓位
{
[list] [*]应该平仓吗? 退出卖空仓位的条件: 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
)
;
}
}
}
[/list]关闭所有残留开仓。 } } }
return
(
0
)
; }
[/list] [/list] [/list]这样一步一步地编写我们的智能交易...步骤3 – 集中程序的结果代码让我们打开智能交易的设定:使用按钮打开"属性..."菜单。在窗口内指定运行参量的外部设定: [/backcolor]

[backcolor=rgb(251, 251, 252)]http://c.mql4.com/articles/2008/03/properties2.gif[/backcolor]
[backcolor=rgb(251, 251, 252)]从先前部分集中全部代码://+------------------------------------------------------------------+

//| MACD Sample.mq4 |

//| Copyright 2005, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/
|


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

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的列表中复制), 按 "保存"键保存智能交易。[/backcolor]

TK29帖子1楼右侧xm竖版广告90-240
个性签名

遇到矛盾 先站在对方的立场上想想问题,先试着去理解别人
如何使用WinMTR查询平台连接流畅度

广告
TK30+TK31帖子一樓廣告
TK30+TK31帖子一樓廣告

本站免责声明:

1、本站所有广告及宣传信息均与韬客无关,如需投资请依法自行决定是否投资、斟酌资金安全及交易亏损风险;

2、韬客是独立的、仅为投资者提供交流的平台,网友发布信息不代表韬客的观点与意思表示,所有因网友发布的信息而造成的任何法律后果、风险与责任,均与韬客无关;

3、金融交易存在极高法律风险,未必适合所有投资者,请不要轻信任何高额投资收益的诱导而贸然投资;投资保证金交易导致的损失可能超过您投入的资金和预期。请您考虑自身的投资经验及风险承担能力,进行合法、理性投资;

4、所有投资者的交易帐户应仅限本人使用,不应交由第三方操作,对于任何接受第三方喊单、操盘、理财等操作的投资和交易,由此导致的任何风险、亏损及责任由投资者个人自行承担;

5、韬客不隶属于任何券商平台,亦不受任何第三方控制,韬客不邀约客户投资任何保证金交易,不接触亦不涉及投资者的任何资金及账户信息,不代理任何交易操盘行为,不向客户推荐任何券商平台,亦不存在其他任何推荐行为。投资者应自行选择券商平台,券商平台的任何行为均与韬客无关。投资者注册及使用韬客即表示其接受和认可上述声明,并自行承担法律风险。

版权所有:韬客外汇论坛 www.talkfx.com 联络我们:[email protected]