私募网

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
2 N5 Y6 n$ X& x& N, t在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。2 @& r' J' |  Q& R: K9 |
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。
+ ]2 b, Z  e" O9 g: O我鼓励您继续阅读,因为内容承诺非常实用。
* D% C& l: E0 {3 l: X; k, F将指标锁定在特定品种上。
& x6 j7 F: ~. Q第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:5 S; Z9 Y# r- Y7 D% Y
#property copyright "Daniel Jose"
5 N# k8 ?( ]% @1 \: ]#property indicator_chart_window  @( R2 l. B" H3 |4 g& `! H
#property indicator_plots 00 T& t* Z' I2 n
//+------------------------------------------------------------------+  {9 u7 Z* Q& l% N
#include <Market Replay\C_Controls.mqh>0 }  i2 A4 F  s  [! R' g
//+------------------------------------------------------------------+0 R! f0 o0 Z3 r
C_Controls      Control;" n6 l5 L9 F5 P) g
//+------------------------------------------------------------------+
/ u. {6 Z2 s! `* Vint OnInit(), Z6 R* S# ]) Y, H: `% g3 e( v0 o
{' }+ P* B" z7 W- Y# x* W7 A  R
u_Interprocess Info;- C  S% u% d! X% e
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);  ^; U" C2 m6 E; Y
if (_Symbol != def_SymbolReplay)
8 ~: ?( U( e2 F' m4 ~{. C* m# S% i6 Z- [0 w. E% [
ChartIndicatorDelete(ChartID(), 0, def_ShortName);9 b: J# b4 C" ^7 E3 m# w$ y
return INIT_FAILED;8 S9 `) y  ^* x# P- Y6 q% W; m
}8 s" {1 h3 m. H: R7 a* ]
if (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;2 }* U% p* H3 v. \
Control.Init(Info.s_Infos.isPlay);( c5 t+ R, G9 \0 Q
return INIT_SUCCEEDED;
3 X% @. y: v  v( g}
$ p' l5 F  h+ m1 E9 r//+------------------------------------------------------------------+% V5 c+ h# R$ Q& h
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
9 q# Y' M) _" n2 H! G) X{
& e1 n' N; c7 Z  v6 dreturn rates_total;) C- d! H# J' E
}* F' @; J/ r, `
//+------------------------------------------------------------------+
, K" n7 L9 I3 z& Qvoid OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
. e/ s+ w. F( N' K" x{7 h. {" E! |  e/ M
Control.DispatchMessage(id, lparam, dparam, sparam);
# Q. g8 G. ~: e6 X8 B' P}
- l% w5 M/ j, P8 V3 Z//+------------------------------------------------------------------+% S9 A. [8 ~. p
void OnDeinit(const int reason)) a4 o6 A7 F3 g0 d
{
' w0 ]/ [1 f) i; V( z# P, W5 n  Nswitch (reason)5 G" Q  ]; q7 j6 Q1 p) |. I
{- k  F: i  I1 V7 n4 y4 L
case REASON_REMOVE:
& Q3 l5 X. Z  L2 xcase REASON_CHARTCLOSE:! f# q" j0 Y3 X
if (_Symbol != def_SymbolReplay) break;
* B/ A- s% @% N. r  R: |2 YGlobalVariableDel(def_GlobalVariableReplay);
& k: l/ l9 W4 s  C6 h6 ZChartClose(ChartID());
" t2 P& g/ z% ^- d2 a! R5 cbreak;
2 z0 c, g. |2 D2 g  @7 x1 D  F}( X0 J- j/ E/ @7 k
}8 P9 a- d% h- m5 S
//+------------------------------------------------------------------+
3 ?  [2 I/ }4 ?$ l2 Z# }我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。( r) u, a' {3 O! S, S, G' p
现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。, C, A' e0 G) g/ t$ O& ]8 _" B
如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。
, ^; |* J7 `2 S$ k5 h尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。& w1 P, i, b$ F- |. e
因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。0 Y$ C4 P. o8 M- c+ ^3 g
我们应该避免在同一图表上多次使用指标。$ U" [5 e' w1 E% c5 r( U6 F! `
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。
3 r( N( p8 B. c我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。" l- ?5 u: |1 u2 {
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:
! V  z# e6 l- H1 Z#property copyright "Daniel Jose"
! \  x3 ]( v; f4 R9 x1 x//+------------------------------------------------------------------+
! L& ~! ^  S1 I5 l#define def_GlobalVariableReplay        "Replay Infos"* R' u0 h& A' x! B+ M+ P" k  v
#define def_GlobalVariableIdGraphics    "Replay ID"! _0 M* }: `8 ~! \$ v9 P, ]
#define def_SymbolReplay                "RePlay"
9 a. t( C/ T( e6 A, O#define def_MaxPosSlider                400
+ a9 I% F" H- B4 |( |$ O#define def_ShortName                   "Market Replay"
) i- T3 N/ a! C( w//+------------------------------------------------------------------+% N; [) H0 b9 Q9 J) F: T
union u_Interprocess
0 J9 C; Y8 _  X/ Y( b0 h{0 P# w- A( b" w$ l% J
union u_0& ~5 y$ [4 f# x" X* P6 t
{3 e6 U8 e; L9 v* Q! t! t
double  df_Value;' |' t0 @  j: e+ t/ _* t9 b4 F4 x
long    IdGraphic;" Z& @, d3 p* i  |/ f; n
}u_Value;
. f: w) o4 x( u. S) F* dstruct st_0
3 T/ I' d. Q$ s  I7 ?{& T2 [# p- b1 t/ V& E
bool    isPlay;
- m$ }8 R) Q9 U- m( Gint     iPosShift;0 _. U+ y* |; B9 R4 V
}s_Infos;0 b$ a! q, c) J' K" N: m
};
8 |6 y5 Y4 y" G& i' M) V' J# b1 f//+------------------------------------------------------------------+
7 S: z* o9 Z2 O( @' h' J对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。% C: P- l! d3 ]  P/ G5 ~$ z
注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。
4 S6 d* x2 b3 R: Q! |: S3 Z重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。9 Z# l# a! v! n% I3 r3 b! S
在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:" j7 Z0 [  R  b8 }  k2 H
//+------------------------------------------------------------------+9 V! y- ]2 Y4 k
//| Script program start function                                    |
# d, a8 b: z% g/ B! ~//+------------------------------------------------------------------+
, t9 t  J8 E2 mvoid OnStart()+ @- R5 t9 g& f
{
9 d, w% ~- w" Z9 U8 ^0 i! tENUM_TIMEFRAMES time = PERIOD_D1;! W3 u" O9 _! \2 O8 @2 O
string szSymbol = "EURUSD";
6 C2 K% ^9 ?/ t! qlong id = ChartOpen(szSymbol, time);
5 M; }* N- t& ~5 ?ChartRedraw(id);! X, g: F* [& ]5 o; \8 m8 Y
ChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));
4 t1 F( Z3 T9 l7 c- N$ ^3 D}
$ q; b) o& ~5 Y" G8 f' Z然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-28 21:25 , Processed in 3.121229 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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