私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
2 K. V1 Y6 r0 D! k7 Q) t我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
& ?: \+ ]8 k0 l% W5 v) ?赫兹量化交易软件7 z, B6 P3 ]$ A7 f
自定义指标和 Heiken Ashi 定义$ O% T, B- K5 l3 R
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件* _: L. Q' t# y4 S5 x% Y/ `; }
简单的 Heiken Ashi 指标7 Y3 L! q0 U* u! F/ }0 `% D  V
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
2 a6 X0 A  m& F9 m. r0 Q, i我们来查看创建此自定义指标需要完成的所有步骤。
# |+ ?  M3 l& R- K! w- n+ |! C通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:4 r; D' {' n7 ]% [: A- r' A3 ?  y. L: |
(indicator_separate_window) 在单独的窗口中显示指标。
! j! H3 H2 W& f' A  u7 m; f1 O(indicator_buffers) 确定指标计算的缓冲区数量。$ i" l3 S& Q; T; J
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。$ }3 ^& i! H9 T+ ^, U3 Q4 A" ]' q
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
5 @5 B3 V! }4 u0 g1 `(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。  g# @4 W' S0 K
(indicator_widthN) 还要确定 N 或图形序列的宽度。
" e  U6 n* n5 o- B(indicator_labelN) 确定图形序列 N 的标签设置。3 E" w. D- F4 Z! i" ^
#property indicator_separate_window
* |) @4 E) E+ h  i- H#property indicator_buffers 5; R8 @0 P* U1 w3 ]7 E1 N3 F
#property indicator_plots   1( D0 z; i  l6 r( ]
#property indicator_type1   DRAW_COLOR_CANDLES
% N! q, ]/ s- a#property indicator_color1  clrBlue, clrRed
% K/ f* k) S9 \' }# E: d+ q#property indicator_width1  26 {7 ]# C: K6 v* n1 k2 E( e
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
$ z- e4 H8 z3 A( e5 L& U7 s为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。( o  B# K6 c. H* B( b' ^1 s# E
double haOpen[];7 u, J3 {3 W8 j/ {4 E: E* g
double haHigh[];
0 V0 i$ H4 v9 Q- Q" R6 N2 h6 jdouble haLow[];
( B; N/ U1 U/ B! c" \! M4 kdouble haClose[];
1 K  \3 s# ?$ Hdouble haColor[];
6 k5 }$ n' H5 p. p5 q9 c: w  t1 r在 OnInit() 中,此函数初始化正在运行的指标。
% n3 l" H7 d( W- s+ Rint OnInit()
# l$ |- \1 `, C$ q  i% @, N* U7 S3 q调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件
* u4 u3 T* b4 L0 X6 U6 J2 {6 e5 U8 @其参数为:2 g! m4 `$ K+ M  ~" f0 J
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。# j0 P7 W  ?! @$ _. z( I; `* L
buffer[]: 在我们的自定义指标中声明的数组。4 U1 Z" [' {  a8 r# Y4 m+ H
data_type: 我们需要在指标数组中存储的数据类型。: n$ X+ F1 j# R( m  b! h6 \
SetIndexBuffer(0,haOpen,INDICATOR_DATA);0 t- r) G- E/ Y- Q
SetIndexBuffer(1,haHigh,INDICATOR_DATA);, c8 `$ D' U1 F! |
SetIndexBuffer(2,haLow,INDICATOR_DATA);
  i3 G! _5 `- |2 z4 A5 W4 e9 jSetIndexBuffer(3,haClose,INDICATOR_DATA);, O$ L7 x) R, ]
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);  b9 @4 Z8 S. a9 Z! ]
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:; v; d8 @3 n$ Z6 R. Z2 G& `! K
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。' V' P: Q: U+ I- S1 f. ~
prop_value: 属性的值,我们将指定(_Digits)。
1 J; V" M, Z/ ]+ O' b! {2 ]IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
* b' `- e+ W! g5 h6 J3 K调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
% i6 |! Z/ M% `prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。' F. b) j5 p* v. P+ \
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。5 i: g. u+ I) m' R/ ?' ?
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");( ?$ k% b, `( n" N4 g
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
" Q2 l- ^) ^( A" j) Q" p7 Fplot_index: 图形绘图的索引,我们将指定 0。' P5 D: Q+ i; O! T/ @( k- ?) C
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。" \6 A: H  J" Z& e9 I# d5 ^
prop_value: 属性值。
- F$ h" \# f' \3 cPlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);7 f# K" h8 B" O# v+ O, K, k
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
  w, T1 |  P$ u; Y# \- H% \return(INIT_SUCCEEDED);7 ~1 C+ E6 l  g* c! Y) L9 v8 v
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
0 @  P. ?- W0 K) h; d& x( V  u基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
$ f* w7 }. F: t; f# R. x/ n/ H$ iint OnCalculate(const int rates_total,) ?; v7 \1 u# U3 u
const int prev_calculated,
: q5 H# y2 L: Y% X/ \: \! y* i! oconst datetime &time[],1 y' C" r9 C* Y* s2 B; C3 X$ L2 a4 ?
const double &open[],
7 R  p. C9 V/ P6 }- v8 Tconst double &high[],
3 ?3 u0 k) p' T4 M3 ~6 Jconst double &low[],
7 c' \: k  o( z; P& M& bconst double &close[],$ U! s; l* i7 P! [
const long &tick_volume[],. W. }  @6 d4 D# ~4 h) Z+ _7 m
const long &volume[],0 l$ P7 _3 v/ \+ _" K& y' V% z
const int &spread[])* \  i0 l, }: N' w& e( S
创建一个整数型 “start” 变量,我们稍后将为其赋值:
8 ?% ]9 }: C& t3 Bint start;$ `8 T. ~) G! C2 }$ }
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:* U, l( O1 ^8 m8 j9 Y9 y
if(prev_calculated==0)
" g" l$ I* y5 z) R6 g{
" K) P2 w7 W8 d( ~( ]5 lhaLow[0]=low[0];
' l- L+ h  h5 L3 }0 c" GhaHigh[0]=high[0];
$ `4 E3 D" I2 F1 [. B% thaOpen[0]=open[0];
* g- h, c1 G/ o, i  S' z/ N6 hhaClose[0]=close[0];
  ?- C5 G* c# Z/ Xstart=1;
