不阻塞,用start
start命令
call和start的区别

对于start,概况二句话:“不同进程不能传值”,“相同进程单向传值,老子传儿子,非儿子传老子”。

  对于call,“同一进程,变量互通”。

  另外,可以从以下几方面理解start与call命令的区别:

  一是调用范围不同:call主要用来进行批处理的内部调用,如call :pend 和一些dos命令的调用如call set test=2,但也可以调用其他可执行文件,而start则不能进行内部调用,但其可以执行基本上所有的外部程序,还可以执行shell,如打开文件夹start "" "%WINDIR%",安装网络打印机start "" "\IP\Printer"等等。

  二是调用方式不同:call是严格意义上而言的调用,在call另一个批处理时是在同一窗体进程里执行,而start则是执行,所以在执行另外一个批处理时是在不同的窗体进程里进行,也就是说在新开启的进程里执行,虽然start可以加入b参数,但其结果却完全不同。如我们使用call set test=2 和 start /b set test=2 看似执行的结果相同,但是我们发现后者有两个进程,而且在窗体里要执行两次exit才能退出,所以当我们使用start来执行一个批处理后最好在被调用的批处理中也加一个exit,否则无法退出被调用的批处理的dos窗体,但是使用call调用时如果在被调用的批处理中存在exit则会直接结束原始和被调用的批处理程序,这是一个非常严重的问题。建议在被调用的批处理中使用goto :eof来取代exit。

  三是调用结果不同:call调用不仅可以把参数或变量传给被调用的批处理,而且被调用的批处理也可以设置参数或变量以便回传,而start只能把参数或变量传给被调用的批处理,却不能回传参数或变量,这一点实际上是第二点的延伸。另外,我们还必须注意一点:使用call调用其他批处理时,在被调用的批处理中若我们使用goto命令的时候,建议要使用与原批处理中不同的标签名来跳转,否则可能会跳转到原批处理中而不能保证完整的执行被调用批处理中的所有语句。

架构网络争议

这儿有一篇去年Quicklib作者与vnpy作者之间的争论骂仗,看了才知道vnpy.comvnpy.cn不是一个站!前者是vnpy官方站,有做https,后者则不是,只做了http. 前者在百度中是 "vnpy量化社区",后者叫做"vnpy官网",迷惑性很大, 但是后者上去之后就很像是一个广告网站, 很多连接指向了pythonpai.com. 这个vnpy.cn搞得我以为vnpy没有文档, 原来是有的...
vnpy.com才是vnpy官网, 风格克制冷静, 有用安全的https协议. 作者"用python的程序员", 真名陈晓优. 公司为 上海韦纳软件科技有限公司.
vnpy.cn及其关联的一系列网站, 是quicklib的作者"量化林"的, 包括一系列互链的网站: quicklib.cn , quicklib.net , pythonpai.com , virtualapi.com , hbapi.cn (华宝证券), coolquant.cn . 搜索起来排名还挺靠前, SEO做得不错, 网站风格特别得广告化. 故而, 显得quicklib就很不可靠了. 通过whosi反查 ,其域名注册方 上海量贝信息科技有限公司, 王登高. QQ邮箱: 147423661@qq.com, 一共注册了如下域名:

vrltd.cn
ctponline.cn
hbapi.cn
momtree.cn
gucps.cn
virtualapi.cn
vnpy.cn
tradeapi.cn
mdapi.cn
lhjie.cn
tmtbp.cn
virtualexchange.cn
coolquant.cn
mdshare.cn
toukj.cn
kucps.cn
jobping.cn
pythonpai.cn
quicklib.cn

PS: 本文是2020年5月20日创建, 写这个PS以前的更新时间是2021年2月19日。写PS的今天是2022年1月3日。刚刚在一条新文章下看到评论,一个自称张律师所留邮箱为329xxxx385@qq.com的留言写着:请删除关于VNPY的评论,您的评论可能不够客观,牵涉到企业名誉权的问题,请删除!, 嗯, 好的, 已经被我当垃圾留言删除了. 本站就是个小的不能小的小站, 经不起用qq邮箱的大律师这么折腾, 双方言论请大家自己判断吧!
PS2: 紧接着PS, 百度了一下, vnpy.cn仍然排在第一位, 不过要仔细看,是广告位. 第二是知乎关于vnpy的提问, 第三是vnpy的github地址, vnpy.com在哪儿? 第一页最后一位... 打开vnpy.cn看了下, 作者似乎开源了一个叫做vntrader的工具, 挂在gitee 的vnpycn/vnpy下. 对于真正开源的项目我是很尊重的, vntrader可能也做的很好, 至少目前看商业化做得很好. 但是要走得远不能老是蹭别人的名头, 最后会给自己埋雷, 看看经典的乔丹告乔丹鞋的案例, 乔丹鞋当年质量做得其实很好, 然而跟乔丹打了几年官司以后, 乔丹鞋同辈的品牌甚至比乔丹鞋晚的品牌, 像特步啊361啊都做得风生水起了, 而乔丹鞋作为最早品质不错商业化也做得好的品牌, 现在只能默默吞食自己早年埋下的蹭名头苦果了. 建议vnpy.cn换个自己的名字,做好自己的品牌, 如果vnpy.cn的技术做的不错, 商业化做得又远超过vnpy.com, 何必还要蹭别人名字呢.
PS3: 程序员很多直到在百度上常常找不到自己想要的. 欧文试着bing搜索vnpy, 排第一的是vnpy.com, 第二才是vnpy.cn, 这符合大众对百度的印象,哈哈.

