数学建模社区-数学中国

标题: 多品种海龟交易源码 [打印本页]

作者: 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 o9 @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 BEnterPeriodA            系统一入市周期             数字型(number)      20
/ g; ^. O6 _% D' }; m  u% o. d4 cLeavePeriodA            系统一离市周期             数字型(number)      104 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)   true9 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( YVMStatus@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& Zvar _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:入市周期A0 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( d8 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 x6 ^; 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