[MT4相关]智能交易示例
[backcolor=rgb(251, 251, 252)]以 MQL4语言程序为原理展示一个以标准MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。[/backcolor]
[backcolor=rgb(251, 251, 252)]交易原理: [list] [*]Long (BUY) entry – MACD指标在零以下, 从下至上并且穿过低端的信号线。
[*]Short (SELL) entry – MACD 指标在零以上,从上至下并且穿过顶端的信号线。
[*]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)]
[/backcolor]
[backcolor=rgb(251, 251, 252)]步骤 1 – 编写智能交易的描述
步骤 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)]
[/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]
[backcolor=rgb(251, 251, 252)]交易原理: [list] [*]Long (BUY) entry – MACD指标在零以下, 从下至上并且穿过低端的信号线。


[backcolor=rgb(251, 251, 252)]

[backcolor=rgb(251, 251, 252)]步骤 1 – 编写智能交易的描述
![]() | 在智能交易的导航窗口处,点击鼠标右键并且选择在菜单中的“创建新智能交易”。创建智能交易的初始提醒将会询问你进入数据中心。在显示窗口,填写智能交易的名称(名称) - MACD Sample,作者(作者) -指出你的名字, 链接 (连接) -你网页的链接,注解 (注解) - MACD-基本智能交易的测试范例。 |
要求的指定。这就是为什么我们在程序的开始插入初始变量的原因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
)
{
(
"
少于 100柱
"
)
;
return
(
0
)
;
}
if
(
TakeProfit
<
10
)
{
(
"
赢利少于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
))
{
(
"
没有资金.自由保证金 =
"
,
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
))
(
"
BUY 开单 :
"
,
OrderOpenPrice
())
;
}
else
(
"
错误 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
))
(
"
SELL 开单 :
"
,
OrderOpenPrice
())
;
}
else
(
"
错误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)]

[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
)
{
(
"
少于 100
柱"
)
;
return
(
0
)
;
}
if
(
TakeProfit
<
10
)
{
(
"
赢利少于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
))
{
(
"
没有资金. 自由保证金 =
"
,
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
))
(
"
BUY 定单开仓 :
"
,
OrderOpenPrice
())
;
}
else
(
"错误
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
))
(
"
SELL 定单开仓 :
"
,
OrderOpenPrice
())
;
}
else
(
"错误
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]
遇到矛盾 先站在对方的立场上想想问题,先试着去理解别人
● 如何使用WinMTR查询平台连接流畅度