simnow

首先simnow各种坑.
坑1: 注册后, 会给一个investorID,这个才是后续登录交易平台的ID!
坑2: 首次登录必须修改密码,而网站上没有任何提示!你需要下载Simnow APP登录才能发现这一点. simnow APP需要选择9999张江
坑3: 登录后没有修改密码的地方! 需要退出登录,然后通过"忘记密码"的方式修改密码, 我也是醉了-__-|| 稳妥起见, 使用了6位数字密码,以免又有什么幺蛾子.
最后通过Simnow APP登录成功,说明一切终于正常了.
坑4:4个服务器! 前三个只能交易时段使用,后一个才能7x24使用. 可是! 7x24这个服务器通过vnpy登录永远会提示CTP不合法登录!测试使用第2个服务器第二组:Trade Front:180.168.146.187:10101,Market Front:180.168.146.187:10111;【电信】是可以的.非交易时段也可以登录.

进行策略调试

知乎上问答A

打印调试信息

从命令行启动vnpy的话, 就会将信息打印回命令行. 通过图标启动则不行

名词解释

回测: 用历史数据测试设置的自动化策略. 历史数据默认是从RQData上下载.
策略: 自动化的买入卖出策略.

RQdata

RQdata是米筐网站RiceQuant提供的数据下载服务. 似乎还不对一般个人开放, 但从vnpy进去似乎是可以的. 有个vnpy专用的使用申请, vnpy中默认下载用于回测的历史数据的数据库. 下载期货数据3000元一年,期货+期权是10000元一年. 试用期15天.

学习资料和API文档

vnpy似乎没有官方的API文档, 主要似乎是给GUI用户使用的.
这儿有大神做了非官方的文档github: vnpydoc_unofficial, 在线阅读. 不过这个大神跟我一样, 写一次就断更了.
这儿有一篇知乎上的笔记
蜗牛博客VNPY学习记录
pythonπ

有这么几个目录,但似乎只有第三个起作用.

C:\Users\username\pip.ini
C:\Users\username\pip\pip.ini
%APPDATA%\pip\pip.ini

pip.ini内容

[global]
index-url = https://pypi.douban.com/simple
[install]
trusted-host = pypi.douban.com

中国的名牌学校出来的学生,逻辑能力很强;美国名牌学校出来的学生,创造能力很强。但学校都不能培育的,就是预测能力。预测能力与逻辑和创造无关,所以从学校退学或者小学没毕业都可以做成功的创业者。预测能力与信心或者叫偏执有关。对预测结果越有信心,越能执行,别人看起来就越偏执。再好的预测能力也不能100%准确,即使这次预测准确,好运气和坏运气会接连来袭。所以经商者都喜欢搞搞风水、拜拜财神。

Future,期货合约, 规定未来购买价格, 必买必卖.
Option, 期权合约, 规定未来购买价格, 买方付保证金换来选择权, 可买必卖.
Forward, 远期合约, 与期货区别是期货是场内标准化的, Forward是场外非标准化的.

import pandas
import numpy

# 读excel
main():
    xls = pandas.ExcelFile(ordersFile)
    df= pandas.read_excel(xls, 'sheet1') # 读取dataframe

# 写excel
    with pandas.ExcelWriter('./订单清洗后数据.xlsx') as writer:
        df.to_excel(writer, sheet_name='sheet1',  index=None)  #默认会写入index, 建议不写入index

# 根据3列后数据去重
    df = df.drop_duplicates(sheet.columns[3:])

# 删除0列和指定名称列
    df = df.drop([df.columns[0], '文件名'], axis=1)

# 返回某一列(sheet名)的哪些行包含指定内容
    df.Sheet名.str.contains('作废')

# 计算True的数量
    numpy.sum(dfall['Sheet名'].str.contains('作废')!=0)

# 删除包含指定字符的行
   dfall[ ~dfall['Sheet名'].str.contains('作废') ]

