四目观天下

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述* p( R: f! @7 P) h5 x
我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
5 b4 ^8 N; g9 Q% c- }赫兹量化交易软件
0 v$ r' h: H/ {& U  n自定义指标和 Heiken Ashi 定义' e( `( @6 b) B7 u' s4 Z+ g. G
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
/ p: g0 e: X6 [& d4 s# {0 N( E简单的 Heiken Ashi 指标" n1 Z0 `5 U4 X5 N4 ^* D# l$ `
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件  [1 d6 ]% ~& k. q
我们来查看创建此自定义指标需要完成的所有步骤。
9 o6 f3 K+ @8 p# Z3 [通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
+ ~1 x& Q) o: B- m, w4 R) t(indicator_separate_window) 在单独的窗口中显示指标。  q/ j0 Y) }* g
(indicator_buffers) 确定指标计算的缓冲区数量。. P3 \" Z" v# N2 g' y* `0 l. R
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。7 B- H% X- u3 x( D8 ^
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
8 S# }1 c9 E5 G; L% T2 I(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。: \: Y/ d* i! j  l) Q
(indicator_widthN) 还要确定 N 或图形序列的宽度。
; j0 M( b& ^, P' B1 N(indicator_labelN) 确定图形序列 N 的标签设置。0 C+ w  O5 u* `9 t! V, ~
#property indicator_separate_window
8 m# r6 y4 H) g1 _- h$ d! F1 D3 X' x2 [#property indicator_buffers 5
) {7 n9 I$ J) G# l#property indicator_plots   1! M' T# M  ]' w0 j/ Q. B3 ?! u4 [
#property indicator_type1   DRAW_COLOR_CANDLES) d9 H) g0 t0 Y9 c0 N
#property indicator_color1  clrBlue, clrRed
# i+ U2 G! |7 }+ o$ ~9 O#property indicator_width1  2* H9 j/ _9 K9 d9 [& S1 [
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"5 l1 L- E$ h3 `6 s  H
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。- O$ M6 w$ H9 F4 T( J) u& H
double haOpen[];6 o0 |; d% G0 z5 _
double haHigh[];1 h3 U& T. n: {( }! _! i/ ]
double haLow[];
' _4 K1 j7 [, v) G7 ldouble haClose[];
3 L# p+ f/ n: ?$ Qdouble haColor[];
3 e1 \7 [" o; o5 ]: Q9 Q6 H7 g, D9 P. m在 OnInit() 中,此函数初始化正在运行的指标。
' J  y7 ?% F3 M/ E9 ?$ zint OnInit()0 S& l$ s4 {* |4 d/ M( W' p
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件( {1 H+ V) F+ g
其参数为:
. G* k6 T  J; ]) q, Bindex: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
7 K; c3 h0 V1 i+ J$ o! y+ Hbuffer[]: 在我们的自定义指标中声明的数组。
7 }  {0 n; D3 T- I2 P- H8 p. Pdata_type: 我们需要在指标数组中存储的数据类型。
) V+ X! a* v0 s  @, _8 T' gSetIndexBuffer(0,haOpen,INDICATOR_DATA);
) E$ u: k/ S4 R9 sSetIndexBuffer(1,haHigh,INDICATOR_DATA);' `! w' J  Q" p) s
SetIndexBuffer(2,haLow,INDICATOR_DATA);* f+ y) k) ?+ \5 h
SetIndexBuffer(3,haClose,INDICATOR_DATA);
6 b; A7 D  e% o: ~' W0 kSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
8 b! Z  z+ F  H通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
' a- j' F  f* dprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。, L4 c) A) F0 w  z. w5 P
prop_value: 属性的值,我们将指定(_Digits)。
. w( K# p  r! B2 q* }1 CIndicatorSetInteger(INDICATOR_DIGITS,_Digits);
; n) S3 L% [# `; ~调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:3 x- Q  ^5 T$ Z$ |/ K& r, J
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。! U. O. u& \! Q  I2 F
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。
: {: ?1 E6 N, D$ l& D- R3 [IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");9 ~: C8 K8 A; Q* O# M$ t
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
& I* ]0 I. h/ }( k$ i; d: M0 l) I) Aplot_index: 图形绘图的索引,我们将指定 0。
" G+ B+ E, C, Z. }prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。) ]: |- W( |9 ]% T
prop_value: 属性值。4 y  _- h; w/ O6 d
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);" ~! m4 U- b5 l% S! T
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
1 b& J' Q  G3 X1 V+ Hreturn(INIT_SUCCEEDED);6 O3 @* ~( A4 l' v5 [& {
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
8 t6 _/ L; H4 o) V/ x基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
& n. R& }2 S9 E/ U3 Oint OnCalculate(const int rates_total,
8 Z: T# B) o. }8 ^const int prev_calculated,
8 a& u: I9 o3 |const datetime &time[]," w8 `+ [1 l6 ]. N% E' h% R
const double &open[],5 {3 r( i# D) c( }
const double &high[],
1 f9 c0 W) N# N5 Dconst double &low[],
4 b4 y$ L+ N* ?+ D2 e# pconst double &close[],
6 l) P! |5 I( k* X& b- [const long &tick_volume[],
6 {3 b+ N6 R' I  nconst long &volume[],
7 n# A' `2 ]* s! p: Yconst int &spread[])- z4 |5 @7 n4 l; p( d6 v
创建一个整数型 “start” 变量,我们稍后将为其赋值:
. X# L& h$ c& W# [2 Y# w# y8 k& oint start;
+ T1 b: `, K; D# X  m" H使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:$ g2 W5 |+ @$ E( W* v( H1 a; s
if(prev_calculated==0)
0 N* \' L. G2 Y# p3 v{6 L" l2 T; B+ G3 I& n
haLow[0]=low[0];
3 o& @. `9 ^9 ShaHigh[0]=high[0];8 a! r8 M  ?& J
haOpen[0]=open[0];8 T/ d6 J, F" G9 I8 C! _
haClose[0]=close[0];
5 r5 @3 G8 r0 {( i- {$ mstart=1;
% y7 W2 E$ l2 B: X: {2 A8 \}
, F2 e- U6 o5 Z; A. Belse
5 j2 T: J' s* V3 `start=prev_calculated-1;& ~" x8 b4 A) [9 Q/ N7 }- Z- v
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。, [+ X5 A1 g& e4 Z6 |3 o: b
这三个表达式将是:
5 I; K* g' q  u  g" m) bi=start: 对应起始位置。
! W* D3 x! d% p% I1 }i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。- y+ P$ H" Y5 E: K
i++: 加 1 作为新的 i。
8 p* M8 A! H0 d$ G我们每次在循环过程中需要执行的操作:
' U6 d( h! \0 S+ v& o' q计算四个双精度变量6 g; {: _0 P; Z, Q
haOpenVal: 对应 Heiken Ashi 开盘价。( {5 k$ K+ J  p+ p; M8 l3 o
haCloseVal: 对应 Heiken Ashi 收盘价。
, j' v! y3 y9 [' w" I* P+ QhaHighVal: 对应 Heiken Ashi 最高价。
8 W! u# d" F4 p  y% a3 WhaLowVal: 对应 Heiken Ashi 最低价。7 v! D7 f5 R( ?" ?: s
在上一步中分配的计算值与以下内容相同6 b; R& Y/ O1 Q
haLow=haLowVal
( d% b. I: `  I9 p$ IhaHigh=haHighVal
4 F: l, Z$ V; w4 x7 c. ?haOpen=haOpenVal5 n( g% w+ [6 c% q2 `! X7 s$ C
haClose=haCloseVal" A7 d, c# s- X. S0 v7 O( v
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。0 s8 F$ W% Z5 I- _( k4 `
for(int i=start; i<rates_total && !IsStopped(); i++)% f& n0 m( \; M7 B! V
{
' b; g7 o& P# y! Wdouble haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
8 L7 u( |, O4 t1 ~& wdouble haCloseVal=(open+high+low+close)/4;+ w+ ~! G0 l# A9 P
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));, |3 b7 [& K7 u
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));3 h8 ?2 j' f; y& w3 d
haLow=haLowVal;7 C7 z9 \. [! E, [' f
haHigh=haHighVal;
# y& |4 O  P6 P, Q4 ]haOpen=haOpenVal;% ?$ C2 a; n% S( T" g9 D
haClose=haCloseVal;
  a7 g; U" _& ~8 O8 T0 U5 U& q//--- set candle color
  S- i1 r- n" @4 D8 Y" h  b6 E$ qif(haOpenVal<haCloseVal)
) u8 y( ~& c, v1 l' O4 K2 J9 f2 p5 ehaColor=0.0;
3 h9 p9 D) H9 f: J- d9 G' L# ]else+ k0 }" c% n7 e. u( u
haColor=1.0;# K, j! f" T3 U4 f
}
2 E5 ]$ }) i" g- U2 T终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
( z- P' ^/ B; G/ F/ Q5 X4 sreturn(rates_total);( u0 [* @4 d6 d( I# V
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:" j7 b& N/ V, ~6 @/ n
//+------------------------------------------------------------------+1 O( d0 U% b  O/ Q' |9 i; z2 _  B
//|                                             simpleHeikenAshi.mq5 |
1 ^/ F6 [3 u, ^5 C$ t9 h. N//|                                  Copyright 2023, MetaQuotes Ltd. |  A2 e! W6 V  U
//|                                             https://www.mql5.com |8 ]( i9 d8 k' s, W! w) L
//+------------------------------------------------------------------+8 F* j# |- R" B/ j& J
#property copyright "Copyright 2023, MetaQuotes Ltd."
, R! [% @" d) ?- g. o; z' z#property link      "https://www.mql5.com"+ J5 n4 B+ Z# L3 y. |3 v+ d
#property version   "1.00"1 A, O$ \" l# l5 k0 R0 \. M
#property indicator_separate_window% B. c! u# l. {# X7 n
#property indicator_buffers 5$ Y% g/ h; N2 F  O* \
#property indicator_plots   1
- \- b" r6 H; u. j+ ~- |#property indicator_type1   DRAW_COLOR_CANDLES
& a* X/ o5 \' o; x#property indicator_color1  clrBlue, clrRed
  ?  f! h8 A$ X5 h7 \# f#property indicator_width1  2
! p2 Y- p$ p0 m9 R) ]* j" r, L#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
7 ~/ A+ D3 j! D2 J5 V8 d" ndouble haOpen[];
& k" M+ c$ q0 i/ P1 qdouble haHigh[];
1 {. r. |: N2 ~7 Q0 x- C; j, \double haLow[];2 j1 b9 U) t% x& X  l4 B' e
double haClose[];
' G9 ?$ ]4 c8 Y* j% P5 ]: {( ^8 idouble haColor[];' y/ k! @6 Z4 m) Q- U* J" c% }3 s
int OnInit()$ q2 Y% N# m; Y4 i: t" F( [
{8 S8 p( s% b1 ]
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
5 G, L* d( n: ?SetIndexBuffer(1,haHigh,INDICATOR_DATA);
) k/ H9 |) Y" q& g& n! LSetIndexBuffer(2,haLow,INDICATOR_DATA);* l$ A5 K! T/ [9 R! F! u) {- M
SetIndexBuffer(3,haClose,INDICATOR_DATA);0 a* V% M1 a$ o
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);' {" U( p7 r. ?8 {, ]* Q
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);, g5 B' `  k, b: ^
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");" k8 q/ T8 V* a
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
' D6 g( Y' L+ freturn(INIT_SUCCEEDED);/ C; s3 R( _9 P" Q( ~0 k0 s8 J
}+ X& V& W3 o7 @2 u0 [. X
int OnCalculate(const int rates_total,8 X+ D; `6 m* Q1 Z
const int prev_calculated,
1 {. N, A" Y$ [$ L3 Q! W: s0 kconst datetime &time[],# u3 L* ^  g7 O$ P6 }3 \% }$ v
const double &open[],
/ W  h+ e$ M5 k1 }const double &high[],
/ B' O) }$ \. ]" D0 c- F9 fconst double &low[],, s7 W( t6 R. p; |& K
const double &close[],5 N+ n- n& ^* c! E& L( B
const long &tick_volume[],
: b9 F6 j2 L0 j/ m$ L* I6 p, v  @const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-3 16:29 , Processed in 3.836890 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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