私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
$ Z) g1 b' n, J8 z我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。/ W7 b; \# ^9 a6 T( k* g
赫兹量化交易软件
- `) T, b. H) x9 e/ B& C! J5 R" u" j自定义指标和 Heiken Ashi 定义
# ^. j9 [  S0 W* r在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
! I: [% q" I; Q: M# n简单的 Heiken Ashi 指标
5 f2 p  l+ L! y' ]. L. m  c在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
' r* \8 r* b: i# s4 i我们来查看创建此自定义指标需要完成的所有步骤。# \  O  t0 {& f: G; [' J8 Z  j
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
% h1 K$ B; a8 a(indicator_separate_window) 在单独的窗口中显示指标。
/ J4 c. _! a7 M, J0 G(indicator_buffers) 确定指标计算的缓冲区数量。4 `! W% z  H5 \; S
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。
# }, a8 v+ c% O8 Z* f" u! _6 q(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
- L* W; O2 f& m(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。
5 Q! ^) q8 O- ]8 |0 \(indicator_widthN) 还要确定 N 或图形序列的宽度。
$ ?' p( W1 Q2 @! S* l* Q; y' e(indicator_labelN) 确定图形序列 N 的标签设置。
# f, b: D* b$ i0 W#property indicator_separate_window4 y( r% l5 ~* F1 R: e0 k
#property indicator_buffers 5
7 U- J/ e8 i/ v% ^. l+ E#property indicator_plots   1& p4 O9 I+ s7 }* n5 ~. y
#property indicator_type1   DRAW_COLOR_CANDLES
: S7 Q1 L! ~' Z. t7 X7 ~5 o#property indicator_color1  clrBlue, clrRed
! C/ ~, z' t4 T; n" v6 }& h#property indicator_width1  2" a( o7 R7 y; k7 |3 S. e
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
) j6 j# Z) J; m, `5 i) d! j4 z& c为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。4 j' Y! ?9 U7 G7 P; X4 Y: @
double haOpen[];. Y3 b* L5 L" }+ {
double haHigh[];3 i' Q  `5 e' Y& f: F! m) a' X1 Y
double haLow[];
  B+ C  F6 ~6 h, O/ w/ Ddouble haClose[];) o" s' j+ I% C# ]8 |" m2 G' U
