交易中的神经网络:一种跨领域时间序列预测框架(TimeFound)
引言
长期以来,时序预测始终是金融分析师不可或缺的工具。如果你曾经尝试预判股价未来走势或是金融指数波动率的变化,就会深切体会到这项工作如同占卜茶水残渣一般难以捉摸。即便如此,任何一家正规基金都离不开这类算命式的预测工作。
过去,ARIMA和指数平滑等经典统计模型得到了广泛应用。就连线性回归往往也能发挥不错的效果。“模型应当尽量精简” 这一观点曾经十分有说服力 —— 直到深度神经网络登上舞台。现如今,深度学习模型早已不再只是小有成果,而是收获丰硕成果,凭借出色的精度与处理海量历史数据的运算速度令人惊叹。
然而和任何强大的工具一样,深度模型也存在短板。训练深度模型需要耗费海量标注任务数据集。缺少足量标注数据,这套神经网络 “老大哥”便无法运行。倘若你仅能获取有限的历史行情数据,或是某个标的刚刚上市交易,该如何处理?对于新上线代币,交易终端尚未积累任何有效历史数据,又该怎样预测其价格?这时便引出了零样本预测(Zero‑Shot Forecasting)的概念,该方案能够在传统方法束手无策的场景下让模型完成预测任务。
时序领域的研究人员开始借鉴大语言模型(Large Language Models,LLMs)的思路。大语言模型已经在文本领域取得巨大成功,可完成翻译、诗文创作、问答等任务。为何不能将该思路迁移至价格趋势预测?于是,时序领域所谓的基础模型(Foundation Models)迎来了发展热潮。设想这样一个通用模型:无论是预测股票价格、电力消耗量或是失业率,都由同一个模型完成。其关键就在于使用多元化数据集对模型开展充分预训练。
受这种通用模型思想启发,文章《TimeFound:一款面向时序预测的基础模型)》的作者提出了一款基于Transformer架构的全新时序预测框架:TimeFound。研究人员借鉴自然语言处理(NLP)领域成熟的设计思路,并将其改造适配到时序预测任务。
TimeFound框架采用经典的编码器‑解码器(encoder‑decoder)架构。编码器(encoder)读取历史时序数据并从中提取上下文特征。而解码器则基于因果约束生成果未来预测结。
该模型采用一种全新的时序分块方案。抛弃固定窗口大小的固有思维,框架设计者提出可以一次性将序列切分为多个尺寸互不相同的时序块。以上市公司股票行情为例:月度波动相对平稳,盘中行情却时常出现剧烈跳空。多分辨率时序分块(Multi‑resolution patching)能够同时捕捉两种时间尺度的特征:长期趋势与波动噪声。
在预训练阶段,框架作者构建了一份规模庞大的跨领域数据集。数据集丰富多样,目的是让模型学习到普适性行情模式。训练数据越多元,模型所习得的模式词库就越丰富。
训练目标十分简单:自回归预测。向模型输入一段历史时序数据,模型便可一步步预测后续数值。但此处预测步长与原始历史数据的时间步长并不一定要保持一致。原因在于模型是以时序块为单位输出预测结果。单个时序块内可以包含被分析系统的多个时间步数据。
TimeFound算法原理
TimeFound属于通用基础模型,可用于搭建包括金融市场在内多领域的时序预测系统。模型整体采用编码器‑解码器结构,数据处理流程采用模块化设计。整套方案包含标准化、多层次时序分块、带相对位置编码的注意力机制,以及结合点预测损失与分位数损失的联合训练方案。
算法流程首先会对输入时序数据进行精细预处理,基础预处理不到位,后续预测结果的可靠性便无从谈起。第一步统一数据量级:对每一条时序序列执行标准化处理,用每一个数据点减去整条序列均值,再除以序列标准差。借助该预处理手段,即便电力消费出现大幅上涨,而行情波动幅度看上去仅像一段小幅正弦曲线,模型也不会产生混淆;反之,当细微波动具备重要信号价值时,模型同样能够精准捕捉。

