私募网

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述4 H4 m$ y* b' O( {$ T
我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。4 _6 h. ~+ b# e( {% a
赫兹量化交易软件% l7 ^1 {/ X: }8 b) l
自定义指标和 Heiken Ashi 定义
/ _! N. ]6 |) r% U在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
' n/ F# W' X% r2 A简单的 Heiken Ashi 指标
, `4 Y5 y( y, R, T在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件" V7 J1 `! z+ Z5 i0 E1 E% K
我们来查看创建此自定义指标需要完成的所有步骤。7 _6 S$ `2 P$ Y! Q- |
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:; _% _6 m6 F$ c6 I/ U2 N
(indicator_separate_window) 在单独的窗口中显示指标。8 h8 ^4 J! _4 j$ E" K# J0 W
(indicator_buffers) 确定指标计算的缓冲区数量。" d- B4 D1 Q+ w
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。- X) p1 c' s% c* i5 _- @
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。, `& [" t: i3 m5 g# U2 ?& i4 N! o
(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。
8 G% ~( U9 h3 ?) x% L5 ]$ ^6 T(indicator_widthN) 还要确定 N 或图形序列的宽度。
- s, P- e! N  O(indicator_labelN) 确定图形序列 N 的标签设置。9 H5 b, f$ V3 B5 s( A9 x
#property indicator_separate_window
9 w# k2 P8 {0 c#property indicator_buffers 5) F1 w" b7 |+ M0 Z
#property indicator_plots   1
) u, ^- D( D% i: f#property indicator_type1   DRAW_COLOR_CANDLES
( V) K8 ]6 R4 G7 t0 a#property indicator_color1  clrBlue, clrRed  Y4 H+ L& e* A4 T9 F2 [* U
#property indicator_width1  2' B6 V8 X9 W) S1 k/ l: V) s3 Z
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
. g  Z  n; F& [7 |8 r4 h" N% B. Z; i为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。/ I! l* e7 K4 V' B/ X" l
double haOpen[];: L, F) l3 v1 {- |
double haHigh[];0 n3 I2 y. o5 d* p
double haLow[];
: T2 k0 w7 C: b& _double haClose[];5 q. K* _4 h2 v8 U8 m# p: s% Q9 M3 i$ t" F
double haColor[];5 r9 R. i3 \! Q# L1 I" ^! g
在 OnInit() 中,此函数初始化正在运行的指标。. R$ p" m$ ?2 V* F4 I
int OnInit()
9 P6 c7 H/ C# ^调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件5 C8 J  X+ t! l# S  B
其参数为:/ S# \( z% G7 S& T: F6 t
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。6 m* O8 A0 U; e7 h* e
buffer[]: 在我们的自定义指标中声明的数组。
$ B% O6 `% x, ~+ @$ [2 Pdata_type: 我们需要在指标数组中存储的数据类型。8 a  u, S" D  c( i: s: i
SetIndexBuffer(0,haOpen,INDICATOR_DATA);$ \0 X0 d0 R1 t0 R8 Q# J, S* L; s; P
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
; w0 `; s0 l) W7 Q  e. m0 ?SetIndexBuffer(2,haLow,INDICATOR_DATA);  w0 u- b$ \$ A% q; t) I
SetIndexBuffer(3,haClose,INDICATOR_DATA);( r0 Y: h4 _. ~5 _2 J. T9 P
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
6 B: z" r3 F$ u$ V通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
4 k7 i, S& [  Z, R5 lprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
8 x1 k- J5 _# c" V& G  xprop_value: 属性的值,我们将指定(_Digits)。
' P: F) I  X4 w. O5 B- A6 C( OIndicatorSetInteger(INDICATOR_DIGITS,_Digits);
' Q! ^/ e  r5 M调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:  c. z) X8 k6 {' f
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
/ k: R9 c( X: |, M! g& f+ g% x9 Yprop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。
$ p6 O9 ^% H! `9 pIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
3 x9 o8 W, k/ T% l9 O调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
( s5 ]: y- a1 _+ x+ G# h/ p4 ~plot_index: 图形绘图的索引,我们将指定 0。5 y+ T; t- g, ~, a
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。) M  {) _) T! r, w. t- B6 B2 V
prop_value: 属性值。/ K; `  A7 r0 i: W
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
9 n% |! D/ M9 a) o. T4 R( W+ R然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。; Q9 I3 W8 A; d' h
return(INIT_SUCCEEDED);
+ S/ I+ ]3 Q# q  e9 v, Y4 K' A在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
8 \% y1 n2 [# W  B' V& T' D基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
. [/ v& g, V7 G+ ~5 l$ [int OnCalculate(const int rates_total,
/ J& s& @: y5 ^# A- econst int prev_calculated,- i7 D2 u) [1 J- G) V
const datetime &time[],7 A4 z# r+ x% `: C% [
const double &open[],& g7 J% V8 o0 G, v1 T5 P6 W; K
const double &high[],
. q# e+ v  m: U8 ?" dconst double &low[],1 o0 P8 R% A2 C$ U" N4 p  K$ E6 f& _
const double &close[],2 |0 o) I9 u& L7 L/ W$ v7 b
const long &tick_volume[],
  X/ X$ b( q, }& m( {const long &volume[],
) U2 g. J% x% j& F7 O- Lconst int &spread[])( G2 g/ e, f, c7 E( n7 x/ _
创建一个整数型 “start” 变量,我们稍后将为其赋值:* E, C: ?& _" ]; q+ n7 l
int start;
# M; N7 T9 G5 b& m7 r: _使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
( D7 P$ F# o* `+ Z& ~$ @% L9 |if(prev_calculated==0), c0 \, ~  B+ T" J7 P
{6 S& p- \: s  B% k+ F) h, T/ Z
haLow[0]=low[0];
- K) W$ e: Q  r4 chaHigh[0]=high[0];/ G4 _; ]# v4 o9 s; U8 u
haOpen[0]=open[0];
- q. F* `& g; Y- [, Q: j. GhaClose[0]=close[0];
8 u/ b* f3 e4 r( rstart=1;4 D7 d( q. {, e
}
5 b2 M9 v# r; Xelse$ S4 r& j# g/ U. W4 G
start=prev_calculated-1;) l5 M6 _% ^' y, ~
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。# t' B1 r: q; a( d6 L7 K& B
这三个表达式将是:
& i) T2 A0 j3 w) d6 fi=start: 对应起始位置。. O' d+ f  I* J, R7 o  K
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。# \! U# f( K) u( H( f% N) d
i++: 加 1 作为新的 i。
9 x0 S9 ?; W; _7 a0 h8 N" v' g; H+ r我们每次在循环过程中需要执行的操作:
1 C: t" L( Y# m3 M1 d  U计算四个双精度变量* V8 A5 y# }9 u* m+ i
haOpenVal: 对应 Heiken Ashi 开盘价。, ~0 `  a4 G$ ]5 T5 O6 ]% e
haCloseVal: 对应 Heiken Ashi 收盘价。
& k: [$ W) P6 N4 hhaHighVal: 对应 Heiken Ashi 最高价。
" q. @: R: N8 c6 shaLowVal: 对应 Heiken Ashi 最低价。
& V/ u6 G( S& }! `在上一步中分配的计算值与以下内容相同7 Y; t0 C) ~* Z# O; G
haLow=haLowVal
/ a$ `" r2 n; ShaHigh=haHighVal
0 O2 L/ S# C0 I/ p1 I" YhaOpen=haOpenVal
& \( ?  i6 N( u4 I; MhaClose=haCloseVal. l" y/ h0 q. j0 S- i7 G0 R: Z# @
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。
# `7 k) l1 F# E% K1 l5 i- ~+ Ifor(int i=start; i<rates_total && !IsStopped(); i++)$ u7 z2 P- i/ h" x
{
& I2 _  C! ^5 @& k5 s/ jdouble haOpenVal =(haOpen[i-1]+haClose[i-1])/2;) ^6 P" Z. J; |# i6 X
double haCloseVal=(open+high+low+close)/4;4 n2 N* Q( |% c+ e/ M% ], e9 B
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
  i- P  X2 y- cdouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));
$ v2 B  S4 L( c0 G4 e, F% B  }haLow=haLowVal;
7 c, r# J* s  v! v" \, Y; b) P3 yhaHigh=haHighVal;
, c' B! k8 ]. P4 ?9 ~' WhaOpen=haOpenVal;
. B6 {1 e  n! A8 j$ U- e9 ^( `haClose=haCloseVal;
" J% W, J# ?' ~7 F+ e2 a  n//--- set candle color
9 ]5 d1 b# H3 `% @( Z% s2 Uif(haOpenVal<haCloseVal)+ j% x4 [  y8 `6 |: Y9 r6 |. B1 t
haColor=0.0;
, Q2 ~& L6 `/ P- s0 ~) l% nelse
' _9 W+ Z* r. r' n1 o* {  AhaColor=1.0;, _- [$ @, w, y
}$ i7 g' b$ ^+ D  e
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。
* i; `, d. i$ a- u7 ?return(rates_total);
" e; J& {7 @# L7 n( p然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:
; E; d3 c4 @& |* ]2 ~! A9 M//+------------------------------------------------------------------+
" i! Y. Z9 b1 T) U//|                                             simpleHeikenAshi.mq5 |) s4 e4 d8 i  e
//|                                  Copyright 2023, MetaQuotes Ltd. |
! D' E- M- Y% A# _4 u/ t( L//|                                             https://www.mql5.com |
1 g; Z, T6 f$ X2 w& K" `" _- f//+------------------------------------------------------------------+
. C+ ?" d) [* j2 @6 S#property copyright "Copyright 2023, MetaQuotes Ltd."
) @5 \1 w7 C6 K9 r$ K7 U2 Q3 W#property link      "https://www.mql5.com"
1 q: b8 K) e3 E" ^- Q#property version   "1.00"0 M# i$ `/ j" s; ?3 M6 o
#property indicator_separate_window
- ?4 }3 Z$ \4 v6 G#property indicator_buffers 5
9 w+ m7 a5 |8 N; j! S' C, Z# W#property indicator_plots   1, f9 D: g: ?% V8 a0 k- J
#property indicator_type1   DRAW_COLOR_CANDLES
+ [8 ^- U7 p- m' X+ t6 b#property indicator_color1  clrBlue, clrRed5 G4 [  b- s0 T4 I! l8 t7 P
#property indicator_width1  2$ |  S. g. l* Z& |, X! ]  m
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"2 h% g5 z8 p; P5 I: p' O) c
double haOpen[];- `& v2 e  I0 L" N% H( E
double haHigh[];
$ I" m- X! K6 b3 f# hdouble haLow[];
& _5 t3 f. s( o- Y( V' }! P  Idouble haClose[];, s" V/ M" {- X; `0 K, ^
double haColor[];
0 ~) c# y7 o4 ~6 u7 i; Y6 Zint OnInit()
5 P* n" W. r4 Y/ X{
; W$ J( w0 H3 O' N$ O; VSetIndexBuffer(0,haOpen,INDICATOR_DATA);* C* I; b" k- a8 x- }) X$ C; {% ^
SetIndexBuffer(1,haHigh,INDICATOR_DATA);0 v1 h$ a# U/ B8 A4 G8 }+ e
SetIndexBuffer(2,haLow,INDICATOR_DATA);
/ R( i/ P( {! K( ~; ]SetIndexBuffer(3,haClose,INDICATOR_DATA);/ _; z. e% |- J
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);7 I$ K4 c9 b' Y/ X4 `
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
; Z. ^, |3 V" s( iIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");# T( Z+ W! y& }3 l" O
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
" M+ f7 B9 L4 mreturn(INIT_SUCCEEDED);4 a( P# U2 u/ }6 k5 U
}
8 e- M5 g" Z. ]int OnCalculate(const int rates_total,
4 `3 q) `! @" _+ B  ?0 Tconst int prev_calculated,& N) A) ]- o; J& K7 B! _! K* Q% n
const datetime &time[],/ s! X( q  y; S9 t: N- s
const double &open[],+ P$ e; a- p" i' p1 }
const double &high[],
/ W5 ^8 T  X4 J& k0 y) ^' I" aconst double &low[],
. k% e- L, C" n  f' f6 R: jconst double &close[],
# `. N8 D$ m7 r0 rconst long &tick_volume[],1 p8 [+ R0 _8 L, e
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-15 11:37 , Processed in 0.994784 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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