四目观天下

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述# T. m3 {9 ?3 U& S( x9 j5 {7 I
在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。
6 f5 U9 H  J  |3 z( v1 |在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。
, @& r% W  W% H我鼓励您继续阅读,因为内容承诺非常实用。8 u) o- C3 ~  g/ h7 o# D
将指标锁定在特定品种上。  O3 l" J, _. @1 @
第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
7 D  Q3 Z% _4 x1 D0 u' v) c. A#property copyright "Daniel Jose"  n0 ]3 q. x# [# F4 U* k0 L2 M
#property indicator_chart_window
/ D/ d( b* I" p#property indicator_plots 0
8 F0 z1 }, }0 j$ `" A( ^9 l//+------------------------------------------------------------------+
* t2 ?0 u! S/ U  s1 Q#include <Market Replay\C_Controls.mqh>" ~% o0 c1 y' @, x- Q9 d
//+------------------------------------------------------------------+
. {' W* ?+ V6 w2 T2 [" V4 T2 GC_Controls      Control;
9 I9 t, E0 v: k+ y9 h( g2 c//+------------------------------------------------------------------+
. m/ s3 O% a0 y, hint OnInit()9 m* u% M# ]. Q% P" {
{5 \: j- p* t/ V3 [$ m
u_Interprocess Info;
9 w9 h+ f& N5 V: B# G# sIndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);4 n" {( n* n- A+ h& ]. W  A: k
if (_Symbol != def_SymbolReplay)- i/ r: I# n4 Y5 d
{
+ L+ ?8 W8 ^: t4 H) c4 `1 y5 V3 KChartIndicatorDelete(ChartID(), 0, def_ShortName);
8 y) ~' i5 Z& J7 Y) X3 V$ breturn INIT_FAILED;# [5 F9 Z2 u1 D2 @1 N/ i# T! Y
}
+ N1 n2 \" l7 T# _4 t! cif (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;* M) [2 z5 r3 v8 s& D6 w
Control.Init(Info.s_Infos.isPlay);
2 a" p, c! j; @% j9 L/ _return INIT_SUCCEEDED;
) r# P; e$ ?! O5 F5 c6 `- H7 U}: `2 |  i* k- u1 l' h5 V
//+------------------------------------------------------------------+
+ L9 e: V& J5 _" a. eint OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])" I( `" `& T' u! |0 g& `
{6 {; I9 k8 S; x! U4 S
return rates_total;0 p" F6 x  [: m1 O
}# d& F' H# J2 X2 C) G3 c+ \0 N
//+------------------------------------------------------------------+
  d6 G' \8 i, X5 g- q* ~5 Jvoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
7 u2 w( q$ @& \3 g; h: l{
7 V/ Z8 Z; u7 h* p, y9 @Control.DispatchMessage(id, lparam, dparam, sparam);
6 _1 o" F/ h  f8 [& T2 W1 H! P}6 I9 t/ @( O/ O- V& N
//+------------------------------------------------------------------+
( _( t$ a# P/ G+ Tvoid OnDeinit(const int reason)
, a5 m7 L# ]7 x7 H{
5 y+ O5 R. ^4 X9 q7 b+ @switch (reason)
, w0 b1 w. ?( p% F3 O! P{% c* E. y; ?5 P+ \
case REASON_REMOVE:
# c8 Z, Y! v& y. K9 E2 q5 u# N/ L$ Mcase REASON_CHARTCLOSE:7 {4 v* ?+ q' O# \7 w0 {2 ]
if (_Symbol != def_SymbolReplay) break;. \0 ]! `* t" }8 N
GlobalVariableDel(def_GlobalVariableReplay);
0 k2 f: _- p5 r+ u' M: |& X6 p4 XChartClose(ChartID());
2 y2 [( |, w  U6 M( bbreak;
' O" I  [8 P2 b2 f1 T5 V6 x) D- U}
  Z+ ]1 u- N. P( ?' B}
; x1 ~$ E( i0 g( x- k# [. n//+------------------------------------------------------------------+
5 u5 p. g3 o# j5 A- b) U我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
% Y. G2 L! H* T# \- O现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。+ v: S: h( u6 l; t/ H- h: r! H6 t
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。  a+ I* x* I# B% t6 }3 |) K
尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。3 P9 P8 i2 `0 L" H
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
- _; R4 u  i8 Z; z5 u$ s我们应该避免在同一图表上多次使用指标。, Z$ V- j4 U) V' G8 U8 B2 n) q
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。' q& G; p; Z: j! F1 |% R
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。
* V; N  B. [7 V; u& y  ^为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:. z! [- j+ j5 Y& w- u. {2 X
#property copyright "Daniel Jose"
  J$ |7 n: s- D! k; t6 i6 a8 A) p//+------------------------------------------------------------------+$ Y4 U4 |' v+ r  W# g. y" w8 J* R
#define def_GlobalVariableReplay        "Replay Infos"
( f0 E7 M% i( O9 g4 v& _1 z#define def_GlobalVariableIdGraphics    "Replay ID"" H) }* ~1 Q: W5 A1 Q/ N
#define def_SymbolReplay                "RePlay"
5 v6 c, A( I" w6 @4 f#define def_MaxPosSlider                400( p2 s3 Q2 G# i5 E2 A1 B# W9 g" N# ]
#define def_ShortName                   "Market Replay"
$ [2 h9 n0 n3 S; e//+------------------------------------------------------------------+' e$ S2 b5 V* @$ t) u4 B3 [
union u_Interprocess' s7 L  \" m2 ]' E
{$ d4 S, U1 W1 r- k  o
union u_0
3 @9 C7 G( ~" _+ y' ?' G8 _' i/ e{. q5 [( }2 \' o
double  df_Value;
5 {0 Z0 `& I4 ^7 p0 e  g7 Dlong    IdGraphic;
+ a3 ?3 @9 q1 m4 B2 k" ]}u_Value;
; T$ x# q6 c3 U5 P% T+ ^# ~9 H5 Tstruct st_0
" Y' |" r# i0 ?+ G( a; x& r+ V{
4 u! |0 h" Y! lbool    isPlay;( M, S1 a- _/ E8 G( T# u6 y3 m8 F! `
int     iPosShift;
9 t$ N9 ~6 e9 _/ J, w* o' G}s_Infos;
% k. ?6 K+ j9 I% C+ ?: D8 d};
: k" E! u1 z' W* r//+------------------------------------------------------------------+
4 b9 w: Y9 g3 ~4 F# p对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。
" k  h2 P) d* X# a, c注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。
% w: s7 n+ ?2 ~  R% `7 J: }重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。' e9 A+ U1 k8 n$ G/ g' A/ U
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:
2 L: b( r+ k( R7 N+ z# r+ D7 B3 D//+------------------------------------------------------------------+
  J" Q! @6 l3 |6 ~//| Script program start function                                    |
5 g( }) O9 U+ ^# d$ ]//+------------------------------------------------------------------+; E" i' X( N9 P5 A' Y1 s% b8 _
void OnStart()
4 V. j. v- |; j  T: s{
; D- v; H+ ^0 O8 O4 t- Q/ eENUM_TIMEFRAMES time = PERIOD_D1;
$ v% g) a6 J5 }% v8 R9 @) fstring szSymbol = "EURUSD";- Y- C' t! b7 W) r/ x
long id = ChartOpen(szSymbol, time);1 a- X, S( F0 d5 _* W' z7 `9 o
ChartRedraw(id);
0 U2 p( Z6 F( R0 oChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));' @/ N2 Y. m+ h7 p. {" _  P
}! P6 k! c3 @6 Y4 i  `
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-30 04:16 , Processed in 2.482323 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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