私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述+ T) m1 U) A) p: _, ^* [5 {- Y
在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。
. j7 h! Z! q" N! E( O在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。
' m- }$ j+ a. \' Q我鼓励您继续阅读,因为内容承诺非常实用。
3 e( Y5 E% W0 ~, Z+ S+ N+ }3 w: O将指标锁定在特定品种上。
2 m+ p5 h! Q; z1 Q3 d/ j6 Y* c第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:: ^* d4 G+ {% z! r1 Q
#property copyright "Daniel Jose"
( v1 i& V' k$ K/ Q#property indicator_chart_window  q' p9 f6 f; [$ ]+ k
#property indicator_plots 04 ^" i, G' f1 r9 O
//+------------------------------------------------------------------+2 ]" e# ^* }" |0 @% Q8 H7 Z
#include <Market Replay\C_Controls.mqh>+ y: T( X6 P9 E) D* P; U
//+------------------------------------------------------------------+
) M3 }" A3 v+ l* x8 b; n" sC_Controls      Control;
. W* g. J$ E& m) z# H4 }//+------------------------------------------------------------------+
; p9 o2 m+ d, K+ ^+ O# Vint OnInit()0 q7 p" B& ]& @% u4 m+ W+ E: t: G$ r
{
% }) Y# N$ f& n. Y$ {: [u_Interprocess Info;
8 e. j, ]' `5 s# i2 Q: J, TIndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);
! ?/ p% {3 v6 e5 y/ q( X+ oif (_Symbol != def_SymbolReplay), S/ x$ |9 p+ |: J- U- v
{- Q' r" s, x9 y; B; H2 }/ o
ChartIndicatorDelete(ChartID(), 0, def_ShortName);$ u& [$ V" g' Z$ }' p9 q0 Q* R
return INIT_FAILED;, Q1 C: Q* w  O
}' u5 [' j! ?% X2 M  U) N  ]
if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
' P6 Y6 L: W& j$ ?4 p3 bControl.Init(Info.s_Infos.isPlay);
# P& D# m8 k, K: Xreturn INIT_SUCCEEDED;
6 d. r" y  g' R0 }}0 V4 R  Q9 Q7 i7 |& V1 _" \
//+------------------------------------------------------------------+' C" s4 V$ }( T3 M
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
. b# b  _; P. J, U( g3 a5 j  z' w{
* Z, S* @3 E# I, S  j& A! ireturn rates_total;
5 E! }1 M' T  G- M& v}5 `, Q/ _. G( y; w# }8 j2 j
//+------------------------------------------------------------------+- N4 Y) O4 m$ ]* |; {! f- q
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)' b1 u& [/ j+ G" H# e. _+ `0 {
{
' P* {0 q1 [+ P$ iControl.DispatchMessage(id, lparam, dparam, sparam);
* z1 e+ [1 i, m- k  _; V$ d5 w}
+ n0 e" U: k3 L9 [# ^5 v2 s//+------------------------------------------------------------------+
" L  G' t2 \2 S2 H9 B& bvoid OnDeinit(const int reason)
( J, D" m/ {! ?: `& p0 w2 G{
4 [0 h$ t$ R0 U1 Fswitch (reason)
2 u; y; [- e! F{
% c- Z& T9 W9 [7 l$ R% o  F! H7 h' ^case REASON_REMOVE:
- X2 H& p# x' E0 Ncase REASON_CHARTCLOSE:6 I5 |7 k( g- P; H
if (_Symbol != def_SymbolReplay) break;: l. O7 s% V6 @* M* S- t9 N
GlobalVariableDel(def_GlobalVariableReplay);
( p! H" C3 ^  p; C) a% TChartClose(ChartID());3 u2 B& L- G5 {) X
break;
, G& W: }7 t0 x* u2 R}
- D0 J% G+ F% l, S}  v6 k8 k: b, t5 ^
//+------------------------------------------------------------------+
# j3 E) {0 w  q" c9 k2 e4 E我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。& T( O/ D! ^! ^  Q+ d* R: T! e
现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。: X7 p: t( v/ O
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。' O! R2 t: t$ F* B' _3 ^; V
尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。4 s% F! a' \% {! k# X- k
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
( h% o" X' ^) v! u9 k0 [我们应该避免在同一图表上多次使用指标。- e: b7 d% k# ^' B8 H
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。8 n+ G4 _4 `$ i. g, p
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。  q" T# K' Q6 I7 _' p4 }) W
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:, a! h6 ^0 |7 s. I1 ^8 j
#property copyright "Daniel Jose"5 e: \8 I: i1 t! C! b
//+------------------------------------------------------------------+- y% Y  ~. R5 G5 z4 ^; z
#define def_GlobalVariableReplay        "Replay Infos"
6 E# @% g8 ?3 B- t  n#define def_GlobalVariableIdGraphics    "Replay ID"- R5 G9 z1 b/ A% D4 n1 e' R4 A
#define def_SymbolReplay                "RePlay"
2 j# ?2 S  ]/ @3 r#define def_MaxPosSlider                400
9 J9 \! ^+ a3 n' X% j* T) U/ s#define def_ShortName                   "Market Replay"
& X" J$ x- L. R" R' V7 [$ I5 b//+------------------------------------------------------------------+/ U- D+ [" |# v; Z# n/ K
union u_Interprocess
$ l* |  k1 w- d  j! l$ Y! b. [2 h{
9 M9 w5 @2 I& \: Y' X% N# Z) d! tunion u_0$ n. B8 |0 q  W; v
{' B4 g6 ~( \0 S  `5 u7 E
double  df_Value;; o2 ?0 `) a2 w5 N+ c/ b
long    IdGraphic;
' w* [+ e, t* ?8 w) X}u_Value;" Z. O# o& s2 Y: ]. F
struct st_0
) Z0 Q- \" m# B, t: R{
" Z+ _" h0 r* Jbool    isPlay;# |9 X0 N0 [, u  a2 r$ {
int     iPosShift;
  U1 p: j' L% z) J}s_Infos;! c$ }9 S( l$ V4 o% d
};
# d' D# E# y% {6 d. @' d. g//+------------------------------------------------------------------+) q  ^( K3 h# g& D7 J
对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。1 S) i" N6 M6 ~
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。
& _0 \/ \7 r) ~重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。
3 k0 I) n0 P6 e7 y* H* D在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:
2 x: U+ h6 R8 {//+------------------------------------------------------------------+) B( I& f; R" L+ G
//| Script program start function                                    |7 {& O  t  V0 }# s7 y
//+------------------------------------------------------------------+3 ]6 @1 P1 o& O& b
void OnStart()
; |0 W; H7 }. N2 B6 W) W{
# }& x3 U! ~7 EENUM_TIMEFRAMES time = PERIOD_D1;. C) E6 r/ `: d9 a1 `" ?) p. U7 O
string szSymbol = "EURUSD";% W/ g& C% Z& y; A
long id = ChartOpen(szSymbol, time);; y  T# `, \/ n1 X1 d8 ~
ChartRedraw(id);' H7 V* `6 o/ l( J* `; [
ChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));: s! _5 E5 Q3 O+ Z  P8 O& I$ C. ^
}
) O0 X% Z) p8 ?然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 16:31 , Processed in 0.374170 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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