四目观天下

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
7 J% X( ?3 v: N  M( w4 r& A在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。9 \7 V5 ^% ~$ a* K4 x/ z
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。
  n1 B& P4 f3 d. W4 A& R5 }( [* O我鼓励您继续阅读,因为内容承诺非常实用。
* \* u- k! K9 k将指标锁定在特定品种上。
9 j$ H, B4 L  n$ s6 t( w第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
# W. c9 I8 y; [# h#property copyright "Daniel Jose"
9 }. }. ]. |8 r: ]) J0 H#property indicator_chart_window+ I8 y0 {- q" u# I
#property indicator_plots 0! L- Z, D/ d9 e! @/ t- h  P
//+------------------------------------------------------------------+6 B/ j6 f$ V( Y  y# a
#include <Market Replay\C_Controls.mqh>: Z" E8 V. M. F/ c
//+------------------------------------------------------------------+
2 k( z, A7 {$ XC_Controls      Control;  X+ U. N) J9 R  m" K
//+------------------------------------------------------------------+4 _. Z+ y; v5 R# D+ t" A
int OnInit()
: a( ~" T4 g# `{
5 L; x5 p& P0 `# |* N' E% {3 Y+ iu_Interprocess Info;' i* F$ F$ W/ ~, B) P
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);
% [* G: J" m. X, q; l3 \if (_Symbol != def_SymbolReplay)
) i5 B6 l, O2 Z! v9 y, j! [/ L{
( Y9 t% v2 D6 I0 |$ \  yChartIndicatorDelete(ChartID(), 0, def_ShortName);
; G3 H; T$ U, s9 Wreturn INIT_FAILED;
* z( Z3 v: I0 {}' o8 Q3 j0 n' U5 I/ G3 v3 d
if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
+ x: V" d: ~5 x, U$ ]% w2 vControl.Init(Info.s_Infos.isPlay);: {& v9 N. m; {( n
return INIT_SUCCEEDED;5 L6 H  V# }5 x
}4 F- _. c8 u& R: z; z3 [- ^
//+------------------------------------------------------------------+8 f2 y6 E: v# X& M3 o8 ]. D2 h
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
5 @, C0 m  v7 R9 U3 h5 `{; v- G. H( K" u
return rates_total;
; I9 ^- h$ T8 [( x: J& m}
( N5 r, T1 N: K8 U' Y4 W//+------------------------------------------------------------------+
6 c3 V) X! I; u' W: y+ cvoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)7 p, q# i6 s' i, W+ T2 l5 b% O
{" S& Y( @2 y2 Y7 A$ m& W, n
Control.DispatchMessage(id, lparam, dparam, sparam);7 }; F* f4 L+ ]) _; \' Z, ?
}
3 Z8 h4 W* G  T0 j! @4 h* j//+------------------------------------------------------------------+
5 ~/ x, y( @  Tvoid OnDeinit(const int reason)3 o- h" _8 }& Y' b: [4 m, g
{1 ^* A2 o$ a0 n2 D$ V: u) R
switch (reason)
! {0 G( F$ T; W2 A# ]! V{4 u+ W1 p8 }: X6 T1 j. [
case REASON_REMOVE:
  c8 E6 o/ D- ~8 R0 Ycase REASON_CHARTCLOSE:% w9 a! F8 B- t8 r
if (_Symbol != def_SymbolReplay) break;  v* o) S) M+ E5 F
GlobalVariableDel(def_GlobalVariableReplay);/ i, T0 G/ N* I$ F  c
ChartClose(ChartID());
& r# V' l/ i5 B, y; Ubreak;- Q/ f1 P9 Z  n2 J' b. K% C9 B
}! M6 t4 l( k; S  Y2 \7 l3 ^4 s
}# n: Q8 `( \" X6 n% y4 Y3 j
//+------------------------------------------------------------------+
9 ?9 n( z# M/ W9 |: M( J我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
* [& x2 h7 ]& _& v# T现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。" [# g2 z( `/ C- Q
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
# C  t( C. r+ f尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。/ r) L9 ]+ {' }  o8 ^" F" d  A7 L  [
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
0 `& x  H9 z2 T6 S& W2 }1 F我们应该避免在同一图表上多次使用指标。6 s! {% g- O0 y$ Y( u6 R; m
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。
' ]: O9 x! {9 |3 v* F" w$ b我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。1 I, m+ e: V: q# n! o8 _
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:, l( i( p7 Q* T0 Z+ E
#property copyright "Daniel Jose"! {9 J9 R& ~' H3 p" D# J# N( {5 b
//+------------------------------------------------------------------+- H* X9 D/ m7 s) y' [$ G6 X
#define def_GlobalVariableReplay        "Replay Infos"( G2 o/ E$ T( @: [
#define def_GlobalVariableIdGraphics    "Replay ID"' ]2 w" I/ O% @6 T, |
#define def_SymbolReplay                "RePlay"
- z8 q, }, {/ [: @#define def_MaxPosSlider                400( [! K  R9 H/ ~3 V; v
#define def_ShortName                   "Market Replay"/ ^: `7 {# ]% j; d" p
//+------------------------------------------------------------------+5 E) k9 m" g  t: X, @: c7 m- c
union u_Interprocess  S2 p$ u/ R$ T7 Q5 |4 q' V
{
( T+ Y" T" \! @, Wunion u_0
5 b) P) N5 t- `1 H0 b  G* {% N5 f{4 n& H. P5 {) |5 r3 Y
double  df_Value;3 M3 R- ^; P% ^, L6 N# ]
long    IdGraphic;
, x3 A2 C: g5 w6 t# Z+ ]}u_Value;
7 Q! `) @8 I( X6 {5 M9 Fstruct st_0
3 E! A) p. j2 b' w4 e2 i4 b{
, M% v" _$ Y4 S6 p- f0 Ubool    isPlay;
8 J+ D, y2 |% D4 l6 Oint     iPosShift;
$ J- V& W3 ^% v. x1 W}s_Infos;
) Z( {: _$ F( P. O; V' A* F, ]% ^  b};1 b3 V  O- @( P7 Y" i7 ^6 R; g$ |/ g
//+------------------------------------------------------------------+
! a6 q5 y' D1 v3 P7 x对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。
! G, h$ a& n- U8 g  @注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。
! ^7 a) K0 c# D+ G1 H/ X3 t) Z! |重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。& a; h9 w: L# \4 K2 U  f+ _# x
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:: ^5 W7 H7 I- T. E1 S) G. R
//+------------------------------------------------------------------+
5 L* }+ ~! p( _2 [& ^" R- c//| Script program start function                                    |+ C6 t# F/ z2 e8 ~1 B" I* Y7 K
//+------------------------------------------------------------------+
- _  M6 n) o1 L; s! T2 l( Tvoid OnStart()1 A- L# Y( v( d* K7 I
{% |. _% F# S2 F
ENUM_TIMEFRAMES time = PERIOD_D1;
( C$ F7 i+ d2 S; p" O! mstring szSymbol = "EURUSD";
( C2 K4 E/ e# l. f& N0 T& Flong id = ChartOpen(szSymbol, time);
( G5 y' h. {" ]- ?ChartRedraw(id);
' F' f& g( {5 F+ `" g7 b9 @9 MChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));' V4 W6 I, @7 L9 l- L% }, v8 }7 H
}
# O' r8 e7 U$ w4 |然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-16 07:21 , Processed in 0.441148 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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