四目观天下

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述5 I5 z5 [* h, U& G: A& [5 I
我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。$ @8 V- q7 P' @+ b& x% S/ A
赫兹量化交易软件
; t: c- Z* `) }# r3 R自定义指标和 Heiken Ashi 定义7 x* _8 U/ F6 |! O: S) b8 l% M7 E
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
* w/ A# a7 U/ K1 R" E7 n$ S简单的 Heiken Ashi 指标+ t  a( o2 {) Y/ \- \5 C1 D9 L
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件  J: \- f  g% o* ]
我们来查看创建此自定义指标需要完成的所有步骤。
/ `. c# ?. r! o7 ]通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:1 S$ `4 _. W. P  a% l! w
(indicator_separate_window) 在单独的窗口中显示指标。
! X, b! P/ L; U, `1 {; q6 @(indicator_buffers) 确定指标计算的缓冲区数量。
5 _0 Y! B" }% r* e9 L9 ](indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。% L; V5 g0 `) n7 n2 s* e1 n" U
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
! H% y- W# J/ O2 Y) ]" w! s$ l(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。& k8 ~. S4 d# N! [# s& C( d4 d
(indicator_widthN) 还要确定 N 或图形序列的宽度。( g( `$ h) c& Q. N
(indicator_labelN) 确定图形序列 N 的标签设置。
+ \6 Q* m" k1 f) D7 ~9 C#property indicator_separate_window
5 ?8 a8 z4 H6 W( o( _' d" p#property indicator_buffers 5
6 f* ]6 f  E% V; F' i#property indicator_plots   1
! J/ w/ F* H2 @9 c9 u% X  P2 D#property indicator_type1   DRAW_COLOR_CANDLES
1 ^9 e4 L0 S- M. S; o9 ]#property indicator_color1  clrBlue, clrRed
! x5 e; r: t% j; r9 G0 [#property indicator_width1  2
$ ?- G. R2 j! C5 K, P#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"  I/ a# m  @6 m7 V- w# Y4 R
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。, y0 d8 d. x  }
double haOpen[];: |; u0 V* f8 q1 \
double haHigh[];# p& G. ~9 ^) g( b
double haLow[];
+ L1 `. ?# M/ `2 q- ?4 Qdouble haClose[];; f. o7 i" V. y2 B& U* g6 x6 }# ^
double haColor[];) |  b. o! f4 z" d' `; W, f
在 OnInit() 中,此函数初始化正在运行的指标。  A3 H& _: \; d' J5 N
int OnInit()
  s# B0 S0 j6 }# [- L' w调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件0 y+ W+ C1 V1 d" S
其参数为:: b  R+ G6 w$ @6 T8 E  I- z
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
0 o/ G2 E: Y% O5 H( d! fbuffer[]: 在我们的自定义指标中声明的数组。
' ^6 d" I( E) ~) s5 idata_type: 我们需要在指标数组中存储的数据类型。
" b- t5 P( y! eSetIndexBuffer(0,haOpen,INDICATOR_DATA);
' T* W+ n8 o" `& w3 H' MSetIndexBuffer(1,haHigh,INDICATOR_DATA);
/ K$ c6 H2 O) ^$ RSetIndexBuffer(2,haLow,INDICATOR_DATA);% Y% z" z( X' R; v- c( p
SetIndexBuffer(3,haClose,INDICATOR_DATA);4 W4 o$ `! s9 a3 G# O4 B
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);$ N5 e! Z  L) n" }% |
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:( H+ l, G2 x9 U; [
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。7 ^0 I# F- c5 l* Z. J
prop_value: 属性的值,我们将指定(_Digits)。9 l' s$ {8 T3 U* s' K; S2 N
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
8 Q0 `. ~1 W, I# b# O/ _调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
0 _1 D# e9 v+ R4 I7 H* x4 |( f5 Vprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
! }( t  H3 {2 s; F* \& Pprop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。4 \  N7 a8 p1 e' N6 g3 `- y
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
3 c. {7 ^% H9 R- g3 e5 J调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
3 N6 k2 Z4 q- `3 j- B$ _7 zplot_index: 图形绘图的索引,我们将指定 0。
3 ]: Y8 |+ a. B! xprop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
2 g2 I' s5 O2 n4 ]  [  T# sprop_value: 属性值。. S+ J+ T& r* _
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
" n0 v+ c( p! N/ V然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。0 a; _; \; r' O9 g$ Y
return(INIT_SUCCEEDED);1 ^: t$ }8 A$ I  ]/ b+ f4 k
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件6 Y( a8 x1 c: I  n0 A
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
: V3 S" b, X  _: a) E0 z) |0 i. xint OnCalculate(const int rates_total,1 u' N7 s8 E) i: }; u( ~; _7 t
const int prev_calculated,
. X- A% u: E- c( n0 q. jconst datetime &time[],
; J% R& |# q# ^  Y) y' a6 Q$ oconst double &open[],
0 s  ]" O( w7 E3 Gconst double &high[],% R$ p; _. _; C3 L. ?1 \; |
const double &low[],
7 Z' u( Y0 N/ y4 X( G" Y+ Rconst double &close[],: L7 |/ m. m* u7 ^6 q" D5 T5 Y- S6 g
const long &tick_volume[],6 V- R4 Q! R" q7 G2 J! T
const long &volume[],! T, e6 H! |5 Z( `  j3 l$ b) N) t
const int &spread[])
" v) W9 I2 V4 U! s" Z' t) G创建一个整数型 “start” 变量,我们稍后将为其赋值:
0 ^4 {8 Z# z3 {5 Vint start;3 S, w- `* [8 U: o
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
. z7 W; U- r: wif(prev_calculated==0)" w3 A/ C) Q, V/ [
{
- p8 k- I/ e+ r+ E- _* [haLow[0]=low[0];) D% l. j) y7 M; q# l3 P1 V3 F
haHigh[0]=high[0];' W$ z3 [+ q( b$ T5 T! l
haOpen[0]=open[0];
/ [- X/ @# M5 J2 b: IhaClose[0]=close[0];( ]6 J& a5 S: w# y' d5 v
start=1;1 k/ {: ]. O* r) j- u) A+ {( }9 f
}
, F8 m& `# e, u9 Melse9 e; E+ Y  z! v9 \& v, a2 r
start=prev_calculated-1;
9 M( M3 x9 x2 P5 t+ K& {在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。
1 w! d' A1 V: m+ u) [+ F" G  k! ?4 D这三个表达式将是:
* _5 R4 F7 ~) k) H3 @i=start: 对应起始位置。. }2 p4 @/ j# Q
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。1 N- M0 w; n& {& n
i++: 加 1 作为新的 i。
8 P9 Q  @2 U( S, o9 s8 X" `. {我们每次在循环过程中需要执行的操作:+ D( _- {, S) q; D6 i
计算四个双精度变量
" j, q# L1 t- O9 w9 p4 NhaOpenVal: 对应 Heiken Ashi 开盘价。
; L- V! D+ C9 H5 m3 rhaCloseVal: 对应 Heiken Ashi 收盘价。9 x# J* S' U3 ^8 S0 N; u
haHighVal: 对应 Heiken Ashi 最高价。7 e+ }/ y# c! g
haLowVal: 对应 Heiken Ashi 最低价。
, k6 U8 ~/ f2 c在上一步中分配的计算值与以下内容相同. o: ^3 W0 Q$ O8 n4 n% B
haLow=haLowVal6 x2 G# w- W8 Z& @9 N' b
haHigh=haHighVal; P. v2 G2 r/ K1 k% u2 m* W7 j0 L
haOpen=haOpenVal" \5 b( O" ^/ r, t2 P
haClose=haCloseVal- t* t( ^1 \) ]7 N  {/ g
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。
1 }( m; b, A8 p0 _4 |4 f/ s2 wfor(int i=start; i<rates_total && !IsStopped(); i++)9 K. J3 \8 O' n: L4 k, V* T. \
{
8 l( C% r/ K8 s) |! O# Ddouble haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
' P: I6 |  H$ I' L( D% g: t* C& F2 i4 |double haCloseVal=(open+high+low+close)/4;7 }. _7 K# o+ ]$ O3 S3 w* O( K1 _, J
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));+ c6 [3 x$ D+ A" @
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));
' A# d2 c( W+ O4 |haLow=haLowVal;6 O1 ~/ f1 E& B% @4 _
haHigh=haHighVal;
+ ^* H2 q7 o, d- K" f  ]4 N2 S2 {haOpen=haOpenVal;
( q7 D! @( T# i% g" ?# I8 PhaClose=haCloseVal;2 W" m5 k1 v2 D7 ?; w
//--- set candle color
* o$ K* y. D' g3 g6 C% _) tif(haOpenVal<haCloseVal), s' s& d; d& @- ?
haColor=0.0;4 B* z! r8 ^$ d4 X. e; j
else/ w' A* {3 ^; ]
haColor=1.0;
# h, A8 S* u: ]3 k6 I, s6 l# u}0 F% t$ z: y2 |6 U2 ]' ]
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
0 g' t: R, p5 P! oreturn(rates_total);0 P# V/ \- Y' A
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:3 o9 ?* R! V$ u( v, [: r# p; q  e
//+------------------------------------------------------------------+
: J; B9 G% }/ `0 N* I- U//|                                             simpleHeikenAshi.mq5 |2 p1 U( `6 [& o6 H) I$ D* D: m0 h
//|                                  Copyright 2023, MetaQuotes Ltd. |
6 K, {3 M3 |% t: L//|                                             https://www.mql5.com |
9 _5 x- _- ^3 z4 a/ E4 f//+------------------------------------------------------------------+
0 D( v% o" E; |#property copyright "Copyright 2023, MetaQuotes Ltd."
: Q" x/ \" A/ q2 T) [#property link      "https://www.mql5.com"
9 I% _/ D6 `  l2 k#property version   "1.00"
5 z( _9 I" y6 |+ ]% A- b#property indicator_separate_window; i# y9 Y( d* l$ i5 `. v1 U
#property indicator_buffers 5
& [1 K. n# ]; n$ U#property indicator_plots   1
1 _$ ]  Q8 y" C5 ^#property indicator_type1   DRAW_COLOR_CANDLES
1 \3 H* o, B9 p/ N3 S#property indicator_color1  clrBlue, clrRed* d, d6 k& X  v3 P
#property indicator_width1  23 b1 {/ s" b0 G$ b  s0 a! \: L
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
* o+ }( W, h* p9 Rdouble haOpen[];0 E6 S* t' s/ p! |  R0 C: M$ i4 W
double haHigh[];
! L, y) m; u; \+ G* cdouble haLow[];& X0 P2 A' Q% l2 O
double haClose[];  X0 y% N& O* v+ r$ ?
double haColor[];3 M, I  o6 G# v/ ]5 a' H9 F% w7 W8 i
int OnInit()
: I4 A. M7 B  c5 }1 i, F{9 N! Z* X+ m4 i7 w
SetIndexBuffer(0,haOpen,INDICATOR_DATA);+ u8 {$ S. Z3 m% A- v) R
SetIndexBuffer(1,haHigh,INDICATOR_DATA);9 D( ^1 O! z$ L9 Y" s, E. w% y! j
SetIndexBuffer(2,haLow,INDICATOR_DATA);
8 O# N7 H6 G/ Q$ e1 ^1 USetIndexBuffer(3,haClose,INDICATOR_DATA);7 k2 z# G$ c& Z  P, I
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
' ], `( x# L5 k+ M2 ]. H, [IndicatorSetInteger(INDICATOR_DIGITS,_Digits);# J' V( R2 r, z3 H! ^
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");! z# }/ R1 |$ T
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);3 Z' H( J; j2 e$ R, X8 g
return(INIT_SUCCEEDED);0 l8 |! s3 _; _& v
}# e9 V0 j$ d- ^* z
int OnCalculate(const int rates_total,
- Q1 M* m* ^( v0 Cconst int prev_calculated,4 R- d# q1 t2 C( z* }7 T" u
const datetime &time[],4 k$ ]& `( e: v0 [2 t. P- S
const double &open[],
: O% f7 I- {3 f$ ]3 R# ^const double &high[],) T/ a5 s1 I9 h5 |7 }& K% v" B
const double &low[],
9 d! v: O. y8 mconst double &close[],
2 |& m4 b, v$ C4 n8 S& Qconst long &tick_volume[],
% u7 D- O2 G" X+ z7 j7 |const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-17 13:28 , Processed in 2.548244 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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