其中 μ 和 σ 分别代表时序序列X的均值与标准差。标准化操作将所有数据映射至同一量级,同时不会破坏时序本身的先后结构。
完成量级校准之后,便可将时序序列切分为若干片段,即时序块。传统方案当中所有时序块尺寸完全一致,然而同一段时序数据既可能出现急速冲高,也会存在缓慢趋势。因此 TimeFound框架作者提出了多尺度时序分块方案。第一层生成尺寸最小、数量最多的时序块。层级越高,时序块尺寸越大,时序块的数量则成比例减少。在原文实验中,作者选用尺寸为 2 的整数次幂的时序块。
每一块时序块都会捕捉一段行情动态特征,无论是短暂的波动率尖峰,还是一段长期下跌走势,都可以被覆盖。
下一步,为生成好的时序块添加二进制掩码,标记真实数据区域以及为补齐统一尺寸而填充的补零区域。每一段时序片段送入带有残差连接的双层感知器。这类MLP投影层可将不同长度的时序块映射至统一的d维隐空间,每个向量均可表征当前时序块的局部行情特征。
但是预处理工作尚未结束。正如前文所说,多尺度分块后每一层生成的元素数量各不相同;小块的数量远多于大块。为实现多尺度特征融合,作者提出将大块特征向量进行复制扩增,直到其数量与最小时序块数量对齐。最终得到一份各个时间维度对齐的多通道特征表征,所有时间尺度下的向量完成合并。随后多尺度特征被拼接成一份完整隐向量矩阵。该矩阵送入注意力模块,从而实现跨尺度特征交互。
模型主体为经过注意力机制改良的编码器‑解码器(Encoder–Decoder)结构。编码器(Encoder)利用双向注意力机制完整读取输入序列。双向注意力意味着序列当中每一个位置都能够获取前后所有位置的行情信息,依靠加权聚合生成更深层次的特征表达。与此同时注意力机制引入时序块的相对位置关系:模型会判定近期片段(例如往前 3 个时序块)比远期片段(例如往前 20 个时序块)具备更高权重。
编码器Encoder运算完成后,输出结果传递给解码器。解码器无法访问未来目标数值,只能依靠历史数据开展预测。注意力机制禁止模型越过已经生成的预测结果窥探未来,由此保证每一步预测结果精准且满足因果约束。交叉注意力(Cross-Attention)在此环节起到至关重要的作用。当解码器(Decoder)生成下一个时序块特征时,会再次调取编码器(Encoder)输出的丰富上下文向量,从中提取近期趋势信息。
解码器输出为下一个时序块对应的预测向量,该向量概括了过往行情特征与关键信号。预测向量送入变换模块,该模块由带残差连接的双层MLP搭建而成。隐空间表征由此转换回可读的时序价格数值,一次性生成一整块未来预测点位。这种一次生成整块预测结果的方式加快模型运算速度,尤其适合长周期预测任务。
模型训练阶段,研究人员并非仅以最小化平均预测误差作为训练目标。除了标准MSE均方误差损失(惩罚预测值与真实值之间的平方偏差)之外,还引入分位数损失函数,驱使模型输出预测结果的不确定性区间。对于每一个时间步,模型不仅输出均值预测值,同时输出例如 10%、50%、90% 分位数。MSE与分位数损失组成的复合损失函数,平衡了预测精度与置信区间宽度。
综上,整套TimeFound算法是一套设计完备、高度统一的流水线。融合 Transformer 架构、多尺度时序分块的灵活性与不确定性感知能力,使其可以适配任意类型的时序数据集。
在TimeFound预训练环节,作者构建了一份覆盖多领域真实时序数据与合成时序数据的大规模异构数据集。数据集收集了公开可获取、不同采样频率的时序数据,采样周期从 5 分钟级别一直到年度数据。数据源包含金融市场(股价、货币期货)、能源消耗、气温、商品销量等;同时通过数据合成技术进一步扩充数据集多样性。该预训练方案让TimeFound学习到时序的通用特征,在新任务上无需微调即可拥有优秀的泛化能力。
下方为作者绘制的TimeFound框架可视化示意图。

