1.Vue3之事件循环、交易交易nextTick与源码解析
2.通达信公式进阶(9):条件预警和全推数据
3.LiteOS:剖析时间管理模块源代码
4.Vue.nextTick原理分析
5.Vue2.0源码阅读(2) —vue.nextTicket()
6.PIXI.JS源码解析:Ticker.js
Vue3之事件循环、源码nextTick与源码解析
事件循环是模型JavaScript单线程执行的核心机制,确保了同步任务与异步任务能有序执行。交易交易同步任务按顺序执行,源码而异步任务则分为宏任务和微任务。模型PHP团队源码宏任务包括setTimeout、交易交易setInterval、源码整体代码、模型ajax、交易交易postMessage、源码交互事件等,模型微任务则包括Promise.then、交易交易catch、源码finally、模型MutationObserver、process.nextTick(Node环境下)。
事件循环机制确保了同步任务先执行,宏任务和微任务则交替执行,形成事件循环的周期。此过程确保了JavaScript代码的流畅执行,避免了因耗时任务阻塞主线程导致的卡顿。
在Vue3中,nextTick功能用于处理异步更新DOM问题。它允许开发者在DOM更新之前执行异步代码,确保DOM的正确渲染。有以下两种使用方式:一种是直接传入回调函数,另一种是通过async和await实现。当对数据进行操作后,如果观察到DOM没有更新,原因在于Vue3中数据响应式是同步的,而DOM更新是异步的。
为解决此问题,可以使用nextTick将同步代码转化为异步代码,确保在浏览器的下一次事件循环中执行DOM更新。在Vue3源代码中,nextTick通过将同步代码包装为Promise,从而转化为异步任务来实现这一功能。
Vue3将DOM更新设置为异步,旨在优化性能。考虑到大量数据变化时,频繁的DOM更新可能导致性能开销过大,异步更新策略降低了这种浪费,提高了应用的响应性和性能效率。
通达信公式进阶(9):条件预警和全推数据
全推数据,它指的是市场实时金融数据,包括最新的即时量价等基础行情数据,以及基于这些基础数据定义的数据。
通常情况下,量化交易的全推数据包括每笔交易、每个tick的实时数据,而通达信的地图大屏源码接口仅提供分时行情级别的全推数据。这里所说的基础行情全推数据,实际上就是分时行情,而其他全推数据则可以通过DYNAINFO即时行情函数来获取。
正因为这个特性,通达信的全推数据通常和条件预警功能搭配使用。接下来,我就以我自己编写的公式综合预警示例为例,来教大家如何设置条件预警。
我是@波有蛋,一位从业八年的职业交易员,对股票、基金、程序化交易等领域有深入的研究,擅长指标和选股公式的编写,已经服务了上千粉丝,帮助他们开通了满意的证券账户。
那么,下面我们就正式开始本期的教学吧!
1、全推数据
通达信的全推数据包括即时量价等基础行情数据,以及其他通过DYNAINFO即时行情函数获取的数据。
需要注意的是,直接使用基础行情数据函数OCHLVA获取到的数据并非即时量价全推数据,它还包含了历史行情。即时量价获取接口如下:
对比OCHLVA和即时量价全推数据,基础行情用实线表示,全推数据用虚线表示,同一个数据用相同的颜色表示,源码如下:
将成交量和成交额放在副图,同比压缩数量级,效果如下图所示:
全推数据始终显示一条直线,始终只输出最新的即时行情数据,而OCHLVA则包含了历史数据。
2、条件预警
条件预警是选股公式的延伸用法。在使用选股公式时,每次选股才生效一次,即便设置自动选股,也只能最多一分钟选一次股(使用一分钟一次刷新非常占用电脑的工作效率)。
条件预警则可以实时处理全推数据,相当于实时刷新的选股公式,只要在盘中随时满足选股条件就能直接将股票加入自选,而使用条件选股则可能错过很多时机。
介绍完条件预警的功能后,我就以我自编的选股公式综合预警示例为例,教大家如何设置条件预警。
首先,导入综合预警示例公式。还没有综合预警示例公式的粉丝,你懂的~
导入成功后,键盘精灵输入.启动条件预警设置。域名源码在线出售
条件预警设置分成4个栏目,其中预警品种设置、预警公式设置是主要用到的功能。下面我将依次教大家如何设置。
预警品种是指你想对哪些证券进行监控,可以自行选定添加,条件预警默认监控添加的品种。
比如,我想监控所有上证A股,就点击左侧的上证A股栏,再点击全选后确认,即可将所有上证A股添加到监控。
之后,进入预警公式设置,点击添加公式,选择综合预警示例公式添加。
注意,预警范围可以选择预设品种和指定范围,选择预设品种即监控之前在预警品种添加的列表,选择指定范围则可重新自定义监控范围。
最后,可以将预警结果关联到自定义板块,相当于选股入板块。
设置完成后,系统会提示启动预警功能。
只有盘中才会出现预警结果,示例截图时间在盘后,所以没有数据。
对于不清楚的地方,欢迎留言讨论,任何问题我都会解答~
如果你对低佣开户或量化交易有需求,或者需要量化策略、通达信公式编写的技术支持,关注我,希望能帮得到你。
LiteOS:剖析时间管理模块源代码
LiteOS的时间管理模块基于系统时钟,主要分为两个部分:一是SysTick中断,为任务调度提供精确的时钟节拍;二是提供一系列与时间相关的服务,如时间转换、统计和延迟功能。
以系统时钟作为基础,时钟管理模块的核心是SysTick定时器,它以周期性的Tick(时钟节拍)为操作系统计时的基本单位。用户可配置每秒Tick数量,如个Tick表示1毫秒。另一个计时单位Cycle,由系统主时钟频率决定,例如在 MHz的CPU中,每秒有个Cycle。
用户通常以秒或毫秒为时间单位,但操作系统内部以Tick操作。源码程序怎么运行对于系统操作,如任务暂停、延时等,时间管理模块负责Tick与秒/毫秒之间的转换。源代码可以在LiteOS开源站点获取,如los_tick.h、los_tick_pri.h和los_tick.c等。
在源代码剖析中,我们以STMFIDiscovery板为例,首先介绍时间管理的初始化和启动过程。它依赖于系统时钟配置和每秒Tick数量的设置。在系统启动时,会进行硬件和时钟配置,然后通过OsTickInit()函数初始化时间管理,启动Tick中断,以及调用OsTickHandler()处理Tick中断。
常用的时间管理功能包括时间转换(如毫秒到Tick和Tick到毫秒)、统计(如Cycle与Tick的关系和自启动以来的Tick/Cycle计数)以及延时管理(如us和ms等待)。通过这些接口,应用程序可以方便地处理与时间相关的操作。
总的来说,LiteOS的时间管理模块为任务管理和应用程序提供了强大而灵活的时间控制能力。通过理解这些源代码,开发者可以更好地利用这些功能进行高效的时间管理。
Vue.nextTick原理分析
了解 Vue 的 nextTick 是如何实现的,首先需要回顾一下 JavaScript 的运行机制。
JavaScript 是单线程执行的,通过事件循环机制进行任务调度。具体流程如下:当执行栈为空时,检查微任务队列,执行全部微任务,之后执行宏任务队列中的事件。
在 JavaScript 中,常见的宏任务包括 setTimeout, MessageChannel, postMessage 和 setImmediate,而微任务则包括 MutationObserver 和 Promise.then。
Vue 的 nextTick 实现细节在 2.6. 版本后被单独封装在 src/core/util/next-tick.js 文件中,源码简洁,约 多行。其核心原理在于,同一 tick 内添加的任务会在下一个 tick 执行,避免创建多个异步任务。
当调用 nextTick 时不传入回调函数,会返回一个 Promise 化的调用,当内部 resolve 函数执行,即进入 then 的逻辑。
总结,nextTick 的实现和使用方法在源码分析后变得清晰。在 Vue 开发中,通过 nextTick 可以确保在数据响应变化后获取最新的 DOM 更新,避免了同步操作导致的渲染冲突问题。
Vue2.0源码阅读(2) —vue.nextTicket()
揭开Vue.nextTick之谜
在vue圈子中,hfss源码怎么导入有一句广为流传的“都市传说”:“遇事不决,问nextTick。”这句话背后的nextTick究竟是何物?根据官方文档的解释,nextTick()是在下次DOM更新循环结束之后执行延迟回调。其核心功能是在数据更新后自动调用回调函数,获取更新后的DOM。接下来,我们将深入源码,一探nextTick的真谛。
将nextTick定义至Vue原型链的代码位于src/core/instance/render.js,具体实现则在src/core/util/next-tick.js。nextTick接受两个参数:函数cd(实际使用场景中,为延迟执行的函数)与this上下文。内部定义了一个回调函数数组callbacks,当cb存在时将其添加至数组,同时将回调函数的上下文指向组件的this;若cb不存在,则将resolve函数添加至数组。接着判断pending值,其用于控制状态。当pending值为false,表示无回调函数正在执行,进而执行timerFunc函数。timerFunc函数在cb不存在且浏览器支持Promise时返回一个Promise,允许在不传入回调的情况下通过this.$nextTick().then(cb)进行调用。
timerFunc看似实现关键,实则执行逻辑围绕Promise、MutationObserver、setImmediate与setTimeout(f(), 0)等方法展开。若系统支持Promise,则使用Promise执行延时;不支持Promise时,依次判断是否支持MutationObserver、setImmediate或setTimeout,选择合适的方法执行flushCallbacks函数。
flushCallbacks函数负责将pending状态设为false,并将callbacks数组复制至copies数组,清空callbacks。接着遍历copies数组,依次执行回调函数(即传入nextTick的cb函数)。至此,我们理解了nextTick的核心机制与使用场景。
MutationObserver:在源码阅读中,我们发现若系统不支持Promise,则使用MutationObserver作为替代方案。MutationObserver是监听DOM树变更的接口,其设计用于替代DOM3 Events规范中的Mutation Events功能。简单理解,MutationObserver用于监听DOM变动,当DOM发生任何更改时,它会接收到通知。
MutationObserver的使用方式如代码所示,实例化MutationObserver并指定回调函数与需要监控的DOM元素与变动类型。调用observer.observe(dom, options)方法进行观察。options对象中定义了需要观察的变动类型,如childList、attributes、characterData等。
下面通过一个简单的demo来理解MutationObserver。在运行该demo后,屏幕显示了,说明文本节点已添加至DOM中。然而,控制台打印的I值只有1,这意味着DOM变动只触发了一次。这表明MutationObserver在异步处理DOM变化,直到页面上所有DOM操作完成时执行一次,实现高效处理。
在nextTick中,MutationObserver用于触发flushCallbacks函数。通过文本节点的操作触发MutationObserver,从而执行flushCallbacks。至此,我们理解了nextTick的实现与MutationObserver的用法。
源码阅读让我们发现,nextTick并非传说中的神物,其主要应用场合与DOM操作相关。在遇到无法在DOM更新前操作DOM的情况时,可以考虑使用nextTick。由于nextTick在DOM更新循环结束后执行,因此在created钩子中操作DOM成为可能,实现目标。
PIXI.JS源码解析:Ticker.js
本文聚焦于剖析PIXI.JS的核心模块,尤其探讨了Ticker.js文件中包含的功能实现,解释了Ticker和TickerListener如何协同工作以处理动画渲染和执行回调。
在使用PIXI.JS时,初次接触的关键代码涉及实例化Application,该实例用于添加精灵图和创建动画。核心在于Application中的内部变量_ticker,它负责动画循环的执行。_ticker对象通过start方法启动循环,同时ticker.add方法允许将渲染函数添加到渲染队列中,确保每次循环时都能触发渲染函数,更新画布上的图像。
Ticker.js作为核心模块,包含了Ticker和TickerListener的逻辑。ticker.add方法将渲染函数添加到渲染队列中,而ticker.start方法则启动循环,触发队列中的渲染函数执行。ticker.remove方法用于移除队列中的函数。UPDATE_PRIORITY.LOW参数允许用户调整回调函数的执行顺序。
Ticker内部维护了一个队列,由_head和_tick变量管理。_head作为队列的源头,而_tick则负责循环执行,通过requestAnimationFrame实现。每次循环执行前,需要确保三个条件满足:_ticker已启动、_requestId为null以及队列中存在有效回调。当这三个条件满足时,循环得以启动并执行。
每次循环时,_tick执行内部逻辑以更新图像。在循环过程中,_head.next指向下个回调,形成链式执行。_addListener方法用于内部管理回调函数的添加与移除,允许用户通过控制参数来影响回调函数的执行顺序与执行次数。
TickerListener作为回调函数链的管理器,负责链接并执行一系列回调函数。当向应用实例中添加回调时,会自动插入到TickerListener队列中,确保在每次循环时按照特定顺序执行所有回调。TickerListener内部方法确保了回调的正确执行顺序与执行次数,同时提供了灵活的插入策略,允许用户根据需要调整回调函数的位置。
总之,Ticker.js通过Ticker和TickerListener的协作,实现了高效、灵活的动画循环和回调执行机制,为开发者提供了强大的动画控制能力,简化了渲染和动画管理过程。
vn.py学习笔记(八)vn.py utility、BarGenerator、ArrayManager源码阅读
在量化投资的探索中,作者对vn.py产生了浓厚的兴趣,并投身于相关学习。目前,作者主要专注于vn.py在A股市场量化策略的学习,面临的主要技术难点包括获取和维持日线数据、实现自动下单交易、开发全市场选股程序、编写选股策略回测程序,以及运用机器学习进行股票趋势预测。作者计划通过阅读vn.py源码,深入了解其架构机制,并通过分享形式记录学习心得,以便更好地理解vn.py。
相关github仓库地址:github.com/PanAndy/quan...
如有收获,请关注公众号以支持作者。同时,作者也收集了一些量化投资和技术相关的视频及书籍资源,欢迎关注公众号亚里随笔获取。
本文将重点探讨vn.py/trader/utility.py中的内容,主要包括工具函数、BarGenerator和ArrayManager。工具函数部分相对容易理解,主要是对通用功能进行封装。BarGenerator是K线合成器,负责根据实时tick数据合成1分钟K线,并进一步合成n分钟K线。ArrayManager是指标计算辅助类,负责维护一定量的历史数据,以供计算sma、ema、atr等常见指标。BarGenerator和ArrayManager是本次学习的重点。
工具函数部分主要提供合约代码转换、路径读取、json文件读写、数值位数设置、日志等功能,主要是对基本功能进行封装,没有复杂的算法。
BarGenerator类用于从tick数据中生成1分钟bar数据,也可以用于从1分钟的bar数据中合成x分钟或x小时的bar。BarGenerator的主要函数包括update_tick、update_bar、update_bar_minute_window、update_bar_hour_window、on_hour_bar和generate。
ArrayManager是一个时间序列容器,用于按时间序列缓存bar数据,提供技术指标的计算。ArrayManager提供的函数分为四类:init函数、update_bar、@property函数和技术指标函数。
学透Vue源码~nextTick原理
nextTick的官方解释:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
例如:我们有如下代码:
第一次输出结果为hello world,第二次结果为更新后的Hello World。
即我们在update方法中第一行对message的更新,并不是马上同步到span中,而是在完成span的更新之后回调了我们传入nextTick的函数。
Vue中数据的更新不会同步触发dom元素的更新,也就是说dom更新是异步执行的,并且在更新之后调用了我们传入nextTick的函数。
那么问题来了,Vue为什么需要nextTick呢?nextTick又是如何实现的呢?
为了理解nextTick的设计意图和实现原理,我们需要理解Vue的响应式原理,包括数据劫持、依赖收集和数据代理等概念。我们需要实现一个简易版的Vue,用于创建Vue对象,处理参数el和data,并使用Object.defineProperty()方法实现数据劫持。
接下来,我们实现Observe类用于监听数据变化,通过get方法收集依赖并存储到Dep类中。Dep类保存依赖,并在数据变更时调用Watcher类,Watcher类观察数据变化,触发依赖收集并在数据变更后执行更新。
通过以上的代码,我们就实现了一个简易版的Vue,用于模拟dom变更。
为什么要使用nextTick?当我们对数据进行频繁更新时,可能会导致严重的性能问题。Vue使用nextTick来优化这个问题,避免频繁的DOM更新操作,只在合适的时机执行一次DOM更新。
为了实现异步更新,Vue使用事件循环机制。每次事件循环期间,Vue将数据变更缓存起来,只在最后一次视图渲染时执行一次DOM更新操作。
Vue中nextTick的实现涉及异步更新队列的概念。Vue为每个要观察的数据创建Watcher对象,当数据变更时,会触发Watcher对象的update方法,但不再立即执行更新操作,而是将变更的Watcher对象保存到待更新的队列中。在微任务中,Vue执行更新队列中的更新操作。
Vue实现nextTick的核心原理包括依赖收集、数据劫持、事件循环机制和异步更新队列。通过这些原理,Vue能够在确保数据响应式的同时,优化性能,减少无效的DOM更新操作。
Vue.nextTick 的原理和用途
一、原理
Vue 实现响应式的策略是按一定的策略进行 DOM 的更新,而非数据变化立即导致 DOM 变化。Vue 在修改数据后,并不会立即更新视图,而是等到同一事件循环中的所有数据变化完成之后,再统一进行视图更新。这样的策略确保了 DOM 的更新与数据变化之间的一致性。
二、 Vue.nextTick 的机制
1、为什么用Vue.nextTick()
Vue.nextTick() 方法是 Vue 的核心方法之一,它允许你在 DOM 更新循环结束之后执行延迟回调,确保你获取到的是更新后的 DOM。通过 Vue.nextTick(),开发者可以在修改数据后立即调用它,从而在 DOM 更新后立即访问最新的 DOM 结构。
2、什么是Vue.nextTick()?
Vue.nextTick() 方法用于在下次 DOM 更新循环结束之后执行延迟回调。这样,当修改数据后立即调用 Vue.nextTick(),你可以在回调中访问到更新后的 DOM。
MutationObserver
MutationObserver 是 HTML5 中的一个 API,用于监视 DOM 的变化。调用 MutationObserver 需要先给它绑定回调函数,并得到 MutationObserver 实例。回调会在 MutationObserver 实例监听到 DOM 变动时触发。在这里,回调是在 microtask 中执行的。
源码浅析
Vue.nextTick() 的实现位于 src/core/util/next-tick.js 文件中,主要分为两部分:能力检测和根据能力检测选择执行回调队列的方式。
能力检测确保优先使用微任务执行,如果浏览器不支持微任务,则使用宏任务。Vue.nextTick() 的执行顺序依次为:Promise、MutationObserver、setImmediate、setTimeout。
对外暴露的 nextTick 函数在每次调用时执行回调,但不直接执行回调函数,而是确保同一 tick 内多次调用 nextTick 的回调都集中在同一个异步任务中,在下一个 tick 执行完毕。
附加
no 的定义如下。
三、怎么用
Vue.nextTick([callback, context])
参数说明:
Vue 实例方法 vm.$nextTick 做了封装,将 context 参数设置为当前 Vue 实例。
四、小结
Vue.nextTick() 的使用是为了获取更新后的 DOM。触发时机是在同一事件循环中的数据变化后,DOM 更新完成时立即执行回调。
同一事件循环中的代码执行完毕 -> DOM 更新 -> nextTick callback 触发
应用场景:
版本分析
在 Vue 2.6 版本中,优先使用 microtask 作为异步延迟包装器,方法实现相对简单。而在 Vue 2.5 版本中,nextTick 的实现是通过 microTimerFunc 和 macroTimerFunc 组合实现的,延迟调用优先级为:Promise > setImmediate > MessageChannel > setTimeout。具体的源码实现细节在相关版本中有所不同。
在 Vue 2.5 版本中,存在一些问题,如在重绘之前状态改变时的不一致(如 issue #)以及在事件处理程序中使用 macrotask 导致的不可预知行为(如 issue # 和 issue #)。
尽管 microtask 在某些情况下也可能存在问题,如在顺序事件(如 issue # 和 issue #)之间或在同一事件的冒泡过程中触发(issue #),但 Vue.nextTick() 依然提供了在 DOM 更新后访问最新 DOM 结构的便利。