数学建模社区-数学中国
标题:
多品种海龟交易源码
[打印本页]
作者:
littleDream
时间:
2017-3-23 18:05
标题:
多品种海龟交易源码
本帖最后由 littleDream 于 2017-3-23 18:11 编辑
( P- ]6 _# a9 D0 Q3 U7 x
0 }" ?% {& m8 S- X4 @: f" Y
### 实现一个多品种并发的商品期货策略(8)
7 C1 x# ^* h6 `% }% R& ]2 g
9 t) O( ^+ ?$ S3 P [; m0 q
> 当一把造物主,做个程序员真好!实现 《商品期货多品种海龟策略》机器人
4 l, S2 T% ~. {) o* b
- E) I' Z4 e% n* F' U4 h& v9 ?
- #### 海龟交易法起源
/ r" \- J2 X1 ~ k% o% h7 A ?
& h) W2 T# p3 O7 r5 v, M
这个交易系统的诞生来源与两个交易老手的争论,一方觉得交易这种技能是后天习得的,另一方觉得这是先天所决定的。1983年,在新加坡海龟农场,两位神一样的交易员Dennis、Eckhardt有了分歧。E神说,交易员是天生的;D神说,就像这一大缸海龟一样,交易员可以培养。
# p) F* g- u$ o/ m5 i$ p
' L# H! A* g H8 U: {
于是,D神掏出来白花花的银子,要做实验,要打赌。他们在华尔街日报、纽约时报等等放出广告,说D神要搞培训班了,给每个人100万美元的账户,手把手地教,不限专业,无须经验,皆可报名。有千余人投了简历,40人进入面试,23人被留下考察,13人进入培训班。
, P) `9 }6 Z. _: x5 @- }. Y; l
1 }: n9 I" a3 {
这13个人来自各行各业,多数都没有交易经验,是一群尚未成功的普通人。他们被培训了两个星期,然后放出去交易,在接下来的四年半里,创出了80%的年均收益率。培训内容,叫做《海龟交易法则》;培训学员,被称为“海龟”。
4 m" S) C9 Y U! @6 o3 p! D
! E" Z; v m) x3 p2 n9 |+ `% ]( T
尽管有人质疑样本的随机性,这场试验应该算D神胜利了。
' K# U* ~& _9 L
& k! a! N/ r, }' Y5 s- o; N
- #### 海龟交易系统是一个完整的交易系统,它有一个完整的交易系统所应该有的所有成分,涵盖了成功交易中的每一个必要决策:
8 v8 m5 j5 h0 G7 u4 g7 B" o
+ D% K8 t3 l0 c2 ]$ v! n! e4 ]
市场:买卖什么?
) I% Y/ t$ [. o0 Q; g
头寸规模:买卖多少? Unit=(1%∗Account)/N
, h9 `# m0 R) k
入市:什么时候买卖?
1 o8 L- V* @7 Q
止损:什么时候放弃一个亏损的头寸?
) C0 L" C% ]8 U
退出:什么时候退出一个盈利的头寸?
* n+ T) O. l% y7 D. }% A
战术:怎么买卖?
' t' `( ] o6 E# _
核心围绕: N值,海龟的止损、加仓、头寸规模 都是基于N值计算, 有些海龟交易系统用的是ATR来代替N值,ATR为真实波幅的20日平均。
' v+ X) K6 w8 a6 M, x
“海龟们从不去预测市场的动向,而是会寻找市场处于某种特定状态的指示信号。优秀的交易者不会试着预测市场下一步会怎么样;相反,他们会观察指示信号,判断市场现在正处于什么样的状态中。”
9 o" F# H) T! b% y7 R- t: O) h: P! F
! \8 i+ @& A/ G; @) F
对于 “海龟交易法”感到陌生的读者可以看这篇文章:
6 J/ h" V$ ?% f$ g
也可以 知乎 或者 百度 搜索,有很多文章介绍,老白就不做赘述了。
; s+ c) j S0 L* M4 b8 r9 ^$ P
+ v1 W V8 j) w4 R0 A- Z/ G+ Q
- #### 作为 本系列文章的最后收尾一篇,我们就来动手实践一个海龟策略,当然我们要有创新,我们实现一个“海龟群”。
! D" x# A% _$ ?' k) A& L$ O! d% Q3 [5 D
7 ?3 f( B4 D% }% f. B
说点题外的,之前的几篇文章记录的都是老白当时学习时的心路历程,学习量化、程序化没办法一蹴而就,只能脚踏实地,耐住性子一点点进步。老白开始的时候也感觉思考问题、找BUG 、写程序晕头转向的。但是,慢慢的我发现学习是个加速度,开始很慢,积累越多越轻松。一个完全零基础的朋友经常和我说:“越是感觉自己要放弃的时候,越是应该跟困难死磕的时候!”
' }9 G& S3 [8 U. R, p9 o
9 @8 D- }# m6 y4 `7 h+ G
言归正传, 为什么我们要使用海龟群呢?
8 t9 D5 K$ S9 _/ E
当然是为了尽可能的分散风险,即使是大名鼎鼎的海龟策略,当年也曾经有过大幅回撤,甚至亏损本金。任何交易系统都是有一定风险的。多品种的好处就是“把鸡蛋放在不同的篮子里”。当然也有缺点,那就是需要不小的资金量。资金量小了,可能只能交易几个品种,降低了分散风险的能力。
) _$ V6 Y: x: O* L( N$ `/ M1 M$ } X _
还有一点需要牢记:任何时候都可能飞出一只黑天鹅! (如商品期货 16年底黑色星期五 全线暴跌。)
: x; b( t1 A' ^
6 s V- D! x: }, e; }5 b! `
注释版源代码:
. ]* S! F" `* ^- E
```
0 n. A. `3 I, [) ?8 K; _+ `
/*
& V8 c7 r- @% ^6 Q5 K+ c9 f
参数:
% s1 [' w8 a# _4 `8 a
Instruments 合约列表 字符串(string) MA701,CF701,zn1701,SR701,pp1701,l1701,hc1610,ni1701,i1701,v1701,rb1610,jm1701,ag1612,al1701,jd1701,cs1701,p1701
& } q8 u/ S+ D( G
LoopInterval 轮询周期(秒) 数字型(number) 3
3 i' M& S- J" W: {
RiskRatio % Risk Per N ( 0 - 100) 数字型(number) 1
. x- I: f8 u A4 f5 \" }
ATRLength ATR计算周期 数字型(number) 20
" M. v7 D3 e7 B
EnterPeriodA 系统一入市周期 数字型(number) 20
/ g; ^. O6 _% D' }; m u% o. d4 c
LeavePeriodA 系统一离市周期 数字型(number) 10
4 P* y5 q* d+ b: C4 c
EnterPeriodB 系统二入市周期 数字型(number) 55
; l$ o: Y; n$ T% T# M) C n+ o
LeavePeriodB 系统二离市周期 数字型(number) 20
! r. L3 ?. b) Z! B
UseEnterFilter 使用入市过滤 布尔型(true/false) true
9 D' C C& J' j1 \
IncSpace 加仓间隔(N的倍数) 数字型(number) 0.5
' ?% g$ m2 B2 B" L% [# x
StopLossRatio 止损系数(N的倍数) 数字型(number) 2
% s+ {: }' R9 g6 |- `1 H/ @
MaxLots 单品种加仓次数 数字型(number) 4
" u& u5 o2 b# ]+ `2 I8 P& @% h, }
RMode 进度恢复模式 下拉框(selected) 自动|手动
E& o0 D. N) N( Y
VMStatus@RMode==1 手动恢复字符串 字符串(string) {}
+ N% w0 w0 J) k2 q9 Y
WXPush 推送交易信息 布尔型(true/false) true
# ]+ v! g9 c( [& z: }: Z- H+ J+ x& _
MaxTaskRetry 开仓最多重试次数 数字型(number) 5
& m; r6 K0 g# w4 M
KeepRatio 预留保证金比例 数字型(number) 10
/ n6 I$ T! [9 B) g1 n+ _+ m2 Z) f
*/
. ]5 m& x: a! } R0 B
- ~3 S9 h( ~ k. N9 H& Z
var _bot = $.NewPositionManager(); // 调用CTP商品期货交易类库 的导出函数 生成一个用于单个品种交易的对象
( p2 T: o! q& h! U4 L( \& I' N
8 o0 ~/ l8 F. d6 Z- h% c7 [
var TTManager = { // 海龟策略 控制器
, t, }, D9 o* z2 \" z
New: function(needRestore, symbol, keepBalance, riskRatio, atrLen, enterPeriodA, leavePeriodA, enterPeriodB, leavePeriodB, useFilter,
2 D+ ^/ C0 s: w: E3 {' S
multiplierN, multiplierS, maxLots) {
) K ?- i' c, `% x/ l2 K
// 该控制器对象 TTManager 的属性 New 赋值一个 匿名函数(构造海龟的函数,即:构造函数),用于创建 海龟任务,参数分别是:
/ ?; D1 A' [4 k0 T2 R) {8 O2 W
// needRestore: 是否需要恢复,symbol:合约代码,keepBalance:必要的预留的资金,riskRatio:风险系数, atrLen:ATR指标(参数)周期。enterPeriodA:入市周期A
0 L, z: D# v/ I% T) U
// leavePeriodA:离市周期A , enterPeriodB:入市周期B, leavePeriodB:离市周期B,useFilter:使用过滤,multiplierN:加仓系数,multiplierS:止损系数,maxLots:最大加仓次数
; N1 h+ R2 v* g! y' J* B
4 Q) ]( G! u* a% P/ w
// subscribe
! S6 c) ~# _& K
var symbolDetail = _C(exchange.SetContractType, symbol);
; |4 F1 e* x. l- }* }* A
// 声明一个局部变量 symbolDetail 用于接受API SetContractType 函数的返回值(值为symbol的合约的详细信息,symbol 是 "MA709",返回的就是甲醇709合约的详细信息),
3 a; a8 F4 H& ^
// 调用API SetContractType 订阅并切换合约为 symbol 变量值的合约。 _C() 函数的作用是 对 SetContractType 合约容错处理,即如果 SetContractType返回null 会循环重试。
; o% b/ I: o! R& a. i! O
if (symbolDetail.VolumeMultiple == 0 || symbolDetail.MaxLimitOrderVolume == 0 || symbolDetail.MinLimitOrderVolume == 0 || symbolDetail.LongMarginRatio == 0 || symbolDetail.ShortMarginRatio == 0) {
. f' b( H- P& Q5 w+ S
// 如果 返回的合约信息对象symbolDetail 中 VolumeMultiple、MaxLimitOrderVolume 等数据异常,则调用 throw 抛出错误,终止程序。
4 e( Z; D @% }+ }7 R3 ]/ G
Log(symbolDetail);
2 U6 q7 u( L) W" s! {
throw "合约信息异常";
9 F& [2 y- g2 B, v
} else { // 检索的数据没有异常则,输出部分合约信息。
4 f; _5 V: q5 g M
Log("合约", symbolDetail.InstrumentName, "一手", symbolDetail.VolumeMultiple, "份, 最大下单量", symbolDetail.MaxLimitOrderVolume, "保证金率:", _N(symbolDetail.LongMarginRatio), _N(symbolDetail.ShortMarginRatio), "交割日期", symbolDetail.StartDelivDate);
+ K$ w. m: V3 {9 C1 O1 ?
}
9 m& D. j2 l# S2 J, B
; \8 S7 P0 z+ o
var ACT_IDLE = 0; // 定义一些宏 (标记)
6 E' _0 l" w! ]4 A: M
var ACT_LONG = 1;
A3 y* F- P3 j
var ACT_SHORT = 2;
?( w* v' z7 g5 `- K
var ACT_COVER = 3; // 动作宏
$ m0 N' ?4 l: h7 R* B4 j. D
8 S$ q) {: T3 W& A% R7 R) y# Q( d
8 b0 x. ^6 G+ q$ t1 ? J! W
var ERR_SUCCESS = 0; // 错误宏
8 K1 X* j/ E) W r8 p
var ERR_SET_SYMBOL = 1;
' d) Z1 ]7 ^4 r6 o w) [0 R
var ERR_GET_ORDERS = 2;
" t' j: R& ~" l
var ERR_GET_POS = 3;
4 R- T1 V9 j. A& z& x% m3 `
var ERR_TRADE = 4;
/ g# E L& t& n2 b; Q- Q
var ERR_GET_DEPTH = 5;
2 |- V, s: J* z3 s- ^4 m Y
var ERR_NOT_TRADING = 6;
# g) J0 U: m* v: ^0 s
var errMsg = ["成功", "切换合约失败", "获取订单失败", "获取持仓失败", "交易下单失败", "获取深度失败", "不在交易时间"]; // 错误宏的值 对应该数组的索引,对应索引的值就是翻译
& k3 l# e: H' a9 x* n3 V
# i8 ~9 C% W% }0 F7 {1 P7 }3 u
var obj = { // 声明一个对象,构造完成后返回。单个的海龟策略控制对象。
9 @1 |; y/ F0 f
symbol: symbol, // 合约代码 构造函数执行时的参数传入
) \ w0 C/ @- u3 q
keepBalance: keepBalance, // 预留的资金 构造函数执行时的参数传入
; E2 i/ g' c; s8 F- h1 E9 g2 z
riskRatio: riskRatio, // 风险系数 构造函数执行时的参数传入
4 x- Y7 v- X8 p# ~& e4 f7 u7 v; Q& B5 `9 X
atrLen: atrLen, // ATR 长度 构造函数执行时的参数传入
, j; P: I+ l5 T5 s
enterPeriodA: enterPeriodA, // 入市周期A 构造函数执行时的参数传入
, U9 s/ f" d$ q D \) L3 H# ^
leavePeriodA: leavePeriodA, // 离市周期A 构造函数执行时的参数传入
* ]% U6 ?0 N* ]! t0 o; y+ T
enterPeriodB: enterPeriodB, // 入市周期B 构造函数执行时的参数传入
# T$ n2 ]/ i( A5 M4 L( ^. ^( C
leavePeriodB: leavePeriodB, // 离市周期B 构造函数执行时的参数传入
- M( }, J0 N" b+ v0 a: Y' S9 \
useFilter: useFilter, // 使用入市过滤条件 构造函数执行时的参数传入
, w. p1 O8 n! ~1 Z. @: T" |
multiplierN: multiplierN, // 加仓系数 基于N 构造函数执行时的参数传入
4 u7 A5 L5 H _
multiplierS: multiplierS // 止损系数 基于N 构造函数执行时的参数传入
" P, A8 f& w# c p3 e
};
2 y" T0 z/ p1 K3 x6 h' l2 |" E8 }
代码太长,限制发不了,喜欢的可以看原文 :
1 ?+ k1 H2 N9 B/ L/ ?) w" z
1 J9 H( P: }0 x
6 ^; O) r' r5 |% \3 p
- S9 j8 s I0 B+ b: B- L2 s% V
作者:
lshqcable605
时间:
2017-4-11 10:20
好还好好还好好好好好
( ^2 v" L- `& @) f8 T
作者:
lshqcable605
时间:
2017-4-11 10:20
9999999999999999999999
, d3 J3 |! G. q. g5 P0 c
作者:
lshqcable605
时间:
2017-4-11 10:20
好好还好好还好好好好好好好好好
; b8 e1 @& k6 x5 K4 N
作者:
lshqcable605
时间:
2017-4-11 10:20
和哈哈哈哈哈哈哈哈哈哈哈哈
& G% Q- }- s0 t- z9 Y6 U8 ]3 J7 F
作者:
lshqcable605
时间:
2017-4-11 10:21
99999999999999999999999999999
* |- G; }" U# E- k
作者:
lshqcable605
时间:
2017-4-11 10:21
9999999999999998888888888888888888888
4 y, o; o( S8 [2 M+ D
作者:
lshqcable605
时间:
2017-4-11 10:21
666666666666666666666666666
5 a+ r E8 J- p2 O
作者:
lshqcable605
时间:
2017-4-11 10:21
好好好好好好好好好好好好好好好好或或
& h( c1 V* D. Q4 o6 k* G
作者:
lshqcable605
时间:
2017-4-11 10:21
999999999999999999999999999999999999999999999
* T( j% M- L+ B! O! g R
作者:
lshqcable605
时间:
2017-4-11 10:22
哈哈哈哈哈哈哈哈哈
& [/ K5 t; ^# x5 a$ q8 M2 f: C
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5