私募网

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
5 _( U" ?4 a! l; v$ Y9 H在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。7 Z, N4 U* J4 M, J7 g/ B3 P
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。4 c* f  s3 c* U! |% [
我鼓励您继续阅读,因为内容承诺非常实用。- O$ ~% Y% z9 ?0 h7 D9 ~7 K4 r
将指标锁定在特定品种上。
# _; G8 O  M4 n. h* J$ Z4 G+ R第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
! s# y2 ]0 Y, B7 |$ p#property copyright "Daniel Jose"- ?- |! H8 i" }9 |3 V
#property indicator_chart_window# y& k; d. H7 ~$ s* l9 ~1 }
#property indicator_plots 0
2 D3 |3 D& g* V- j' S//+------------------------------------------------------------------+% N. r! J! y$ R
#include <Market Replay\C_Controls.mqh>
- S5 x' B2 n& [, ]//+------------------------------------------------------------------+" b5 u+ [% L; s' p( m; B3 W
C_Controls      Control;3 J& B; J" m: z8 B. u) `+ n
//+------------------------------------------------------------------+8 D$ P* [% T) d3 Z- I+ @! W
int OnInit()# N9 p( e! N  W
{
  D( r$ M3 G6 r: s/ C% F9 tu_Interprocess Info;( s" R1 v& w1 _- Y) ?
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);- ^5 s- B' W3 A6 F7 w" y, L
if (_Symbol != def_SymbolReplay)
, b0 N0 ?5 I1 T. u{
2 J  J8 V& [  |+ I$ d) }& h" z' {ChartIndicatorDelete(ChartID(), 0, def_ShortName);
" H- S( \9 }& O) O! kreturn INIT_FAILED;
- \/ {" R, m: D$ E! Z}
9 m( l+ v( o: a9 z: f7 Pif (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;6 O" ?; j: G0 T  C  S2 a
Control.Init(Info.s_Infos.isPlay);+ c6 z' T/ u% N: N  V
return INIT_SUCCEEDED;# |# o2 l$ x4 F, l# F7 l
}. J( A+ {/ `" F2 W& k# j
//+------------------------------------------------------------------+4 Q% m; Y/ T0 T
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])$ J2 r: Y: [2 ^, B4 a" z" ^
{
+ F* C7 r" ]5 r1 W. [9 breturn rates_total;
1 p8 ~$ R! U9 m) W3 L  N7 Y2 R}
4 ~3 e$ i/ Y  V/ j) L% W. d9 k//+------------------------------------------------------------------+" Z1 u8 G$ }- O/ r8 ]; Z
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)" G2 d0 p% u) K
{
  H& l  ?5 x" w; P2 O# GControl.DispatchMessage(id, lparam, dparam, sparam);
0 i- [5 P# o7 q0 ^+ w8 c% |}8 C' H3 s. B( L, l* O$ k
//+------------------------------------------------------------------+
9 J( j% V5 s; P. M) Pvoid OnDeinit(const int reason)$ e( j4 o. d1 K- Z+ T
{* g, J( A5 X( b% ~
switch (reason)
( l7 w5 y. P; e( R7 {& |, W{
3 F) O2 W1 r3 ~& V0 ^case REASON_REMOVE:
$ {/ R( X6 s; o2 i# Y2 W% Ucase REASON_CHARTCLOSE:
; n. u0 X- t& O* tif (_Symbol != def_SymbolReplay) break;
. o: z  b; j" h  |* hGlobalVariableDel(def_GlobalVariableReplay);
! g2 l; [' @* y& mChartClose(ChartID());
) s2 s/ O- o) I9 L  ~0 Kbreak;
; L. @  O( e: p. M}
* o. k3 R, @/ b* J0 c( Y. f2 x}
1 A0 I! F: T: w+ V3 c; f  l, q//+------------------------------------------------------------------+
$ m1 c' Q% {+ T% m7 k' n我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
# J8 W: K7 r7 p; i$ E, O现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。
! X2 M+ a6 |$ K9 \/ m  Z; {如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
, A( [. Z' J3 p" F( @6 t- T尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。: J1 f& d- J. x
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。5 R( t9 @# h% h
我们应该避免在同一图表上多次使用指标。
5 ?+ `' p4 N. x1 d2 e) ?7 y5 }我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。9 a1 c4 l* I: e
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。
+ J; M! ?/ Z2 ^为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:! N, {( |- g' W6 z. D1 C
#property copyright "Daniel Jose"
6 N+ p: m' T; l9 g' ?* ?//+------------------------------------------------------------------+
5 o3 d! _0 Z9 t' \9 g7 [#define def_GlobalVariableReplay        "Replay Infos"
& P0 a& H8 l% R0 b# j8 h2 S6 ?#define def_GlobalVariableIdGraphics    "Replay ID"
6 C$ F; A0 {+ i9 W#define def_SymbolReplay                "RePlay"1 r6 V! _5 v7 h1 N, F# {
#define def_MaxPosSlider                400
8 I5 h/ i4 K0 x; H4 f#define def_ShortName                   "Market Replay"
( w& e9 b% M9 ]8 c( X& h//+------------------------------------------------------------------+0 |" V2 H  F) V2 l' f6 v
union u_Interprocess
. H6 k" V7 c- H- ^, N- e, {. ?{, \! H2 q' @, C9 C
union u_0
& a# g7 z: w: k7 R{
1 j; k) G6 ]" `4 K4 _double  df_Value;" z) L1 W/ K% O$ `$ u/ g/ F
long    IdGraphic;
7 J8 `* u! {6 _% ^& w" H: D}u_Value;
  {" _. i1 G; l6 f. O3 W) kstruct st_0. z  b, X$ F1 q7 W) `* t6 C+ d
{
- w& g% u/ L0 {. Qbool    isPlay;
3 h* f) \9 d% u5 M! Zint     iPosShift;0 q3 G: B4 r% ]3 K& `! D* n3 |
}s_Infos;8 N( U$ D7 J% a5 X$ L8 g
};7 H) l9 X" @$ r4 x6 W2 o4 ?) k
//+------------------------------------------------------------------+
, W" i& q# _1 ?- l2 b: q对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。8 v! I4 ^5 U4 }/ S9 u) o
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。8 p! ]5 c2 R0 b1 ]' W
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。' i5 v( S( z* C9 T5 `5 c; Z  C0 ?4 W) [
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:
4 `' u' {/ K: i- O# [  `1 l  m//+------------------------------------------------------------------+
3 L) c1 U/ T' ~1 r) A( d9 Z5 y//| Script program start function                                    |
, ]# @) e# _" x8 r( r//+------------------------------------------------------------------+
6 [9 c9 |  Q0 q" J$ T' A% l9 wvoid OnStart()
( u4 }2 v; u! R9 i) I6 v{
7 k( P4 \3 P% l4 k+ K* xENUM_TIMEFRAMES time = PERIOD_D1;
3 n& o) g# Q8 V9 u* Q: H; N7 Gstring szSymbol = "EURUSD";$ |/ M6 d( X9 H7 k) x
long id = ChartOpen(szSymbol, time);. C8 X) ?* i" _( u* b& r9 h8 ~
ChartRedraw(id);
- X/ G6 m  K, v3 H& |- l, Q5 vChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));
3 {4 X% _4 @+ b}
. U1 }; [. s7 z' X: H- V: G然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-26 07:24 , Processed in 1.603314 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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