-
Notifications
You must be signed in to change notification settings - Fork 0
/
Sim.cs
200 lines (179 loc) · 10.5 KB
/
Sim.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace BTCSIM
{
public class Sim
{
public Sim()
{
}
public SimAccount sim_ga(int from, int to, Gene2 chromo, SimAccount ac)
{
var nn = new NN();
var strategy = new Strategy();
int amount = 1;
var nn_input_data_generator = new NNInputDataGenerator();
for (int i = from; i < to - 1; i++)
{
var nn_inputs = nn_input_data_generator.generateNNInputData(ac, i);
var nn_outputs = nn.calcNN(nn_inputs, chromo, 0);
var pred = nn.getActivatedUnit(nn_outputs);
var actions = strategy.GAStrategy(pred, amount, ac);
for (int j = 0; j < actions.action.Count; j++)
{
if (actions.action[j] == "entry")
ac.entry_order(actions.order_type[j], actions.order_side[j], actions.order_size[j], actions.order_price[j], i, MarketData.Dt[i].ToString(), actions.order_message[j]);
}
ac.move_to_next(i + 1, MarketData.Dt[i + 1].ToString(), MarketData.Open[i + 1], MarketData.High[i + 1], MarketData.Low[i + 1], MarketData.Close[i + 1]);
}
ac.last_day(to, MarketData.Close[to]);
ac.calc_sharp_ratio();
return ac;
}
public SimAccount sim_ga_limit(int from, int to, int max_amount, Gene2 chromo, SimAccount ac)
{
var nn = new NN();
var strategy = new Strategy();
int amount = 1;
var nn_input_data_generator = new NNInputDataGenerator();
for (int i = from; i < to - 1; i++)
{
var nn_inputs = nn_input_data_generator.generateNNInputDataLimit(ac, i, chromo.num_index);
var nn_outputs = nn.calcNN(nn_inputs, chromo, 0);
var pred = nn.getActivatedUnit(nn_outputs);
var actions = strategy.GALimitStrategy2(i, pred, amount, max_amount, ac);
//check invalid ac situation
if (ac.order_data.order_side.Count > 1)
Console.WriteLine("Sim: # of order is more than 1 !");
for (int j = 0; j < actions.action.Count; j++)
{
if (actions.action[j] == "entry")
ac.entry_order(actions.order_type[j], actions.order_side[j], actions.order_size[j], actions.order_price[j], i, MarketData.Dt[i].ToString(), actions.order_message[j]);
else if (actions.action[j] == "cancel")
ac.cancel_all_order(i, MarketData.Dt[i].ToString());
else if (actions.action[j] == "update amount")
ac.update_order_amount(actions.order_size[j], actions.order_serial_num[j], i, MarketData.Dt[i].ToString());
else if (actions.action[j] == "update price")
ac.update_order_price(actions.order_price[j], actions.order_serial_num[j], i, MarketData.Dt[i].ToString());
else
Console.WriteLine("Sim: Unknown strategy action !");
}
ac.move_to_next(i + 1, MarketData.Dt[i + 1].ToString(), MarketData.Open[i + 1], MarketData.High[i + 1], MarketData.Low[i + 1], MarketData.Close[i + 1]);
}
ac.last_day(to, MarketData.Close[to]);
ac.calc_sharp_ratio();
return ac;
}
public SimAccount sim_ga_market_limit(int from, int to, int max_amount, Gene2 chromo, SimAccount ac, double nn_threshold, bool stop_no_trade)
{
var nn = new NN();
var strategy = new Strategy();
int amount = 1;
var nn_input_data_generator = new NNInputDataGenerator();
var zero_trade_check_point = 0.1; //to - fromの間のx%進捗した時にnum trade=0だったらsimを打ち切る。
for (int i = from; i < to - 1; i++)
{
//check num trade=0 discontinue sim
if (stop_no_trade && i - from > ((to - from) * zero_trade_check_point) && ac.performance_data.num_trade == 0)
{
//Console.WriteLine("Stopped sim due to zero trade.");
break;
}
var nn_inputs = nn_input_data_generator.generateNNInputDataLimit(ac, i, chromo.num_index);
var nn_outputs = nn.calcNN(nn_inputs, chromo, 0);
//var pred = nn.getActivatedUnitLimitMarket(nn_outputs, nn_threshold);
var pred = nn.getActivatedUnitLimitMarket2(nn_outputs, nn_threshold);
var actions = strategy.GALimitMarketStrategy(i, pred, amount, max_amount, ac);
//check invalid ac situation
if (ac.order_data.order_side.Count > 1)
Console.WriteLine("Sim: # of order is more than 1 !");
for (int j = 0; j < actions.action.Count; j++)
{
if (actions.action[j] == "entry")
ac.entry_order(actions.order_type[j], actions.order_side[j], actions.order_size[j], actions.order_price[j], i, MarketData.Dt[i].ToString(), actions.order_message[j]);
else if (actions.action[j] == "cancel")
ac.cancel_all_order(i, MarketData.Dt[i].ToString());
else if (actions.action[j] == "update amount")
ac.update_order_amount(actions.order_size[j], actions.order_serial_num[j], i, MarketData.Dt[i].ToString());
else if (actions.action[j] == "update price")
ac.update_order_price(actions.order_price[j], actions.order_serial_num[j], i, MarketData.Dt[i].ToString());
else
Console.WriteLine("Sim: Unknown strategy action !");
}
ac.move_to_next(i + 1, MarketData.Dt[i + 1].ToString(), MarketData.Open[i + 1], MarketData.High[i + 1], MarketData.Low[i + 1], MarketData.Close[i + 1]);
}
ac.last_day(to, MarketData.Close[to]);
ac.calc_sharp_ratio();
return ac;
}
public SimAccount sim_win_ga_market(int from, int to, Gene2 chromo, SimAccount ac, double nn_threshold)
{
var nn = new NN();
var strategy = new Strategy();
var nn_input_data_generator = new NNInputDataGenerator();
for (int i = from; i < to - 1; i++)
{
var nn_inputs = nn_input_data_generator.generateNNWinGA(i, chromo.num_index);
var nn_outputs = nn.calcNN(nn_inputs, chromo, 0);
var pred = nn.getActivatedUnitOnlyBuySell(nn_outputs, nn_threshold);
var actions = strategy.GAWinMarketStrategy(i, pred, ac);
for (int j = 0; j < actions.action.Count; j++)
{
if (actions.action[j] == "entry")
ac.entry_order(actions.order_type[j], actions.order_side[j], actions.order_size[j], actions.order_price[j], i, MarketData.Dt[i].ToString(), actions.order_message[j]);
}
ac.move_to_next(i + 1, MarketData.Dt[i + 1].ToString(), MarketData.Open[i + 1], MarketData.High[i + 1], MarketData.Low[i + 1], MarketData.Close[i + 1]);
}
ac.last_day(to, MarketData.Close[to]);
ac.calc_sharp_ratio();
return ac;
}
/*
*
*/
public SimAccount sim_entry_timing_ptlc(int from, int to, SimAccount ac, string side, double max_leverage, int entry_interval_miniute, int entry_num, double pt_ratio, double lc_ratio)
{
if (side == "buy" || side == "sell")
{
var strategy = new Strategy();
for (int i = from; i < to - 1; i++)
{
var max_size = max_leverage * ac.performance_data.total_capital / MarketData.Close[i]; //常にレバ2倍になるようにサイズを決める
var actions = strategy.entryTimingPTLCStrategy(i, max_size, ac, side, entry_num, entry_interval_miniute, pt_ratio, lc_ratio);
for (int j = 0; j < actions.action.Count; j++)
{
if (actions.action[j] == "entry")
ac.entry_order(actions.order_type[j], actions.order_side[j], actions.order_size[j], actions.order_price[j], i, MarketData.Dt[i].ToString(), actions.order_message[j]);
}
ac.move_to_next(i + 1, MarketData.Dt[i + 1].ToString(), MarketData.Open[i + 1], MarketData.High[i + 1], MarketData.Low[i + 1], MarketData.Close[i + 1]);
}
ac.last_day(to, MarketData.Close[to]);
ac.calc_sharp_ratio();
}
else
Console.WriteLine("Invalid side! " + side);
return ac;
}
//エントリータイミングをx分にy%以上変動した時などに予め限定してエントリーする戦略
public SimAccount sim_entry_timing_ptlc_price_change(int from, int to, SimAccount ac, double max_leverage, int entry_interval_miniute, int entry_num, double pt_ratio, double lc_ratio, int buy_price_change_minutes, double buy_price_change_ratio, int sell_price_change_minutes, double sell_price_change_ratio)
{
var strategy = new Strategy();
for (int i = from; i < to - 1; i++)
{
var max_size = max_leverage * ac.performance_data.total_capital / MarketData.Close[i]; //常にレバ2倍になるようにサイズを決める
var actions = strategy.entryTimingPTLCPriceChangeStrategy(i, max_size, ac, entry_num, entry_interval_miniute, pt_ratio, lc_ratio, buy_price_change_minutes, buy_price_change_ratio, sell_price_change_minutes, sell_price_change_ratio);
for (int j = 0; j < actions.action.Count; j++)
{
if (actions.action[j] == "entry")
ac.entry_order(actions.order_type[j], actions.order_side[j], actions.order_size[j], actions.order_price[j], i, MarketData.Dt[i].ToString(), actions.order_message[j]);
}
ac.move_to_next(i + 1, MarketData.Dt[i + 1].ToString(), MarketData.Open[i + 1], MarketData.High[i + 1], MarketData.Low[i + 1], MarketData.Close[i + 1]);
}
ac.last_day(to, MarketData.Close[to]);
ac.calc_sharp_ratio();
return ac;
}
}
}