私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述" u2 s7 ]1 T3 P- a' L
在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。: U4 }5 v4 h# O8 `
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。: e7 p% B" Z  q* Q/ ]- N
我鼓励您继续阅读,因为内容承诺非常实用。) V: w, [- e9 @: w; X+ @
将指标锁定在特定品种上。& X" j% u4 B0 H# M& S
第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
$ e* `# a# y2 Z#property copyright "Daniel Jose"
2 P- q8 n* k, o* T/ o% d" `#property indicator_chart_window
7 X5 P% d! {( s  W) S#property indicator_plots 0/ _+ J8 g+ `' Q
//+------------------------------------------------------------------+- N2 }- L: U! H3 ~- t
#include <Market Replay\C_Controls.mqh>
5 T! J) X* q9 [4 q( P//+------------------------------------------------------------------+1 [! F1 l# h5 q- j3 F( }
C_Controls      Control;1 ~) M; j$ e* T
//+------------------------------------------------------------------+
) K! O& `$ O+ B# Wint OnInit()
' J" {$ ?4 S- j" d' V6 @) a4 r6 L{
8 B# a6 c5 W. b  \4 t3 a& ~8 mu_Interprocess Info;0 N, [. O( B4 n1 U
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);
! V7 _6 q- ^. |2 l% Hif (_Symbol != def_SymbolReplay)
4 F# s- Q/ O; b" W7 e{
1 M) \1 \& T: m. ?) k1 FChartIndicatorDelete(ChartID(), 0, def_ShortName);
' u" F' `. W& F( o4 E$ \return INIT_FAILED;
7 _0 ]1 `) G7 e4 L# {}
* w- ]) `: D, m$ c1 Gif (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;0 Z$ T- q: `# C3 R3 M& M2 |
Control.Init(Info.s_Infos.isPlay);/ u4 x! z  N5 Q& S9 ~
return INIT_SUCCEEDED;
  L1 T* I; g1 X2 N* l, D# w. M* K  B) k}
. `7 r$ g' a2 z! C9 b0 [//+------------------------------------------------------------------+" N# B( K' P/ v4 H9 F
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])5 C$ \/ P8 Z& U: V" ~( K( j
{0 X: L6 j! j" \, l. q# f9 \
return rates_total;
: z1 a4 |* @/ A, N5 O}
2 S8 u( _9 F5 J//+------------------------------------------------------------------+5 t) }* W1 N0 S0 s9 Z$ Q
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
( W/ j3 h; g8 N7 F8 |/ V{
" t" Y. D0 N3 y( b! AControl.DispatchMessage(id, lparam, dparam, sparam);' Q# A- s6 i( v3 B* U2 b' ]8 X
}( z0 \3 A, E" x0 w! e
//+------------------------------------------------------------------+
5 H7 U: E7 g2 ]0 X  vvoid OnDeinit(const int reason)
9 a" w9 ~- U: j$ }" l/ I  Z{& o8 @% V' K+ `* J$ n3 d9 R+ O
switch (reason)) j( z' a8 p$ \( n2 V0 ^# P, w5 o
{# |9 T0 b- B, @: p- |
case REASON_REMOVE:; g4 z# D" x0 o6 w% R& k1 W
case REASON_CHARTCLOSE:3 D3 `  W, n& j% w* u
if (_Symbol != def_SymbolReplay) break;
( q+ M+ v2 Z8 R5 p3 r! ^" F7 B( \/ GGlobalVariableDel(def_GlobalVariableReplay);; G! r$ q& p9 N+ ^
ChartClose(ChartID());
, y4 Y! q/ p. F5 {9 D. @7 i$ ubreak;; Z( Q" f% q  A- I" G
}% W; h2 O" l/ d, b/ R4 l
}; Y+ \, Z. l; ?% Y2 z
//+------------------------------------------------------------------+
# Z# \1 s% B" R5 T我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
7 a. P6 V+ H% v: c现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。
6 s5 c( _" }1 y2 L如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。; M7 j" h. o3 z9 R
尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。: o0 V4 X* _0 C. E. M
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
) {. \7 k( z" R& v' e我们应该避免在同一图表上多次使用指标。
" R% N* O$ P+ V4 s- D我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。
% B9 K! F! v+ w1 ~我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。) X( K0 O6 T: S: o" O2 ?+ H
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:$ Z. {# ^0 f- j* I  R0 s* m
#property copyright "Daniel Jose"9 x# Q6 u8 M. e6 k5 w
//+------------------------------------------------------------------+$ `  T# D  K# K
#define def_GlobalVariableReplay        "Replay Infos"
* _; n- c' O' D$ Q6 k2 ?2 b9 S0 R#define def_GlobalVariableIdGraphics    "Replay ID"
8 C/ i) E$ F! v2 B. R2 a* Q1 U#define def_SymbolReplay                "RePlay"% g6 _( S$ c6 a  @8 h% v
#define def_MaxPosSlider                400  E: S& j3 ~9 ?  ^9 k7 v# A
#define def_ShortName                   "Market Replay"
# v) S: {7 B7 M) Z" n//+------------------------------------------------------------------+
' E3 w( D% q6 m# d3 q. y3 zunion u_Interprocess
6 t- O  }+ e: M9 p# p% G{" ?& w2 j$ L2 r/ [
union u_0
/ X: v' Q, u' \{& l1 z5 j- C6 n! \) }* q8 r
double  df_Value;
) H; N, }, {: p; C5 ]: xlong    IdGraphic;
- V* {  W" h7 r; R% g0 G}u_Value;% K+ w% ]* [- H; k2 |# ]
struct st_0
) }  _2 x) f6 l1 k{
: ^, J6 Y7 P1 R. A, k% ~bool    isPlay;7 P% w( p# P# T, Q0 N" {5 ~
int     iPosShift;
" ^: N# c& o) I3 }: `}s_Infos;: o8 x3 r' N4 R8 a7 F2 n4 {6 S3 r3 k
};
. Y8 R8 @8 O2 }; m# |//+------------------------------------------------------------------+2 `+ M: Q. C( B- D% D7 K1 m* H
对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。) @" M6 Z- U' |! o
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。( S. _) a1 o1 T4 V% w
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。
! s% X( S" {2 E5 x4 f$ j在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:8 n$ w5 H/ r* C  L
//+------------------------------------------------------------------+
1 c+ z, l# u0 |# W! }4 z//| Script program start function                                    |
4 s8 `) i* S9 Q/ K3 b2 p- |. D//+------------------------------------------------------------------+
1 Q6 y$ K- [7 u, `' d( [void OnStart()
- r2 ]. c" Y) T; Q  b2 K{
9 \/ N' C6 H4 n$ QENUM_TIMEFRAMES time = PERIOD_D1;$ c% N( |' P3 u0 U9 |
string szSymbol = "EURUSD";8 i* J* O" J) @7 x/ F1 P
long id = ChartOpen(szSymbol, time);+ \2 X( C& z, h' E/ b4 m/ a) X- v
ChartRedraw(id);. Z2 D/ V: l0 P" T- C7 j
ChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));
& P! g) e& F# a6 N}4 E% }  ?/ k( \7 C
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 02:18 , Processed in 0.820787 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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