四目观天下

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述9 z+ y1 X# d* k% j6 ?
在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。
7 i2 c4 H  L  Q! M1 l( K在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。, n  r( p( A( ]3 c( ^+ O
我鼓励您继续阅读,因为内容承诺非常实用。. {$ q0 J) S; P% H% _2 o
将指标锁定在特定品种上。1 ^( C1 J2 W0 K- X6 ^
第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:2 c+ g( r6 K0 D: p5 |/ {3 [4 M
#property copyright "Daniel Jose"
) H  h  g7 [9 ?7 Q#property indicator_chart_window
. K4 Q/ b9 f# V, g  J- }- v#property indicator_plots 0
( _/ |! t! a5 Y! v6 n' E- L//+------------------------------------------------------------------+. a$ G4 ^% e, B
#include <Market Replay\C_Controls.mqh>
* q: A- [8 L" i# I; E8 Z: c6 B# P//+------------------------------------------------------------------+
5 Z) p' T' R* |6 _6 |( b& F; o# rC_Controls      Control;/ U9 [7 b( f& D) V
//+------------------------------------------------------------------+
9 U8 j! h) A; C/ _: ]% O4 B; @int OnInit()  q. m, d  A- {* o% d& C' a
{0 E$ T, q" s3 {# c+ ?) `
u_Interprocess Info;
9 U; g5 s. e7 S" N3 yIndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);& m2 ?/ o* C6 ~6 e0 }' f) i
if (_Symbol != def_SymbolReplay)
; U( w7 A% F8 ^8 R1 t{( y" C' M1 Z% C6 Y. m
ChartIndicatorDelete(ChartID(), 0, def_ShortName);0 V  d2 w  m: J% J( l% O4 h& g2 V
return INIT_FAILED;, O/ \) V3 b4 r# Q8 E" H" y, W
}
$ \# V( k: O( C: |1 J) |0 }if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
( V# s7 o! w) a1 ]/ D5 p& JControl.Init(Info.s_Infos.isPlay);/ i6 C0 w1 Z/ c- K9 _
return INIT_SUCCEEDED;( r: d7 L* b+ k: U, s
}2 ^" `$ t" ~; |  M4 @
//+------------------------------------------------------------------+
0 ?+ ^& P, [: c! j0 gint OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]): `3 U/ Q2 C, N: I' z5 w5 P; g
{
. B+ e1 M; k+ d: Greturn rates_total;
$ t4 b0 q9 X& J, p}& e7 m; c0 e2 E9 N
//+------------------------------------------------------------------+
3 k' R9 t! h( k+ g3 z& E2 ovoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)3 P1 \8 D7 R/ V, T3 W, _  N
{* @) K! m, u' `
Control.DispatchMessage(id, lparam, dparam, sparam);
/ z5 j3 }& t  i9 Z& D7 M}
8 H9 T% `1 t; a, x3 G//+------------------------------------------------------------------+: D* p! L' Q# B6 j
void OnDeinit(const int reason)
; J  R! j7 e9 T6 a- a" ^% p0 G{
& B9 ]7 A$ I! {2 Fswitch (reason)( H4 A7 t4 O; j+ {. c. m* ^
{
" [" C! N: T$ b4 s' l& L5 I% Acase REASON_REMOVE:
) d5 G( T/ w' u6 |7 ?% `4 i8 {3 \case REASON_CHARTCLOSE:8 H0 j% u2 U/ a+ d9 [/ }( _/ p
if (_Symbol != def_SymbolReplay) break;( `1 d$ m9 T! g9 ]' _+ y
GlobalVariableDel(def_GlobalVariableReplay);& ^0 k" I) U8 g- Z. B( p$ Z# w
ChartClose(ChartID());
, n2 k* }' I1 E9 m" rbreak;
, W$ b& W9 m6 G2 a& X* w}* P: u# {8 q7 I3 E- x
}
; v7 V( m. w5 p$ i1 R//+------------------------------------------------------------------+
# ~! u8 f4 k1 r! Z' n4 a我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
4 H* Q! \% ~: C; R/ x现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。6 x# O% C! N* _$ t
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
% {6 |* f8 T. P尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。4 }/ S- C& |% t  z0 r
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
- k7 p7 e6 l& K5 W8 f' R6 T0 w我们应该避免在同一图表上多次使用指标。
5 A6 r0 w% k9 k' S, _我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。
5 c3 W* p2 y3 o( E6 Y* n2 z: W我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。
/ R! a) ?# D! M0 O/ V为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:
6 Q! c. Y$ E: ], e5 W#property copyright "Daniel Jose"5 w9 q/ W5 O8 k8 x+ N8 f/ p
//+------------------------------------------------------------------+
" ^; ^: G: |6 a8 M#define def_GlobalVariableReplay        "Replay Infos"$ r; Q7 ^# \# }" j" v
#define def_GlobalVariableIdGraphics    "Replay ID"
( L( K0 R/ Z1 D6 s- q#define def_SymbolReplay                "RePlay"0 r8 l/ t( o( N6 F4 ]
#define def_MaxPosSlider                400) c7 _5 j3 A# ^1 r( X8 @
#define def_ShortName                   "Market Replay": i) r2 n# t7 u; C
//+------------------------------------------------------------------+. G! a0 \4 e0 N* \2 E
union u_Interprocess
( ?* o% }6 M( y& e8 G$ R{
8 A' }2 F6 u( T; m' Sunion u_0$ `0 p5 p: \, S/ k: w8 r, ]5 i9 O
{
+ v+ m" g7 Z+ fdouble  df_Value;& f% I+ J; y2 R" v2 M
long    IdGraphic;
$ K3 L) [% ^- h' n' S( r/ a4 e0 q}u_Value;: l: j! w) r, G- u6 s# K* h, G% A
struct st_0
8 [) H. F6 z+ I" ]{0 W( u1 V3 c8 U% Z4 Y6 P. T" N
bool    isPlay;
9 ^8 W1 ^9 f1 o5 hint     iPosShift;) F5 L1 h( Z" v. e2 t* f; ?4 S
}s_Infos;
, q+ T4 [/ I; I5 h- `2 G+ f};
* B* p2 Q; _+ n" U% z0 a9 O//+------------------------------------------------------------------+
6 q% f3 Y4 x7 H, e3 j对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。
; }) [2 J/ i: W注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。; b( A3 i( n8 j; f; d
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。. D& j, r  V0 ?+ d  c! p$ Z
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:, B- x' k2 v5 v! Z
//+------------------------------------------------------------------+
# o1 m9 C, L+ \/ [- a, \//| Script program start function                                    |
+ b2 N4 E* ~4 W0 N//+------------------------------------------------------------------+6 `4 y  y4 G/ q- X' L
void OnStart()( k5 `, r* b- W; W. |* o
{, E0 {# s! x: K& Z. n4 W
ENUM_TIMEFRAMES time = PERIOD_D1;
& L/ {5 o& s* ]7 }string szSymbol = "EURUSD";2 e$ U5 T" H6 G1 W$ I7 V! P- h$ n
long id = ChartOpen(szSymbol, time);9 r; R8 w/ o/ d$ }9 E. ^: M- H. S
ChartRedraw(id);
. x% [  X% {# U0 V- @8 T# L- x9 mChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));4 B: a% G  Y- B  K) k% b
}
/ h5 p+ `0 [! r( h2 C然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-4 09:09 , Processed in 0.734430 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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