私募网

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
' K$ a# |; }% X我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。7 e( v3 B0 ^- L& V+ y6 M, T9 f4 D
赫兹量化交易软件
' [# |' s9 c6 V自定义指标和 Heiken Ashi 定义
6 N; e3 n! w9 m; [: O在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件; ?$ s. A5 x- h: k! k9 A
简单的 Heiken Ashi 指标
' D' i+ C3 {! Z* Y在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
- u- ~$ @  r7 k) i, r我们来查看创建此自定义指标需要完成的所有步骤。
% m1 u  V# [0 r; x; G! }& B9 l* B通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
; U) r  c0 u$ X( G  c  c(indicator_separate_window) 在单独的窗口中显示指标。. ~4 u, U$ `5 U  `7 h' A
(indicator_buffers) 确定指标计算的缓冲区数量。; p/ Q0 A1 n+ s4 `* F- X
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
* L0 k9 ]" E4 V2 S: J9 t(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
+ `* A' y6 _* w' ]# ?(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。
7 [- @. J2 {0 ~- ]; [(indicator_widthN) 还要确定 N 或图形序列的宽度。- t- {& ]  D3 C
(indicator_labelN) 确定图形序列 N 的标签设置。# b3 h; B3 T8 Z# X8 H
#property indicator_separate_window7 m+ H( I5 Z9 j9 ]7 t
#property indicator_buffers 5
& w  r/ G" K; ^- S$ q: I7 p/ p#property indicator_plots   1
6 S% H; S( a+ z: Q& {#property indicator_type1   DRAW_COLOR_CANDLES( v' r- T4 ^, p, }6 G4 J
#property indicator_color1  clrBlue, clrRed. [. f/ b- `* {4 x8 ~
#property indicator_width1  2
9 F  S2 o1 f: k' t0 G7 G#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
: l3 F: O6 Q$ Z& B为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
# C  @% M% s5 x+ H8 G. Cdouble haOpen[];& y/ N, F5 u8 x6 L& L
double haHigh[];
5 t/ m/ p, Z! z4 F0 Ndouble haLow[];
% ~% }* O7 H: _& Z. o" Z6 gdouble haClose[];$ `& X* ^- o) p
double haColor[];3 s  F, t8 ~2 c. f
在 OnInit() 中,此函数初始化正在运行的指标。% R( _" b: ]& k) g$ a5 P2 S. s/ k- l
int OnInit()
7 G8 S* H* n1 w7 q+ d) C- q& @调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件
* |0 X) e/ s' J其参数为:; B6 c0 |7 g, s0 H5 d. ~* ]
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
" M: h; P* Z4 Zbuffer[]: 在我们的自定义指标中声明的数组。, D6 h0 U$ M4 `9 g5 i# P% s
data_type: 我们需要在指标数组中存储的数据类型。
+ L) k9 m# w6 R$ n) ]+ p: iSetIndexBuffer(0,haOpen,INDICATOR_DATA);# V& I1 X8 r+ G6 B
SetIndexBuffer(1,haHigh,INDICATOR_DATA);) B) Z7 `9 N+ F% s
SetIndexBuffer(2,haLow,INDICATOR_DATA);
7 D; [! f- L& a2 s2 |( k6 t( ~SetIndexBuffer(3,haClose,INDICATOR_DATA);
2 X1 M0 B' m1 ~SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);1 A4 P8 i( E" F- Y& }6 p* |. j
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
2 j, o, l% z  d7 jprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
' S' o! o% J% a( z: `prop_value: 属性的值,我们将指定(_Digits)。; v& z$ {! W/ D- [6 u$ D, V! z( e
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);. b$ X+ N2 U- ^8 K! j: _
调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:' F0 o3 q) Y: O, ~! ]+ k
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
# j  F" S9 w) O* S, Q- |prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。% v3 D3 ]# S0 s+ Y) z* E' v
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");: Z" v8 W4 u3 \7 T& k% N
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
; I, a) B9 y% r& C) l' dplot_index: 图形绘图的索引,我们将指定 0。
5 h& X2 j  K' ~  ~7 w) {prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
/ ]5 @" u# a$ Y  Fprop_value: 属性值。) N( i! s1 a. h0 S4 m# b3 R
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);: [1 _/ B( F( x1 P" w
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。) l) L2 R" B* n4 S) w  g
return(INIT_SUCCEEDED);7 `/ B* N, G# y% g3 O1 R
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
. B0 [$ z9 B$ R# {基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。& y$ r# ~$ e. |$ Y
int OnCalculate(const int rates_total,
4 F# n  i% _9 E3 d- N6 @& ^* yconst int prev_calculated,* q% V+ ]6 s+ c" P# k
const datetime &time[],- U8 I* V) [5 ^3 [* `0 A
const double &open[],4 t) Y( [4 q8 z/ C4 b
const double &high[],
0 u" o3 g( _: Fconst double &low[],
. b& _4 k4 `2 i( h* Vconst double &close[],' S! h+ e4 X$ X4 W. L# y! Z
const long &tick_volume[],
+ p! P9 f) @' M3 R( k3 Xconst long &volume[],
/ o2 i# B$ n6 `const int &spread[])5 l0 |" Y& S, x, T2 U; g2 Y
创建一个整数型 “start” 变量,我们稍后将为其赋值:
7 y7 u) E- P% [; B5 E4 Kint start;/ W# }: ~( ^$ J5 q1 l
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
  }8 R- T" i- Mif(prev_calculated==0)
