Home >  > VN.PY 2.0学习记录四(多线程、多进程)

VN.PY 2.0学习记录四(多线程、多进程)

0

蜗牛博客VNPY学习记录:

VN.PY 2.0学习记录一(如何回测)
VN.PY 2.0学习记录二(策略开发)
Vn.py学习记录三(米筐教程)
VN.PY 2.0学习记录四(多线程、多进程)
Vn.py学习记录五–交易时间段及Widgets
Vn.py学习记录六(无界面模拟盘)
Vn.py学习记录七(V2.0.5版本)
Vnpy学习记录八(R-Breaker及pickle)
Vn.py学习记录九(事件驱动引擎)
VN.PY学习记录十(源码概述)
VNPY学习记录11(微信+Vscode)
VNPY学习记录12(父子进程、回调函数)
VNPY学习记录13(部署到云服务器,实现自动交易)

一、optimize函数
这个函数位于vnpy-2.0.2\vnpy\app\cta_strategy\backtesting.py里面。是一个优化任务,我们要使用多进程来执行它。它的代码与vn.py 1.x已经不同,完整代码如下:

def optimize(
    target_name: str,
    strategy_class: CtaTemplate,
    setting: dict,
    vt_symbol: str,
    interval: Interval,
    start: datetime,
    rate: float,
    slippage: float,
    size: float,
    pricetick: float,
    capital: int,
    end: datetime,
    mode: BacktestingMode,
):
    """
    Function for running in multiprocessing.pool
    """
    engine = BacktestingEngine()
    engine.set_parameters(
        vt_symbol=vt_symbol,
        interval=interval,
        start=start,
        rate=rate,
        slippage=slippage,
        size=size,
        pricetick=pricetick,
        capital=capital,
        end=end,
        mode=mode
    )

    engine.add_strategy(strategy_class, setting)
    engine.load_data()
    engine.run_backtesting()
    engine.calculate_result()
    statistics = engine.calculate_statistics(output=False)

    target_value = statistics[target_name]
    return (str(setting), target_value, statistics)

从上面的代码可以看到,它和这里“五、策略回测”中的代码一样的。

二、多线程
例子:

import threading
def func1(a):
    #Do something
    print('Do something')
    a+=1
    print(a)
    print('当前线程数为{}'.format(threading.activeCount()))
    if a>5:
        return
    t=threading.Timer(5,func1,(a,))
    t.start()


func1(1)

执行结果:

再看一个:

import threading

def fun_timer():
    print("这是第二个函数")
    # 定义全局变量


def func1(a):
    #Do something
    print('Do something')
    a+=1
    print(a)
    print('当前线程数为{}'.format(threading.activeCount()))
    if a>5:
        return
    t=threading.Timer(2,func1,(a,))
    t.start()
    if a ==3:
	    t2=threading.Timer(4,fun_timer)
	    t2.start()

func1(1)

执行结果:

今天看到了这篇文章,终于也理解了多线程。

三、多进程与全局锁
来看看多个线程同时操作一个变量怎么把内容给改乱了

import time, threading

# 假定这是你的银行存款:
balance = 0

def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

def run_thread(n):
    for i in range(100000):
        change_it(n)

t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)

我们定义了一个共享变量balance,初始值为0,并且启动两个线程,先存后取,理论上结果应该为0,但是,由于线程的调度是由操作系统决定的,当t1、t2交替执行时,只要循环次数足够多,balance的结果就不一定是0了。

如果我们要确保balance计算正确,就要给change_it()上一把锁,当某个线程开始执行change_it()时,我们说,该线程因为获得了锁,因此其他线程不能同时执行change_it()。创建一个锁就是通过threading.Lock()来实现。

import time, threading

balance = 0
lock = threading.Lock()

def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

def run_thread(n):
    for i in range(100000):
        # 先要获取锁:
        lock.acquire()
        try:
            # 放心地改吧:
            change_it(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)

锁的好处就是确保了某段关键代码只能由一个线程从头到尾完整地执行,坏处当然也很多,首先是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了。

参考:https://www.cnblogs.com/chengd/articles/7770898.html

三、
出现下面的错误:

'numpy.ndarray' object has no attribute 'index'

https://blog.csdn.net/w5688414/article/details/77965820

四、VNPY的Bar
故收到Tick数据后,需要用到K线生成模块(vnpy/trader/utility.py/Class BarGenerator)里面的update_tick函数,通过时间切片的方法,聚合成1分钟K线数据,并且推送到on_bar函数。

收到推送过来的1分钟K线数据后,通过K线生成模块里面的update_bar函数,以分钟切片的方法,合成15分钟K线数据,并且推送到on_15min_bar函数。

所以,on_bar到的是一分钟K线,on_15min_bar收到的是15分钟Bar。

>>> xmin_bar = None
>>> if not xmin_bar:
...     print("xx")
... 
xx
----------------
>>> xmin_bar = None
>>> not xmin_bar
True


>>> if not 6%5:
...     print("xx")
... 
>>> 
>>> if not 5%5:
...     print("xx")
... 
xx
>>> if not 4%5:
...     print("xx")
... 
>>> if not 7%5:
...     print("xx")
... 
>>> if not 1%5:
...     print("xx")
... 
------------------------------------
>>> if not 1%10:
...     print("xx")
... 
>>> if not 10%10:
...     print("xx")
... 
xx
>>> 

要理解看这个:https://www.vnpy.com/forum/topic/36-zai-ce-lue-zhong-tong-guo-ticksheng-cheng-ren-yi-zhou-qi-kxian

K线合成器
https://blog.csdn.net/q275343119/article/details/85165752

五、吐槽
今天在听网上的VN.PY视频,忍不住在这里吐槽一下。6天的课程,我现在看到了第4天,全在讲一些概念性的东西,我反正感觉是啥也没学到。用一位学员的话说就是:走马观花。

不得不感叹,每个人的话课方式真是千差万别,就上面说的情况,并不是老师的能力不行,他的能力很强,PPT也做得很漂亮,准备得也很用心,可是这课讲得真是渣。

因为学过电脑的应该最清楚,最快速的学习方式就是通过实例学习,或者是从0做一个项目来学习,我至今还记得慕课网的django教程 ,就是教你做一个网站,现场敲代码,我觉得这是我见过的最好的教程,不止是我这么认为,这个课程也是慕课网最爱欢迎的课程之一。

而上面说的这个vn.py的讲师呢?这里打开源码给你看一两行,那里又打开源码给你看一两行。啥都没学会。就以一个例子来说吧,他讲课中说要用到timer,然后给学生看了策略中用到这个timer的代码,可是我还是不懂怎么用啊。你现场 将代码敲出来,然后再演示,让学生看到结果,不就可以了吗?

现在已经第4节课了,后面两节是实战课,我预计估计到时会出现这样的情况,比如你去学习EXCEL,老师花了4节课讲EXCEL的设计哲学 ,后面两节课你就学会了最基本的划个表格,其它高级一点的,复杂一点的,实际工作中要用到的东西啥也没学会。

暧昧帖

本文暂无标签

发表评论

*

*