私募

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

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

[复制链接]
发表于 2024-4-9 08:32:19 | 显示全部楼层 |阅读模式
概述
  @2 U# }7 N0 b) N3 M1 e我们都需要读取图表,任何可以帮助完成此任务的工具都会受到欢迎。 在有助于读取图表的工具之中,指标计算可基于价格、交易量、其它技术指标、或它们的组合,而在交易世界中存在众多新奇的思路。 我们在交易终端中内置了很多现成的指标,如果我们需要添加一些功能以便能适应我们的交易风格,我们会发现这有一些挑战,因为也许无法更改它,除此之外,我们也许无法在交易终端中的内置指标里找到期望的指标。
7 q* j% e( o, c' r2 d" N' R  F赫兹量化交易软件
- Q9 Y2 D% n4 J6 w. P/ |& T9 z自定义指标和 Heiken Ashi 定义: H2 {6 ]  R& L8 a
在这一部分中,我们将更详细地学习自定义指标和 Heiken Ashi 指标。 正如我在上一章节的概述中提到的,自定义指标是用户利用 MQL5 编程语言创建的技术分析工具。 它可以在 MetaTrader 5 中用来分析和明晰市场走势,并有助于做出明智的投资决策。 有许多实用的内置技术指标,但有时我们需要根据一些额外和特定的数学、统计或技术概念来分析和理解市场的行为,而这些概念在内置指标中不存在,或者没有指标可以完成任务。 那么,在这种情况下,我们必须自己创建指标 — 这是 MetaTrader 5 平台的功能之一,因为它可以帮助我们创建自己的分析或交易工具,从而满足我们的特定偏好和目标。赫兹量化交易软件
# j' H1 k" Z4 G% `5 L+ R简单的 Heiken Ashi 指标6 ^/ [% g* V8 J  r" L
在这一部分中,我们将创建一个用在 MetaTrader 5 上的简单 Heiken Ashi 指标。 该指标应持续检查价格(开盘价、最高价、最低价和收盘价),并执行数学计算,以从而成 haOpen、haHigh、haLow 和 haClose 等数值。 根据计算结果,指标应依据数值在图表上绘制不同颜色的烛条:如果烛条方向看涨,则为蓝色,如果为看跌,则为红色。 烛条应作为子窗口显示在传统图表下方的单独窗口之中。赫兹量化交易软件
8 A& H+ a1 _  w, J$ G" B* [1 Y9 t我们来查看创建此自定义指标需要完成的所有步骤。: K6 \" @9 W$ W7 j( m7 Z: i' D
通过 #property 和标识符值指定附加参数来确定指标设置,如下所示:
' b1 c; {' e% V. I4 h# ](indicator_separate_window) 在单独的窗口中显示指标。
6 v: u0 p, T# `(indicator_buffers) 确定指标计算的缓冲区数量。
6 A, {: H1 n% y: G(indicator_plots) 确定指标中图形序列的数量。 图形系列是在创建自定义指标时可用的绘图样式。' a( v+ `0 k) a4 ]- C) o- M( j: j
(indicator_typeN) 要根据 (ENUM_DRAW_TYPE) 的值确定图形绘图的类型,N 是我们在最后一个参数中确定的图形序列的数量,它从 1 开始。0 I5 J$ ]0 A+ q( ~2 R/ E, ?, c
(indicator_colorN) 确定 N 的颜色,N 也是我们之前确定的图形序列的数量,它从 1 开始。1 @, L  i! r7 {! \: B2 R. e8 g
(indicator_widthN) 还要确定 N 或图形序列的宽度。
0 ]# U5 g/ X: Y' B: @& R(indicator_labelN) 确定图形序列 N 的标签设置。. y! q: c# E5 Q" p4 C/ P+ R
#property indicator_separate_window
) ]  V3 Y: @) o0 {4 j0 j#property indicator_buffers 5
( x  N3 P; H" w# u! m5 z& ?3 J#property indicator_plots   1
' o* j- ?- n/ @0 t! |8 T- b#property indicator_type1   DRAW_COLOR_CANDLES
# k& p5 f, @$ q3 W& U* x6 A5 s#property indicator_color1  clrBlue, clrRed
' v* @& s) O* F  x0 t) m# {3 _#property indicator_width1  2; \; Z( y6 c6 r; q5 I
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"; v( D. i8 W5 s: o" `0 q
为指标的五个缓冲区(haOpen、haHigh、haLow、haClose、haColor)创建五个数组,均为双精度类型。2 b% s$ t6 w+ X8 o
double haOpen[];% N, r) x7 h& P: i( e# J' k
double haHigh[];$ t6 r# L# X  C9 G0 g  V7 M. R8 \
double haLow[];
$ L0 V1 V' w) A! E1 }- Fdouble haClose[];& P/ ?/ V8 [+ M. V: A% W6 ?
double haColor[];
# H4 V% u2 _+ c" d& X在 OnInit() 中,此函数初始化正在运行的指标。
# e% i! ~9 ?5 m% vint OnInit()
8 k# V# i+ M1 g  R调用(SetIndexBuffer)函数为双精度类型的一维动态数组的指标缓冲区进行排序。赫兹量化交易软件1 c: T# l& V9 m* s: ]; I% l3 g3 F
其参数为:
& q7 h, {( g4 L7 A6 b2 z1 f! g$ E. ~index: 指标缓冲区从 0 开始的编号,此数字必须小于在参数 (indicator_buffers) 中确定的声明值。
9 {4 f# p1 I, k9 j% n* n; X4 Kbuffer[]: 在我们的自定义指标中声明的数组。  `' F. {4 W+ ~9 I. ~/ \$ L' f3 }
data_type: 我们需要在指标数组中存储的数据类型。+ y$ T* |! p( O! ?1 y
SetIndexBuffer(0,haOpen,INDICATOR_DATA);" p8 t  a3 M) t" s3 A2 ^
SetIndexBuffer(1,haHigh,INDICATOR_DATA);+ `/ b$ r, n4 c( T9 u' k# r3 c
SetIndexBuffer(2,haLow,INDICATOR_DATA);
: |; e4 \+ \  \2 ?. r3 K, HSetIndexBuffer(3,haClose,INDICATOR_DATA);
, j: R$ z0 b: ~3 I/ g0 FSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
  k9 i9 x6 k! d- A; p+ b通过调用(IndicatorSetInteger)函数和调用变体,设置相应指标属性的值,其中我们指定了属性标识符。 其参数为:7 \; D& P( L3 `# ^
prop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_INTEGER)之一的属性的标识符,我们将指定(INDICATOR_DIGITS)。
) B0 y9 r- t% d! `/ kprop_value: 属性的值,我们将指定(_Digits)。
1 H) o5 ]6 S: o) G0 sIndicatorSetInteger(INDICATOR_DIGITS,_Digits);
9 a3 |! P0 E3 c& S; M( \调用变体设置相应字符串类型属性的值,我们还在其中指定属性标识符。 其参数为:
# _2 w0 \5 J+ D' ^$ x( Z9 Xprop_id: 可以是(ENUM_CUSTOMIND_PROPERTY_STRING)之一的属性标识符,我们将指定 (INDICATOR_SHORTNAME)为指标设置短名称。/ w& t2 w, o( h9 E
prop_value: 属性的值,我们将指定(“Simple Heiken Ashi”)。
( P3 A# C2 j- D6 r  e% e9 OIndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");9 R& L9 \5 _# P* Q
调用(PlotIndexSetDouble)函数设置相应指标的对应双精度类型属性值。 其参数为:
6 ]. C( Q; f9 _  j! {plot_index: 图形绘图的索引,我们将指定 0。0 b8 e0 N/ A3 q; [  \
prop_id:(ENUM_PLOT_PROPERTY_DOUBLE)值之一,对于无绘图,它是(PLOT_EMPTY_VALUE)。
8 j: x4 V. p: \* `6 ^3 Uprop_value: 属性值。2 ]) x/ L8 V& K$ V
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
& e$ j" [0 v  C然后返回(INIT_SUCCEEDED)作为 OnInit() 函数的一部分,终止它,并返回初始化成功。! l: Z5 c3 Z' d: ~0 I0 M2 r+ [
return(INIT_SUCCEEDED);
& U* B6 l9 u! G在指标中调用的 OnCalculate 函数内部,赫兹量化交易软件& d1 z+ ]; T* l, a9 c6 B3 v
基于当前时间帧的时间序列进行计算,其处理的价格数据随着计算类型而变化。: A& Y! u9 y, h. w6 a, W
int OnCalculate(const int rates_total,# s6 K( U4 P  |; F  ]6 D4 ~
const int prev_calculated,! {4 a: N; J( }7 h! l" y8 m1 |
const datetime &time[],
$ K+ u: E! I! k" kconst double &open[],
4 v% b; [. n: o# R4 `8 \' R) @2 sconst double &high[],
. [& L* Z% r' [const double &low[],
# n: K6 U* `: z) g" K! \9 bconst double &close[],
# w( S  \! a8 |. U; dconst long &tick_volume[],
- Y4 f  i* X! N6 J0 hconst long &volume[],) ]; R' d& c; r, S/ j+ O) S
const int &spread[]); |2 r8 j' M( {" R8 ^- b& i
创建一个整数型 “start” 变量,我们稍后将为其赋值:
: {% e8 |$ j3 {8 J+ H6 \$ Z' W1 Bint start;) M  [5 n9 A+ ]$ X3 K) Z% D
使用 'if' 语句返回索引值(最低价、最高价、开盘价和收盘价),如果 prev_calculated 等于 0,则 start 值 = 1;或把返回的值(prev_calculated-1)分配给 start:
' M) Y% \. Z/ r6 dif(prev_calculated==0)
+ ?& O2 O# A7 i  O: n& M{
! x! u3 }6 n- w. t  khaLow[0]=low[0];5 j6 s1 E- a- A% }( z/ T
haHigh[0]=high[0];  e4 w( ^5 a; T  }
haOpen[0]=open[0];
3 q2 Q3 ^2 d9 }  e$ j0 y) F6 uhaClose[0]=close[0];
) Y: F+ _/ m& q# kstart=1;5 h0 V) D6 Z( l/ J1 o8 I
}
/ t% `+ ^* F0 K& `  l$ ]else
0 h1 Q5 n0 m3 t$ Z) h0 Q$ cstart=prev_calculated-1;
7 b0 }! r% S  S. F/ p! @  n在主循环的 “for” 主体里进行计算,“for” 运算符由三个表达式和可执行运算符组成。# m! W3 k& ?- T! p- G
这三个表达式将是:) P% i, i* X0 B% g: p' @: c  O
i=start: 对应起始位置。1 Z& f  T( Q& D" i( N% F
i<rates_total && !IsStopped(): 完成循环的条件。 IsStopped() 检查指标的强制关闭。# n' ]. s- g1 Q3 W
i++: 加 1 作为新的 i。; `2 c6 x6 F2 p8 E' I. [
我们每次在循环过程中需要执行的操作:
8 J8 X% i6 Y6 U$ N" E8 \' E: H6 J计算四个双精度变量' R2 D; U7 ?& z! ?& F4 F: q/ g
haOpenVal: 对应 Heiken Ashi 开盘价。
; @2 C2 X; W0 K5 w$ g) B( z; uhaCloseVal: 对应 Heiken Ashi 收盘价。& R$ V5 ^7 \+ o) J: j: ^
haHighVal: 对应 Heiken Ashi 最高价。( g. t* \2 `5 V9 W9 r  n
haLowVal: 对应 Heiken Ashi 最低价。, b. R5 L+ N/ W- N& z( G$ {
在上一步中分配的计算值与以下内容相同, |( p* j) V, y4 u
haLow=haLowVal
0 n( @& [. i. ]3 f) O) h7 lhaHigh=haHighVal" ~- E% B4 t* A) |  D2 K+ L
haOpen=haOpenVal3 U; ~9 B9 c. Y7 ?. k2 p$ T3 E
haClose=haCloseVal# i& Q- j' m1 [, q' e
检查 Heiken Ashi 的开盘价是否低于收盘价,我们需要指标绘制蓝色蜡烛;如若不是,我们需要把它绘制为红色烛条。3 u) W$ X8 E( [8 F' V
for(int i=start; i<rates_total && !IsStopped(); i++)
* V3 Y7 p; K1 U( v' W{$ J2 h+ `% t- [
double haOpenVal =(haOpen[i-1]+haClose[i-1])/2;$ `4 f: z9 F3 d
double haCloseVal=(open+high+low+close)/4;
* s" y- Z( ~& [double haHighVal =MathMax(high,MathMax(haOpenVal,haCloseVal));8 o/ \) ]: }4 d8 F5 k
double haLowVal  =MathMin(low,MathMin(haOpenVal,haCloseVal));9 @  Q% R' H9 Q; y$ C) ?
haLow=haLowVal;
3 e6 |' N8 N. p# i2 ^4 uhaHigh=haHighVal;8 G4 J! |3 S3 g6 B: C% |7 b
haOpen=haOpenVal;( k$ N; ~+ ?) @! ?
haClose=haCloseVal;
- C4 l/ |0 _6 l//--- set candle color
8 ]$ m7 R* K; K, w3 d2 x0 ^if(haOpenVal<haCloseVal)* G, C% T; l* y. y$ J# q% U/ U* W2 M
haColor=0.0;
7 r8 z5 b6 _, c( y$ |else
+ y" K( o, z! b" ^/ ahaColor=1.0;- ?( O6 i5 t: B! T* r$ B
}- p5 i' t5 g2 L
终止函数,并返回(rates_total)作为下一次调用的 prev_calculated。" L, }0 n& s7 O; e8 Z2 W
return(rates_total);
8 I& d& \. I0 F6 ]+ \然后我们编译代码,并确保没有错误。 以下是一个模块中的完整代码:( b/ ^) ^; K( e/ {$ P: @( F
//+------------------------------------------------------------------+9 p2 ?3 O# g- f% m
//|                                             simpleHeikenAshi.mq5 |
' k) Q. Q, E, ~' p4 _6 x//|                                  Copyright 2023, MetaQuotes Ltd. |
8 D, c. H9 m* b; V! ~  g//|                                             https://www.mql5.com |
: }  q8 W, R4 ~9 v//+------------------------------------------------------------------+
/ t6 J) V/ C  l+ Z8 {1 e( |* T#property copyright "Copyright 2023, MetaQuotes Ltd."
" e9 K( D" F3 u' S2 Z#property link      "https://www.mql5.com"; @, q( n/ W0 ]- Y  L8 w3 b
#property version   "1.00"4 O1 g, `6 d7 N: Y8 S
#property indicator_separate_window
- p: o% W7 p8 F$ u0 v7 ?( }: {! o#property indicator_buffers 59 u* J$ N0 E1 `5 s- s" C
#property indicator_plots   1
9 B1 n$ X- C$ w! U- P#property indicator_type1   DRAW_COLOR_CANDLES; }2 F' x0 i7 e; s
#property indicator_color1  clrBlue, clrRed
4 G* t) U/ r, W& M) q#property indicator_width1  2, f0 M! E& `; K* m: Z: x& U
#property indicator_label1  "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
4 w; b8 x- i" ~1 G# m" I" B; K% }double haOpen[];
4 o2 R" C7 N8 ^$ kdouble haHigh[];( L% l" d- I" _# @- o! j
double haLow[];
3 d  J/ ~) R( d* S/ vdouble haClose[];5 R7 D* z, Y, R
double haColor[];6 T* Z) H) F- c: {2 T/ |2 \
int OnInit()" ~: d( ^) `7 x" F7 T( S
{
" @7 ^5 g' M7 H+ dSetIndexBuffer(0,haOpen,INDICATOR_DATA);9 \! N! [9 l0 ]4 K
SetIndexBuffer(1,haHigh,INDICATOR_DATA);9 a& E$ {. E- |9 V  L4 N0 g
SetIndexBuffer(2,haLow,INDICATOR_DATA);
5 ~* I- l) r3 a8 _2 M& z: O1 NSetIndexBuffer(3,haClose,INDICATOR_DATA);
1 l; e  W" {" W4 lSetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);7 {! R' _! \6 b
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);) j7 k* p; [( X. _! T
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");8 G' v% m6 K) X% p& N7 T( ]$ Z( u
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);. d# D" w) c# B& K9 a
return(INIT_SUCCEEDED);1 F: E1 r  b: W( A
}
: ~3 B( m+ j- M5 j2 q' m, J! c4 U/ Aint OnCalculate(const int rates_total,
, }  u& a: Y- ]; L- _% H% _7 o1 V+ nconst int prev_calculated,
* @; `$ }- N. y' I( T& V+ xconst datetime &time[],
5 A7 n1 A" P6 ^$ s) aconst double &open[],
- q7 u% w/ u. Gconst double &high[],% L8 g2 Z0 e5 }; S, N  V* J
const double &low[],
  c" V- b' ?% w! \+ E8 ]" Tconst double &close[],
$ F: }1 Z- y9 Z' i2 O9 Q+ Xconst long &tick_volume[],$ Y/ K6 B0 }8 m3 u% D) t
const long &volume[],
http://www.simu001.cn/x288178x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 10:05 , Processed in 0.518307 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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