私募网

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
7 t) U9 ]: G  P! i" b3 K+ K我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
+ @5 a3 T6 J( G, i6 U赫兹量化交易软件
1 B3 ^: G1 `9 b- e6 a9 {+ M, a+ u自定义指标和 Heiken Ashi 定义
" ~, k: S' i1 j在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
" O% o! a- C, k简单的 Heiken Ashi 指标
* V0 }. a3 i" l( }7 X在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
" K0 t0 Y! |0 w2 }我们来查看创建此自定义指标需要完成的所有步骤。0 R9 l3 s5 h# p+ d+ Y$ n
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
# H/ l0 \% {5 k! n(indicator_separate_window) 在单独的窗口中显示指标。' O, {7 I$ T- v
(indicator_buffers) 确定指标计算的缓冲区数量。7 p. ~9 R  T8 z& p( L/ P+ J
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
( ]. t2 B$ V& G3 A) H(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
, P* M9 }* b3 l$ L- Y(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。5 h- O- ^/ k" V7 F7 D" k/ V5 U  I8 w
(indicator_widthN) 还要确定 N 或图形序列的宽度。9 \- ?3 g: e. V
(indicator_labelN) 确定图形序列 N 的标签设置。8 R6 Q, x0 g3 U5 U. H
#property indicator_separate_window
, r6 q1 P! W; g- C1 ~& N; e#property indicator_buffers 5
( n  C6 ^9 m% F$ p$ C) |#property indicator_plots   14 _( n  Z8 H' o# N
#property indicator_type1   DRAW_COLOR_CANDLES3 }9 w5 T2 N4 \6 a2 d
#property indicator_color1  clrBlue, clrRed( h, d( G4 R" A+ u$ O
#property indicator_width1  2
* \5 h- ^# ^$ D#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"- u( j- L: ]/ B- \1 g
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
$ S- U! D+ e* Q$ O- bdouble haOpen[];$ ]: B1 b( J. U! A0 k! C
double haHigh[];1 k. D/ t( E; Y/ F3 B0 \+ @
double haLow[];
7 I1 {$ {/ V- c2 @! Gdouble haClose[];
+ G2 @5 r% ~6 O, P) ndouble haColor[];6 E1 _0 M5 a/ u% s9 h
在 OnInit() 中,此函数初始化正在运行的指标。
. q3 S9 P8 j9 Z% l3 _int OnInit()* Z! O" f9 [) u4 c* V( D! Q
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件6 s+ e, Y; l+ u7 q7 t
其参数为:* Y! {% r7 c" X4 G
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
2 b" p, c# u$ Z& ]buffer[]: 在我们的自定义指标中声明的数组。# ]7 l& O% F) X1 m# G' L
data_type: 我们需要在指标数组中存储的数据类型。
) e( c0 l5 A0 OSetIndexBuffer(0,haOpen,INDICATOR_DATA);
3 `  g5 x. [0 [6 |1 U& CSetIndexBuffer(1,haHigh,INDICATOR_DATA);
0 Q3 m3 i; q/ q0 r* c0 M- `SetIndexBuffer(2,haLow,INDICATOR_DATA);- a1 Y! X" b+ G6 w
SetIndexBuffer(3,haClose,INDICATOR_DATA);
$ i6 M9 p  N1 H$ q+ nSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
1 q, L( _; p$ F通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
, Y( T. v' y3 j6 f  A$ f6 `prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
( Q% k9 n  b+ ]* {$ x4 oprop_value: 属性的值,我们将指定(_Digits)。1 t# h$ W5 U" H
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
2 Y, p4 W+ X  m, W调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
, u) M8 V% |: l8 `prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
  [$ N! J5 g" K! Eprop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。+ V0 M; z/ b% H' v
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
. ?8 X% n- K* v- t调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:  @& }2 ^9 E9 t
plot_index: 图形绘图的索引,我们将指定 0。6 i& P# s# w* Y6 K% i) X
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
7 g' o/ L: @- g" [3 q4 i$ D2 |1 bprop_value: 属性值。1 r& J' ]2 S% F# H7 v
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
3 L% H% _' T4 _- T2 K0 N9 a/ R然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
7 |( s( ?3 {8 v2 ?) k/ B2 Areturn(INIT_SUCCEEDED);
7 f( m' ]5 e! |; ?+ h. v* z, e在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件* a. C, h* P( ~, A+ L
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
5 t3 [5 B8 S3 k8 u) f. @int OnCalculate(const int rates_total,
0 q6 W" x9 u5 x5 `const int prev_calculated,2 H/ R& Q! y0 j0 Q, ?/ c) {
const datetime &time[],
) G0 L3 Z8 G, J$ uconst double &open[],1 O: m1 g# [4 Y. v: w
const double &high[],
+ R6 ~0 W+ r  I# j" s; \4 {const double &low[],# c) D2 `  h0 v8 _$ h  P
const double &close[],: Y; b# |+ u0 m0 d6 ?
const long &tick_volume[],
7 H0 e/ ~' s7 |, S+ J) t7 S9 ^3 E0 Rconst long &volume[],; L$ R' W4 t) Q' J0 f
const int &spread[])
  `8 ^. l+ j2 z, P4 `! R创建一个整数型 “start” 变量,我们稍后将为其赋值:
) ]: d) _7 b7 ^" Hint start;, ]0 f5 ^9 W: o1 B' i
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
# k) X9 K- N5 |5 q! rif(prev_calculated==0)
2 I% y) Q4 Z6 Q( ]  M- `{
3 Z0 }( b. ?$ {$ K! \3 b7 c  R* ?haLow[0]=low[0];* j# U7 S; x- y% C& |& r
haHigh[0]=high[0];( @) E1 I4 |+ n2 y1 s. {
haOpen[0]=open[0];9 F2 F& U! q2 x6 d. i% ?
haClose[0]=close[0];2 y7 {. Z* x6 s' ]# R7 g+ |
start=1;" q' q! U7 C- O6 Q  p8 m
}
9 K; ?7 I% q, L- V  l3 {1 n0 }( Welse
  o9 ^/ ], {2 N5 d' [start=prev_calculated-1;
' y9 e2 C. A- L在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。3 E: P) h% k* {& p8 }. T
这三个表达式将是:
  a/ c, w+ h- m8 _: Mi=start: 对应起始位置。) ~8 Y5 R0 V' L& X" [+ Y6 d
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。* t5 n4 B0 O" w/ i
i++: 加 1 作为新的 i。
( i- R8 T/ k7 l1 t1 b* m我们每次在循环过程中需要执行的操作:% p$ r! _. n. i; \2 C' w" B! B- E
计算四个双精度变量
# e0 S  [% d( t7 rhaOpenVal: 对应 Heiken Ashi 开盘价。) g  E! {! j: E7 C8 @
haCloseVal: 对应 Heiken Ashi 收盘价。  T; H/ H! o! r  a  x  D; |0 b% X- P
haHighVal: 对应 Heiken Ashi 最高价。: C. E/ \( e, w# p; P9 m. i
haLowVal: 对应 Heiken Ashi 最低价。
3 R0 O5 P" ?0 C4 [在上一步中分配的计算值与以下内容相同- l* H5 F+ L* h  S& x& G  ~0 Z% X( N
haLow=haLowVal# S" b/ u# c2 |& ~0 C, m
haHigh=haHighVal
4 m$ ]  x* b" l$ f: UhaOpen=haOpenVal
6 }: D9 |# c8 K( J( AhaClose=haCloseVal4 r2 p$ q3 R9 G
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。( u; ^3 [0 N  K6 \
for(int i=start; i<rates_total && !IsStopped(); i++)
2 P  Q. L" @6 w( ]* G{
$ r1 e1 |# ?' X, G, ^0 Vdouble haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
1 e8 i6 H+ {! F, x! n: rdouble haCloseVal=(open+high+low+close)/4;
5 B  y' Q5 a" o& ]; ?double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
# L1 ^" L: B  {$ X" e5 k& idouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));; x* g& v3 x: c
haLow=haLowVal;* n  G% _- J4 u- G
haHigh=haHighVal;
% h* a+ h% l4 `" v' O' t9 mhaOpen=haOpenVal;& C8 L; c2 |, l, w
haClose=haCloseVal;2 k1 |# h; s2 u' ~
//--- set candle color
' c3 S/ i+ b, S0 s0 B! iif(haOpenVal<haCloseVal). ~$ r# Z, P4 s) _; d9 ]
haColor=0.0;3 E" h3 R1 j' |9 q$ f! e
else
& F. J1 e- L' O, BhaColor=1.0;8 y" I  O1 ^$ ~+ G9 B
}% X7 B7 B. d: s
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
, |9 p0 ~0 l# c& Z, Areturn(rates_total);
7 g1 g2 f: v* Q, v8 Y6 b9 S5 d然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:
  W! d( `# B, F6 ]//+------------------------------------------------------------------+
8 J# l7 Y1 J* G4 J  ^8 g& P/ R//|                                             simpleHeikenAshi.mq5 |
: m/ |1 `2 J  L1 S6 T4 {, E% K7 G//|                                  Copyright 2023, MetaQuotes Ltd. |
7 v+ H. B* `! D//|                                             https://www.mql5.com |' F' q0 Y5 s: ?! a( V7 X
//+------------------------------------------------------------------+9 U( ?3 V5 [: l0 Z" ^
#property copyright "Copyright 2023, MetaQuotes Ltd."
4 }2 R1 V8 _5 L: h7 t4 E6 N#property link      "https://www.mql5.com"* A; G. A* k. F6 P% p1 {
#property version   "1.00"
$ N* |' h2 W% B% ~- [+ c#property indicator_separate_window# [1 X: p' N8 A9 s' V
#property indicator_buffers 5
& @0 u- ]% }1 Q: C% V#property indicator_plots   1
4 z/ k  U+ u5 W. w5 C- y0 B#property indicator_type1   DRAW_COLOR_CANDLES
# G% P  f0 p, _2 A6 ], R, I#property indicator_color1  clrBlue, clrRed* k+ l9 ?) w4 U2 a8 ?9 v, e
#property indicator_width1  2
: _+ E+ j0 m! G$ l- B& R#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
4 i5 b. ?% p4 |4 [& f8 qdouble haOpen[];' y5 q0 l4 ^- F* y8 {
double haHigh[];
# e8 U6 `) U' x6 Xdouble haLow[];- o' |2 S2 G  G1 c
double haClose[];
+ C/ I2 ?  S- w* X7 d2 V+ g' Vdouble haColor[];9 c' r# m( `0 B
int OnInit()
4 O) L/ h$ V. Y# k) J! ~8 h) B{+ e( T' k, g9 i! `* l
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
3 ~% A1 Y. j2 l5 E. eSetIndexBuffer(1,haHigh,INDICATOR_DATA);
1 ]3 J! ]( w* t- z8 F6 zSetIndexBuffer(2,haLow,INDICATOR_DATA);2 @5 A5 y/ V6 _) Y4 i1 C; I
SetIndexBuffer(3,haClose,INDICATOR_DATA);% _% @3 D2 P3 K, {( D
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);+ c; I1 Q6 Z. I- S- p' W
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
" N) t; H7 g0 PIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");: n; a* E/ G  I# _, X- P9 f8 W' n' l
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
- Z) J" i+ Y* i- lreturn(INIT_SUCCEEDED);6 z: w# ]$ e% B6 n$ J- }
}
* m9 B; _" ^7 Z, X* O/ xint OnCalculate(const int rates_total,+ ?$ L( E, h/ y* i3 ?* h
const int prev_calculated,
7 T9 [' n+ h' R, X1 Vconst datetime &time[],
$ m% J" m3 q: nconst double &open[],6 o/ C9 t# |7 c* d# J$ w
const double &high[]," |: ^! n- m- m) E6 n
const double &low[],7 j. L9 c4 t; _0 i  H
const double &close[],9 l. j% K. x* D9 ]
const long &tick_volume[],
5 R5 q- F) e  }0 U+ p6 gconst long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-30 04:46 , Processed in 0.424172 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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