私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
9 L+ f; K# A" i/ M我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
4 r) }/ ?% A0 u+ {# G: E, V9 [( u赫兹量化交易软件% s2 V5 [* s6 g: b) Z* a: g
自定义指标和 Heiken Ashi 定义. o* n- U9 N' K! p5 m& F
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件- j4 h7 O4 B$ l. Q3 q5 K( E
简单的 Heiken Ashi 指标+ `7 R" j4 ~! V/ n! J# b* H" @
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
  x* G! {% x+ O+ x# l我们来查看创建此自定义指标需要完成的所有步骤。1 F% \) u6 Y* k; T2 U: w$ I
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:- g0 a: F% c& i6 Z. Z
(indicator_separate_window) 在单独的窗口中显示指标。+ Y6 _9 G5 l9 @
(indicator_buffers) 确定指标计算的缓冲区数量。
" ]* i# w9 n9 ]' Q(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
! P9 G1 \9 L7 C) j, M6 _(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
- m* y+ ~% P& b4 {' c9 n(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。5 O5 X1 G. s# C7 ?- y/ W
(indicator_widthN) 还要确定 N 或图形序列的宽度。
$ v+ I# U: I7 U( E3 n; _, U(indicator_labelN) 确定图形序列 N 的标签设置。: s( d; D, z5 }  Z; A' h4 S% `
#property indicator_separate_window* N, }: J" d  w& M3 R7 V
#property indicator_buffers 52 ^  J: m: c$ m3 r# F
#property indicator_plots   1
; w5 X1 c/ _( k' M1 S#property indicator_type1   DRAW_COLOR_CANDLES
% o1 }, u$ A/ z. @0 q2 i#property indicator_color1  clrBlue, clrRed3 {. X5 z5 r/ j
#property indicator_width1  2
) P; v. A# Z, t: J4 m6 u" K#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
, w, E9 V3 T7 N# u# k& v3 Y7 Y为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
& E/ f" `$ T8 |' p% Sdouble haOpen[];
& \# i, _; x5 O: S8 u- I9 u0 adouble haHigh[];
& t& [" t/ N4 d, Vdouble haLow[];
; |/ K/ I& ^5 K/ ]4 j$ }double haClose[];
$ ~) Y: [, v" @double haColor[];/ x' n" V9 {( C# M$ R
在 OnInit() 中,此函数初始化正在运行的指标。
9 B3 c, d+ \( w  r# {' Gint OnInit()
8 W+ N7 F5 I1 P: P1 U调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件  C& _% Q, {0 y/ `; {( T5 e: r
其参数为:% F' Y0 @0 k5 B
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
, H% x; q: ^: P- a+ h# w0 abuffer[]: 在我们的自定义指标中声明的数组。
0 p/ v6 \; J$ y( C$ X# a' @1 d* Fdata_type: 我们需要在指标数组中存储的数据类型。
+ Q- c$ n) i* N, m' LSetIndexBuffer(0,haOpen,INDICATOR_DATA);" r0 \: e) Z4 _7 B
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
  r; ]/ d2 W! a3 H1 d; iSetIndexBuffer(2,haLow,INDICATOR_DATA);5 T) h7 O. _# p1 ~
SetIndexBuffer(3,haClose,INDICATOR_DATA);$ e0 Q8 Z/ k& J9 a9 T& f. }+ {
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);+ i1 a7 E4 H$ I% j3 e. I* \
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:+ I5 @) C( ?" {! ?& W% S' W
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
4 w: C# D) R4 I: b) F/ Nprop_value: 属性的值,我们将指定(_Digits)。
' v5 Z, m5 E" w& V& }7 o* PIndicatorSetInteger(INDICATOR_DIGITS,_Digits);
; b5 Z6 V* L  w* h& E调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:. `" n! w, k$ q: T, Z" k* e5 o# o: L
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。: `9 b, d$ y" o+ Y* L% y+ W9 C+ P
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。5 [3 @+ S8 H+ b+ g( ]: d
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");! M: [' v9 F4 W  s3 I/ Y
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:0 G" j( ?/ e# m
plot_index: 图形绘图的索引,我们将指定 0。
; {+ r6 f7 G5 s# X) jprop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。* R& B2 ^( B7 y+ \) p6 n8 p/ `* l
prop_value: 属性值。
# F. C4 i, M8 Q" p! T$ M* iPlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);" N7 ?/ ?" b# `; v
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。$ G: ?5 ?* f& C4 T0 q
return(INIT_SUCCEEDED);% G( K8 S* ]3 Y! s6 t
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
7 N2 k2 E1 T5 H3 `4 `6 f2 _基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。) E# Z4 M5 ^' P5 [! [5 V( G' W
int OnCalculate(const int rates_total,; O. `& T+ g# t8 k
const int prev_calculated,
+ c' C5 H0 Z2 a; H& X3 Dconst datetime &time[],
, L  \9 r- n) s9 iconst double &open[],. A' }4 A3 Y% R4 E7 u, G; q
const double &high[],5 a3 g# ?4 z7 w# x* ]) s  z
const double &low[],
8 \' b+ I' H# o5 x7 x& ]const double &close[],
7 F8 C$ Q+ o3 p4 r3 E5 y% [const long &tick_volume[],
1 @+ H; B" D8 u5 Kconst long &volume[],% p1 m8 Z: N0 P6 y& o8 m* {. v
const int &spread[])) {1 e# B8 r8 C6 p( d
创建一个整数型 “start” 变量,我们稍后将为其赋值:0 M6 O  e) G5 }/ h" q# @
int start;* I( q( t: q0 |' M% e
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
  V+ i5 N( z  S4 e, fif(prev_calculated==0)
1 I' S9 Y" W- w{+ [: k5 s- Y9 ]
haLow[0]=low[0];
+ W$ e: n1 M  h% [haHigh[0]=high[0];0 k" q9 d9 B7 j6 ?
haOpen[0]=open[0];. `, T- I5 Z6 d8 `# ^5 {
haClose[0]=close[0];
2 J% w( X1 X. M. X7 O9 Bstart=1;- J* o( [& u1 u. ?
}/ f) X4 Z  u1 a% |# g* r' O6 |& H
else
! |1 n: i7 `. Fstart=prev_calculated-1;
  Z: z& V4 W# e+ }, ~8 t在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。7 D$ b' o9 b% u" q( A
这三个表达式将是:4 ]5 G; I2 {1 P: K  L; b! Y
i=start: 对应起始位置。8 z6 o7 N# p- L3 a" G4 K
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。  B, u5 p& k7 k
i++: 加 1 作为新的 i。  D9 s! q7 t+ I
我们每次在循环过程中需要执行的操作:" m1 c# q5 L& C; b" i+ z' ~) K9 C
计算四个双精度变量
) j4 l4 P9 y5 v# s9 chaOpenVal: 对应 Heiken Ashi 开盘价。* c! V! r- L4 e- n& y
haCloseVal: 对应 Heiken Ashi 收盘价。
! W1 P  \1 q4 d# o% ohaHighVal: 对应 Heiken Ashi 最高价。# L4 r9 Q) H3 r; Y. G! x
haLowVal: 对应 Heiken Ashi 最低价。; Y9 `1 l# S! X$ g6 {+ r0 N: L
在上一步中分配的计算值与以下内容相同0 f0 w3 U( r: F1 v, v( ^8 ?& t  E
haLow=haLowVal
6 N& p9 q+ J$ VhaHigh=haHighVal, X# b. l& m) W- I
haOpen=haOpenVal
" ?) U$ @: `% uhaClose=haCloseVal
* ~) y  c' D4 V, }& r检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。
- O: `3 S! F8 _' O- X; Efor(int i=start; i<rates_total && !IsStopped(); i++), n# O8 b  w- |7 {' k, o6 `( @
{# Z" S' I4 |; L: V5 d7 h1 F4 Q
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;. O) ]: M( R% z9 h1 B8 Q0 B$ g
double haCloseVal=(open+high+low+close)/4;" s& Z7 ]! E& H! C$ U% O. P* _
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
0 b6 d$ u  j: Jdouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));! C9 u2 U1 f& |# R
haLow=haLowVal;
. _6 F9 o0 N+ m7 bhaHigh=haHighVal;
4 p( `) E) B7 q2 [" UhaOpen=haOpenVal;6 P$ g3 o/ F( V- D/ M% ]6 O6 w& f
haClose=haCloseVal;
; P$ s$ L# B. D* \//--- set candle color
3 L6 j+ u  ]5 L- Oif(haOpenVal<haCloseVal)$ r$ s+ I7 c+ U6 S5 l
haColor=0.0;
% F( G2 `8 M4 r. ?4 G( ?else* P3 }' Y& d/ L- ]% }3 u3 ^, }! I# l
haColor=1.0;
. Z) a& x' K# t5 \6 G( D5 ?}
: g" ~5 v* Z1 I: M% R终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
, r* S% Y$ ]- v8 h( M( Y* y6 freturn(rates_total);* a/ N; M2 [1 q) ~1 W
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:
% k. p, X. D0 B4 C/ m2 h+ m* d//+------------------------------------------------------------------+
1 k; V3 l: O$ `* ]  @" O//|                                             simpleHeikenAshi.mq5 |0 M+ e1 h: ]4 g9 E" m
//|                                  Copyright 2023, MetaQuotes Ltd. |
  m) F+ z0 V+ x5 b//|                                             https://www.mql5.com |
& d. A5 y" l/ O+ k: p+ ^! s//+------------------------------------------------------------------+
& i0 K3 V; H. }8 h/ `* `) b#property copyright "Copyright 2023, MetaQuotes Ltd."* ^+ M& i! n7 X# @6 ^
#property link      "https://www.mql5.com"* w; i3 q3 t1 M
#property version   "1.00"
) V+ ?6 e- A+ {#property indicator_separate_window3 s/ m% c+ ~# @6 G* u3 ], V
#property indicator_buffers 5
5 i1 W- W( ~2 B#property indicator_plots   1* X! B# R3 u* b4 A5 u  V* l
#property indicator_type1   DRAW_COLOR_CANDLES/ P. Z6 J% g- w3 Q
#property indicator_color1  clrBlue, clrRed
/ G3 m  h. l: S#property indicator_width1  2
; Z: P3 C5 J8 |$ e  D#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
2 m* Z1 H* c; D. y7 P  H: rdouble haOpen[];
6 @1 s( C3 [* j2 O; ~3 ^& jdouble haHigh[];' R/ z, H5 c7 [
double haLow[];) @3 d. ?' l- u. b, @0 ?# I; t9 Z
double haClose[];
7 `, M! `  ~$ W: y' S$ xdouble haColor[];
; @/ L: D. L/ n1 dint OnInit()
: c# B. R% |; H+ S& G% _6 l{
# E% B3 J! ~$ e, D) g( f' mSetIndexBuffer(0,haOpen,INDICATOR_DATA);
! J" C- B& i4 \- E# qSetIndexBuffer(1,haHigh,INDICATOR_DATA);2 d1 o  a# J$ k( y# d
SetIndexBuffer(2,haLow,INDICATOR_DATA);# m# U( ?% U( p4 }9 L& S
SetIndexBuffer(3,haClose,INDICATOR_DATA);
- W$ L6 Y8 j  Z: Y  cSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);2 w0 D2 w- {+ I& U
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);) M7 A6 N& X/ n8 |4 p1 k3 W" r6 i% g
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
) x0 Q3 Z6 s+ t% `* A! Q: P; D  pPlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);) h( i+ [4 E& x* e4 P, J* [! M
return(INIT_SUCCEEDED);/ P6 [  B( y, p- e
}* K3 ?/ h7 ]! J0 W" D
int OnCalculate(const int rates_total,
0 ]7 K( G$ `  I: _const int prev_calculated,
+ N3 V+ C+ h2 L% ~  K- `/ s" Lconst datetime &time[],
/ ^: |9 {. @% X4 `4 l$ zconst double &open[],
: W, p4 r! U) E! |# ?const double &high[],
5 S0 ]3 R- L6 F# L; i' Wconst double &low[],# x) r5 w/ E! [
const double &close[],1 v' |+ }2 Z* k" {, t" _1 ^9 M. e# j
const long &tick_volume[],. C. ]! i$ t1 X( E4 V
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 00:37 , Processed in 0.473559 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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