在MQL5中的实现
梳理完 TimeFound 框架理论之后,我们进入文章实操部分,基于 MQL5 自行实现一套适配交易场景、改良版的 TimeFound 方案。但在深入编写代码细节之前,需要理清整套任务流程以及各个模块之间的依赖关系。整个流程起始于原始行情数据预处理,预处理质量直接决定后续所有预测结果的上限。
针对时序数据标准化,我们不再从零开发,直接使用现成的批标准化(batch normalization)模块。该模块会实时扫描价格缓存池,在每一步计算均值与方差并标准化数据分布,降低模型对市场环境突变所引发分布漂移问题的敏感度。滑动标准化方案在剔除干扰训练与预测的离散噪声的同时,保留了行情关键模式的时序动态特征。
数据完成量级标准化之后,便来到一项核心任务:多尺度时序分块。在传统序列复制(sequential‑replication)方案中,我们先将时序切分为多组不同尺寸片段,随后复制放大块向量补齐至与最小块相同数量,最后再将所有特征拼接。该方案逻辑简单,但运行延迟过高,无法用于实盘。每当一根新 K 线生成,复制扩增操作都会耗费运算时间;并且放大尺度后的嵌入特征被多次复制后,本身独有的特征信息也会丢失。
因此我们的工程实现采用另一条技术路线。引入多窗口卷积(multi‑window convolution)。简单来说,放弃依次执行三次独立分块流程,改为并行运行三组卷积核,每组卷积核设置互不相同的窗口尺寸。借助补零填充与窗口重叠设计,步长一致的卷积滤波器沿着整条时序序列滑动运算,一次性生成三份长度完全一致的特征数组。
该方案带来多重收益:第一,全部运算并行执行,无需等待小块处理完毕再填充大块特征数据。第二,固定步长滑动窗口保证时序当中每一个新生成数值都经过三套卷积变换,天然不存在时序对齐问题。输出张量从一开始便和时间索引一一对应。第三,依靠窗口重叠(the overlap),大尺寸卷积捕捉相邻时序块,更容易识别平缓波动与长期趋势,而不是生硬切割时序。
与此同时,我们无需手动复制向量或是插值补齐,算法天然保证每个时间步特征向量数量统一、表征完整。
最终可以瞬时输出一份细节可控、结构紧凑的市场快照特征,该特征可直接送入MLP投影层映射至隐空间。
这种并行多尺度时序分块正是预处理模块的核心:保留所有尺度嵌入向量独有的特征,消除冗余复制运算,让你的交易 EA 可以更快、更精准地做出决策,既能够捕捉短期脉冲行情,也可以识别长期趋势。
接下来我们将生成的嵌入向量转换为高价值特征。多窗口卷积完成之后,每一个时间步已经生成了多通道嵌入特征。但是对于深度神经网络来说,仅有嵌入特征远远不够。我们需要添加非线性层与可训练权重,以此生成表达能力更强的特征向量。原版 TimeFound 论文当中作者推荐使用带残差连接的双层MLP;而我们在本次 MQL5 实现当中,复用StockFormer框架内置的多头前馈网络(Feed‑Forward)模块。
假设当前我们拥有三路不同尺度的特征数据流,每一路特征都需要提升至统一的特征表达标准。前馈模块将三路数据流切分为若干独立头,每个头使用独立权重与偏置并行运算;随后将所有运算结果合并为一条向量。残差连接机制保留原始嵌入特征信息,将原始特征和网络输出平滑融合,加快模型收敛速度,同时提升模型对行情噪声的抗干扰能力。
在前馈Feed‑Forward模块内部,每一个头都是一个双层MLP,两层之间设置非线性激活函数。MLP输出结果与输入向量相加之后再执行标准化。最终每个时间步生成的特征向量融合了局部短期形态与全局长期特征,可送入下一模块。
这套实现方案既保证整体架构和原版 TimeFound 保持一致,又复用了 StockFormer 经过验证、性能优化成熟的组件,减少开发工作量,保障实盘运行的高性能。
多尺度特征预处理的最后一步是特征聚合;此处放弃简单逐元素相加的方案,改用卷积 + 最大池化的灵活聚合机制。设想你拥有三路嵌入通道,每一路通道都为行情研判提供不同维度信息。如果只是简单逐通道相加,则短期脉冲行情、长期趋势特征将被赋予同等权重。而卷积层内的可训练滤波器能够跨尺度扫描特征,自动筛选信息量最高的特征组合。
卷积层遍历三通道张量时,每一个滤波器能够一次性读取全部时间尺度的特征,从中搜寻标志性行情模式。运算之后生成一组全新特征向量,每一条向量都融合了局部信号与全局信号。随后最大池化(max‑pooling)登场:池化窗口滑动扫描特征图,只保留最强特征响应,过滤噪声以及无关紧要的小幅波动。举例来说,同一时间段内微观维度成交量突然冲高,宏观维度价格稳步上行,池化操作能够保证两路信号都完整保留在最终特征向量内。
卷积 + 最大池化的组合方案让我们无需人工为各个时间尺度手动设置权重。模型自主学习并聚焦于对当前预测任务最有价值的特征集合。该自适应机制不仅提升预测精度,还增强了算法面对市场跳空与噪声的鲁棒性:微弱低频信号被平滑过滤,而重要行情尖峰信号则被放大,完整无损耗地传递至编码器与解码器模块。
我们将上述整套方案封装在CNeuronTimeFoundPatching对象中,其内部结构将在下文中展示。
class CNeuronTimeFoundPatching : public CNeuronConvOCL { protected: CNeuronTransposeOCL cToVarSeq; CNeuronMultiWindowsConvWPadOCL cProjecting; CNeuronTransposeVRCOCL cToVarProjSeq; CNeuronMultiWindowsConvWPadOCL cPatchingProj; CNeuronMHFeedForward cPatchsFeedForward; CNeuronConvOCL cPatchingAgr; CNeuronProofOCL cProof; CNeuronTransposeOCL cToPatchVarEmb; //--- virtual bool feedForward(CNeuronBaseOCL *NeuronOCL) override; virtual bool updateInputWeights(CNeuronBaseOCL *NeuronOCL) override; virtual bool calcInputGradients(CNeuronBaseOCL *NeuronOCL) override; public: CNeuronTimeFoundPatching(void) {}; ~CNeuronTimeFoundPatching(void) {}; //--- virtual bool Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint count, uint patchs, uint variables, uint embedding_size, uint patch_filters, ENUM_OPTIMIZATION optimization_type, uint batch); //--- virtual bool Save(int const file_handle) override; virtual bool Load(int const file_handle) override; //--- virtual int Type(void) override const { return defNeuronTimeFoundPatching; } //--- virtual void SetOpenCL(COpenCLMy *obj) override; virtual bool WeightsUpdate(CNeuronBaseOCL *source, float tau) override; };
CNeuronTimeFoundPatching的所有内部模块自程序启动起便可独立运行。这些模块采用静态声明,并在程序库加载时完成初始化。因此,我们无需在构造函数中创建模块对象,也不必在析构函数中处理资源清理工作:上述两个方法将保持空实现状态,对象架构的全部管理逻辑都由一个通用的Init初始化方法完成。
初始化方法的入参为一组常量参数,用于定义各个内部对象的网络架构。
bool CNeuronTimeFoundPatching::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint count, uint patchs, uint variables, uint embedding_size, uint patch_filters, ENUM_OPTIMIZATION optimization_type, uint batch) { uint inside_emb = MathMax((embedding_size + 2) / 6, 8); if(!CNeuronConvOCL::Init(numOutputs, myIndex, open_cl, 3 * inside_emb, 3 * inside_emb, embedding_size, patchs * variables, 1, optimization_type, batch)) return false; SetActivationFunction(SoftPlus);
需要说明的是,在设计本对象时,我们借鉴了Mantis框架当中诸多优秀的设计思路。本类不再硬编码时序块尺寸,仅输入最细粒度下的分段数量以及目标输出token长度。该设计具备很高的灵活性:开发者无需修改源码,即可快速调整时序分块的粒度。
并且我们在此基础上做了进一步拓展。Mantis框架仅使用单次卷积生成特征通道,而本次实现采用多窗口卷积,能够一次性生成输入信号在多个尺度下的特征表征。初始化阶段首先需要计算出每一个细节层级对应的token向量内部维度。用户可为对象输出端指定任意token长度。但token长度并不总是能够被尺度层级数量整除。这时父卷积类就会发挥作用:它会自动微调通道数量至目标维度,调用经过优化的卷积滤波器,保证最终输出特征表征规整统一。
和之前实现保持一致,本对象接收一个二维张量作为输入,用于描述多模态时序数据;张量当中的每一行对应单个时间步的完整特征信息。但为了让分块流水线将每一项特征视作一条独立的单变量时序序列,我们首先需要对输入矩阵执行转置操作。
这项简单却关键的处理保证后续所有运算严格遵循“一条序列,一个独立叙事”的原则,不会将不同来源的行情信号相互混杂。借此便可保留每一条时序序列的完整性与可解释性。
int index = 0; if(!cToVarSeq.Init(0, index, OpenCL, count, variables, optimization, iBatch)) return false;
接下来执行多窗口卷积运算。我们并行运行 3 个卷积滤波器,窗口大小分别为 3、5、7 根 K 线,卷积步长设置为 1。得益于零填充操作,输出时序序列长度保持不变;并且每一个特征值都融合了邻近样本以及周边上下文信息。
index++;
{
int windows[] = {3, 5, 7};
if(!cProjecting.Init(0, index, OpenCL, windows, 1, inside_emb, count, variables,
optimization, iBatch))
return false;
cProjecting.SetActivationFunction(SoftPlus);
}
至此,用于后续分析的基础特征已经生成完毕。接下来需要对数据结构进行调整,使其能够送入模型下游模块,也就是执行时序分块操作。但在将时序切分为片段之前,需要执行一项重要的数据变换操作:调整四维张量最后一维的轴顺序。
上一步运算输出张量维度格式为 [Variable × 序列长度 × 通道数量 × 特征数量],其中每一个时间步都由经过不同卷积尺度提取得到的三通道向量表示。而想要独立地对每一条单变量时序进行分段处理,则需要将数据排布格式转换为 `[Variable × 通道数量 × 特征数量 × 序列长度]`。经过轴顺序调整后,每一项特征都可以被视作一条独立时序,之后再被切分为固定长度的片段,也就是时序块。
index++; if(!cToVarProjSeq.Init(0, index, OpenCL, variables, count, 3 * inside_emb, optimization, iBatch)) return false;
该数据排布格式在金融场景下尤为实用:经过多窗口卷积增强后的每一条通道都相当于一个独立行情指标,我们可以借助时序分块技术分析其走势变化。
随后进入核心阶段 —— 多尺度时序分块,这也是整套时序预处理架构的基础。该模块设计思路并没有完全照搬传统方案,而是参考高频行情数据分析的工程实践;在高频场景下,特征覆盖广度与模型响应速度二者缺一不可。
我们不再采用单一刚性的一维切分方式,转而使用多窗口卷积层,可同时在多个时间尺度上处理时序信号。这使得模型能够同时观测不同时间周期下的市场走势,就如同分析师同时查看 1 分钟 K 线、小时图与日线图表。
index++;
{
uint step = (count + patchs) / (patchs + 1);
uint windows[] = {step, 3 * step / 2, 2 * step};
if(!cPatchingProj.Init(0, index, OpenCL, windows, step, patch_filters, patchs,
3 * inside_emb * variables, optimization, iBatch))
return false;
cPatchingProj.SetActivationFunction(SoftPlus);
}
此处卷积窗口尺寸由程序自动计算生成,窗口大小取决于待分析时序的总长度以及用户指定的时序块数量。高尺度窗口会在原有步长基础上放大尺寸并开启窗口重叠,以此保障相邻时序块之间信息的连贯性。
下一步,提取完成的时序块送入多头前馈(FeedForward)模块。该环节绝非简单的数据转发,真正的数据特征解析工作从这里正式开始。每一个经由不同尺度提取得到的时序块都会转换成完整的嵌入向量,即一种紧凑、高信息量的特征表征,对对应时序块的核心行情特征进行编码。前馈模块输出一组精简且表达能力充足的向量,每一条向量均可看作该时间段行情特征的精华。
index++; if(!cPatchsFeedForward.Init(0, index, OpenCL, 3 * patch_filters, 6 * patch_filters, patchs, 3 * inside_emb * variables, 3, optimization, iBatch)) return false; index++;
当所有尺度下各个时序块的嵌入特征都生成完毕后,进入特征聚合阶段。模型想要构建完整的市场上下文图景,就必须把不同细节层级的信息融合为一条特征向量。
为实现特征融合,我们采用卷积搭配最大池化的组合方案。卷积层负责挖掘不同尺度嵌入向量之间的局部依赖关系。卷积层的作用类似分析师,寻找短期形态和长期趋势的典型组合,例如长期趋势平稳背景下出现短期波动。这类特征组合往往在复杂行情环境中对交易决策起到决定性作用。
接着,卷积运算结束后的数据将经过最大池化处理,提取张量各个区域当中响应最强、辨识度最高的特征。最终输出一条聚合完成的特征向量。该向量是经过多尺度处理之后,对全部历史输入行情的精简高信息量表征。
index++; if(!cPatchingAgr.Init(0, index, OpenCL, 3 * patch_filters, 3 * patch_filters, patch_filters, patchs, 3 * inside_emb * variables, optimization, iBatch)) return false; cPatchingAgr.SetActivationFunction(SoftPlus); index++; if(!cProof.Init(0, index, OpenCL, patch_filters, patch_filters, 3 * patchs * inside_emb * variables, optimization, iBatch)) return false;
但在将生成的token传递至下游网络层之前,还有一项关键操作:对张量执行转置,将时间轴重新调整至张量最前端。
index++; if(!cToPatchVarEmb.Init(0, index, OpenCL, variables * 3 * inside_emb, patchs, optimization, iBatch)) return false; //--- return true; }
为什么必须执行这一步?原因在于前面生成嵌入特征、聚合时序块的运算流程当中,数据排布优先以时序块和特征维度作为主轴。这种轴顺序适合执行局部运算,却无法适配对时序先后顺序敏感的网络模块。
将时间轴放回张量首位之后,生成的token便按照时间先后顺序完成排列。此时每一枚token都对应一个时间步,并且融合了来自多个尺度的行情信息。模型就可以将输入数据视作一条完整的时序序列,而不是一堆毫无时序关联的抽象特征集合。
调整完成后的张量才会送入后续处理阶段,开展时序依赖关系挖掘、上下文分析以及预测结果生成工作。该轴序调整保证了数据内部的因果时序关系;如果缺少这一步,任何金融市场建模工作都将失去意义。
尽管该对象的内部架构看上去较为复杂,但其前向传播与反向传播算法的实现逻辑却十分简洁清晰。计算流程采用分步串行执行的方式,不存在嵌套循环或是复杂的分支跳转逻辑。相信读者不难看懂这些成员方法的运行原理。因此本文不再对前向、反向传播方法展开详细讲解。如果想要深入研究CNeuronTimeFoundPatching对象完整的工程实现,包含其所有成员方法的完整源代码将会作为本文附件提供下载。
文章篇幅已经接近上限。目前本文内容体量已经很大。但正如大家所见,我们的开发工作远未结束。目前仅仅完成了基础铺垫,实现了至关重要的数据预处理模块,而该模块正是后续所有行情分析工作的根基。
让我们稍作停顿,在下一篇文章当中再分步实现该框架剩余的各个组件。
结论
本文探究了TimeFound框架的理论原理,该框架能够将杂乱无序的时序数据转换成具备规律性、可预测的行情模式。
我们开始基于原论文提出的思路,实现一套适配交易场景的自研版本。本次开发工作的重心放在数据预处理模块,因为预处理模块直接决定模型能否精准、充分地提取输入信号当中的结构特征。
后续还有同样精彩的开发工作等待完成,我们将在下一篇文章继续深入。
参考
本文使用的程序
| # | 名称 | 类型 | 说明 |
|---|---|---|---|
| 1 | Research.mq5 | EA | 采集样本数据的EA |
| 2 | ResearchRealORL.mq5 | EA | 使用Real-ORL方法采集训练样本的EA |
| 3 | StudyEncoder.mq5 | EA | 用于训练环境编码器的EA |
| 4 | Study.mq5 | EA | 用于离线模型训练的EA |
| 5 | StudyOnline.mq5 | EA | 用于在线模型训练的EA |
| 6 | Test.mq5 | EA | 用于模型测试的EA |
| 7 | Trajectory.mqh | 类库 | 描述系统状态与模型架构的结构体 |
| 8 | NeuroNet.mqh | 类库 | 用于搭建神经网络的类库 |
| 9 | NeuroNet.cl | 库文件 | OpenCL程序的代码库文件 |
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/18414
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
新手在交易中的10个基本错误
从基础到中级:对象事件(四)
您好,德米特里·吉兹利克,希望您一切都很好。
您是在哪个文件中实现了 CNeuronTimeFoundPatching 类?
我不太明白,也许它已经包含在zip压缩包的某个文件夹中了,或者这是尚未作为本文文件的一部分上传的内容。
这种方法非常有趣,希望不久后能看到后续内容(用西班牙语,我的母语)。拥抱。
您能否(如果可以的话)更详细地说明哪些库是代码的依赖项,因为尝试编译任何文件时,都缺少许多依赖项
(目前只有“EXPERTS”文件,但可能缺少其他文件,例如“include”目录中的文件)。
你好,Dmitry Gizlyk,希望你一切都好。
你是在哪个文件中实现了 CNeuronTimeFoundPatching 类?
我不太明白,也许它已经在压缩包的某个文件夹里了,或者还未作为本文的附件上传。
这个思路非常有趣,希望很快能看到后续内容(用西班牙语,我的母语)。祝好。
下午好,米格尔。
CNeuronTimeFoundPatching 类位于 NeuroNet.mqh 库中。
您能否(如果可以的话)更详细地说明哪些库对代码有补充作用?因为尝试编译任何文件时,都会缺少许多依赖项
(目前只有“EXPERTS”文件,但可能缺少其他文件,例如“include”目录中的文件)。