免费期货量化软件策略:在一张图表上的多个指标为用户开发

通常,当我们开始实现一个新系统时,我们并不真正知道我们如何对其进行改进;故此,我们应该始终启动一个新项目,并着眼于未来进行改进。 这对那些刚开始的人来说非常重要:持续地规划一些事情,想象未来的扩展和改进。

核心代码根本没有改变,这在某种意义上是意料之中的。 但是对象类的代码已经发生了巨大的变化。 随着代码重用性变得越加重要(这是面向对象编程的基本思想之一:始终重用,仅在必要时创建新代码),赫兹期货量化进行了这些修改,以实现新功能,并能够以更灵活的方式创建新的改进。 如此,我们来看看新的对象类。 我会高亮示意这些变化,令其更容易理解。

赫兹期货量化从类的私密变量新定义开始。

 

 

 

struct st { string szObjName, szSymbol; int width; }m_Info[def_MaxTemplates]; int m_IdSubWin, m_Counter, m_CPre, m_Aggregate; long m_Id, m_handle; ENUM_TIMEFRAMES m_Period;

请注意,所变量数量显著增加。 这是因为赫兹期货量化需要更多数据来正确管理新功能。 现在我们的变量系统有了一个结构。 这种结构非常适合将相关变量组合在一起 — 它们确保我们在处理数据时能够快速、轻松地访问。

 
 

