私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
" f- v1 V. ?0 n0 |( Z/ T# J在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。0 r/ K3 ^  l( q
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。
9 K# {7 O" Z3 P& S$ N我鼓励您继续阅读,因为内容承诺非常实用。1 r$ N- ?' P  Q: P- v4 L% ?
将指标锁定在特定品种上。1 H( W7 U6 i) F( ~, q; A
第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:  t+ V$ Q! k& g8 e8 E# H
#property copyright "Daniel Jose"
' t4 C, E4 g% A1 s. P7 b8 k#property indicator_chart_window
  H1 x" _! H$ ~#property indicator_plots 0
& H1 w/ W# @* G0 C5 m- W7 ^//+------------------------------------------------------------------+
- G4 L$ @) c  z#include <Market Replay\C_Controls.mqh>
/ E; Y/ M6 V4 N9 a& |" d1 a, m//+------------------------------------------------------------------+* O  N$ N) n8 @) y4 R: n
C_Controls      Control;- c: z6 d9 z  @) [, h; U3 I
//+------------------------------------------------------------------+: c3 o6 L4 }% p1 B; ?- ]4 c: W& t
int OnInit()6 d) r* U4 s3 W; C$ D! u! R# t
{5 ~9 u3 Y+ c. ]& J4 g" M4 R
u_Interprocess Info;" I- H, h5 Q! i4 m2 x8 P
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);" ?+ q5 B6 T7 l) |5 y- @
if (_Symbol != def_SymbolReplay): Z  _# ]* J6 ]7 L
{
& }  B: \* a; {- z( G/ aChartIndicatorDelete(ChartID(), 0, def_ShortName);
$ }; Y. a) k9 W$ r1 z9 breturn INIT_FAILED;; j7 u, J0 f6 s1 F/ `
}
9 |- h# J+ C- [$ C( [4 S$ `: vif (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
& u( q+ T' t( j. UControl.Init(Info.s_Infos.isPlay);7 B+ m* d  n, t5 P! T7 G0 P
return INIT_SUCCEEDED;6 r3 r0 A. H# w% N0 j6 c9 g
}5 H. A1 F' N* _; H
//+------------------------------------------------------------------+
$ x* R6 x2 l* f7 X1 [- S% b0 i/ r, Pint OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
* [  l- ]2 _1 B{" G4 ?7 U# G6 ~' k; ?
return rates_total;: f  z$ ]; x% S3 f' q- A
}
5 |* M* o* s6 J7 E- e+ R7 i9 I" v' x//+------------------------------------------------------------------+
% a2 d* F# D- `" ?1 svoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)4 a0 q- M5 J$ \* T
{* M# i2 v8 U2 l0 n; c
Control.DispatchMessage(id, lparam, dparam, sparam);
; L: q- M4 z1 I; U6 T" R}1 m% d) [3 S; C2 [! K" i
//+------------------------------------------------------------------+
5 p1 f- N' t; u6 a6 F9 ^/ ^void OnDeinit(const int reason)5 q8 {3 w* B6 N6 i
{) g+ l7 i4 \1 J7 s
switch (reason). t0 _! G6 m6 M+ F0 r8 v5 R
{5 n+ {' Q" H. z, E7 i1 g3 t6 f" j
case REASON_REMOVE:
, P: d5 p+ E) R$ @; Bcase REASON_CHARTCLOSE:
) n2 L2 A* x+ ~if (_Symbol != def_SymbolReplay) break;0 g: Y* _$ @' e- R' A0 Y3 z" ~6 Z
GlobalVariableDel(def_GlobalVariableReplay);
9 `: Z& I- U) d( d4 u  oChartClose(ChartID());0 H, J! l, b+ U1 ?5 \9 q' m
break;
  k) C: i$ N: E! p- I; M4 y$ x}
* b% z& Y9 i1 J. Z7 w& ]}  ?! ~# M( F! T9 H; O. U9 M
//+------------------------------------------------------------------+1 }3 p$ P4 r2 q/ [" _+ v
我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
0 i  i/ R; i5 B$ Z# P  a" F现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。$ C' R$ L& {4 k2 I: X6 f
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
3 W9 D) c! A$ X尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。
5 c  c% {' S4 x* T4 @0 Y6 \' [因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
; G* m! e4 x& \" P1 e/ h/ F我们应该避免在同一图表上多次使用指标。# i8 w! R; {  N1 I
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。: [# R( n2 g. c0 c+ ]+ a# s( i
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。1 g/ C) l  @6 k7 [) |; M) g
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:
! K# W( n; o& R. X8 ]) c" v5 F#property copyright "Daniel Jose"" g/ ?$ w9 {; G( _
//+------------------------------------------------------------------+
. u& J" ~1 t8 P/ m0 ~#define def_GlobalVariableReplay        "Replay Infos"
7 D4 {& n5 ~' k* G$ E" R#define def_GlobalVariableIdGraphics    "Replay ID"
4 q' A( o" k- {# k% ]. x; @' |#define def_SymbolReplay                "RePlay"
) E+ U' N) ~5 S, P/ d#define def_MaxPosSlider                400
5 Z% i3 d0 l: g% B  X9 u7 t8 [& a#define def_ShortName                   "Market Replay"
0 K- f/ y) f' {, Q/ z; k: \4 B//+------------------------------------------------------------------+8 e' e6 s9 V2 Y  |- d
union u_Interprocess
& I2 F, N( [4 Y/ f% h5 t3 `( w{
( \8 U( A  h; ^7 M3 d- Z/ A; ?3 nunion u_00 X% u1 S" e- P" T& s0 k
{( W! j* d+ C* }; {# @3 P
double  df_Value;
( A% g' @8 R1 C  }6 A# G" vlong    IdGraphic;% Q; J* v4 @# H7 j6 H0 u, `
}u_Value;
' ^1 \+ v9 c3 _2 Fstruct st_0
( e$ {* p) E0 _6 P$ p& }{" ^# }' K' J2 ^8 n9 A% D
bool    isPlay;
' z2 ]! a* [& b' F/ Vint     iPosShift;
. h( R- y" y% t}s_Infos;
6 n9 e" S+ }" u. V4 }- ], |1 U};& G* }1 j) v" Y- U* O8 u+ D
//+------------------------------------------------------------------+4 w' o: h3 ^% H0 n; e
对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。$ E5 K' N* w0 \( a- c
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。! N; b, m2 ]$ h0 c( U
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。3 h4 B( v  H: d+ ~
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:4 C7 R5 _7 M: ?- c/ U' l- S8 ?) Y
//+------------------------------------------------------------------+) w! {# y+ l! f4 E
//| Script program start function                                    |6 j# H+ l  J8 p
//+------------------------------------------------------------------+
7 u( a* j2 l# Z* v' t/ xvoid OnStart()
* Y, Y, A$ x* M- b& S  x{: ~' b* G7 H; _8 B6 M# a$ Z
ENUM_TIMEFRAMES time = PERIOD_D1;& [& |2 _) c( r4 Y3 ^/ ~
string szSymbol = "EURUSD";
# M; G: N! ]" j' r$ ~3 f( a$ h" elong id = ChartOpen(szSymbol, time);, U9 Z! @/ V$ z" J% c2 J
ChartRedraw(id);
# t# s$ C2 r+ I# e8 Y) D! aChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));
) s: I. A2 L4 E3 Q3 X4 W5 r, s! A0 h}2 i6 A- d/ l+ ?, K4 H
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-28 22:44 , Processed in 0.872868 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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