私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述5 _8 n1 u4 h% J8 b3 m1 z
我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。2 b! u( [1 o( ~1 _( P; B4 n* }) D
赫兹量化交易软件7 [2 a, o6 h- a; d) T2 y
自定义指标和 Heiken Ashi 定义: t1 O! e4 W* ^* D$ [2 n* H
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
1 m, ?' t, x! D( C5 k简单的 Heiken Ashi 指标
6 u, p" D7 s6 @在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
0 b* |- O7 F0 c& [4 E& ?' \我们来查看创建此自定义指标需要完成的所有步骤。
0 N3 F5 ]; e: a. n5 ~8 _% ^通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:6 [- Y1 k  P3 U8 y! G; e3 G
(indicator_separate_window) 在单独的窗口中显示指标。1 q6 X" ^( j' v7 K
(indicator_buffers) 确定指标计算的缓冲区数量。
$ ]) @) O5 {/ ?1 K! B3 U/ C(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
% x1 T. ?% y9 o$ v: _4 C! o(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
/ B4 F# |. t  w/ [: g(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。7 N& h6 e9 l. L9 I# R3 x7 y, i  @' ?2 f5 j: t
(indicator_widthN) 还要确定 N 或图形序列的宽度。! f" ~3 A' y) ^/ l# m0 A
(indicator_labelN) 确定图形序列 N 的标签设置。
* e$ C4 e+ X# Y; d  q) q#property indicator_separate_window" M" d. h9 ^& y& _
#property indicator_buffers 5
* I) C7 j1 V; _; x9 L#property indicator_plots   1
7 u, p8 H. x+ F#property indicator_type1   DRAW_COLOR_CANDLES6 O) g  j2 C8 Y3 b1 t5 K
#property indicator_color1  clrBlue, clrRed3 x" N( ~: L, V; z1 ~
#property indicator_width1  2% _8 t& z- t: B& _0 n
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"8 S# W. `& n3 y: I2 g
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。1 n* q; g0 ]" m/ T4 Y* }9 P) a
double haOpen[];
) |, [' L2 m( {4 Rdouble haHigh[];6 Y! R0 u/ s( c; B6 {
double haLow[];
5 G0 d" B, K: v/ kdouble haClose[];
, M, x& ]& |7 _- A$ I$ D( Q1 ndouble haColor[];
' e/ P/ k6 s$ ~在 OnInit() 中,此函数初始化正在运行的指标。5 G; D& t- ?0 U2 V  c: A
int OnInit()/ b9 z; Q. ?1 x( t. \
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件! G: v: h* P4 j" D  v" i% x
其参数为:
% h) i! N) k; a7 R/ m! l9 B/ Mindex: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。9 y, I3 y9 k! G) Z+ w; `% W
buffer[]: 在我们的自定义指标中声明的数组。! I6 K! j/ `  }% _! S
data_type: 我们需要在指标数组中存储的数据类型。" s7 f$ ~' P% |
SetIndexBuffer(0,haOpen,INDICATOR_DATA);/ l6 L% G3 N- N$ ]! d
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
* k# D; \/ F8 v1 }& vSetIndexBuffer(2,haLow,INDICATOR_DATA);- }8 P( u" t+ R8 |' w' \6 ?
SetIndexBuffer(3,haClose,INDICATOR_DATA);% P$ q5 j$ w( ^
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
2 _5 j8 [0 o9 H' j7 }通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
, z% L, L2 ]. z7 Uprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
7 G5 B7 d/ G+ A: r) Xprop_value: 属性的值,我们将指定(_Digits)。. ~' s5 h  I8 C% I, d4 o- ~
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);! ^: U1 b: d; r. N+ K
调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
6 h  X: d2 j7 Y. Zprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。4 x0 l. ~' c5 T( n2 ~$ n
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。! @: o% G/ a) @
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");% h# V/ w& a4 D- b) G% D
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:- p  ~3 P* q" F$ y  m9 b
plot_index: 图形绘图的索引,我们将指定 0。. P) T7 d! ]% _, d0 a9 k
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。% ~0 H+ V# C- n$ h- z
prop_value: 属性值。
5 o7 {3 B% ?! OPlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);% B, a, c- B0 T& Z6 k
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。6 V; e7 S: m& Y
return(INIT_SUCCEEDED);6 D$ W$ r& C- H) z0 V$ n
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件" m) |5 {4 R/ i
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
8 E" B3 G- E- j$ Eint OnCalculate(const int rates_total,. ]- @) o! X1 e3 B8 n
const int prev_calculated,, S; I) b' f9 ]; z7 U& N9 x
const datetime &time[],& ]% m( I1 u, l+ E7 |6 ?, `4 w
const double &open[],
. P, F- X8 ]0 M: A$ sconst double &high[],
- B1 j( h" u3 t& N% f5 fconst double &low[],
& @, k7 j$ t7 u7 H  Vconst double &close[],4 C. g) E" u3 t( K8 I' b
const long &tick_volume[],1 G7 y9 J1 D/ o! |% n
const long &volume[],/ d* ?. a2 ]6 i' T) Q; }" \
const int &spread[])
8 ]! O# c6 C0 ?# U  |9 Y' b创建一个整数型 “start” 变量,我们稍后将为其赋值:
8 i9 U) V4 a) j; ?int start;. X' H* L: E5 d0 v1 b
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
. J7 `: Z1 ]4 O5 r6 x9 ?7 Oif(prev_calculated==0). x. [" N* m/ M4 K' J. f" M! p
{5 Z$ Y; F9 y0 |# b; M
haLow[0]=low[0];6 z$ x2 }- Y) h1 y
haHigh[0]=high[0];
5 X" W+ \2 o5 c1 H3 l9 C9 _; rhaOpen[0]=open[0];9 O+ |; ?- `2 C6 q! L
haClose[0]=close[0];
# D4 G4 T9 `9 d2 i/ p! Lstart=1;
0 `* \. r9 N' P1 d2 X5 R& F}4 b4 o, A1 P0 Y8 [. X
else
6 e. L5 i  C, g" V2 N+ Fstart=prev_calculated-1;; J' A4 G; a8 k$ a$ l: k0 V  O+ z
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。
+ c6 W9 ^9 [! f6 `. y这三个表达式将是:" b! r6 G5 H& E6 o& [- I% i8 {
i=start: 对应起始位置。# R8 f) s; S2 a' H' ~
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
+ K7 Z& f2 h  J! F* y7 F3 U5 Qi++: 加 1 作为新的 i。
0 h; d1 P9 H1 a7 T我们每次在循环过程中需要执行的操作:
7 u6 a& m) B  @0 M: E: b计算四个双精度变量
$ X# }! c. O6 N+ A, C* LhaOpenVal: 对应 Heiken Ashi 开盘价。
! X* |& s+ Y, f: A1 B6 K2 }haCloseVal: 对应 Heiken Ashi 收盘价。
' x4 H. A; ^5 G2 FhaHighVal: 对应 Heiken Ashi 最高价。
  l3 ?7 ^  s! [& Z. `8 e- e+ m) |haLowVal: 对应 Heiken Ashi 最低价。! u. X* z7 h' E# q
在上一步中分配的计算值与以下内容相同
1 Q( O" F/ q, y8 vhaLow=haLowVal
; D+ B. I# n' I* h3 f. ~haHigh=haHighVal8 X/ |+ y4 Y8 r; h8 L1 n
haOpen=haOpenVal
! T3 {4 l- ^$ K- k7 YhaClose=haCloseVal
( a" W$ H1 s# u$ `$ E9 X检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。9 R! j9 _/ [4 r3 ?' l
for(int i=start; i<rates_total && !IsStopped(); i++)
3 [8 }- B+ P' G  Z  }{, k8 ?, S; m6 C  L9 O0 y
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;5 s2 l5 l8 \: Y6 c4 U4 ]5 t4 _
double haCloseVal=(open+high+low+close)/4;( Q5 w; M. {1 n5 J
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
# P- _8 u/ s* k4 M4 idouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));
1 H' p1 g  q! u, C! V  W7 g$ khaLow=haLowVal;
* M7 l; n* k+ v* O: ^& [6 zhaHigh=haHighVal;) y5 P7 s6 |  V1 l( S
haOpen=haOpenVal;
. R' c7 c4 b9 h! [  V/ i+ GhaClose=haCloseVal;
+ D' a9 s# E0 u$ E2 u; z% e4 g//--- set candle color  r, @1 g, n- E0 W* I- G& v
if(haOpenVal<haCloseVal)
$ M4 L8 t# `# ~# D4 l: FhaColor=0.0;1 d6 z# \! j( `! e" s
else' ]; D$ ~2 G2 j% J8 v
haColor=1.0;
6 C& D" U& N7 ]! f  E}
$ d" j7 N( q2 V6 u终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。2 m( _9 O" z3 ?1 v& U. T6 t' f& r4 a
return(rates_total);
9 q6 R; K4 d7 h& E4 k然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:; Y( O. k9 G8 W0 c" d
//+------------------------------------------------------------------+6 A9 u4 |; Z# b
//|                                             simpleHeikenAshi.mq5 |
) V7 T4 L- o+ X" D. ~, h1 ]//|                                  Copyright 2023, MetaQuotes Ltd. |. ^" p  E. V0 n" e
//|                                             https://www.mql5.com |9 g! [- P) w) `+ R4 r
//+------------------------------------------------------------------+
1 M( W/ M% |; x- w#property copyright "Copyright 2023, MetaQuotes Ltd."
; @) i2 O5 m4 s4 i$ m/ ^#property link      "https://www.mql5.com"8 x( Y: H: `: @
#property version   "1.00"  O+ q' E* u5 I
#property indicator_separate_window
' R8 I  N" l1 t9 o#property indicator_buffers 5& f4 k, N; \  l
#property indicator_plots   1
7 ]% S6 q/ @/ ~' x+ D2 m, [1 s#property indicator_type1   DRAW_COLOR_CANDLES( f1 D" t9 E% K  k& i( Q% c
#property indicator_color1  clrBlue, clrRed8 {& X0 f5 J* y- f! I* @1 s* t
#property indicator_width1  2, S3 {0 F. J) h
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
6 M. |% h- r1 b4 E0 R& gdouble haOpen[];
: n3 r; n4 e. idouble haHigh[];; E( s7 }% H$ f& W$ I( Q. |
double haLow[];
/ w+ C% A% `. N7 T& zdouble haClose[];1 O$ j" ?1 K% b% V0 f
double haColor[];
$ D+ z7 ]! ^/ Y; q3 O& o4 [3 Kint OnInit()1 V7 h; e5 x5 r( Q) d; |" I
{
5 |/ y: S: }9 ^SetIndexBuffer(0,haOpen,INDICATOR_DATA);
# o5 D* D$ S" g( r) c5 eSetIndexBuffer(1,haHigh,INDICATOR_DATA);
4 L0 G% a& N& [' RSetIndexBuffer(2,haLow,INDICATOR_DATA);
& v! p) T' s& Z7 q0 k$ pSetIndexBuffer(3,haClose,INDICATOR_DATA);
; j" R: |. E; t( E; n1 Y8 P; TSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
% S8 Q: \& _/ N; ?4 Q/ f0 KIndicatorSetInteger(INDICATOR_DIGITS,_Digits);9 P; Y6 y7 O0 G. d6 O
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");' F) S: S4 H  h
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);) E, I3 ]0 v* j) {
return(INIT_SUCCEEDED);
& ^" [  X7 N% w3 |- I}( P4 I; t$ ]: G; f7 }
int OnCalculate(const int rates_total,
, g4 K; H$ K+ ]8 [1 n, Qconst int prev_calculated,
9 s, ]0 t  z8 Lconst datetime &time[],. A0 q$ n# i! `) T$ D1 ?, M
const double &open[],2 {& X* J& v. V! Y- P
const double &high[],( X: [- ]) [: L4 C0 S. b
const double &low[],, G: P+ q9 l1 d" [9 q
const double &close[],
) X& p8 O$ p" S' ~const long &tick_volume[],5 {7 s* c8 f1 n
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 15:57 , Processed in 0.894887 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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