double haColor[];
% l: {1 l7 W0 |' [在 OnInit() 中,此函数初始化正在运行的指标。' \5 X/ g- k! a  |
int OnInit()
1 E5 N& F3 o+ H1 H调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件
8 A) T. @' g' X% ]" A其参数为:
7 b+ m" L% Z& c6 y, c0 Qindex: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。& t2 N  h4 i% b  K. R/ y
buffer[]: 在我们的自定义指标中声明的数组。
( L, _) F6 G0 x  }  \data_type: 我们需要在指标数组中存储的数据类型。& E% X0 p& E! {, W8 D$ D, }: _
SetIndexBuffer(0,haOpen,INDICATOR_DATA);; Q: f* j6 B  v. i/ x1 e9 D5 l# f3 F5 z
SetIndexBuffer(1,haHigh,INDICATOR_DATA);
6 j3 @4 ~( h1 u$ s- w8 U: NSetIndexBuffer(2,haLow,INDICATOR_DATA);
3 P/ z" ?* d7 t+ m4 V9 l' {/ \# u5 PSetIndexBuffer(3,haClose,INDICATOR_DATA);
& q+ T2 [, V% e' Y: |3 cSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);/ i+ r* D* n4 g/ V$ `5 v
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:
9 {. B* |+ v: r# z% u$ c) R  sprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。" j/ ?6 _5 L2 a3 r# M" {$ w0 p
prop_value: 属性的值,我们将指定(_Digits)。
* u: r" i- G1 D$ M3 HIndicatorSetInteger(INDICATOR_DIGITS,_Digits);
9 ~+ Z9 \3 A+ E" d6 N1 R0 [3 L& a, O( b7 V调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
0 B+ Z8 v& F) cprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
! t7 a& T+ c( u) @prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。
$ ~2 N* g- ]7 s  EIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");* c$ d" z" N3 m# \6 [! {$ n
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:" P* U/ A* E7 B
plot_index: 图形绘图的索引,我们将指定 0。# \$ `" i, N' b4 Q' u- A
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。3 M: `' S- N+ H) |0 g/ V" C
prop_value: 属性值。
+ X+ ^" J5 i7 ?5 a8 w8 ]0 I6 w& ~PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
, c8 g/ ^! p( Y+ h& |8 L然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。! C. L9 e# ?- e7 \. b
return(INIT_SUCCEEDED);
# e' ~) M( ~2 S5 {9 h/ [3 o' v. y+ X在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件
: |/ C! x& f1 |, C* q) I5 G基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
6 T& ^' o# Z$ ~* b5 j5 N: Fint OnCalculate(const int rates_total,6 l7 R! Y" S) W/ U$ P" T# r
const int prev_calculated,0 `- o! [: T8 X& Y
const datetime &time[],
* [% x# G/ N) @- B, P" J) T( N% Hconst double &open[],8 n4 I2 [8 \2 G( ~0 J6 ^
const double &high[],1 A/ p; {( P8 _/ G
const double &low[],
* h7 e, J1 L5 ?  L% s$ ^/ c0 Hconst double &close[],( q7 W1 [! F" d& K! V8 m
const long &tick_volume[],
( R% f  g: A" c* F! o/ D- m" Jconst long &volume[],( H, C( V0 a; c3 y# N
const int &spread[])- |( y; n3 s8 \$ N  b% X
创建一个整数型 “start” 变量,我们稍后将为其赋值:: n/ O; S* {: J7 Z( @
int start;
: G, c* Z  L- n6 k! a; U使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
* }( E% O3 M' s/ wif(prev_calculated==0)  {. F, u1 i$ F' C. c
{& Z2 i: i" ~1 ]0 ?: m. S
haLow[0]=low[0];' F: U8 ]+ c' S/ |5 \
haHigh[0]=high[0];
. _9 f5 C5 p' l* B4 thaOpen[0]=open[0];$ }5 t5 h* g4 M& B. I$ F
haClose[0]=close[0];
. _& l5 ]# B' Z# p9 K! tstart=1;; O5 Z6 u" N( U
}6 K; a0 c- r8 J. E/ j) t, l
else  L. c% H4 `9 L0 c+ F/ l1 x
start=prev_calculated-1;, Z! R# k2 x8 U3 T4 z; Q- o0 j+ k
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。
/ H% X* x# E+ r0 u# i' I这三个表达式将是:
9 R8 }" w+ k( o+ `  D/ {# ]i=start: 对应起始位置。: a" L1 q: ?, k, `4 ]
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
, J5 b8 t$ `) j" Ji++: 加 1 作为新的 i。
1 L9 |* [' S" N: d3 d我们每次在循环过程中需要执行的操作:0 E, c3 y& |) x7 _# n! B: i& K/ h4 k
计算四个双精度变量
- n& @- F( n( `% `; {haOpenVal: 对应 Heiken Ashi 开盘价。- _- p9 w: x* h3 M; P* y
haCloseVal: 对应 Heiken Ashi 收盘价。% G: p4 N9 E$ z$ q' K9 }
haHighVal: 对应 Heiken Ashi 最高价。
  V4 P' W- k. o3 ^& O& chaLowVal: 对应 Heiken Ashi 最低价。
' }( Q3 u% r! l' I在上一步中分配的计算值与以下内容相同$ t4 m0 z/ E# d' {# q& R" c7 V
haLow=haLowVal5 `5 m. e. O  V
haHigh=haHighVal3 I8 @- A# f! I' w9 G/ [
haOpen=haOpenVal7 \/ D" e$ s3 R  P. R) P
haClose=haCloseVal
/ Y9 A4 w& z, ^3 S) A7 I/ d8 w( d检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。# R6 B: ?- ]! l9 c" y" A
for(int i=start; i<rates_total && !IsStopped(); i++)" q" {: w; \, Y5 L
{0 I3 o: _, y$ @
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
# u8 F4 M- @! j3 s5 R& t& v6 Qdouble haCloseVal=(open+high+low+close)/4;7 Z/ _  a- p- W  Y- g- y* {
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));- T( E. ]+ {5 s9 c. ?
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));
+ h2 F7 e' \# l! Q$ Q8 VhaLow=haLowVal;7 Z2 {' @' a1 w! d# ^7 z' p! X
haHigh=haHighVal;
& T2 U4 L" g6 f# y7 ~3 ~5 x, shaOpen=haOpenVal;, p8 {& }5 C4 B  V; j9 I
haClose=haCloseVal;8 E# Z/ M  s; i* j2 d, r
//--- set candle color- O3 I1 y+ A4 |- \# i! X6 ]
if(haOpenVal<haCloseVal)
& Q; X. z5 c% \5 d: i/ Z4 D. BhaColor=0.0;
; \9 _& \1 ]0 A/ i$ pelse
) ]$ x. z" y! [$ a5 [haColor=1.0;2 Y5 g/ S$ t4 W$ S+ ~% K- v. U
}9 Z) ~+ D6 ]- @. E' j% L! L
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。1 a0 r* g3 N' ~% \- z* r7 }( V
return(rates_total);
* M# C0 p! j" X- o/ D% w. m4 d然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:+ ^3 \7 ]! Q5 l. |( D( I$ L
//+------------------------------------------------------------------+
8 {8 C" k/ F; X" n: s$ s. q//|                                             simpleHeikenAshi.mq5 |. @) X- q5 t! a9 l3 t
//|                                  Copyright 2023, MetaQuotes Ltd. |9 w# g- q! [' W+ B
//|                                             https://www.mql5.com |
# X! W5 `: u% ^2 d//+------------------------------------------------------------------+
9 Y) r7 W+ x6 }! u- _#property copyright "Copyright 2023, MetaQuotes Ltd."2 A3 U! d% s- i$ E2 H+ e0 x
#property link      "https://www.mql5.com"0 s8 R  H# f* n# s8 s& `
#property version   "1.00"0 I( |+ l  U7 c$ R7 o
#property indicator_separate_window
, B+ ~0 s, j+ Q# J! M4 V#property indicator_buffers 5
# P1 V) P& c9 o% [% Q7 {( A#property indicator_plots   1. g* {6 H2 w9 g4 l  y4 z
#property indicator_type1   DRAW_COLOR_CANDLES
7 S- I: R& i: G1 k#property indicator_color1  clrBlue, clrRed
! A! Z% c7 a! Q- x2 w5 `#property indicator_width1  2
4 o% d+ O/ g" r, K% A#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
8 h( z* y0 a/ }  [$ a8 zdouble haOpen[];
$ M& b! H1 B5 t: o0 {0 I& n: Q1 W# adouble haHigh[];
5 J% P) R7 Y8 W0 t. o9 n% ]0 J7 }. g& xdouble haLow[];* E6 g! g/ k5 v" d2 ?: t
double haClose[];) z+ P) |6 G& M$ w* _( g( m; w
double haColor[];$ y4 h6 f; A) T
int OnInit()4 z% T+ I, V4 A* b3 W& u: q
{
$ @5 T( b4 Z% L8 o$ lSetIndexBuffer(0,haOpen,INDICATOR_DATA);
! |9 D! c, p# o! {: RSetIndexBuffer(1,haHigh,INDICATOR_DATA);
$ V5 [. N5 ^9 q$ Q- ySetIndexBuffer(2,haLow,INDICATOR_DATA);
! z# _/ p: w6 bSetIndexBuffer(3,haClose,INDICATOR_DATA);1 M' t& g6 E9 }
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);- P/ a/ j/ a; }/ A: }+ O% {4 R
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);2 a+ X' Y: h; l7 j
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");( R1 |) L2 Q$ S- y9 _
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
8 p3 c) A! A& ~) m. d+ x8 Q5 Q6 Ireturn(INIT_SUCCEEDED);
5 o! |- |6 \6 v7 C9 v& W/ t}6 f; X; r! L' A3 X& [4 t  _
int OnCalculate(const int rates_total,
1 N( `; V+ i' v. D6 q: y5 B5 Dconst int prev_calculated,. H  M& m+ x5 e9 @% }- o" s
const datetime &time[],& Q. x9 Y* g. m. X& R
const double &open[],
0 C( g; l) z5 e9 @7 g" X( nconst double &high[],3 x; u' Z/ t0 I4 R6 y: f( w
const double &low[],
: t2 V0 c+ b( u4 L; Oconst double &close[],
1 F/ X! g! N% C6 X7 b/ l! Y% Gconst long &tick_volume[],: {4 D, \/ \) ]8 P9 E
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

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

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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