私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述1 E& Y" {- N, W5 c
在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。
! Z4 e' ^  _/ k% z# D. U% ^% k在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。$ u( Z9 Z: n2 H$ \6 B) ]
我鼓励您继续阅读,因为内容承诺非常实用。
0 ?; T8 i2 T; \! \5 C7 R将指标锁定在特定品种上。
- T3 J# q" `# C) b. T第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
2 a/ c3 R; J8 x# ~#property copyright "Daniel Jose"
' B) w+ ~) A& L4 g8 H8 L#property indicator_chart_window! s* w: Z& C' M! p6 \* i1 N
#property indicator_plots 0$ a' ~: }1 q8 N, ]8 h
//+------------------------------------------------------------------+3 ^0 S9 O0 M6 r! K; e' O2 q
#include <Market Replay\C_Controls.mqh>
( A, q- N+ @: {( [//+------------------------------------------------------------------+4 V7 P' v0 W; U3 |
C_Controls      Control;% U6 a, o4 _7 R, g* e) [& O
//+------------------------------------------------------------------+2 _9 }9 C, X* d2 c% H( ]
int OnInit()# z, i( c; l% N2 Z& G
{, e, v( K" ~5 G! n+ G
u_Interprocess Info;0 `! f' x' b1 E6 |7 Q& V$ C
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);9 ~( A6 w" G% _( D, ~+ B
if (_Symbol != def_SymbolReplay)& {4 W# `( g! z( S) K, |
{: z1 z  S& R5 X( ~+ P! J  x
ChartIndicatorDelete(ChartID(), 0, def_ShortName);& W( V! {3 ?9 W6 F$ y3 r
return INIT_FAILED;& m! _5 e/ V& E1 v. @
}. X# T4 d  u5 Y3 h$ d' e
if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
3 k+ m3 P0 q/ |6 X4 H. _Control.Init(Info.s_Infos.isPlay);
1 K6 s  {- \" O  Hreturn INIT_SUCCEEDED;
* O, H( U) @4 L  M5 @: S$ O# @}0 P- b( ~. _- @9 R8 o( U) R* B
//+------------------------------------------------------------------+
, V5 {, u8 s# {7 eint OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])/ y  |- ^" I3 y3 n8 Y6 R1 c# q
{
0 u# }4 Q' S' d5 D7 Lreturn rates_total;
( X) Q1 Q4 u, I3 ~$ b* c: ~}/ R) b( @% |' q; k. f
//+------------------------------------------------------------------+
- ~8 m6 N4 o* {+ ~) P: j3 svoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
. I) M/ N, b6 E4 P6 k# y{
6 O8 c5 A" Z. [2 F, B2 @7 d4 J( W; UControl.DispatchMessage(id, lparam, dparam, sparam);
" p, N2 a3 l8 v" r}; a4 i) p( X' u" {9 I
//+------------------------------------------------------------------+
& Q/ n) g( x0 e% n5 g0 {void OnDeinit(const int reason)
; r! K) M8 A, @5 q1 j  D{
. N/ c! M7 v& r  {9 S% o; Oswitch (reason): \( _4 w# N1 P4 k( U- J
{: l7 k. G" \  h/ k' z1 x; N  {8 ]/ J
case REASON_REMOVE:7 S# \" s9 f* q9 M  f
case REASON_CHARTCLOSE:
$ A; t. k+ U' ]3 e5 h- j/ Y0 Kif (_Symbol != def_SymbolReplay) break;4 h0 d* h. k; z& C0 [* G( C+ z+ S# N
GlobalVariableDel(def_GlobalVariableReplay);
4 ?; s- E& o4 D, S2 a& u0 UChartClose(ChartID());
6 U. ~6 Y9 Y& d- jbreak;5 n8 n# c5 {( v2 h! b
}  Z1 W6 x" F& H+ ?, i' b. l, Q
}6 k: t, f/ g, ~) W
//+------------------------------------------------------------------+
  ]5 ^. {- L$ o- c) o( I% r  Z我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。  U8 ]( d& a( D8 s
现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。% [! A1 G3 M( ^
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。$ ?( {6 J. \/ H- n1 T
尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。
) m0 Q/ @0 A3 {  k# P因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。* [$ m' f3 D$ K! H
我们应该避免在同一图表上多次使用指标。4 k& _* P# k1 |1 A# H# Z) l
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。
; `! h6 B- z0 v2 o8 W9 X我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。
+ _- }5 R9 l: @; ]为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:
: z( C6 O  {8 ?0 D2 Z3 f& t#property copyright "Daniel Jose"
& ~0 A* O1 b5 Q9 |- \- z- `% i//+------------------------------------------------------------------+
5 E/ U4 j& `( h% g3 }) k+ a8 t#define def_GlobalVariableReplay        "Replay Infos"6 r$ o3 x) x" T9 @
#define def_GlobalVariableIdGraphics    "Replay ID"
' A5 b0 G/ D6 ~  N; L  `#define def_SymbolReplay                "RePlay"
3 i) A7 I' A, M#define def_MaxPosSlider                400, I/ y0 u4 H' W% k% j
#define def_ShortName                   "Market Replay"8 e0 N6 m4 v; a! o. H- ]( `5 v0 S
//+------------------------------------------------------------------+- H6 a" M. o) |1 A+ h
union u_Interprocess4 e4 E! t0 B: v0 N
{0 C, C, a: W! T- G7 D
union u_0
" |3 |& p- J' o% R6 C/ t3 s* |$ R. y( e{
0 f7 E3 L2 G; X+ F. {double  df_Value;7 Z' y* J# I  B2 n0 K. D, ]
long    IdGraphic;
; H" [* Z2 L0 u( Y7 f. x4 b* E}u_Value;
# v; a) k3 W8 v- C4 Lstruct st_0
6 M! n- G% M+ _* V. N) l  s{1 _5 m9 j2 Z$ u% k) [
bool    isPlay;/ e1 z% m9 \, o; Y. n
int     iPosShift;/ z: x. h' g4 u5 B8 e/ `9 x
}s_Infos;
/ s5 ~- ~5 R! s- _7 C" o};& \7 d5 J" {, R( S. N; j, y% C
//+------------------------------------------------------------------+
6 I7 Y. E: l+ |! `; Z4 \对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。7 ~8 Z! i0 H7 t6 x3 r/ C1 n0 C
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。
4 ]' R7 A: F" K( G重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。8 M% M; b) `3 h- Z" j# M
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:
/ X( }' y' i; Q' c" K//+------------------------------------------------------------------+0 C3 x/ r0 n1 k7 k$ d
//| Script program start function                                    |
. X" E4 j, |0 B! D7 f, M8 t//+------------------------------------------------------------------+: p& c$ J+ j9 }% j6 i6 g% H
void OnStart()
" H- m% J7 r( x% u{
  [: n5 _* ?, v2 P: HENUM_TIMEFRAMES time = PERIOD_D1;/ q$ l% }$ B. h: D% ~* O7 w
string szSymbol = "EURUSD";
7 |; ]& U. m" L. `long id = ChartOpen(szSymbol, time);
5 h3 H  C" q9 t4 V; d0 RChartRedraw(id);
& |$ w3 N( d9 w$ a/ a1 KChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));
2 v! |: A3 D* i& z; m/ m5 z6 p}8 z3 X  F8 `4 ?( p6 ]
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-14 11:07 , Processed in 0.405995 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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