私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
0 O4 t4 |0 ?' n" z, i# Q我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
3 b0 L/ ?2 H9 l4 P* h赫兹量化交易软件
6 U: |2 Y4 q# _自定义指标和 Heiken Ashi 定义0 z; L; z% Q/ z2 E
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
! G$ |: k# C) y: C/ n. y) a简单的 Heiken Ashi 指标; y8 ^3 E2 q6 e8 Y- Z8 g1 n8 h+ Y9 R
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件; c, u# A/ B) x5 `+ `( Y
我们来查看创建此自定义指标需要完成的所有步骤。
% @; q0 |% b" X* C通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
: Y! b6 f+ B, L- X) j(indicator_separate_window) 在单独的窗口中显示指标。( d' }' N0 M% |* W0 K6 ?
(indicator_buffers) 确定指标计算的缓冲区数量。% s5 u* ^7 ?) g5 G. n- c) C
(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。/ ~) @$ c$ s+ e4 ?  b" a, n* }
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。
, T1 ^9 T2 Q8 ^8 F(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。: v$ m4 C( P5 `( \3 Z$ h7 [) a' ~# \
(indicator_widthN) 还要确定 N 或图形序列的宽度。/ R$ M" P0 \9 ~
(indicator_labelN) 确定图形序列 N 的标签设置。, U  U0 j8 g  ^
#property indicator_separate_window8 ]1 h/ ?% T3 T* I- f2 n+ o1 l+ G# P$ h
#property indicator_buffers 5
' k0 V  s! `5 ~9 ?) y  ~- S#property indicator_plots   1
' y/ U8 l" Y# t* U#property indicator_type1   DRAW_COLOR_CANDLES# H$ v0 ^) j7 `1 O3 [  {5 I; S
#property indicator_color1  clrBlue, clrRed
$ c" K7 \+ C0 f0 D( X' g- J1 A8 A#property indicator_width1  23 [; v( O  n7 W; Q0 ~
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
. m6 }  E' j& q, o$ b7 |5 ~& r0 Q3 ~为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。
9 d/ @) C# y: t& ?: Q7 qdouble haOpen[];
7 t, `8 f' W% G8 x3 n6 ~3 Cdouble haHigh[];
2 h% i0 K) V/ M% }8 |, Ddouble haLow[];$ R& n4 `% s2 `$ Y& m# n
double haClose[];: P- K' [' s& I& b% U: w  a
double haColor[];
9 n1 L5 {6 H, j: u, G% e8 l9 J& t( Y在 OnInit() 中,此函数初始化正在运行的指标。+ `% Q9 K% [& Q7 P( p/ c
int OnInit()
. p$ @6 v( J2 |7 e调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件* p8 w6 _+ K2 N$ b
其参数为:
- n1 H, o  d9 `, s1 x3 x6 ]index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
& ]/ M9 c+ d0 }9 H  x7 t, ~; c! p# Ybuffer[]: 在我们的自定义指标中声明的数组。
& }- B7 n7 H- J. U7 h' ~9 Ldata_type: 我们需要在指标数组中存储的数据类型。1 E7 b! |  ]) D7 m* N, Y
SetIndexBuffer(0,haOpen,INDICATOR_DATA);
. F% y( _7 s1 n% R6 ySetIndexBuffer(1,haHigh,INDICATOR_DATA);  m5 z$ V1 N' W- J. k' w! |$ }
SetIndexBuffer(2,haLow,INDICATOR_DATA);1 b3 ^4 k9 ?9 I$ B& C* \
SetIndexBuffer(3,haClose,INDICATOR_DATA);& T( B3 k  T5 x0 H/ K5 P" T8 `
SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);3 ^  e& i( n' j0 |% r9 C* X
通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:3 G8 J$ K% _- }1 u9 ~) O5 B; f' q
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
0 a8 ]- r4 z* `/ {prop_value: 属性的值,我们将指定(_Digits)。( `+ w# c2 R# y2 Q
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);; B  O6 `3 v5 f
调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
* b  m1 [% H' s8 R& D4 dprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。
3 f* m. @( `+ d% p9 }prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。4 c) s% S) `4 q3 Q3 g7 C
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
: b4 y7 J/ k8 K# z, ^调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:7 `6 E' X! ?- Z( {! o
plot_index: 图形绘图的索引,我们将指定 0。
' Q: ]( O* L3 U$ ?; E, Cprop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。' s( ?$ s" o7 G$ F' G8 \" C
prop_value: 属性值。0 y' Q: P" J% f. U5 Y6 r! t
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
6 W4 q9 n; o$ W+ I% H6 }. |然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。
% B3 [$ L+ B5 H1 {1 D. k; mreturn(INIT_SUCCEEDED);  _% Z+ N; X: B; b- N) p
在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件& K8 I& W( b& d5 d& w8 x5 D3 l: _
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。
, B( x  q- B/ }6 v( y0 W! vint OnCalculate(const int rates_total,1 G& v& n% s2 b& w) S
const int prev_calculated,
$ X4 A/ J1 y7 v, e' _) Vconst datetime &time[],; O$ k0 K4 Z6 d. l+ ]& A7 t. K
const double &open[],& _7 g. x0 T( F. `
const double &high[],
+ w* a" `/ `; B% V% h7 Sconst double &low[],
& j' R( k6 ^0 D# ?" J! P! p: u4 }. r; Jconst double &close[],; C4 \: ~- W8 |4 {' y8 U. i2 Y; h
const long &tick_volume[],
1 F) |; K% D1 Y6 Z. l* ?7 dconst long &volume[],
" f4 _! e5 V- ^5 w2 l0 fconst int &spread[])
5 e9 U5 E) i" \; c9 K创建一个整数型 “start” 变量,我们稍后将为其赋值:
2 C3 {3 |) [/ [6 Tint start;0 w! P% d+ ?$ U% \4 ?; Q& g
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
3 W/ R- ^4 m/ k) O# Oif(prev_calculated==0)
. B  l; T( Y0 h( Z7 K" T{
% T% q. Z3 P: c* }) o( ahaLow[0]=low[0];+ s% u' G% Q* A' R
haHigh[0]=high[0];
0 V/ S# s6 Z, L4 V) m" ?haOpen[0]=open[0];% w% A% d+ x7 P9 c6 F2 B
haClose[0]=close[0];
$ x) r: i# P# E% i3 Sstart=1;0 R( _4 ?8 G9 X; t; Y5 c! ~
}
9 S6 o) ?4 p$ `- F' j9 V7 A8 jelse/ L; z5 o' |9 |4 [7 N. K. }
start=prev_calculated-1;. B6 X+ `! y+ Q6 Y
在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。! k1 g5 h  Z* O0 C; k+ y4 F
这三个表达式将是:
7 }3 L1 b1 x/ o0 G0 Ti=start: 对应起始位置。
" P) |$ w2 h. n3 P% t4 }i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。
: B+ i9 e9 X+ qi++: 加 1 作为新的 i。
" }2 N' V. W5 c% Q7 t我们每次在循环过程中需要执行的操作:+ F; @0 y$ {6 S2 D
计算四个双精度变量
2 ~9 N: o5 f/ |' {haOpenVal: 对应 Heiken Ashi 开盘价。8 ^+ {' s! W& X! u0 n
haCloseVal: 对应 Heiken Ashi 收盘价。9 N1 A& ]+ _: l+ W
haHighVal: 对应 Heiken Ashi 最高价。1 B5 X4 d- s+ `2 x  w7 z5 b$ t
haLowVal: 对应 Heiken Ashi 最低价。
1 _7 ?, v3 g' f) V2 F4 W! T& i9 J- |在上一步中分配的计算值与以下内容相同
8 p* C& ?+ ^2 A" G+ z( _- O6 KhaLow=haLowVal1 |8 ?8 k2 r" G7 s
haHigh=haHighVal
; M- l, s7 m, R: R! w# o. V+ GhaOpen=haOpenVal
, b* J# D5 {2 u$ GhaClose=haCloseVal
2 T1 K  B/ Z% D; A% ^: V检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。5 Z' w5 E- l) m3 @; a: i
for(int i=start; i<rates_total && !IsStopped(); i++)
& m; M- W( K, c# `7 y{$ v# z. o7 {- P7 q: L( A, a
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;
# E8 e! y' W( c4 ]& i( J: \) ^; tdouble haCloseVal=(open+high+low+close)/4;4 z! y  b4 p0 p5 q/ b% v( ]2 A
double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));
- M% @: g0 r. ^! Sdouble haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));% t: `6 f$ X5 {7 d/ ]1 d, z
haLow=haLowVal;
/ p) q' w+ }2 N& Z* \haHigh=haHighVal;/ ~8 `6 U" w3 ]( q2 y7 y
haOpen=haOpenVal;
: p0 k% ~* Y5 l1 v+ f" J  _haClose=haCloseVal;+ i# Q' |1 Y/ X8 V
//--- set candle color
2 y+ J5 w* Z9 T1 C1 G9 Nif(haOpenVal<haCloseVal)
4 ^$ v0 b5 [5 Q1 }haColor=0.0;) {5 B; U# Q) A9 V/ Z- D  }1 b
else
0 r$ ?# K! S5 E. @9 |% K: n0 V; DhaColor=1.0;/ b" @/ g% G  b6 K1 t+ ~
}* v# U- v: e7 O& S. m, ~
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。2 L( c7 S  n# J( o- c: n* Y
return(rates_total);
" I4 n+ y6 D" B/ N) q0 z然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:
" f$ W* @4 {3 J//+------------------------------------------------------------------+
' X! d" p( b1 \2 x//|                                             simpleHeikenAshi.mq5 |0 F8 g% U  u1 d! i6 D
//|                                  Copyright 2023, MetaQuotes Ltd. |* Q. c" y/ h2 d; g1 g
//|                                             https://www.mql5.com |
' e5 z$ D; a- n( X3 e# T//+------------------------------------------------------------------+# B0 ?/ h3 @, W
#property copyright "Copyright 2023, MetaQuotes Ltd."3 `, b/ ~% T9 l) p
#property link      "https://www.mql5.com"! y6 Q! a5 W2 z! B3 {* n* a2 _
#property version   "1.00"
8 i1 g2 ]3 H7 N3 N0 V0 ]#property indicator_separate_window
1 F% F8 L' R4 ^, p#property indicator_buffers 5: b+ W4 ^% K5 Q, [
#property indicator_plots   1
  n( q0 x  Y4 q/ t* O#property indicator_type1   DRAW_COLOR_CANDLES
; G2 u) w. O5 C4 L: z$ m8 k3 A0 a3 ?#property indicator_color1  clrBlue, clrRed5 P( _1 P3 |4 h, P. J
#property indicator_width1  2
* G% L  Z, r9 [) z6 F# D8 C0 L#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"' @8 I) g  D  a6 \# x  S
double haOpen[];& K1 P6 n$ p  R9 J* Z
double haHigh[];
8 K5 s! U$ y6 H2 j* Rdouble haLow[];. b! S6 C$ Q- T( Q9 S$ |5 A  C
double haClose[];8 G- B7 G% w- G$ Z! X4 _& K
double haColor[];/ Y# n4 y6 l# R4 W% n
int OnInit()3 S; i$ G2 E2 [( H; m
{: o) b8 j4 `2 \
SetIndexBuffer(0,haOpen,INDICATOR_DATA);) [) f4 h2 w7 v( H% ]6 F+ C
SetIndexBuffer(1,haHigh,INDICATOR_DATA);% n. s/ ]2 b! n% h  N3 @; P( T
SetIndexBuffer(2,haLow,INDICATOR_DATA);
+ y5 d+ U8 g+ H0 I& ]8 qSetIndexBuffer(3,haClose,INDICATOR_DATA);
! _' |9 |0 d# [SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);( c. q; ~7 x2 _5 O7 W0 h
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
+ d$ v, a6 s# X( n/ M( Z. wIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
, x" Z$ ?8 h+ c4 P" N8 P8 sPlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
; f6 t) N1 p) A0 O: oreturn(INIT_SUCCEEDED);/ d  r1 n( ?1 [+ Z7 M* d9 ]& y2 s
}) k& Y. H: u0 x# h
int OnCalculate(const int rates_total,- u# w& C# o% z
const int prev_calculated,
! L" j  }2 `  }8 B6 yconst datetime &time[],
, w7 s, B/ P' a# i$ a$ oconst double &open[],$ R2 x  q* x* e8 w
const double &high[],; h% R( j7 l# H- C4 y* o3 T
const double &low[],- \- ~' L& d' T4 H
const double &close[],3 N' k1 C# M- x, k8 N! \& Q
const long &tick_volume[],7 I6 ^- S# {0 t% z8 J2 Z( g$ W
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 18:03 , Processed in 0.614705 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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