私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
3 _; d; g* B  z: w, H& g$ y5 s# `6 n在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。
4 M" d4 V7 t$ ]3 d" D$ e在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。
& T: r8 m3 Q2 I# x$ S) [7 P我鼓励您继续阅读,因为内容承诺非常实用。
3 n, Z) U2 o# C& J* v0 Y将指标锁定在特定品种上。
5 S/ [; P8 _' @7 x% j/ @第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
( ?0 w! A5 L% Q' ~#property copyright "Daniel Jose"
7 i/ y- O$ c, U( S9 c& x#property indicator_chart_window
8 `! ]8 j3 S" B; n$ p#property indicator_plots 0
7 Z9 i* s7 C/ d, V7 X% Z0 i//+------------------------------------------------------------------+
7 g3 P! J( l+ p  F#include <Market Replay\C_Controls.mqh># X6 S  p8 ?' ?
//+------------------------------------------------------------------+' ^3 s( E- i1 }; g
C_Controls      Control;
0 F' V, Q4 n( ?; U5 A//+------------------------------------------------------------------+0 t3 a4 R& M2 A4 B. U- q1 P
int OnInit()
8 G9 v4 z- r( y+ o0 q; X: I, }{
+ R! ~4 p$ x' wu_Interprocess Info;
3 s- Z+ _6 Z! l% z9 yIndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);
8 r) P. L; f8 u- N: \6 `5 l9 jif (_Symbol != def_SymbolReplay)* [# n7 s6 C5 x# N5 ~0 {) ^
{  }' m9 V$ n; O" ^" q/ O6 y
ChartIndicatorDelete(ChartID(), 0, def_ShortName);8 j5 r$ n, j5 g0 L/ W
return INIT_FAILED;0 f" L  k1 J# k" }# U# ^3 ~4 y" G
}! z/ `0 w8 B  s: F5 V: q# ^
if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
! ?9 Z; S- O+ R( uControl.Init(Info.s_Infos.isPlay);: W& Z: \6 ]- Q& e' |
return INIT_SUCCEEDED;
2 I  p, u1 O, _# A( s/ v; [% O0 L}
$ n% e) P' X2 O% e//+------------------------------------------------------------------+5 P6 p3 S, g6 A
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
- H# R/ q5 o5 b0 _( ]; V, }{
. q& A3 J4 n2 S2 @. A% _( E5 y4 L( b5 rreturn rates_total;
4 t- b  F0 u' e1 O5 W3 I}1 ~4 T8 `! [4 v7 `8 f) p9 X2 g4 r
//+------------------------------------------------------------------+4 K. b% g$ W" c$ ?% J4 S
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam). }2 u) }  T/ a# ~" K
{3 t: \0 q. x5 V4 `# v
Control.DispatchMessage(id, lparam, dparam, sparam);
9 m1 D1 Z) ?) a0 p! M  r/ A+ @2 y}
" C, E, A. r. I3 U6 L//+------------------------------------------------------------------+
2 J' p* x0 r9 I: lvoid OnDeinit(const int reason)
" U7 C( Q) M* u8 Y' u9 `, e{& B4 m& ?7 ~1 K7 Z* ^
switch (reason)7 h- p& `. V: o: @4 R
{& ~3 D9 c% W1 N+ r! k% ?) K4 f: I& k
case REASON_REMOVE:
: t$ i! t8 L; U/ Acase REASON_CHARTCLOSE:
+ A# ~4 z( W1 [. E; P0 m% Aif (_Symbol != def_SymbolReplay) break;4 u" I& z& n; h& v) O, Y2 x
GlobalVariableDel(def_GlobalVariableReplay);; u& g+ D: _' K7 m6 ]1 M2 _1 y  t
ChartClose(ChartID());4 F/ ]& O3 s& x2 Y6 m. M6 ?, l
break;: \) _$ U3 {. }4 R! B) \
}
5 d; M/ H% ?/ B5 h. v( V' O8 l}9 e; |. c. W! f: j0 e* [, X: i
//+------------------------------------------------------------------+# {, r) e3 j# Q1 }/ f" A; s0 e& A0 d
我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。& A' @8 |9 F% |! h0 M' |, T
现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。
) q. `7 E" U& e7 d, V如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。0 g+ y. B6 |! T( U7 L* g6 c' y8 ~$ o
尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。
4 a2 O* A4 b- I6 v" V0 i6 S' A7 i因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
. o2 s" P/ c3 o4 I我们应该避免在同一图表上多次使用指标。
' L8 z8 b0 j2 L" C4 y! ^( ?2 H我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。3 [% ^$ H& R& r/ s
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。
! M% f) K4 k1 y+ p/ P1 q& |& u为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:
) q, E+ v  o! X1 v( M! J8 O8 C#property copyright "Daniel Jose"
, R8 d- d/ K+ ]) \- `//+------------------------------------------------------------------+, I# E) F8 C) g+ C
#define def_GlobalVariableReplay        "Replay Infos"  h' {* H/ P; G4 q3 _# P& z
#define def_GlobalVariableIdGraphics    "Replay ID"
; `1 s5 f% n/ L# r5 X: L: Q#define def_SymbolReplay                "RePlay"
+ s$ s& r" C! d& M# e#define def_MaxPosSlider                400# b2 m( l# L9 t) q6 J3 q# A
#define def_ShortName                   "Market Replay"" W' ]9 K9 S8 }
//+------------------------------------------------------------------+4 A! S* q$ ^- u, d. w% L
union u_Interprocess8 d6 Z+ u, D8 ~: d; U( }( P
{
4 \1 D7 ~; C2 l# c1 \union u_0* s% {6 m5 a4 I( o) n" J' Y, q
{
; _% p/ n2 C- Fdouble  df_Value;
* P; z. I* w+ v2 Q0 x. r* Y2 H# elong    IdGraphic;
0 m; n% J5 j7 R4 {}u_Value;
  I: F9 M0 d) D, e+ Estruct st_0
8 o+ G% i* I6 {3 C+ z- x{; I8 \& {6 i# i! Z* {- a$ x, ]
bool    isPlay;
0 T. R; p1 ~% [+ Jint     iPosShift;! E4 O3 S# e; O/ g. T& {5 a
}s_Infos;" o4 M! |; g5 G  Q; ]# k2 _
};
5 ?8 {1 Z& g* ^* v& q//+------------------------------------------------------------------+$ @- b7 \1 a# L8 q
对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。
: P/ h7 Z9 \" R( @6 d. z& O; M注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。" v7 c8 X5 @) H( a5 [8 ~
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。
' f: b5 m) L2 z, a- A! V在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:
2 o, b9 }5 Y& S# Q//+------------------------------------------------------------------+
( D" f8 z4 y4 ?; o+ v8 ?//| Script program start function                                    |
9 Z( o: S* ]+ }' [) m. t$ Y$ Z2 y- A//+------------------------------------------------------------------+
) i/ r/ s9 O2 X) p9 p# o1 Vvoid OnStart()% [3 q1 c6 _& q! p" i
{5 r) @, C' y4 u$ l
ENUM_TIMEFRAMES time = PERIOD_D1;. s9 r+ \6 O0 ]2 X; I: A; ~) N
string szSymbol = "EURUSD";' Y" D8 {; l, n1 q# |0 |
long id = ChartOpen(szSymbol, time);
& @% C  \4 H6 H7 {( [- KChartRedraw(id);
) `' B* V; U0 b; M& S; ^ChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));$ S4 ]0 p+ \& I# Q8 A: e2 A7 U
}$ b8 `$ W9 T6 t
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-21 23:55 , Processed in 0.372986 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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