void SetBase(const string szSymbol, int iScale, int iSize) { #define macro_SetInteger(A, B) ObjectSetInteger(m_Id, m_Info[m_Counter].szObjName, A, B) if (m_IdSubWin < 0) { m_Id = ChartID(); m_IdSubWin = (int)ChartGetInteger(m_Id, CHART_WINDOWS_TOTAL) - 1; m_Aggregate = 0; } m_Info[m_Counter].szObjName = __FILE__ + (string) MathRand() + (string) ObjectsTotal(m_Id, -1, OBJ_CHART); ObjectCreate(m_Id, m_Info[m_Counter].szObjName, OBJ_CHART, m_IdSubWin, 0, 0); ObjectSetString(m_Id, m_Info[m_Counter].szObjName, OBJPROP_SYMBOL, (m_Info[m_Counter].szSymbol = szSymbol)); // .... macro_SetInteger(OBJPROP_PERIOD, m_Period); m_handle = ObjectGetInteger(m_Id, m_Info[m_Counter].szObjName, OBJPROP_CHART_ID); m_Aggregate += iSize; m_Info[m_Counter].width = iSize; m_CPre += (iSize > 0 ? 1 : 0); m_Counter++; #undef macro_SetInteger };

赫兹期货量化很快将看到的主要变化是,我们正在使用一个结构来存储资产名称、对象名称及其宽度。 现在我们还可以指定指标在子窗口中的宽度。 我们来做些注释,方便在类的其它部分使用它们。 下面是变化最大的函数。

 
 

void Decode(string &szArg, int &iScale, int &iSize) { #define def_ScaleDefault 4 #define macro_GetData(A) \ b0 = false; \ for (c0++; (c0 < max) && (szArg[c0] == ' '); c0++); \ for (i0 = 0, i1 = c0; (c0 < max) && (szArg[c0] != A); i0 = (szArg[c0] != ' ' ? c0 - i1 + 1 : i0), c0++); \ if (szArg[c0] == A) sz1 = StringSubstr(szArg, i1, i0); else sz1 = ""; string sz1; int i0, i1, c1 = StringLen(szArg); bool b0 = true; StringToUpper(szArg); iScale = def_ScaleDefault; m_Period = _Period; for (int c0 = 0, max = StringLen(szArg); c0 < max; c0++) switch (szArg[c0]) { case ':': b0 = false; for (; (c0 < max) && ((szArg[c0] < '0') || (szArg[c0] > '9')); c0++); iScale = (int)(szArg[c0] - '0'); iScale = ((iScale > 5) || (iScale < 0) ? def_ScaleDefault : iScale); break; case ' ': break; case '<': macro_GetData('>'); if (sz1 == "1M") m_Period = PERIOD_M1; else //.... if (sz1 == "1MES") m_Period = PERIOD_MN1; break; case '[': macro_GetData(']'); iSize = (int) StringToInteger(sz1); break; default: c1 = (b0 ? c0 : c1); break; } szArg = StringSubstr(szArg, 0, c1 + 1); #undef macro_GetData #undef def_ScaleDefault }

绿色示意代码的新增内容。 黄色示意源代码中已经存在,但由于实际原因被移动的行。 现在我们来看看所有这些加入代码做了什么,更重要的是,它们针对原始系统的功能方面做了哪些改进。 实际上,我们正在打造一个基础,让用户能够定制一些特殊的东西。 赫兹期货量化尝试往向现有语法中添加新规则来实现这一点(请参见下表):

分隔符

功能

示例

结果

< >

指定要使用的图形周期

< 15m >

将指标周期固定为 15 分钟。 原始图表可以使用不同的时间帧,但指标仅显示 15 分钟时间帧的数据。

[ ]

指定指标宽度

[ 350 ]

指标宽度固定为 350 像素。

固定图表周期的分隔符 — 仅在指标窗口中,且不会影响用户所作的任何更改。 所有其它指标和主图表将依据用户选择的新图表周期进行更新,但固定指标不会跟随新图表周期。 在某些情况下,这可能很有趣,如下图所示。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

赫兹期货量化需要在交易屏幕上显示同一资产不同时期的图表,而这大大方便了各种类型的设置。 现在,在很特别的情况下,一个固定图表宽度的分隔符会令这些设置变得更容易。 它还有一个很大的用途,我们会在另一篇文章中探讨,但现在您可以用它来控制指标的宽度。

您可以利用所有分隔符的组合,也可只用指标中真正需要的分隔符,因为这里并无具体的规则。 唯一的规则是,指标名称应该放在其它所有内容之前。 我们回到代码解释。 看下面几行:

 
 

#define macro_GetData(A) \ b0 = false; \ for (c0++; (c0 < max) && (szArg[c0] == ' '); c0++); \ for (i0 = 0, i1 = c0; (c0 < max) && (szArg[c0] != A); i0 = (szArg[c0] != ' ' ? c0 - i1 + 1 : i0), c0++); \ if (szArg[c0] == A) sz1 = StringSubstr(szArg, i1, i0); else sz1 = ""; //.... case '<': macro_GetData('>');

请注意,赫兹期货量化正在定义一些对许多人来说可能感觉很奇怪的东西。 但其名称在此很有用:macro_GetData(A),因其是个宏定义,故会创建一段代码。 当编译器在代码中发现这个宏定义时,编译器将用宏定义代码替换声明。 如果我们要在多个地方重复某个代码片段,但期望在一个声明和另一个声明之间进行最小的修改,这种方式将非常有用。 在上一个示例中,绿色的行会被替换,编译器生成的代码如下所示:

 
 

case '<': b0 = false; for (c0++; (c0 < max) && (szArg[c0] == ' '); c0++); for (i0 = 0, i1 = c0; (c0 < max) && (szArg[c0] != '>'); i0 = (szArg[c0] != ' ' ? c0 - i1 + 1 : i0), c0++); if (szArg[c0] == A) sz1 = StringSubstr(szArg, i1, i0); else sz1 = ""; //....

这种东西是最真实的哲学表达:尽可能多地重复使用,尽可能少地写新东西。 现在,赫兹期货量化看看如果我们想让语法更清晰,可以如何进行修改。 这是一个小细节,但可依据您的个人风格量身定制,如此可能会更好。 请看下面一行:

 
 

//..... if (sz1 == "1M") m_Period = PERIOD_M1; else //.....

高亮示意的信息是一个重要的细节。 根据我所用的模型,如果用户想要使用 1 分钟时间帧,那么用户应该使用以下语法来表达:MIN_1。 如果您想拥有一个独立的风格,您可以用自己的方式来指定。 但是字母应该是大写的,不含空格。 例如,所选部分可以替换为 "1MIN","MIN_1","1_MINUTE" 或者更详细的东西,比如: "LOCK_IN_1_MIN" 或以您的语言 - 只要单词之间没有空格,就行。 实际上,这个空格限制是可以取消的,但在我看来,这样做并无实际必要。 看看通晓编程有多好 — 您可以用自己的独特风格来使用。 我修改的下一个代码片段是默认的析构函数。

 
 

~C_TemplateChart() { for (char c0 = 0; c0 < m_Counter; c0++) { ObjectDelete(m_Id, m_Info[c0].szObjName); SymbolSelect(m_Info[c0].szSymbol, false); } }

针对以下情况添加了高亮示意的代码行:如果资产并非在单独的窗口中打开,则它不应再出现在市场观察之中。 这样可以防止使用未出现的资产,占用空间并污染窗户。 现在赫兹期货量化看看在上一篇文章中承诺要解释的内容。 这在最初的代码中并不存在,但将来它将成为代码的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621621.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

免费期货量化软件策略您能用移动平均线做什么呢?

我们将学习布林带&#xff0c;它测量数据在其平均值附近的离散度。该指标由约翰博林格&#xff08;John Bollinger&#xff09;创造。 它由围绕 20 天移动平均线的两条波段构成&#xff0c;以测量数据&#xff08;价格&#xff09;在其均值&#xff08;20 天移动平均线&#xf…

免费期货量化软件策略:从头开始开发智能交易系统(第 25 部分)

概述 在上一篇文章提供系统健壮性 &#xff08;I&#xff09;中&#xff0c;赫兹期货量化已经看到了如何更改 EA 的某些部分&#xff0c;从而令系统更加可靠和健壮。 这只是针对兹期货量化将要在本文中所做之事的介绍。 请忘记您所知道的、计划的、或希望的一切。 这里最困难…

免费期货量化软件:学习如何设计一款布林带Bollinger Bands交易系统

我们将学习布林带&#xff0c;它测量数据在其平均值附近的离散度。该指标由约翰博林格&#xff08;John Bollinger&#xff09;创造。 它由围绕 20 天移动平均线的两条波段构成&#xff0c;以测量数据&#xff08;价格&#xff09;在其均值&#xff08;20 天移动平均线&#xf…

免费期货量化软件:针对交易的组合数学和概率论曲线分析

赫兹期货量化将继续为构建多重状态、可扩展的交易系统奠定基础。 在本文的框架内&#xff0c;我想为您展示如何利用前几篇文章中的发展成果&#xff0c;来进一步阐述交易过程的广泛可能性。 这有助于从这些层面评估策略&#xff0c;来弥补其它分析方法未能涵盖的地方。 在本文中…

免费期货量化软件:从头开始开发智能交易系统概念上的飞跃

有时&#xff0c;在开发一些项目时&#xff0c;我们也许会发现新的思路和新的可能特性&#xff0c;这些特性能够派上用场&#xff0c;并为我们正在创建的系统提供极大的改进。 但问题出来了&#xff1a;实现新功能的最简单途径是什么&#xff1f; 问题在于&#xff0c;有时我们…

Bugku 密室逃脱 WP

一、打开题目 二、解压文件夹&#xff0c;查看文件和压缩包&#xff0c;发现压缩包进行了加密 三、查看剧本&#xff0c;发现摩斯密码&#xff0c;并解析得到电脑密码&#xff1a;xjpc 四、输入电脑密码得到一张图片和一个压缩包&#xff0c;查看图片发现图片位置发生错误&a…

如何不下载软件来制作自己的网站

注意&#xff1a;本文使用Windows操作系统。如果你计算机的操作系统不是Windows&#xff0c;这篇文章对于你来说没有丝毫意义。 我们前几天介绍了如何建立一个自己的网站&#xff0c;虽然也有用&#xff0c;但是下载了许多软件。Windows系统就自带了一个名为IIS的软件&#xff…

能优化你的网站的网页制作软件

做一个网站也许并不是一件很难的事情&#xff0c;但是想做出漂亮而且极富个性的网站就不那么容易了。这里笔者就给大家介绍几款用于修饰和改造网页的软件&#xff0c;让你的主页效果更炫一些。 有声有色 “有声有色”是给网页添加Java特效的一款软件&#xff0c;它集合了518个十…

搭建个人网站软件安装

搭建个人网站软件安装(均在Root用户下完成) 系统环境为&#xff1a;Centos7.6 参考文献&#xff1a; 在CentOS 7系统上安装PHP 7.4版本的方法 解决CentOS中yum安装程序时出现的"Transaction check error"错误 Centos7下安装MySQL Centos 7下安装配置Nginx Ngi…

个人网站搭建,个人网站需要什么软件

好的网页设计软件通过编码平台或简单的拖放就可以构架一个简单的个人网站。过去的网站建设需要用HTMLCSS和JS来制作。然而随着建站技术越来越成熟&#xff0c;拖放式网页制作工具越来越普遍&#xff0c;任何人都可以轻而易举地搭建自己的个人网站。 在本文中&#xff0c;我们将…

建站软件用什么呢?

建站软件用什么呢&#xff1f;目前网络上有很多建站软件都是可以建网站使用的&#xff0c;企业用户可以根据自己的需求去选。目前网络上建站软件有两种&#xff0c;一种是免费的&#xff0c;另一种是收费的。免费的建设网站软件一般功能是有限制的&#xff0c;只要能够符合用户…

VS警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

1、问题 Microsoft visual studio 2019跑仿真的时候出现该警告&#xff0c;在高级保存选项设置编码为Unicode(UTF-8 无签名)还是会有该警告。 2、解决方法 右键项目&#xff0c;打开属性设置&#xff0c;选中&#xff1a;工程 -> 右键选择"属性" -> C/C ->…

webassembly003 GGML Tensor Library part-1

GGML ggml的函数 可以看到官方示例项目仅依赖于#include "ggml/ggml.h"&#xff0c; #include "common.h"&#xff0c;可以阅读ggml.h获取ggml的使用帮助 函数解释注释ggml_tensor多维张量按行主顺序存储。ggml_tensor结构包含每个维度中元素数&#xf…

Redis数据结构全解析【万字详解】

文章目录 前言一、SDS1、SDS的必要性2、SDS的数据结构3、SDS的优势O&#xff08;1&#xff09;复杂度获取字符串长度二进制安全不会发生缓冲区溢出节省空间 二、链表1、结构设计2、优缺点 三、压缩列表1、结构设计2、连续更新3、压缩列表的缺陷 四、哈希表1、结构设计2、哈希冲…

安装单片机开发工具Keil5和仿真开发板proteus

项目场景&#xff1a; 安装单片机开发工具Keil5和仿真开发板proteus 为啥不买开发板? 这里不使用开发板的原因是单独买个开发板其实还行&#xff0c;但是很多外设&#xff0c;而且加上本来自己是自学的&#xff0c;啥也不懂&#xff0c;坏的几率很大。 网上说买开发板实际开…

Linux下安装qt5步骤

Qt下载 Qt官方下载非常慢。Qt 官网有一个专门的资源下载网站&#xff0c;所有的开发环境和相关工具都可以从这里下载&#xff0c;具体地址是&#xff1a;http://download.qt.io/ 下载方式可以看这个教程Qt教程网站 当然也可以直接去我的百度网盘里下载 链接&#xff1a;https…

yolov5环境配置和训练

慢慢写不着急 yolov5权重文件&#xff08;百度网盘&#xff09; yolov5weight 提取码&#xff1a;g5jh 鉴于官网权重文件4个月没有跟新&#xff0c;放心食用&#xff08;20201030&#xff09; weight V4.0 提取码&#xff1a;aljp 20210123 复制这段内容后打开百度网盘手机App…

夸克网盘提取cookie

打开首页登录&#xff0c;【夸克网盘】夸克网盘PC网页版端入口 chrome按F12打开&#xff0c;开发者工具-网络-找到sort?开头的文件---标头-cookie&#xff1a;后面的值

Java后端开发面试题——集合篇

ArrayList底层的实现原理是什么 底层数据结构 ArrayList底层是用动态的数组实现的 初始容量 ArrayList初始容量为0&#xff0c;当第一次添加数据的时候才会初始化容量为10 扩容逻辑 ArrayList在进行扩容的时候是原来容量的1.5倍&#xff0c;每次扩容都需要拷贝数组 添加逻…