私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
" Q7 X0 M, A3 D# ?在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。
; P2 S% q/ l* H: s在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。; z; @" \) b: N7 \& x6 X
我鼓励您继续阅读,因为内容承诺非常实用。
  |7 Y8 c3 b6 n0 m) R5 t3 G将指标锁定在特定品种上。
8 e$ p3 f  L. T第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:# a$ L7 V& p4 c
#property copyright "Daniel Jose"  i. M6 c! d+ G, `( n! C0 m
#property indicator_chart_window
( I/ a, a; C" T! ^9 r+ |#property indicator_plots 09 J, A: h$ I: ]! I: D
//+------------------------------------------------------------------+
+ \$ ~. a/ |/ Y6 Y: {( @#include <Market Replay\C_Controls.mqh>
: w( v! H0 ?: x1 C3 b2 x. W2 Z! \9 z//+------------------------------------------------------------------+
2 f2 N! r, V  ]' xC_Controls      Control;' L5 g6 k* g3 O  Y
//+------------------------------------------------------------------+) u/ d, Y& K! I% x" N
int OnInit()
- m7 y+ A: o3 u! }: Z1 V{* K$ d  x1 @6 C2 x5 V
u_Interprocess Info;& N" k8 h! [/ M: J
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);0 S0 F* b. q0 k0 A
if (_Symbol != def_SymbolReplay)9 o; B/ ?! h- l$ |
{$ X9 F% p) ~$ m! `
ChartIndicatorDelete(ChartID(), 0, def_ShortName);
2 R' {* H) \1 v1 E& S9 _, ~return INIT_FAILED;+ \; B# u& K3 y9 K
}8 f3 |4 @! ^6 @9 m6 e
if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;, `, e4 Q, C3 b3 `; B6 `, w0 [0 {
Control.Init(Info.s_Infos.isPlay);/ a) W( @. E& n; y* r$ L% z
return INIT_SUCCEEDED;& ^0 p: F9 t5 Q: j- G
}
" G# J/ e' _1 s1 k: ^, @8 {% s//+------------------------------------------------------------------+" ?: N: h3 |7 b8 l: ?1 P
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
# ~( n8 M! B/ ~9 W  H2 y+ O3 }{6 k; |) P6 a7 D1 V! \6 W
return rates_total;
: ~. e. S, |  E}
' h+ Y7 Y4 T7 t( b0 {  w! P//+------------------------------------------------------------------+( c$ j0 O  C- h9 V
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)' M" X: X4 I7 Q: b$ D+ w
{
+ r6 _& t" d# Q8 m: @Control.DispatchMessage(id, lparam, dparam, sparam);
5 l$ d3 c: o; K4 `. M# F0 ^* v}
5 _; ]* R$ k# T' A//+------------------------------------------------------------------+% r& Q& ?8 Z0 \: m6 p
void OnDeinit(const int reason)3 U) I9 Z( K9 k8 L) t& R
{& D8 Q3 Z- X* R& d7 n% X/ a2 D
switch (reason)' X1 W4 n5 P: F/ J! k4 y
{$ E- e: l; `8 W, X. h# \
case REASON_REMOVE:
0 R5 C( |( c) ]7 H4 `7 C3 P) }case REASON_CHARTCLOSE:7 G9 a3 e- H  _2 v' c% C) Q
if (_Symbol != def_SymbolReplay) break;" x3 ^) E- K2 f  K8 @2 |1 F: z
GlobalVariableDel(def_GlobalVariableReplay);
& \! h' O- \1 @6 N- NChartClose(ChartID());
) I+ v: `! r; S7 o$ Ybreak;3 y  j: Y1 j' S  t0 J$ ^
}3 L0 j" d2 `- _/ t' W; M
}
. F' m) I7 m5 Q3 F+ a8 m' U. p/ j//+------------------------------------------------------------------+
- I, L( w) W. }  P- d2 `7 O我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。- G: w' b7 }7 s8 C
现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。
& r5 {2 ]) y% V6 _8 `0 y* ?如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
9 [% ~" T5 G& T9 r, I, A尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。
- j5 u8 n6 |7 V" P因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。% i: S$ B* k% {8 |
我们应该避免在同一图表上多次使用指标。  P6 J0 o/ I" Q9 d  {' b: h
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。
' Z; d  [+ B2 B$ b4 q( k5 D- }( r6 [我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。  \* |. L% {7 u5 x: f
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:5 B: w9 w( |4 \. o
#property copyright "Daniel Jose"/ R) V4 p3 M( `" B6 V& L7 Y
//+------------------------------------------------------------------+0 l( H. w( P" U! V( g0 r4 C
#define def_GlobalVariableReplay        "Replay Infos"
$ F) M4 X/ }$ j0 j3 M#define def_GlobalVariableIdGraphics    "Replay ID"! V. G  I' `8 w  ~9 _5 z$ m! k
#define def_SymbolReplay                "RePlay"
+ U2 _+ q6 F2 f: q3 {: [: Y& _#define def_MaxPosSlider                400
* W9 V' c8 Z9 C& T  d#define def_ShortName                   "Market Replay"+ F- P4 z& B& P1 F! `. \$ \% Q
//+------------------------------------------------------------------+
6 `, |# U8 F# a1 gunion u_Interprocess: }& t  O. U" q4 @& C# A* Z  G' j9 |9 y9 U
{
. K  \7 q0 {5 C' `6 t7 x- yunion u_0% [  L7 G& w) F9 ^9 C: Y" I2 }) r; t
{  @% D  H% p: Z' e! p
double  df_Value;0 L6 d+ m) {0 {: I% \; k* Z/ ?
long    IdGraphic;/ W, P, S# n0 R+ l2 T$ y
}u_Value;, {# @, b( i$ R1 }0 V2 H4 b1 o
struct st_0
1 o0 p$ a# w) L; r' J# m( |{6 k0 e4 P( T- y7 W$ \
bool    isPlay;' W/ v7 F. e0 t
int     iPosShift;
3 W! h% c- W0 q) U8 k. _}s_Infos;
7 J1 X. q, ]. W% O4 |};( Y. O+ V9 h( [8 M* L% ^
//+------------------------------------------------------------------+
% q# ?' q) z) O4 V3 B对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。
, I' Y* @' r9 l8 Y6 r注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。
8 M  b! p: t  t) u7 S0 T3 [- a重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。7 f9 k( D" C+ v0 P( \( Y* N0 e
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:
8 \- }& U: L& I$ `" Z; c//+------------------------------------------------------------------+: y* |5 g9 f; X/ V; M0 m
//| Script program start function                                    |
* A, l$ ]+ I$ e5 b//+------------------------------------------------------------------+( n8 L- A1 G" o2 t( a
void OnStart()7 Q& k' R; w. d8 ?& @0 q4 c
{
) K0 T' R6 U( @+ WENUM_TIMEFRAMES time = PERIOD_D1;( A9 o/ e: T5 C' I% u
string szSymbol = "EURUSD";' A% b0 Z/ @9 o8 |% i
long id = ChartOpen(szSymbol, time);
: M, ~( w0 `8 c! A1 O* n/ ]& x2 \ChartRedraw(id);
3 Z, J1 \5 O6 r2 K/ k" jChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));9 \) T/ b$ K+ U- d
}
2 _1 Q& n8 x0 R! H( U; f然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-9 02:23 , Processed in 4.231192 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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