私募

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

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

[复制链接]
发表于 2024-4-4 08:08:25 | 显示全部楼层 |阅读模式
概述
+ E" c$ V. U% N1 m( S在上一篇文章我们曾做过一些修正和调整。 不过,依旧还有错误,如该文所附的视频所示。: p/ K+ d* P1 L
在本文中,我们将亲眼见证如何修复此错误。 虽然表面上看这似乎很简单,但我们需要遵循若干个步骤。 这个过程将是奇妙和有趣的。 我们的目标是令指标专门应用于特定的图表和品种。 即使用户尝试,他们也无法将指标应用于另外的图表,或在一个会话中多次打开它。  i6 b9 K, e- e" H) U; Z. H
我鼓励您继续阅读,因为内容承诺非常实用。
; e0 `; ?. {! G" g  x2 N将指标锁定在特定品种上。. T/ c$ C; L) w
第一步是将控制指标链接到进行市场回放的品种。 这一步虽然看起来很简单,但对于开发我们的主要任务是必要的。 我们来看看指标代码在上下文中会是什么样子:
; ^) W3 J5 }4 O: M7 _% A#property copyright "Daniel Jose"* N. S6 t$ R0 ^6 X
#property indicator_chart_window$ B9 z' G( \/ T5 Z+ u
#property indicator_plots 0
* p- y- C! r! w8 l. g5 A- q+ y//+------------------------------------------------------------------+  w7 E- p4 f  T; X9 ]( L" T9 }
#include <Market Replay\C_Controls.mqh>
; w# p  O1 S$ W* L/ Q2 P//+------------------------------------------------------------------+0 \; a4 ]9 G6 q4 O
C_Controls      Control;2 A3 N* {/ r" X7 z- ^4 }
//+------------------------------------------------------------------+
5 L+ N' a( ^" sint OnInit()1 N6 R! m7 g) I. d, _$ o2 t2 b
{
+ W3 s+ }7 E! d$ v! Gu_Interprocess Info;4 J, c' H5 w$ \) y. \' E0 o
IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);+ I0 ?( ]% r6 L& R
if (_Symbol != def_SymbolReplay). F- _5 ?# _$ e" V) M. j9 Y
{
2 Y( p% O5 ]% P5 A$ }ChartIndicatorDelete(ChartID(), 0, def_ShortName);
  Z2 C8 ?; N5 a* ireturn INIT_FAILED;
) ~/ ]9 t; @( D}
+ F% A, A2 h- t5 Aif (GlobalVariableCheck(def_GlobalVariableReplay)) Info.Value = GlobalVariableGet(def_GlobalVariableReplay); else Info.Value = 0;
- ?! a2 V+ G. Q% e; TControl.Init(Info.s_Infos.isPlay);
+ Q3 k) ^7 T8 v9 qreturn INIT_SUCCEEDED;/ ^& o$ D- N( ?: M! a* b  F, q
}( B) c% M' A. A  M# R  Y
//+------------------------------------------------------------------+
" Y, Y" O! c9 S. Sint OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
& W7 L! Q. I: q2 S7 R: Z" v{
- l0 T7 A+ e+ }  x* t+ q3 q+ R0 nreturn rates_total;1 e6 g! C# ~$ ]9 N6 A4 P( ]
}2 M' F" L+ j0 G* Y1 J+ Q
//+------------------------------------------------------------------+! u8 R0 k) Y! I! j4 t
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)) G$ y) @' h% Q) w9 }* M' i
{
8 f" E) e: t2 w6 h  W+ @Control.DispatchMessage(id, lparam, dparam, sparam);- F& M/ n7 c' v
}0 S0 s" o9 Y( \+ V  C: |
//+------------------------------------------------------------------+  w/ \4 G* }7 c; ?6 Q: @6 [
void OnDeinit(const int reason)' r7 k5 o* M7 U7 R# t
{
  X, S2 P0 Z, Z0 ?( e9 Mswitch (reason)) [, B3 _1 S7 I$ Y4 ^
{
; ~' e2 E3 J+ T0 L) B$ O( t% kcase REASON_REMOVE:# e% K$ |/ Z* ^8 Q5 N
case REASON_CHARTCLOSE:$ [* a2 T" S7 F; u( N% Q
if (_Symbol != def_SymbolReplay) break;, ]8 d4 |# g. m4 A% v
GlobalVariableDel(def_GlobalVariableReplay);
! p# Z& z0 \  u. a) x' X+ Q2 i, TChartClose(ChartID());
, z; Q' A- D: }) Hbreak;5 A. o$ E+ o9 f( n
}, O# O. e$ @3 }6 {7 J
}
9 U; c$ |- {: ~# ~8 H4 J//+------------------------------------------------------------------+; p; @$ @& [5 ^" U
我们首先检查针对的品种是否要进行市场回放。 如果不是这种情况,指标将自动关闭。 请注意,知道指标的名称很重要。 因此,初始化期间执行的第一个函数调用我们的指标,这令我们能够轻松删除它。
- b) F9 ~; Q* T4 o现在重要的一点是:当您将其从图表中删除时,MetaTrader 5 会生成 DeInit 事件。 此事件触发 OnDeInit 函数,而标记为 REASON_REMOVE 的事件表示从图表中删除指标。 这是因为该品种与指标设计绑定的品种不同。 如果我们不重新检查并阻止代码运行,品种图表将关闭。 不过,幸亏我们的检查,它将保持开放状态。
6 ^4 p+ e& y8 m- L6 q1 W, o如果指标代码与上一篇文章中提供的代码不同,请不要感到惊讶:上一篇文章重点在于其它改进和修复。 不过,在编写了文章和代码,并录制了本文随附的视频后,我意识到尽管其中一个问题已解决,但另一个问题仍未被发现。 这就是为什么我不得不修改代码。  f% @# P2 d/ @1 w! p2 \2 a: t, X" M
尽管进行了修改,但我们不会在此处详述所做的全部修改。 必须删除很大一部分,因为它对于此处讨论的锁定方面无效。 因此,上面的代码与以前的代码有很大差别。 不过,我相信上一篇文章中讲演的知识在某些时候可能对某些人有用。 我保存了那篇文章,以表明有时我们都会犯错误,但我们依旧应该努力把事情做好。
, }* ?8 E* I5 O; T& v" N因此,我们来建立第一个锁定步骤,即确保控制指标仅存在于市场回放品种的图表上。 然而,该衡量值并不会阻止向同一图表或不同图表添加多个指标,因此必须进行调整。
4 g# C4 ~% w8 d8 |" Y我们应该避免在同一图表上多次使用指标。% F: {. j# W. T5 j" L6 u% x
我们已经解决了一个问题,现在我们来应对另一个问题。 这里有各种解决方案,这取决于我们真正想要和愿意做什么。 就个人而言,我没有看到这个问题的理想和最终解决方案。 不过,我将尝试提出一种方式,读者能感到熟悉和理解。 最重要的是,该解决方案将完全基于 MQL5。 我甚至考虑过使用外部编码的可能性,但最终决定使用纯 MQL5。 诉诸外部编码,并利用 DLL 进行锁定的想法很诱人,但这太容易了。: f  T3 r! g: k/ o5 ^$ d/ A2 U
我认为在诉诸外部 DLL 来填补 MQL5 语言无法胜任的空白之前,我们在 MQL5 中还有很多东西需要学习。 这将提供一个在使用外部代码时看起来“更干净”的解决方案。 只是,这并无助于更好地理解 MQL5。 此外,这可能会强化 MetaTrader 5 是一个受限平台的误解。 对平台的误解和效力利用不足助长了这种误解。& w7 n, x# {( p4 O9 w2 p! ^
为了应用我们提议的解决方案,您不得不进行一些修改,并撤回其它更改。 第一步是更改 InterProcess.mqh 头文件,令其拥有以下结构:0 s! i0 X! U' B
#property copyright "Daniel Jose"
# L; o0 @) g* Y. k, I& D//+------------------------------------------------------------------+
$ i* R' w0 D& g; @#define def_GlobalVariableReplay        "Replay Infos"! R1 Z% x* C7 O: t2 J
#define def_GlobalVariableIdGraphics    "Replay ID"
1 b2 T3 J. v) _$ Y#define def_SymbolReplay                "RePlay"
% G/ P& \: C$ b8 d- Y#define def_MaxPosSlider                400$ X* Y& ]+ Y$ c4 s
#define def_ShortName                   "Market Replay") O6 I+ u! @0 ]5 u8 g( S2 L
//+------------------------------------------------------------------+& D: s' q: @, T# U
union u_Interprocess
1 L; |' o* p+ c! x- D{* Z1 o) F* @& \' h$ K% P
union u_0
, c, k2 \, U* v# u9 h{9 E! v; I1 y* V
double  df_Value;
) b* ?+ X2 L& I* w) D4 Plong    IdGraphic;$ E) `6 W- x& \+ w# T) `: c
}u_Value;% K' D9 n9 @& P  P* _* p3 y
struct st_0
, @7 \% s% d* A- c# I{3 B0 V3 K2 N& s. f; {5 Q" L
bool    isPlay;3 _1 x- B  u( R
int     iPosShift;. s, I' U% Z2 s' h$ p4 _
}s_Infos;& d1 A! R% [! [$ ^1 a5 I
};( y$ e3 j; H4 I: C) K' v
//+------------------------------------------------------------------+
0 ~7 A9 F6 t* V7 w( j' o+ O7 X对于许多不熟悉编程的人来说,这似乎有点奇怪,但令人惊讶的是,上述结构仅占用 8 字节的内存。 您也许已经注意到,从上一篇文章的结构中删除了一个变量。 原因是我们将不再使用这种锁定方法。 我们将采取一种不同的方式,稍微复杂一些,但对于把控制指标限定于单个图表方面则有效得多。 这将是一个非常具体和明确的回放服务。
" g0 Y$ n! b3 |( }注意: 如果 MetaTrader 5 平台和 MQL5 语言的开发人员为该服务提供了向特定图表添加指标的能力,或者允许该服务在图表上调用和执行脚本,那将会很有趣。 使用脚本,我们可以将指标添加到特定图表当中,但目前服务无法做到这一点。我们可以打开图表,但不能向其内添加指标。 当尝试执行此动作时,即使我们使用 MQL5 函数,也始终显示错误消息。 在撰写本文时,MetaTrader 5 版本为 build 3280。4 s- V! n% c4 f" F0 K+ @; J
重要提示:在撰写本章的这个阶段,这是一个更高级的阶段,由此我才能够实现这一点。 不过,当我撰写这篇文章时,我找不到任何可以帮助解决这个问题的参考资料。 因此,请关注这个回放/模拟系列,看看我是如何想出解决方案的。
: _. \; B& ~  D. o6 |在这种关联境况下,通过运行下面的脚本,我们就能够打开指标,并将其添加到图表之中:9 y3 |6 S8 E8 H8 i1 T
//+------------------------------------------------------------------+4 X4 {1 I& o- A3 D
//| Script program start function                                    |
' R5 p" W  Z$ C//+------------------------------------------------------------------+
2 X, J$ ~( s& f$ v! b1 S! Dvoid OnStart(), f+ Q6 k* t8 m: B) |/ \
{- @, c( [) Q- ^6 Q" ~0 [
ENUM_TIMEFRAMES time = PERIOD_D1;  _6 f* _9 i' V' M: z' [8 W
string szSymbol = "EURUSD";
* m$ Z8 V; \- [- w  I  t, B1 dlong id = ChartOpen(szSymbol, time);
! k8 ^3 O: B6 f  u7 }' |; b$ L7 GChartRedraw(id);
9 E1 b, D; Q! K+ S: F3 ]9 BChartIndicatorAdd(id, 0, iCustom(szSymbol, time, "Media Movel.ex5"));$ b6 {0 y  Z/ b6 E* h( i1 w
}  U1 H9 x1 F: ?% M# f; n+ X
然而,如果我们将相同的脚本转换为服务,我们就不会得到相同的结果。
http://www.simu001.cn/x288003x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-8 16:10 , Processed in 1.683541 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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