私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
1 z6 t. \$ y. z% P我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。+ R& c1 |8 u0 Z. d
赫兹量化交易软件# H8 e" N  k, O, z  A' H# t
自定义指标和 Heiken Ashi 定义' L" }8 }5 G% M2 g8 G0 F
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
: q* z0 b* q$ e. R- U% r# }9 B, m简单的 Heiken Ashi 指标0 L) @, Y' y3 w
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
% o$ \  d, M1 k; ]我们来查看创建此自定义指标需要完成的所有步骤。9 H: t8 Q$ s' o3 \9 d4 ]
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
* x& O1 m6 i% z; \(indicator_separate_window) 在单独的窗口中显示指标。
% ]7 w4 P9 j5 c9 Q$ V9 W8 I' |(indicator_buffers) 确定指标计算的缓冲区数量。
3 }5 L7 v7 n: e9 V; L6 q' P/ F# z(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。; `: ]$ X2 a# @+ I7 ?* b( X9 y
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
, ?" N. o  K2 |- \+ X; ~) c(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。/ N* z" T! U6 i& g, |
(indicator_widthN) 还要确定 N 或图形序列的宽度。4 I( U: `; L$ `" O& L3 l. U
(indicator_labelN) 确定图形序列 N 的标签设置。. j) P: q, h/ g9 d# v, F
#property indicator_separate_window
3 W! o* U6 |  j; m& O3 Y0 ]5 N#property indicator_buffers 5* A# a, n; Y" x: ^
#property indicator_plots   1
- P" F6 X3 K  W8 p: W. ^#property indicator_type1   DRAW_COLOR_CANDLES4 Y5 T+ D- o9 Y* b8 j; Y4 s
#property indicator_color1  clrBlue, clrRed
; P$ ]1 A+ v3 l( n#property indicator_width1  2
! z( z( }( l/ B* v9 {#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"$ `6 g* C( ~# Q  G8 |
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
8 k* k% ^4 V2 z3 P8 A) b: s  \( Kdouble haOpen[];' U3 h: T! N0 Y  H! e6 K
double haHigh[];
: p# z# l/ M5 I* W! _double haLow[];- I% C- N+ z4 M' W
double haClose[];
/ b4 {) a! w* Q/ f8 D: q; Ndouble haColor[];4 w9 _" l6 q7 Z; ^! }6 K
在 OnInit() 中,此函数初始化正在运行的指标。+ i* J9 S' V' G9 Q. w
int OnInit()9 u+ f* i* [5 A$ }) z% p; ?1 p
调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件; x# X( ~- @* v* Z$ H' X0 W
其参数为:4 X; w. ?& b; F0 S3 j, n: \: q+ B
index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。3 l$ k  [0 L% ?8 r- @6 d3 H& u$ _
buffer[]: 在我们的自定义指标中声明的数组。
" m5 q3 w4 q5 bdata_type: 我们需要在指标数组中存储的数据类型。3 ~# C& E5 ?: s! S) E  E$ E
SetIndexBuffer(0,haOpen,INDICATOR_DATA);8 d  s5 |4 N7 j5 K7 r1 f5 l
SetIndexBuffer(1,haHigh,INDICATOR_DATA);7 \* V. o' o. q7 n! R: _- k  I: O
SetIndexBuffer(2,haLow,INDICATOR_DATA);
- N1 B7 M# O% ySetIndexBuffer(3,haClose,INDICATOR_DATA);
/ G% r2 `) j( ]' {6 g) bSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);- U* P* @; W9 l# R3 x1 E1 t
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:! e# q3 W1 ~& K) g& |+ Q8 |- H
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。( u, k' ~; ]) R0 Y% j$ G' A
prop_value: 属性的值,我们将指定(_Digits)。" w' P( c2 v  a  x& Q% ~3 a$ j
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
. c3 {5 b" F/ B8 Z1 v5 B: e调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
/ Z8 _/ `0 `) q/ n. N5 [* H( U1 \prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
% w9 x/ ~$ J0 m) t) R8 Kprop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。! E! X2 X% P! a" `" q  Y. N8 C
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");4 `: u7 b9 c# p( K$ p$ N. j6 P
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:# f& T# I( G! H, k; |3 F/ |
plot_index: 图形绘图的索引,我们将指定 0。
3 x6 g$ b! O& A6 m9 p3 rprop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
- V9 T$ D6 M, \6 Gprop_value: 属性值。
! \- T1 V. ~; [& vPlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);/ O$ ~/ X& O6 P1 E4 v
然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
8 _0 h/ s3 k# F' Dreturn(INIT_SUCCEEDED);
/ h3 }" J6 B: Y& W4 ]在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
: q4 B# r9 j/ ~8 Q基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
$ L7 e3 g; V- c- ]/ k4 A, E# Hint OnCalculate(const int rates_total,9 p5 v- I6 W7 t$ {2 L! ]
const int prev_calculated,
2 ^% ^; I; ?9 H9 i2 L' m% @const datetime &time[],
, o0 ?6 f! G8 c% dconst double &open[],# f8 e: b3 [+ Y+ _
const double &high[],
, h% K6 G* b2 N6 V/ h) M  ?& O9 ]1 v/ mconst double &low[],
; \4 f8 a$ w- ~- J/ w4 ^const double &close[],
8 ^9 \% M9 }4 \& M2 ^const long &tick_volume[],% R% ~* C# R( K) M( H" m
const long &volume[],
. Q/ |+ E+ s+ F7 n4 cconst int &spread[])1 l, S7 l% ?6 Q$ e; V
创建一个整数型 “start” 变量,我们稍后将为其赋值:0 [# A  }2 t! j! `% X% e
int start;
/ P: M+ I7 t+ W" y1 ^使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
) u- ]7 g7 m3 Y: Gif(prev_calculated==0)
* r4 h" w9 {' e" s, h& f{
2 G7 E. x3 X# Q) g$ jhaLow[0]=low[0];
$ j' G+ \5 v/ @- Y4 x/ _haHigh[0]=high[0];- y4 J$ p& x% ~, o8 \4 o
haOpen[0]=open[0];
+ E2 Q- b8 o, E4 j. M( OhaClose[0]=close[0];
8 g, b7 h: C4 [3 Cstart=1;1 {$ O) x- F' V* e5 t
}. G: G# @7 U0 B
else
+ Y! Q% z3 T) ^start=prev_calculated-1;$ y* Y  }. G+ V9 ?0 X( @% z0 M
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。
% K* E0 x+ N5 U这三个表达式将是:: I; P  ~  p9 I# q; r
i=start: 对应起始位置。7 @# }* y* X* g* H
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
0 ^% h5 m) f- ^; o. _& li++: 加 1 作为新的 i。
1 m. I! Z9 {) L6 B我们每次在循环过程中需要执行的操作:
3 z6 r# p' z1 |3 t3 P4 w$ O计算四个双精度变量
7 \( m" u, Y! U2 L$ A9 q& D" ZhaOpenVal: 对应 Heiken Ashi 开盘价。' v$ v( i1 f8 H1 c0 ~' N
haCloseVal: 对应 Heiken Ashi 收盘价。
/ |( |" e# ^$ l, {1 ahaHighVal: 对应 Heiken Ashi 最高价。& G3 [2 k+ i/ |
haLowVal: 对应 Heiken Ashi 最低价。2 _! g7 n! f- v9 z% N4 D- P
在上一步中分配的计算值与以下内容相同/ F( ]  Q- `$ `" }! m# H6 B, H
haLow=haLowVal! B: @% C* C/ V  r; q6 ~2 S. M
haHigh=haHighVal
9 A0 `- A: f7 H  m; w! shaOpen=haOpenVal) N9 o9 G- t4 Q) M
haClose=haCloseVal
6 b9 h6 w* F8 X! [, k5 G6 U+ b检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。- C, s: M9 a7 L& E# L
for(int i=start; i<rates_total && !IsStopped(); i++)
( }2 s# R& x% G0 I/ s" l{
( F% W3 d8 s. C$ v  e. Y/ x) udouble haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
6 D* H! ]+ \) @$ v8 M) G6 {double haCloseVal=(open+high+low+close)/4;- K0 t+ d/ O" O; X& K! v# t
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
' _0 G, X1 h4 r: Tdouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));& x! ]( p8 _  c
haLow=haLowVal;
9 _0 _( w, x0 |7 n' yhaHigh=haHighVal;6 ^2 G4 l) Q1 r/ P2 O; ^7 E
haOpen=haOpenVal;4 c% h" O6 J; y8 s$ \. G- t
haClose=haCloseVal;
% x: e/ Q, U- E" V, |- w4 p& C- k//--- set candle color
: r# M3 f3 z- ?/ ]( ^! iif(haOpenVal<haCloseVal)/ m$ e7 z2 q, K, ~# U' M
haColor=0.0;7 r7 w" P) l+ r5 j1 |
else
+ C- y- m9 k5 _7 [# xhaColor=1.0;
- s3 W6 u: N6 @) s& Q1 D" y  i}0 K+ ~' h0 y7 d8 j) H4 M
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。0 g0 J9 s( x6 t0 Y: b
return(rates_total);
; ^7 j, L- f  j' F3 F然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:
' g/ b. X( A9 |' W" [, l$ x//+------------------------------------------------------------------+# b4 W4 j5 w, h+ M
//|                                             simpleHeikenAshi.mq5 |
; F0 D/ h2 g8 N: _//|                                  Copyright 2023, MetaQuotes Ltd. |
( K8 e7 B0 t- _//|                                             https://www.mql5.com |
% w3 g; g1 j# }, Y! D# E+ M& `//+------------------------------------------------------------------+) C1 Q; v' O3 `* y* u& V  J
#property copyright "Copyright 2023, MetaQuotes Ltd."
% w3 }+ w1 x9 z" i#property link      "https://www.mql5.com"8 r! Q" F5 R- |
#property version   "1.00". g& X2 k* V0 b3 b- w
#property indicator_separate_window
3 ?/ x) `2 ^) P+ \#property indicator_buffers 5$ F) _! Y% n4 Z7 R
#property indicator_plots   1! n, C0 j$ X" s% S  M: m" V' ^
#property indicator_type1   DRAW_COLOR_CANDLES) O1 ~' j1 H' O3 X7 \
#property indicator_color1  clrBlue, clrRed1 }- O  g+ [8 s) _
#property indicator_width1  2
  G: R0 I9 j! T0 I: @) H#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
) V4 {3 n  I  k1 [double haOpen[];! N# L  Q( T( Y% l  _0 A
double haHigh[];$ _( Z9 o2 a) t  I: z" ?3 o" p( W. l
double haLow[];$ Y" t  N0 V, c! i! P, Y3 O
double haClose[];
# B) I6 Y) r2 B; `* |! Edouble haColor[];5 o# x" \8 ~% q7 p8 ]0 i! a+ x
int OnInit(), D8 _2 t1 x' D
{6 e# f: b% \3 m0 B& b, E
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
2 z. U: G% S  L; o8 V0 y1 M$ JSetIndexBuffer(1,haHigh,INDICATOR_DATA);
) i  R7 a! }5 r* ]+ j; L% @. \SetIndexBuffer(2,haLow,INDICATOR_DATA);% b/ Y6 T/ l  f
SetIndexBuffer(3,haClose,INDICATOR_DATA);
9 N6 O' k1 e  r. }5 j: cSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
6 S3 f: |% J8 _; TIndicatorSetInteger(INDICATOR_DIGITS,_Digits);0 {' Z7 @3 _0 j, }
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");7 A) w& [. m4 `+ j6 @, h, U8 d- p
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
' e" B% p; g! Z- o3 O5 Greturn(INIT_SUCCEEDED);
# X( h+ I2 U2 g" [7 ~( t; ]}2 h$ B4 f! W2 w4 P( \, N# c1 F
int OnCalculate(const int rates_total,
7 f# ?2 r. k1 [& `2 P$ tconst int prev_calculated,
+ G( H! m/ J8 K- ^% O( e3 Hconst datetime &time[],+ z( n7 o/ v5 F8 s
const double &open[],% K( w: H$ ^9 z# R* `
const double &high[],
9 W1 B' T  v4 W1 ^& c0 Pconst double &low[],
# N% ~9 P* M1 Z0 p! uconst double &close[],
3 U. Y2 x; C4 @. X- n/ econst long &tick_volume[],7 y4 A2 e- t' g" x9 S( E/ h
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-18 15:37 , Processed in 5.809526 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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