# 插入列
   df.insert(index数值表示的位置, '列名', 数组)

# 直接数组方式插入
   df['新列名'] = [1,2,3,4]

# 直接数组方式修改
   df['旧列名'] = [1,2,3,4]

# 遍历并修改行内数值
for i in range(len(df)):
    index = df.index[i] #实际index和数组序号不同
    df.loc[index, '某列名'] = '新数值' + df.某某列名[index] # 必须使用loc修改,但可以直接使用"."读取

# 列名相同的简单合并
    df = df.append(otherdf)

# 相同内容填充数组
arr = numpy.full((3), 'a') # 填充一元数组
arr = numpy.full((3,2), 'a') # 填充二元数组

# 将第1列NaN替换掉的四种方式, 有时候会报错`A value is trying to be set on a copy of a slice from a DataFrame`, 有时候不会, 还不知道怎么解决.
df[1].fillna(0, inplace=True)
df[['a', 'b']] = df[['a','b']].fillna(value=0)
df.fillna({'a':0,'b':0})
df=df.fillna({'a':0,'b':0})

# 连接多个df后, index重复需要做index重置
df=df.reset_index(drop=True)

# 修改指定的columns名称
df.rename(columns={'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}, inplace=True) 

数据合并

数据合并比较多样,看这儿https://www.cnblogs.com/guxh/p/9451532.html

使用第2行作为header(从0起算,序号为1)

sheet = pandas.read_excel(fileName, sheetName, header=1)

我们在用EcountERP, 不过感觉应该所有ERP对于下面的问题应该都差不多.
ERP中的品目管理是所有其他管理的基础. 所有品目管理最主要的就是要保证品目唯一性. 然而产品需求的快速改变和迭代开发导致品目也在不断迭代更新. 此时旧的代码需要停用,然后增加新的代码. 然而ERP原生没有版本管理, 增加的新代码也看不出和老代码有什么关联, 随着品目更新,停用的代码越来越多, 翻查新代码也是个问题.
ERP应该结合软件代码版本管理的思想, 不说分布式Git了, 集中式SVN的思想多少得有点儿吧, 这样代码+版本号来管理品目. 具体来说:

  1. 每次品目更改执行commit操作, 说明更改内容并自动升级版本号
  2. 可以用x.y.z的版本方式人工命名,也可以生成像Git一样的自动版本号
  3. 从品目到往来单位, BOM版本都可以通过版本管理来做,甚至订单模板等等也可以这么做.
  4. 甚至可以进行自动化单元测试, 以查看定义的品目有没有问题, 原材料组合成的BOM有没有遗漏, 有没有使用旧的版本等等
    总结来说, 通过版本管理, 甚至自动化测试, ERP进一步减轻人工管理的负担, 专注于新物料的开发, 与产品开发能够同步.

另外,不知道有没有可能基于文件系统的分布式ERP

  1. 可以基于Git, 但又有更细致的针对不同目录的权限管理
  2. 可以使用Excel或者其他本地数据库进行存储
  3. 可以使用特定的后缀名或本地软件, 便捷的UI以方便普通员工操作

IFTTT

这个应该是最方便,然而在魅族手机上成功, 在华为手机上却失败了. 原因是IFTTT在华为手机上只会打开邮箱界面并填充邮件内容,并无法自动发送出去.

Tasker

Tasker比较灵活些, 可以接Java和Javascript的代码, 不过JS代码运行环境是内置的WebView, 并不是Node. 也能发送EMail. 然而在华为手机上遇到了同样的问题, 无法继续.

Termux

Termux搭配Termux:API可以读取系统短信,然而, 根据Termux最新的官方消息, 谷歌禁止这么做, 否则不让上架, 于是Termux取消了这个接口 ,以及一系列和发送SMS相关的接口https://wiki.termux.com/index.php?search=sms&go=Go

短信助手

在酷安上下载的这个APP(也叫短信转发)终于解决了问题. 它还可以转发为手机短信. SMTP信息在APP里面填写,这就不依赖外部应用了. 然而有个小问题是, 不能定义邮件标题为短信内容,或者转发短信内容和收件人.

#查看磁盘占用
df -h
# 查看当前目录磁盘占用
du -h --max-depth=1
# 查看不同文件磁盘占用(含隐藏文件)
ls -alh

# 清理nohup.out文件,保留前10000条
# 使用locate命令定位nohup.out
log=`tail -n 10000 nohup.out`; 
echo "$log" > nohup.out 

# 清理tomcat的catalina.out文件,保留前10000条
# catalina.out位于: /opt/apache-tomcat-8.5.3/logs
log=`tail -n 10000 catalina.out`; 
echo "$log" > catalina.out