私募网

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

期货量化软件:赫兹量化中锁定指标

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
7 H7 i4 _3 r; J, D5 l在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。; M& B' J; H0 p: s* N# ?$ c+ ^
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。- I9 `. i5 B9 y1 `$ \
我鼓励您继续阅读,因为内容承诺非常实用。+ ^! ?5 c" ~- l; h
将指标锁定在特定品种上。
2 U) X' s6 o; G6 z& Y% P+ Q# P第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
* y6 C$ r' z% I! Q2 y) Q#property copyright "Daniel Jose". \2 I- a6 E2 _. z9 z) B+ F
#property indicator_chart_window: q( J$ X+ p" S3 ?
#property indicator_plots 0
1 {. x6 s1 I9 [7 o( }0 `5 c//+------------------------------------------------------------------+: `9 k+ j+ e. j0 ~/ [
#include <Market Replay\C_Controls.mqh>
3 {! K( ?6 e  `1 Y, m. U; i. c& F; E! ]//+------------------------------------------------------------------+' X* m/ E4 y) [8 f
C_Controls      Control;  R- d3 g  Y. }# y
//+------------------------------------------------------------------+
. W5 H1 }4 D; O: e# Cint OnInit()
& R! `4 ~0 M: p3 D) g$ K" W' M1 b+ A{( U# O2 x0 H$ |0 V1 F: d' X
u_Interprocess Info;
: v1 m9 m' `  }8 m/ ?9 }; H1 i1 KIndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);/ R! N6 C  o. E& G7 r# |
if (_Symbol != def_SymbolReplay)
3 B1 E5 J, J0 z+ W{
& r; J/ p% A' v6 `ChartIndicatorDelete(ChartID(), 0, def_ShortName);' _1 L6 _& I4 x5 q2 |- F
return INIT_FAILED;
( L( ]* }5 b# w3 w" l}
5 Y; ~& Q$ q8 V# f6 M% x$ ?if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
+ z5 }& ~! c- Q; s: _+ e  MControl.Init(Info.s_Infos.isPlay);
* ^- s6 P5 p; Greturn INIT_SUCCEEDED;/ T) I4 I( i+ ?; ]+ y* Q
}
, g# e2 j8 n& m4 M0 k  x//+------------------------------------------------------------------+
5 {7 C& j( F  a  z4 B" kint OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
; ^, G6 |7 s" {{+ k- |8 _7 e- n
return rates_total;
( S3 U* W+ R; d* X4 [2 @3 K}  f1 X) i5 L+ ?% N" A: Y
//+------------------------------------------------------------------+
: G' u+ ^" U$ |9 U$ `5 hvoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  X; K" _. p; M$ `! w0 `. I9 y8 X{
1 k* q" X) j$ J* g# W. ^; B. VControl.DispatchMessage(id, lparam, dparam, sparam);7 }& ^' B) I" \1 H& _& w) t
}
( z. m4 U$ Y) O& c; g//+------------------------------------------------------------------+
6 L& P3 h* t6 j8 G0 y* tvoid OnDeinit(const int reason)
% ]& ?# `  g+ E{3 ?: _- k( ?$ P) U
switch (reason)
! X" u2 M2 s2 _! |5 G/ _{
2 l. u, I8 z8 O2 u: A& K  Kcase REASON_REMOVE:2 V5 V$ ^# d3 i/ O
case REASON_CHARTCLOSE:0 N" I8 R& }( ^) Y7 P; R3 l- ^# ^
if (_Symbol != def_SymbolReplay) break;
$ I, G$ _7 G% e  L0 gGlobalVariableDel(def_GlobalVariableReplay);
6 y$ c5 [; a" Y; aChartClose(ChartID());, f& Q. @* t# i: s6 ]; r
break;
8 _: S* d0 m7 j# O( H}
0 c) q0 P' u2 f6 l& K, }}
% x9 Z/ A4 ~2 E6 K; j, _6 `, ?//+------------------------------------------------------------------+
1 w: K6 R4 d/ h0 N* }" M我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。' U& D, p4 N( U' H
现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。
/ A+ I$ ~3 j: i+ \# H$ G如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
5 N' u; m. f8 p6 K4 J4 g4 L尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。. F8 s% x4 R. ~8 m+ O
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。8 e5 H9 x4 O# z' V1 c2 x
我们应该避免在同一图表上多次使用指标。
. W. ~& Z0 a/ l+ a/ U我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。3 s! Y* e  \; n
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。
7 U) @$ @  Y8 U! T+ `+ T  c# E, }为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:9 \" D* v; A8 Y6 O" H3 H) B
#property copyright "Daniel Jose"
- i' h% \2 V' o- J- j+ V//+------------------------------------------------------------------+- b6 v/ A" h4 X9 k# e
#define def_GlobalVariableReplay        "Replay Infos"4 V8 H  v2 d1 x3 b& y. {
#define def_GlobalVariableIdGraphics    "Replay ID"6 a( h# X4 c- X3 m1 R5 E
#define def_SymbolReplay                "RePlay"0 f" H& W+ j6 e! G) ~
#define def_MaxPosSlider                400
, h8 s; R$ V: O9 \1 F, P) U+ w#define def_ShortName                   "Market Replay"2 B3 F, b% e& x  L6 l
//+------------------------------------------------------------------+
/ Y/ _: C, v2 m1 G; }. T* eunion u_Interprocess
0 ]1 G- k* q4 ^+ X! {+ x: p9 |{
! L9 C; R; l( Z- Z& J4 n, X. G7 K! Qunion u_0/ U2 ], ^! ]% }/ e
{
, J) |# B- L1 m" Gdouble  df_Value;
+ x4 Y  K1 F6 W# d- Flong    IdGraphic;2 V* D; ^9 L4 t( `0 q8 N
}u_Value;
: b$ l3 t2 b4 n7 I$ k( \$ Dstruct st_05 N6 P/ U" C0 ~2 a, @) ]
{
; ]) ~' I# D4 b! o9 M: t/ Z" t' jbool    isPlay;
8 k; x4 P( x8 s; _! U6 c& S/ Wint     iPosShift;
8 _, l5 P' N. W" e}s_Infos;4 i7 ]% n+ q8 s
};
" j% x) Z- }+ G- j) c//+------------------------------------------------------------------+8 P1 ^$ C7 E1 B7 x, {; F: h& X9 d2 O
对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。; n4 O8 y% }; g  \9 v
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。4 i9 y" e3 h% z6 J8 L" N) w/ {3 {
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。+ r, B( t; b( p$ M& Z3 l8 f
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:2 A, @2 ~, n2 y
//+------------------------------------------------------------------+- ~* ^/ x6 L1 |' M
//| Script program start function                                    |
) d/ I4 ^) `% W//+------------------------------------------------------------------+% q, D- y2 Y1 B, ^# |2 |% T
void OnStart()# Z7 w" R) A4 G
{  P) I% t" D0 t" m1 A
ENUM_TIMEFRAMES time = PERIOD_D1;
+ `5 ^: [9 R2 dstring szSymbol = "EURUSD";$ y2 i: m+ [" z1 C9 A- R
long id = ChartOpen(szSymbol, time);
/ e- [% X3 ]- n. r7 |ChartRedraw(id);
  w9 H7 Z- T1 Y: lChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));. E: n! |( c7 p$ ^5 X
}- T$ w* ]% \$ P9 W: m: x2 y, p3 j
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 02:30 , Processed in 1.086732 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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