( f# w$ w5 y6 Q- U" i0 e, j$ R{* }* ^( B3 B  H# ~  y' [. W
haLow[0]=low[0];
$ W6 l5 A4 G" B  |4 ghaHigh[0]=high[0];0 z& R- B' a  y# K9 T" k5 W$ U
haOpen[0]=open[0];* b: b1 _& T% Z9 M" Y
haClose[0]=close[0];" Y0 U, p- U6 _* ^/ j
start=1;3 Q% b) Z5 I& N" P& w
}* I7 V8 Y! s% [
else
. o2 q3 [6 e$ r5 g- c+ ?: h3 Xstart=prev_calculated-1;
; t' ^9 U9 O, m. h/ L* W在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。( }) Z% N* N, I
这三个表达式将是:
) J* q: @; H( q9 Ni=start: 对应起始位置。' H- Z; [6 G; f1 k0 |
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
( K3 z. j, n3 ]7 si++: 加 1 作为新的 i。
. `( S3 b" O! v我们每次在循环过程中需要执行的操作:
2 I, D; o+ m' S! ], A" ]计算四个双精度变量4 P2 j+ s& l0 i5 h2 {  C
haOpenVal: 对应 Heiken Ashi 开盘价。
4 H7 u+ {' @  P; uhaCloseVal: 对应 Heiken Ashi 收盘价。) d  t6 u$ _  X& L4 f. \
haHighVal: 对应 Heiken Ashi 最高价。, Q9 M: C+ d5 z0 W2 C4 ]- Y
haLowVal: 对应 Heiken Ashi 最低价。
4 R3 A* [) d2 a& l在上一步中分配的计算值与以下内容相同
* {; t- h# Y' h! P+ b: u* zhaLow=haLowVal
1 l" b$ [' m) W4 K9 VhaHigh=haHighVal
3 ]5 Y5 P( \% k' G0 x1 l% UhaOpen=haOpenVal
4 X) r: A6 y% p) L: Q; J' [haClose=haCloseVal
1 p9 o! n* p; P3 v" |检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。
. u8 J9 }1 ^$ E+ K" `) ?) Lfor(int i=start; i<rates_total && !IsStopped(); i++)8 n/ N  _/ ~2 `; g+ U
{4 t) B( m/ L4 s! L% [0 r% p7 m( a
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
1 V% ?/ w( V& p, d, Zdouble haCloseVal=(open+high+low+close)/4;
7 z2 U* ~  d6 Sdouble haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));: N* ], n$ T( c5 Y0 ?+ T
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));/ C$ z+ ]/ {% X6 e: K( @. j
haLow=haLowVal;$ A- x& G" s$ M' Q
haHigh=haHighVal;. r% F& S% l9 H! ?
haOpen=haOpenVal;4 \4 z: i5 Q; P& k2 w+ c
haClose=haCloseVal;# V: l8 e. [, N  o
//--- set candle color
) c6 A, [! {) C3 x2 A  ^, Tif(haOpenVal<haCloseVal)
5 e, j! [3 S  w, Z& qhaColor=0.0;
  j0 P7 T0 o8 p# e  f" z% Yelse
. ^9 _8 a' b1 _% x' B/ f* G) _6 }haColor=1.0;
4 o& q) |0 c5 i8 n+ ~$ S9 J- x}
9 H) u4 c1 D9 m% Z- ~终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。4 D$ N3 c" ]3 ^% C, u& P. T2 Z! V
return(rates_total);1 W& X; v% V2 U  F
然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:3 O9 i  r/ p. ]
//+------------------------------------------------------------------+
6 b" A( b) I) Z, |2 ]$ q' `//|                                             simpleHeikenAshi.mq5 |
) S. B+ D  s# o; v) m2 O/ o//|                                  Copyright 2023, MetaQuotes Ltd. |- A' a9 K4 B  s0 x, \' j
//|                                             https://www.mql5.com |2 A& U7 Y9 z% y; e& V3 g5 n( g
//+------------------------------------------------------------------+( C5 ~! _, j  S, {3 q
#property copyright "Copyright 2023, MetaQuotes Ltd."- q2 v$ N. [8 |2 q
#property link      "https://www.mql5.com"
, N' }9 i: y9 a  g#property version   "1.00"
: _3 w4 A: D. x#property indicator_separate_window/ t; ]# U2 r- e1 `. T- v# A0 E
#property indicator_buffers 50 A" T8 y$ O: _7 X5 S7 C
#property indicator_plots   1# {; d" ]& p5 X0 U5 z7 J
#property indicator_type1   DRAW_COLOR_CANDLES
: D5 E% _# `9 K/ V5 U/ o' B$ F#property indicator_color1  clrBlue, clrRed& J- J# S# W3 G% d9 b4 o/ y
#property indicator_width1  2+ F: h$ G, W+ [+ C
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"; q4 q1 W0 y; E' [6 c8 ^
double haOpen[];  K, H& F3 J1 w( }& K5 b5 K$ @
double haHigh[];
" R' q+ c; ~% \0 y$ o6 Kdouble haLow[];5 @8 Y* Z/ ?' U0 f$ p, ]! j
double haClose[];2 ~9 F; [" [2 t, o( U$ \
double haColor[];# {; r9 N7 Z9 k& m$ e5 S
int OnInit()
7 V' Y  r& j0 Q2 U3 ^: T% y! F; k2 O{  ]4 m5 @7 {. e8 T5 D5 r1 G  r
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
, v! R0 W3 u5 x% n, w0 \SetIndexBuffer(1,haHigh,INDICATOR_DATA);
! J# m4 q3 d- O9 W2 O7 z5 M# FSetIndexBuffer(2,haLow,INDICATOR_DATA);
' m$ r  Z% R) [. s: S1 H4 Z1 e0 vSetIndexBuffer(3,haClose,INDICATOR_DATA);2 w4 ^: F  A8 ?/ C8 W- P+ U" q# S. b
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
4 ]& s  I; F+ R5 W; G! a. ]IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
/ k- e3 Q9 I- @* `7 U! [IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");; M+ ?7 d" z- A9 C/ R
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);3 P" p$ m" _0 F7 }  H$ q9 h
return(INIT_SUCCEEDED);
+ Z+ v& c0 i6 f# ~5 Q0 Z. _}
, r1 N' N4 a3 [7 X9 i, L3 d# o# oint OnCalculate(const int rates_total,! t8 R3 z6 l% V0 G/ @7 l! A0 T; y( G
const int prev_calculated,& A5 s8 B9 R! _- P
const datetime &time[],
8 z2 e; e7 Q6 Z0 E7 Mconst double &open[],
- A" J$ }3 M! \const double &high[]," o# Y* d- b" Q# F1 @6 P
const double &low[],
% L! U. W. w4 R; i0 ~( Yconst double &close[],& F, Y* }1 A$ m4 T
const long &tick_volume[],
0 p8 M+ `1 I2 K  v8 {  ~: {+ tconst long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-23 07:42 , Processed in 0.647772 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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