私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述3 ?! R# @" n1 A  a" U/ B  s
我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。( P1 t; G6 l' a1 c' D
赫兹量化交易软件
/ h- \* }5 R* B# x5 i" a4 s/ `自定义指标和 Heiken Ashi 定义
4 j8 Y4 W8 [1 C4 x在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
& Y3 s/ v# K+ r* d# {+ N8 {简单的 Heiken Ashi 指标
; n( E7 P. c% h0 M& P1 p在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
$ m, q: a* i* g8 y我们来查看创建此自定义指标需要完成的所有步骤。* b& r# q; u' t2 P' b
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
1 `! W& M9 W6 K* _. W(indicator_separate_window) 在单独的窗口中显示指标。
! z/ y& G" b/ v) y(indicator_buffers) 确定指标计算的缓冲区数量。: ]1 u; n7 a  J, @* G* q+ M1 ^0 O, w
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
! {" j! F4 i4 Y/ s% F  l(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。$ r# ^, d- }& w. A
(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。
/ Y& }  y% |4 v# \8 ~* w(indicator_widthN) 还要确定 N 或图形序列的宽度。' [' U7 u+ S5 m% }  X/ P* G
(indicator_labelN) 确定图形序列 N 的标签设置。
8 `: D: X. a4 @6 W#property indicator_separate_window
# U: U+ g; U! S2 R* |#property indicator_buffers 5
# j& v) t3 o- U# n#property indicator_plots   1
' q; {% O' `. W- R#property indicator_type1   DRAW_COLOR_CANDLES
4 C0 s& l. k6 Y9 C" J#property indicator_color1  clrBlue, clrRed& k6 i* C# }! X( ^
#property indicator_width1  2
6 ^# p# n0 |- @! y% e: _2 h#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
4 ^+ G+ o' R& U+ ?& t: G为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
9 |6 B  g5 o/ i6 Xdouble haOpen[];; [" u* o8 h& v, `/ R
double haHigh[];
3 v; j( n. {' X* t3 Zdouble haLow[];
- `9 T7 Z; ~9 ]. e8 adouble haClose[];
2 I* O5 {3 Y) o" [6 J/ idouble haColor[];
/ u8 M+ g" j) H* o5 Y$ I9 I& [在 OnInit() 中,此函数初始化正在运行的指标。, S+ I: S' H3 f" L. ?. ^
int OnInit()8 u+ G6 O- a- e1 ?4 L8 P( R
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件
8 t+ \2 K- O- A. R- C0 Y! u其参数为:
1 u# r, M8 j9 h4 m& ]# Findex: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。, K9 q2 ^  Y& \# N, i
buffer[]: 在我们的自定义指标中声明的数组。4 T! H3 Q3 a" S6 ~5 R# g
data_type: 我们需要在指标数组中存储的数据类型。; M0 u4 B6 V* |1 D0 M! f5 ?0 J! J
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
/ X2 Y5 d8 j9 W8 k, C2 qSetIndexBuffer(1,haHigh,INDICATOR_DATA);3 d# \: G( ?! P( }  F
SetIndexBuffer(2,haLow,INDICATOR_DATA);2 R; m# w( k  ]
SetIndexBuffer(3,haClose,INDICATOR_DATA);
2 J7 F2 n* z7 t, {) cSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);9 |- x- p6 ^7 H
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:- V/ ]2 M  E& e% w+ w9 {4 Z3 K5 s5 @
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
4 R5 O* [8 E8 N0 a. T; Gprop_value: 属性的值,我们将指定(_Digits)。9 u" I# T5 Z" X  o; o6 w6 T
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);. ?( l8 ~+ g' r& c& ~# w
调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
( |% ~( @. X+ h5 Hprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。- L1 ^* k$ c" B& \$ Q6 g0 e
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。
6 R: T  a8 |8 J# M0 PIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");7 `" A% J& p/ Z! B8 |
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
5 m+ t' w) R; s: |plot_index: 图形绘图的索引,我们将指定 0。: r9 K/ q0 o) }6 \
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
6 z+ s3 G0 n$ Z0 z* l! g/ fprop_value: 属性值。
, B: a! c  P0 y2 J) B) A+ }PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);/ O% }3 Z5 Z' z4 r/ h
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
& e% F+ N( T* B9 O% \return(INIT_SUCCEEDED);: t+ l  Q, G4 H; `" q9 a2 m
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
5 T. j! n  k6 v$ `  `基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
1 h& _  ?: k# Oint OnCalculate(const int rates_total,0 ~& C( C' E5 Y: ?- v% s, |0 N
const int prev_calculated,& @; q0 ~$ H5 g; L! M$ M% d  t
const datetime &time[],$ t; x% j' X/ {1 D
const double &open[],/ a6 F* l% R2 ?" Y/ s
const double &high[],
' u3 u. u; U% X  o' q/ Yconst double &low[],
9 U; u7 J( |2 d- pconst double &close[],8 l  W7 @0 k3 Q7 A  `% D" v& R9 M
const long &tick_volume[],
5 o/ y4 X9 S" q9 v/ iconst long &volume[],
. @- R* c) Y# x& u$ Oconst int &spread[])5 I% y2 }: A- F! C
创建一个整数型 “start” 变量,我们稍后将为其赋值:2 Z+ Y$ a& e$ g$ g' \
int start;. S, E$ S+ }" B1 G1 w& Q8 j
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:* N# r4 ^3 y  j3 |  j
if(prev_calculated==0)
- C( Q' S6 L3 ?{7 X. K4 }& N1 f3 H$ p5 v
haLow[0]=low[0];
! v, y  {! V+ M$ f3 G% ~. ZhaHigh[0]=high[0];
- W+ E9 J4 P  a( g, S/ S( thaOpen[0]=open[0];5 O1 Z, a9 X% H" E
haClose[0]=close[0];- Q/ I" x- p( y, ^$ Z  Y
start=1;) T1 m% Z6 X$ I, h0 i9 v' u8 K
}; O7 f0 {. [) E2 Y
else
& I4 R% Q; B. z9 a$ W& Ystart=prev_calculated-1;) c& m2 r& M+ E( B, [0 z
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。5 l" h7 \, @- B
这三个表达式将是:, x" V- S. K+ w/ ]8 i. Y
i=start: 对应起始位置。  N3 |. n0 U9 p% E; o
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。+ s1 v- U: l, g2 [$ Z# u7 Y" n
i++: 加 1 作为新的 i。
, v8 H% o, ~: O4 A. S我们每次在循环过程中需要执行的操作:2 M% a0 \7 P3 F& J5 Q# O
计算四个双精度变量
+ g5 C  l$ d4 zhaOpenVal: 对应 Heiken Ashi 开盘价。
" ?1 k7 a9 @5 \4 d) w6 N6 zhaCloseVal: 对应 Heiken Ashi 收盘价。
; A: F& y. z$ i/ O' A, f- ?haHighVal: 对应 Heiken Ashi 最高价。9 Q/ H0 ^0 Y* D5 Q
haLowVal: 对应 Heiken Ashi 最低价。
4 n4 N+ ^1 z- P1 d% d在上一步中分配的计算值与以下内容相同! i4 A  I% O/ m/ ^$ s& m" G
haLow=haLowVal4 Q1 F. q, F. `
haHigh=haHighVal" m3 c7 ~+ b/ k! Q  O  b
haOpen=haOpenVal) |* v- ~9 h1 |3 G% w
haClose=haCloseVal
. Y* ]3 _. c5 _9 H, J2 x: i检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。/ `. A" \( I7 V( m8 F& ]4 H
for(int i=start; i<rates_total && !IsStopped(); i++)' F% J/ u6 `0 {! @/ F" C
{8 q0 Y* R/ K% H  J
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;* n6 \: K! |- b) }" E
double haCloseVal=(open+high+low+close)/4;
3 A% A- w) v- k5 B9 ^( ldouble haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));, m8 L# |7 w" t$ C+ q7 P5 Y
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));4 r" a& j. ~9 P6 K( D# e
haLow=haLowVal;" c+ V" o; r: B: p- d; B
haHigh=haHighVal;& D% [; L! B1 o
haOpen=haOpenVal;( o1 a, J+ A- o/ ]! Z. `$ p
haClose=haCloseVal;
% z; b. B* [1 R* j0 S//--- set candle color
& O3 K7 P" }/ n3 P% w0 B! M. Bif(haOpenVal<haCloseVal)
- i% q$ Z/ I+ g; v$ AhaColor=0.0;
" [& D) I, \/ ?) oelse0 H$ h3 @2 T3 B
haColor=1.0;$ s( C2 H( T& k! H
}
7 }3 U, ~3 ~: E4 n( C9 y5 ^2 L终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。! z! f: E$ g% |7 M
return(rates_total);) W2 P& b' ~5 m& P4 K
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:: i/ B6 S6 y# n
//+------------------------------------------------------------------+
# Y3 _$ k! H" R//|                                             simpleHeikenAshi.mq5 |# T0 q" u7 \  @/ X- v, a, V) D1 L
//|                                  Copyright 2023, MetaQuotes Ltd. |( f; n2 ~! p. Y# x- M
//|                                             https://www.mql5.com |
/ C$ ^8 a) K0 \9 f& ], G) v//+------------------------------------------------------------------+, C& V2 [! c' e! V, _
#property copyright "Copyright 2023, MetaQuotes Ltd."
; s: p  _/ G0 ~( q. X  |0 _#property link      "https://www.mql5.com"8 f9 q  R# r# `* O4 T
#property version   "1.00"2 C$ [* W6 ?! ?. B' \8 ~
#property indicator_separate_window% L  M0 H8 u& i) w4 L8 p
#property indicator_buffers 5
' v1 h' ~/ X- U! X0 n" l#property indicator_plots   1
9 i7 i3 I" y( |#property indicator_type1   DRAW_COLOR_CANDLES# U$ N8 p+ W2 Z
#property indicator_color1  clrBlue, clrRed1 E3 G% O) W$ `0 z; ~1 }+ c  E
#property indicator_width1  2
" h4 ~% p# `: P  w2 q" O; n. M#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
- ^) n3 N. Q. |( p3 Qdouble haOpen[];
, ^9 U, z( M. ?. I& \8 c; ddouble haHigh[];
( e( n/ E# {2 S( K$ ]double haLow[];& R* P6 @; n0 o. _4 |
double haClose[];
8 k, N8 Y* O( a( Q) qdouble haColor[];( _6 d# ^+ U% G. x
int OnInit()# v# x9 S# q) {; D& Y
{) K% }8 K' f  [  i2 i
SetIndexBuffer(0,haOpen,INDICATOR_DATA);# v: r* J2 Z4 V5 `& s. @8 z4 T
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
) D& s0 o; a+ z) tSetIndexBuffer(2,haLow,INDICATOR_DATA);2 g% T3 T7 E  O0 C+ I# r( d
SetIndexBuffer(3,haClose,INDICATOR_DATA);+ a3 O5 z/ _/ f7 t& T5 s
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
# j* n# u6 H8 F% ^/ t7 u7 EIndicatorSetInteger(INDICATOR_DIGITS,_Digits);, b  T6 T3 `. t* f" e
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");8 U: d  q' s* S) X/ e
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
. M. |, h0 E! r; xreturn(INIT_SUCCEEDED);  C, g9 I/ n( n) u
}
: I$ v& ]0 e% a' B) P  ^int OnCalculate(const int rates_total,
: X, W- Y/ E1 I+ ^2 Vconst int prev_calculated,
" W4 l3 t4 `/ [/ R. vconst datetime &time[],
8 ^5 a( ?* ?! d6 I& yconst double &open[],# q' q8 d. M5 i* G; a, _1 d
const double &high[],
+ h+ e4 L5 W: U) K6 jconst double &low[],
1 a9 F2 F& f* M2 D7 y& yconst double &close[],6 i# v0 W: }: R- L- ^; R
const long &tick_volume[],
* D# Q1 t% b% Z1 dconst long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 19:03 , Processed in 0.415018 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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