|
| 1 | +import numpy as np |
| 2 | + |
| 3 | +def LAG(field, period): |
| 4 | + nMarkets = np.shape(field)[1] |
| 5 | + out = np.append(np.zeros((period,nMarkets))*np.nan, field[:-period,:],axis=0) |
| 6 | + return out |
| 7 | + |
| 8 | +def ATR(HIGH, LOW, CLOSE, period): |
| 9 | + |
| 10 | + tr = TR(HIGH,LOW,CLOSE) |
| 11 | + out = np.mean(tr[-period:,:],axis=0) |
| 12 | + return out |
| 13 | + |
| 14 | +def TR(HIGH, LOW, CLOSE): |
| 15 | + CLOSELAG = LAG(CLOSE,1) |
| 16 | + range1 = HIGH - LOW |
| 17 | + range2 = np.abs(HIGH-CLOSELAG) |
| 18 | + range3 = np.abs(LOW -CLOSELAG) |
| 19 | + out = np.fmax(np.fmax(range1,range2),range3) |
| 20 | + return out |
| 21 | + |
| 22 | +def myTradingSystem(DATE, OPEN, HIGH, LOW, CLOSE, settings, exposure): |
| 23 | + if 'long' not in settings: |
| 24 | + settings['long']=0 |
| 25 | + settings['short']=0 |
| 26 | + |
| 27 | + nMarkets = len(settings['markets']) |
| 28 | + p = np.zeros(nMarkets) |
| 29 | + |
| 30 | + holding = 4 |
| 31 | + |
| 32 | + if settings['short'] != 0: |
| 33 | + settings['short'] = (settings['short'] % holding) +1 |
| 34 | + p[0],p[1] = 0,-1 |
| 35 | + if settings['short'] == 0 or settings['short']==4: |
| 36 | + p[0],p[1] = 1,0 |
| 37 | + settings['short'] = 0 |
| 38 | + |
| 39 | + if settings['long'] != 0: |
| 40 | + settings['long'] = (settings['long'] % holding) +1 |
| 41 | + p[0],p[1] = 0,1 |
| 42 | + if settings['long'] == 0 or settings['long']==4: |
| 43 | + p[0],p[1] = 1,0 |
| 44 | + settings['long'] = 0 |
| 45 | + |
| 46 | + |
| 47 | + closeRange = np.ptp(CLOSE[-4:,1]) |
| 48 | + atr9 = ATR(HIGH, LOW, CLOSE, 9) |
| 49 | + atr1 = ATR(HIGH, LOW, CLOSE, 1) |
| 50 | + |
| 51 | + LongRule1 = atr9[1] < atr1[1] |
| 52 | + LongRule2 = CLOSE[-1,1] <= min(CLOSE[-9:,1]) |
| 53 | + LongRule3 = CLOSE[-1,2] > CLOSE[-9,2] |
| 54 | + |
| 55 | + ShortRule1 = atr9[1]< atr1[1] |
| 56 | + ShortRule2 = CLOSE[-1,1] >= max(CLOSE[-9:,1]) |
| 57 | + ShortRule3 = CLOSE[-1,2] < CLOSE[-9,2] |
| 58 | + |
| 59 | + if LongRule1 and LongRule2 and LongRule3: |
| 60 | + p[0], p[1] = 0, 1 |
| 61 | + settings['long'] = (settings['long'] % holding) +1 |
| 62 | + settings['short'] = 0 |
| 63 | + |
| 64 | + if ShortRule1 and ShortRule2 and ShortRule3: |
| 65 | + p[0], p[1] = 0, -1 |
| 66 | + settings['short'] = (settings['short'] % holding) +1 |
| 67 | + settings['long'] = 0 |
| 68 | + return p, settings |
| 69 | + |
| 70 | + |
| 71 | +def mySettings(): |
| 72 | + settings = {} |
| 73 | + |
| 74 | + settings['markets'] = ['CASH', 'F_AD', 'F_AE', 'F_AH', 'F_AX', 'F_BC', 'F_BG', 'F_BO', 'F_BP', 'F_C', 'F_CA', |
| 75 | + 'F_CC', 'F_CD', 'F_CF', 'F_CL', 'F_CT', 'F_DL', 'F_DM', 'F_DT', 'F_DX', 'F_DZ', 'F_EB', |
| 76 | + 'F_EC', 'F_ED', 'F_ES', 'F_F', 'F_FB', 'F_FC', 'F_FL', 'F_FM', 'F_FP', 'F_FV', 'F_FY', |
| 77 | + 'F_GC', 'F_GD', 'F_GS', 'F_GX', 'F_HG', 'F_HO', 'F_HP', 'F_JY', 'F_KC', 'F_LB', 'F_LC', |
| 78 | + 'F_LN', 'F_LQ', 'F_LR', 'F_LU', 'F_LX', 'F_MD', 'F_MP', 'F_ND', 'F_NG', 'F_NQ', 'F_NR', |
| 79 | + 'F_NY', 'F_O', 'F_OJ', 'F_PA', 'F_PL', 'F_PQ', 'F_RB', 'F_RF', 'F_RP', 'F_RR', 'F_RU', |
| 80 | + 'F_RY', 'F_S', 'F_SB', 'F_SF', 'F_SH', 'F_SI', 'F_SM', 'F_SS', 'F_SX', 'F_TR', 'F_TU', |
| 81 | + 'F_TY', 'F_UB', 'F_US', 'F_UZ', 'F_VF', 'F_VT', 'F_VW', 'F_VX', 'F_W', 'F_XX', 'F_YM', |
| 82 | + 'F_ZQ'] |
| 83 | + |
| 84 | + settings['slippage'] = 0.0 |
| 85 | + settings['budget'] = 1000000 |
| 86 | + settings['beginInSample'] = '20040101' |
| 87 | + settings['endInSample'] = '20200101' |
| 88 | + settings['lookback'] = 504 |
| 89 | + |
| 90 | + return settings |
| 91 | + |
| 92 | +if __name__=='__main__': |
| 93 | + import quantiacsToolbox |
| 94 | + results = quantiacsToolbox.runts(__file__) |
0 commit comments