私募

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

期货量化软件:赫兹量化如何利用 MQL5 创建自定义指标Heiken

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
; i7 V: |9 e8 G# U0 e+ k我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。+ l* |  @+ l  P# d
赫兹量化交易软件
: }) n8 W! B1 T/ G自定义指标和 Heiken Ashi 定义
. @* P2 y1 _' }/ L在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件8 H2 v$ b# {) L9 s: s7 l- Q. Z- O: W
简单的 Heiken Ashi 指标% J5 d3 ^3 g+ O3 a+ O4 {3 y
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
% S+ h3 l' W1 c% t) `3 z$ c1 E我们来查看创建此自定义指标需要完成的所有步骤。7 a( W. y& r& p8 ^% j0 Z- X
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:5 H2 G4 Q% @' x: v, t$ n/ m
(indicator_separate_window) 在单独的窗口中显示指标。. \, T. C2 Z* v; a& B/ C  d7 q. S* e
(indicator_buffers) 确定指标计算的缓冲区数量。
/ O2 O/ U2 f1 q" ~4 j1 C0 I(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
3 d* ~0 L7 ~% z6 F(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。$ f1 S5 T! A$ r( M
(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。3 P! T. B  t, P6 A
(indicator_widthN) 还要确定 N 或图形序列的宽度。
0 T. @" c; g6 d8 P(indicator_labelN) 确定图形序列 N 的标签设置。
$ i3 e$ \; e1 |4 a5 {: x#property indicator_separate_window
  j7 l! {3 `. T- I- t" J#property indicator_buffers 5' N) {) t- N0 ~. n- @
#property indicator_plots   13 Z; S9 n; _: F9 g% G
#property indicator_type1   DRAW_COLOR_CANDLES
2 j" g+ X- W: g# a: C, h#property indicator_color1  clrBlue, clrRed7 B2 h; C* V# \% f) H8 L- f3 D
#property indicator_width1  20 f/ ?' k8 o& T7 @5 f" ]( T
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"" I/ o6 |  ?) ~# |6 u% k
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
7 f9 U- C- m7 L  ^+ e# odouble haOpen[];
( r. A+ j3 N) Q. M5 bdouble haHigh[];1 c  F! M' M( M  e" L" T. E8 S
double haLow[];" r) w+ r5 j, Y6 G5 N
double haClose[];  [  u  o- u8 |. m* G* p1 L; k
double haColor[];( w1 c9 l8 t8 U2 Z
在 OnInit() 中,此函数初始化正在运行的指标。# h( X9 d0 d; y% t4 T: C
int OnInit(); I, j+ v" P" V7 Q# V
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件
3 F2 F; P! c2 J4 L# M$ b! D* d( h其参数为:
" e. I$ B4 k- ]  zindex: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。# i) `; ?- M6 q& _7 q0 y6 @
buffer[]: 在我们的自定义指标中声明的数组。  }) O! @8 T' y" O$ r. P! i
data_type: 我们需要在指标数组中存储的数据类型。
: Z5 ]- j/ _4 [. U! \, S( RSetIndexBuffer(0,haOpen,INDICATOR_DATA);
. S8 b6 S0 Z5 `SetIndexBuffer(1,haHigh,INDICATOR_DATA);
6 p0 V8 {1 A' DSetIndexBuffer(2,haLow,INDICATOR_DATA);' d' o; A( e# B) e
SetIndexBuffer(3,haClose,INDICATOR_DATA);
+ i3 X/ p: d5 T' PSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);' l% q3 \2 ^* ~/ S
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
: B4 y. P* R6 p$ B, y; {prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
! D7 E9 Y$ t# J, rprop_value: 属性的值,我们将指定(_Digits)。3 v9 q) |- A+ I- z) q, C) R7 [; X# [
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);) x- d' x5 p' q
调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
6 q% C. |5 v# p; O9 S: Y$ uprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。+ w  Z, W) v% {. g: h
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。' Y4 O: M; q% u, F9 O4 D
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");0 i' s/ E4 z$ K$ I
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
. x2 e8 o6 Q0 x; Qplot_index: 图形绘图的索引,我们将指定 0。' V  P4 Q( ]/ L$ W' G3 o6 |
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。' i: H1 ]- f4 c8 ~1 l" z% q
prop_value: 属性值。% a4 B! m; w1 t3 R
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
/ L) @4 h( X4 T. j然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。, |! g3 S/ R! d! O( b( |& i$ O1 h
return(INIT_SUCCEEDED);
! `2 W/ k( P+ V! L' F. e在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件9 U* m# B' K7 s5 N9 E9 X; A2 q
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。" Z& s# g% w, b' E+ P' m
int OnCalculate(const int rates_total,8 o2 m  ~4 s$ S, r! w1 G
const int prev_calculated,% ]5 T! R/ U9 f
const datetime &time[],& o3 B$ I" G! J- @
const double &open[],; E: r7 c  a0 P) L4 w/ y4 a
const double &high[],
& B% K" Z: a( G, c4 _const double &low[],) @! e$ d7 |7 \1 D5 C& z
const double &close[],) k2 {0 J0 k& ]. q$ f/ c
const long &tick_volume[],: T! y: e# C7 S9 x+ O3 J$ y
const long &volume[],
# g4 q* Z+ R9 J% Oconst int &spread[])( C) P6 ~8 v/ H4 w! ~9 r( [
创建一个整数型 “start” 变量,我们稍后将为其赋值:
* Q- i& a/ O& \4 N) K- \int start;: H2 i, c2 F! E) `4 a
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:6 W" m% A& ]9 p6 O% V9 j
if(prev_calculated==0)
; k3 M8 r$ K9 i) M' V{5 q; l0 v% ], R0 t- W
haLow[0]=low[0];8 T: r; w6 D1 z! G& Q( |: w) f( o3 _
haHigh[0]=high[0];
$ [1 q( N  d4 E; t1 \haOpen[0]=open[0];- `9 Y: A. O5 U, w. c
haClose[0]=close[0];
3 O) i( |/ d, r. A  dstart=1;
( H& A$ W2 q; h' |* p# a}
% f' ]' x4 |7 ?- o- Z( oelse! w! {. I3 v6 u8 K# c' p: A% S, o: y
start=prev_calculated-1;
  J  p4 h. Q+ Q在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。. h- E1 f% o, H* C, K8 U. h
这三个表达式将是:
& z" G; |  ]- s  S6 U+ qi=start: 对应起始位置。, j1 D( W1 L% @' T8 O3 v
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
5 ?/ @8 {  B% k% }( w( @i++: 加 1 作为新的 i。7 y$ W# v8 @$ F9 V/ j% B# A
我们每次在循环过程中需要执行的操作:
! f& C  X$ @  ~! z' q% ^" k& e计算四个双精度变量
1 O' w. B  [( ]9 V& I3 g/ }1 e4 GhaOpenVal: 对应 Heiken Ashi 开盘价。
# S- L- ?' N$ ~0 X, PhaCloseVal: 对应 Heiken Ashi 收盘价。
! s2 O, }6 w2 B  }7 J) MhaHighVal: 对应 Heiken Ashi 最高价。) \3 h- e' |% B# {5 B
haLowVal: 对应 Heiken Ashi 最低价。
5 {5 s# U9 E" Z在上一步中分配的计算值与以下内容相同- R1 ~: r. |6 V: q) O
haLow=haLowVal1 B- `0 |# X3 y& X5 n% J# m/ a# S7 G
haHigh=haHighVal
4 z" g$ }% }5 H8 ?' v) S) EhaOpen=haOpenVal
4 x$ C$ O) l8 p8 `. }4 G8 I$ FhaClose=haCloseVal5 C" O1 p+ s* t6 o  [/ ?! B" d- R- ^1 G
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。
  S  n8 V* U4 a, |; Efor(int i=start; i<rates_total && !IsStopped(); i++)5 d! `4 A/ J( R! p- l7 Y8 X/ C0 M
{, _$ _: p& P! p+ U$ c: G- L0 M
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;; w, N9 z: m- n3 p5 \4 {
double haCloseVal=(open+high+low+close)/4;' ]) i- ?3 G% \3 W5 m" t1 u. K
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));  l/ z  ~' h5 K. w' Q9 q8 y* {( y' V) i  Y2 ~
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));$ M/ j  K: q, P" @* z7 n) ~- f0 J
haLow=haLowVal;
2 T! K2 s2 Z  LhaHigh=haHighVal;# y) V$ N# g- }% E5 y
haOpen=haOpenVal;4 y9 t% J' ^7 W
haClose=haCloseVal;2 }0 n  [* \  J) t/ v1 s3 e7 g
//--- set candle color
; Y7 T$ A  f' |- l# Y( G- M5 F! Oif(haOpenVal<haCloseVal)
  s( g/ \+ U4 W, T  JhaColor=0.0;8 b9 k/ b' p1 D( l7 \
else9 p$ j( \) U/ z$ I
haColor=1.0;- p$ A% P  O6 h9 z6 S5 L
}
* }9 s: w- F& E2 @终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
8 N5 {6 |2 g4 a$ R# J+ Ureturn(rates_total);
. T! I: ~( F, E: X. M* S- J) V然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:) Q& f; a# }4 `  X8 c. `( ]
//+------------------------------------------------------------------+) @, |, J: Q# C3 x7 X0 p
//|                                             simpleHeikenAshi.mq5 |1 ~. N4 `, a2 B5 ?$ g
//|                                  Copyright 2023, MetaQuotes Ltd. |- u6 Q9 [. b" Y: |
//|                                             https://www.mql5.com |  L8 p# h4 e, c7 R) f
//+------------------------------------------------------------------+: Z7 I0 {6 J! G1 I
#property copyright "Copyright 2023, MetaQuotes Ltd."
4 ?, R2 g9 k( n1 p#property link      "https://www.mql5.com"
+ M/ }, c9 c/ N. a2 H/ k#property version   "1.00"
# H& a+ h" I$ n# W$ @( y. ~; P#property indicator_separate_window
8 e' x2 R; j: m6 g2 P& Y2 {#property indicator_buffers 57 N; r4 e0 A4 @+ t* _% ?5 c# i
#property indicator_plots   1$ I3 {6 E: M% z4 w
#property indicator_type1   DRAW_COLOR_CANDLES
0 n! P! a$ \$ Q' o#property indicator_color1  clrBlue, clrRed% S" t) I$ N" P. I* x. X0 S1 r
#property indicator_width1  2$ Z0 {0 b  I9 J4 y2 b6 D# ~1 R
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"/ v; T1 g7 E3 Q* j! I
double haOpen[];
% Q9 r( ~1 T& R* V" edouble haHigh[];
! h. h& g  z$ m0 P) o, Hdouble haLow[];1 R- O0 J$ ]4 S$ Z: i
double haClose[];" Y& u. ?# n3 K0 Q
double haColor[];
( W$ u& j$ N# [3 yint OnInit()8 c- f& D2 s% Z- p' P; b
{9 }% t* |# Y) i3 r
SetIndexBuffer(0,haOpen,INDICATOR_DATA);; R2 w+ g1 D- _' b9 a8 y
SetIndexBuffer(1,haHigh,INDICATOR_DATA);5 T. O" L* N; ]- m: i, O+ z* m; u
SetIndexBuffer(2,haLow,INDICATOR_DATA);1 Q+ O+ V% @, ^/ y6 n
SetIndexBuffer(3,haClose,INDICATOR_DATA);# y& X2 E/ \6 d" h7 X
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
% c1 c; e3 I' t" a* wIndicatorSetInteger(INDICATOR_DIGITS,_Digits);
. w1 k" M7 t3 E- E, s' cIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");3 X  ^5 M0 ?1 U# Z  C1 J( A
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);; |. M( u1 S+ {3 T1 W) U6 m
return(INIT_SUCCEEDED);2 j' H3 x2 _' {' {& @0 z4 Z* w
}
+ s/ S3 V2 e9 L( m: c: R+ H1 Bint OnCalculate(const int rates_total,# P; ^3 V) ^/ z! A
const int prev_calculated,
, {$ u# w6 F) {3 w( Yconst datetime &time[],
9 J3 {. w" F$ X7 uconst double &open[],+ t* ]; m2 w% ~4 f4 A. }3 J
const double &high[],
+ f: t& l8 l/ N6 Bconst double &low[],) [4 x  B4 u: M) |6 _
const double &close[],
7 E& P  m# b) D1 j0 O( oconst long &tick_volume[],$ t/ g, Y% R" w) q0 s9 s7 Z
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Archiver| ( 桂ICP备12001440号-3 )|网站地图

GMT+8, 2025-4-5 17:27 , Processed in 0.371203 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表