; e! w5 H: t$ J' p}
2 Z( ]6 R: r6 selse
- v" _# M9 b  w- u  d8 Cstart=prev_calculated-1;2 W( S' B9 }, z( P
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。3 h- w/ g8 G; \
这三个表达式将是:
1 L8 U0 M/ e' T8 \& _( ji=start: 对应起始位置。1 ~2 S1 V7 s) w/ Y/ }2 U& K& \: n
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
2 i, D" U% a0 }i++: 加 1 作为新的 i。
) h( q9 s# o+ Q( D9 W$ V; p我们每次在循环过程中需要执行的操作:# I# u) Q; h" `7 ]( j4 M( p, u
计算四个双精度变量$ Z+ @0 d0 n9 }5 A+ E6 n* {
haOpenVal: 对应 Heiken Ashi 开盘价。
+ }; ~. O2 l5 A+ C0 \# ghaCloseVal: 对应 Heiken Ashi 收盘价。
, @  w: B/ y2 s3 k1 H0 YhaHighVal: 对应 Heiken Ashi 最高价。
" f: l, J. [$ NhaLowVal: 对应 Heiken Ashi 最低价。
; U; R& j+ x* x7 a/ [在上一步中分配的计算值与以下内容相同
! g7 \  \7 b& H6 `) M. chaLow=haLowVal
+ I. t4 ]  m" R- @3 GhaHigh=haHighVal
" H$ Q: E0 n; i: O9 K' ThaOpen=haOpenVal) s8 U' X3 ^/ D
haClose=haCloseVal% t3 K! h) i" e# C* }
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。0 f" e( }' u. C" [* K' Y0 F) Q. s
for(int i=start; i<rates_total && !IsStopped(); i++)
; v" [7 A1 t% m; h2 C{
5 m) X6 ]# O! s" ?$ X3 adouble haOpenVal =(haOpen[i-1]+haClose[i-1])/2;+ w. p" u8 ]; }' S1 ^2 Q
double haCloseVal=(open+high+low+close)/4;
; T9 y& S1 n0 G2 i) o- Q9 D7 e  Ndouble haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
8 W3 t. M& i7 c6 R! T7 d% D2 M4 fdouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));
. {9 C; G4 _+ B3 S  O! C# H1 khaLow=haLowVal;
4 n0 X# L4 b/ L  T6 t2 U: [haHigh=haHighVal;  L5 D( m* u6 N; B0 k
haOpen=haOpenVal;" p  P! p8 i" u. b  q" |
haClose=haCloseVal;
& Z2 w0 I& \! B* W3 l: s//--- set candle color
: Q. a6 m* A" g& i, }# ?if(haOpenVal<haCloseVal)
, z! [' Q/ d& lhaColor=0.0;
# v5 b, i1 |2 K% w7 |else4 {) D  L  `* \: V& h, d
haColor=1.0;2 L0 a# q& J' v' O
}+ e# b: X% V. n6 H( U
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
' ^* G' U9 B2 g2 A% D: \return(rates_total);8 z, A1 s6 D) y1 h) {3 }
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:* L5 K2 H% l$ E  @7 _" }
//+------------------------------------------------------------------+2 T7 ^3 w- P4 ~2 g
//|                                             simpleHeikenAshi.mq5 |
; M+ k# w* K! [4 h+ Z//|                                  Copyright 2023, MetaQuotes Ltd. |
9 u! j' _, C0 t//|                                             https://www.mql5.com |
0 c# i9 U4 L" T& h//+------------------------------------------------------------------+
" I8 F/ A3 Z' M7 r4 o" ]# V1 |#property copyright "Copyright 2023, MetaQuotes Ltd."
: j- r& {2 ~& C: u4 ^: _* j#property link      "https://www.mql5.com"4 V3 c$ o) j# W) ?
#property version   "1.00"$ Z/ U0 p8 w2 x! p
#property indicator_separate_window
+ K  ~+ \' g/ D$ k  r% R#property indicator_buffers 5+ Y( L$ |1 X8 P& ?0 r
#property indicator_plots   16 I' X- n% t: S9 k. ~( Y8 f
#property indicator_type1   DRAW_COLOR_CANDLES- D5 t4 R5 j1 V, t: T  @# v
#property indicator_color1  clrBlue, clrRed3 w; e3 z" d5 ^6 d, B
#property indicator_width1  23 B, [7 k" |$ |2 e1 d' b
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
: j% H# r! X. ~! }* V  Edouble haOpen[];9 i9 G9 G; |2 @
double haHigh[];
2 u4 k) m! t* p" X9 @. O( Ndouble haLow[];
; a5 x5 D. D6 u; r, Jdouble haClose[];5 Q5 U& h0 e5 H$ Q& G. X
double haColor[];
* A. {- M& K; Uint OnInit()+ J# P; |. i  o5 O3 F
{
6 z/ U/ w; }& B5 FSetIndexBuffer(0,haOpen,INDICATOR_DATA);3 B& J2 `4 b" p! x' c
SetIndexBuffer(1,haHigh,INDICATOR_DATA);8 e. W. F7 U1 X
SetIndexBuffer(2,haLow,INDICATOR_DATA);5 n& w4 A' E' B7 ?8 j- R2 G" O0 h6 E
SetIndexBuffer(3,haClose,INDICATOR_DATA);
% w: R! Z1 Y0 _/ ESetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
; C/ J, O9 x, W$ P+ IIndicatorSetInteger(INDICATOR_DIGITS,_Digits);0 Y; }0 g; M2 q8 T
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");/ ~! T; {3 G$ l- ?: }/ k& j) J6 L& N
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
' \+ s5 S# s* Y. O, v6 [# {return(INIT_SUCCEEDED);
  ~% C* u" D* g: M  P6 l}
: [# X$ ^5 u$ h9 P+ Z' Uint OnCalculate(const int rates_total,
4 a8 R/ m/ h& i8 f, gconst int prev_calculated,
$ @' t' b% a$ Oconst datetime &time[],
# k3 D0 c. ?5 q7 G" `const double &open[],
, y& B  T( g0 x8 _const double &high[],
  W7 d+ X2 {" B' Q. H" c7 n4 y3 Cconst double &low[],
" O% i9 `) \! ]const double &close[],
% ?) X8 [# P( nconst long &tick_volume[],9 z+ J0 O- x, H  y' i8 W# T
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 15:51 , Processed in 0.553738 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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