stockgame.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <template>
  2. <view>
  3. <!-- 顶部导航 -->
  4. <fa-navbar :title="vuex_table_title || 'K线训练'"></fa-navbar>
  5. <view >
  6. <HQChartControl ref="HQChartCtrl" DefaultChart="{Type:'KLine'}" DefaultSymbol="000001.sz"> </HQChartControl>
  7. </view>
  8. <!-- 控制图1 !-->
  9. <view class="button-sp-area">
  10. <button class="mini-btn" type="default" size="mini" @click="ChangeMinutePeriod(1)">分时</button>
  11. <button class="mini-btn" type="default" size="mini" @click="ChangeMinutePeriod(5)">5日</button>
  12. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(0)">日K</button>
  13. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(1)">周K</button>
  14. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(4)">1K</button>
  15. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(5)">5K</button>
  16. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(6)">15K</button>
  17. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(7)">30K</button>
  18. <button class="mini-btn" type="default" size="mini" @click="ChangeKLinePeriod(8)">60K</button>
  19. <!-- <button class="mini-btn" type="default" size="mini" @click="ChangeSymbol('600999.sh')">招商证券</button>
  20. <button class="mini-btn" type="default" size="mini" @click="ChangeSymbol('000002.sz')">万科A</button> -->
  21. <button class="mini-btn" type="default" size="mini" @click="MoveNextKLine()">Next</button>
  22. <button class="mini-btn" type="default" size="mini" @click="Buy()">Buy</button>
  23. <button class="mini-btn" type="default" size="mini" @click="Sell()">Sell</button>
  24. </view>
  25. <view>
  26. {{tradeinfo}}
  27. </view>
  28. <!-- 底部导航 -->
  29. <fa-tabbar></fa-tabbar>
  30. </view>
  31. </template>
  32. <script>
  33. import HQChartControl from '@/uni_modules/jones-hqchart2/js_sdk/HQChartControl.vue'
  34. import JSHQData from "./hq.data.js"
  35. // #ifdef H5
  36. import HQChart from '@/uni_modules/jones-hqchart2/js_sdk/umychart.uniapp.h5.js'
  37. //HQChart.MARKET_SUFFIX_NAME.GetMarketStatus = (symbol) => { return 2; }
  38. HQChart.JSChart.GetMinuteTimeStringData().CreateSHSZData = () => {
  39. return JSHQData.HQData.CreateSHSZData(HQChart.JSChart.GetMinuteTimeStringData());
  40. } //替换交易时间段
  41. HQChart.JSChart.GetMinuteCoordinateData().GetSHSZData = (upperSymbol, width) => {
  42. return JSHQData.HQData.GetSHSZData(upperSymbol, width);
  43. } //替换X轴刻度信息
  44. // #endif
  45. // #ifndef H5
  46. import {
  47. JSCommon
  48. } from '@/uni_modules/jones-hqchart2/js_sdk/umychart.wechat.3.0.js'
  49. import {
  50. JSConsole
  51. } from '@/uni_modules/jones-hqchart2/js_sdk/umychart.console.wechat.js'
  52. import {
  53. JSCommonCoordinateData
  54. } from '@/uni_modules/jones-hqchart2/js_sdk/umychart.coordinatedata.wechat.js'
  55. JSCommonCoordinateData.MinuteTimeStringData.CreateSHSZData = () => {
  56. return JSHQData.HQData.CreateSHSZData(JSCommonCoordinateData.MinuteTimeStringData);
  57. }
  58. JSCommonCoordinateData.MinuteCoordinateData.GetSHSZData = (upperSymbol, width) => {
  59. return JSHQData.HQData.GetSHSZData(upperSymbol, width);
  60. }
  61. //JSCommon.MARKET_SUFFIX_NAME.GetMarketStatus = (symbol) => { return 2; }
  62. //禁用日志
  63. JSConsole.Complier.Log = () => {};
  64. JSConsole.Chart.Log = () => {};
  65. // #endif
  66. export default {
  67. components: {
  68. HQChartControl
  69. },
  70. data() {
  71. let data = {
  72. Symbol: '600000.sh',
  73. ChartWidth: 350,
  74. ChartHeight: 350,
  75. LatestKData: null,
  76. LatestTrade: null,
  77. AryTrade: [],
  78. OrderID: 10,
  79. tradeinfo: ''
  80. };
  81. return data;
  82. },
  83. onShow() {
  84. uni.getSystemInfo({
  85. success: (res) => {
  86. var width = res.windowWidth;
  87. var height = res.windowHeight;
  88. this.ChartWidth = width;
  89. this.ChartHeight = height - 170;
  90. this.$nextTick(() => {
  91. this.CreateHQChart();
  92. })
  93. }
  94. });
  95. },
  96. onHide() {
  97. this.ClearHQChart();
  98. },
  99. onUnload() {
  100. this.ClearHQChart();
  101. },
  102. methods: {
  103. CreateHQChart() {
  104. var chartHeight = this.ChartHeight;
  105. let hqchartCtrl = this.$refs.HQChartCtrl;
  106. hqchartCtrl.NetworkFilter = this.NetworkFilter; //绑定数据回调
  107. hqchartCtrl.KLine.Option.Type = 'K线训练';
  108. hqchartCtrl.KLine.IsShowMaxMinPrice=true;
  109. hqchartCtrl.KLine.Option.IsApiPeriod = true; //周期使用api数据
  110. hqchartCtrl.KLine.Option.IsClickShowCorssCursor = true;
  111. hqchartCtrl.KLine.Option.IsAutoUpdate = true; //自动更新
  112. hqchartCtrl.KLine.Option.AutoUpdateFrequency = 10000; //更新频率 ms
  113. hqchartCtrl.KLine.Option.KLineTitle = {
  114. IsShowName: false,
  115. IsShowSettingInfo: false,
  116. IsShowDateTime: true
  117. }; //标题设置
  118. hqchartCtrl.KLineTrain = {
  119. Font:'bold 14px arial',
  120. LastDataIcon: {Color:'rgb(0,0,205)',Text:'⬇'},
  121. BuyIcon: {Color:'rgb(0,205,102 )',Text:'B'},
  122. SellIcon: {Color:'rgb(255,127,36 )',Text:'S'},
  123. }
  124. hqchartCtrl.KLine.Option.Train = {
  125. DataCount: 200, //训练数据
  126. StartDate: {
  127. Date: 20180201
  128. }
  129. },
  130. hqchartCtrl.KLine.Option.ExtendChart = [{
  131. Name: 'KLineTooltip'
  132. }, {
  133. Name: '背景图',
  134. FrameID: 0
  135. }];
  136. hqchartCtrl.Minute.Option.IsAutoUpdate = true;
  137. hqchartCtrl.Minute.Option.AutoUpdateFrequency = 10000; //更新频率 ms
  138. hqchartCtrl.SetSize(this.ChartWidth, chartHeight);
  139. hqchartCtrl.OnSize();
  140. hqchartCtrl.CreateHQChart();
  141. hqchartCtrl.KLine.AddEventCallback({
  142. event: 4,
  143. callback: (event, data, obj) => {
  144. this.OnKLineMove(event, data, obj);
  145. }
  146. });
  147. },
  148. MoveNextKLine() {
  149. let hqchartCtrl = this.$refs.HQChartCtrl;
  150. hqchartCtrl.JSChartContainer.MoveNextKLineData();
  151. },
  152. Run() {
  153. let hqchartCtrl = this.$refs.HQChartCtrl;
  154. hqchartCtrl.JSChartContainer.Run();
  155. },
  156. Stop() {
  157. let hqchartCtrl = this.$refs.HQChartCtrl;
  158. hqchartCtrl.JSChartContainer.Stop();
  159. },
  160. OnKLineMove(event, data, obj) {
  161. console.log("[KLineChart::OnKLineMove] data", data);
  162. this.LatestKData = data.LastShowData;
  163. var dateTime = `日期:${this.LatestKData.Date}`;
  164. if (this.LatestKData.Time) dateTime = `日期:${this.LatestKData.Date} 时间:${this.LatestKData.Time}`;
  165. //更新界面显示信息
  166. var message =
  167. `状态:${data.Description} ${dateTime} 最新价格: ${this.LatestKData.Close.toFixed(2)} 剩余数据:${data.TrainDataCount}`;
  168. //$("#traininfo")[0].innerText = message;
  169. this.tradeinfo = message;
  170. if (data.TrainDataCount <= 0) this.LatestKData = null;
  171. },
  172. Sell() {
  173. if (!this.LatestKData) return;
  174. ++this.OrderID;
  175. //以最新价格卖出
  176. var data = {
  177. Price: this.LatestKData.Close,
  178. Vol: 10,
  179. Op: 1,
  180. ID: this.OrderID
  181. }; //{ Price:价格, Vol:数量, Op: 买/卖 0=buy 1=sell, ID:单号 }
  182. this.LatestTrade = data;
  183. var tradeItem = this.AryTrade[this.AryTrade.length - 1];
  184. tradeItem.Sell = {
  185. Price: data.Price,
  186. ID: data.ID,
  187. Date: this.LatestKData.Date,
  188. Time: this.LatestKData.Time
  189. };
  190. this.CalulateScore();
  191. let hqchartCtrl = this.$refs.HQChartCtrl;
  192. let chart=hqchartCtrl.GetJSChart();
  193. chart.JSChartContainer.BuyOrSell(data, false);
  194. chart.JSChartContainer.MoveNextKLineData();
  195. },
  196. MoveNextKLine() {
  197. let hqchartCtrl = this.$refs.HQChartCtrl;
  198. let chart=hqchartCtrl.GetJSChart();
  199. chart.JSChartContainer.MoveNextKLineData();
  200. },
  201. Buy() {
  202. if (!this.LatestKData) return;
  203. ++this.OrderID;
  204. //以最新价格买入
  205. var data = {
  206. Price: this.LatestKData.Close,
  207. Vol: 10,
  208. Op: 0,
  209. ID: this.OrderID
  210. }; //{ Price:价格, Vol:数量, Op: 买/卖 0=buy 1=sell, ID:单号 }
  211. this.LatestTrade = data;
  212. var tradeItem = {
  213. Buy: {
  214. Price: data.Price,
  215. ID: data.ID,
  216. Date: this.LatestKData.Date,
  217. Time: this.LatestKData.Time
  218. }
  219. };
  220. this.AryTrade.push(tradeItem);
  221. let hqchartCtrl = this.$refs.HQChartCtrl;
  222. let chart=hqchartCtrl.GetJSChart();
  223. chart.JSChartContainer.BuyOrSell(data, false);
  224. chart.JSChartContainer.MoveNextKLineData();
  225. this.CalulateScore();
  226. },
  227. CalulateScore() {
  228. var count = 0,
  229. success = 0;
  230. var aryBGData = []; //背景颜色
  231. for (var i in this.AryTrade) {
  232. var item = this.AryTrade[i];
  233. if (!item.Buy || !item.Sell) continue;
  234. var bgItem = {
  235. Start: {
  236. Date: item.Buy.Date,
  237. Time: item.Buy.Time
  238. },
  239. End: {
  240. Date: item.Sell.Date,
  241. Time: item.Sell.Time
  242. }
  243. };
  244. if (item.Buy.Price < item.Sell.Price) {
  245. ++success;
  246. bgItem.Color = 'rgba(250,128,114,0.5)';
  247. } else {
  248. bgItem.Color = 'rgba(152,251,152,0.5)';
  249. }
  250. aryBGData.push(bgItem);
  251. ++count;
  252. }
  253. var result = 0;
  254. if (count > 0) result = success / count;
  255. var message = `成绩:交易次数${count} 成功次数${success} 胜率:${result.toFixed(2)}`;
  256. //$("#traininfo2")[0].innerText = message;
  257. this.tradeinfo = message;
  258. var bgPaint = this.GetBGChartPaint();
  259. if (bgPaint) bgPaint.Data = aryBGData;
  260. },
  261. GetBGChartPaint() {
  262. let hqchartCtrl = this.$refs.HQChartCtrl;
  263. let chart=hqchartCtrl.GetJSChart();
  264. for (var i in chart.JSChartContainer.ExtendChartPaint) {
  265. var item = chart.JSChartContainer.ExtendChartPaint[i];
  266. if (item.ClassName == 'BackgroundPaint') return item;
  267. }
  268. return null;
  269. },
  270. RestartTrain() {
  271. this.AryTrade = [];
  272. this.LatestKData = null;
  273. this.LatestTrade = null;
  274. // $("#traininfo2")[0].innerText = '成绩:';
  275. // $("#traininfo")[0].innerText = '加载中......';
  276. // $("#buy").show();
  277. // $("#sell").hide();
  278. var bgPaint = this.GetBGChartPaint();
  279. if (bgPaint) bgPaint.Data = null;
  280. var option = {
  281. Symbol: "000001.sz",
  282. Train: {
  283. DataCount: 30,
  284. DateTime: {
  285. Date: 20190301
  286. }
  287. },
  288. Period: 0, //周期
  289. Right: 1, //复权
  290. }
  291. let hqchartCtrl = this.$refs.HQChartCtrl;
  292. hqchartCtrl.JSChartContainer.RestartTrain(option);
  293. },
  294. ClearHQChart() {
  295. let hqchartCtrl = this.$refs.HQChartCtrl;
  296. if (hqchartCtrl) hqchartCtrl.ClearChart();
  297. },
  298. ChangeMinutePeriod(days) {
  299. let hqchartCtrl = this.$refs.HQChartCtrl;
  300. hqchartCtrl.ChangeMinutePeriod(days);
  301. },
  302. ChangeKLinePeriod(period) {
  303. let hqchartCtrl = this.$refs.HQChartCtrl;
  304. hqchartCtrl.ChangeKLinePeriod(period);
  305. },
  306. ChangeSymbol(symbol) {
  307. let hqchartCtrl = this.$refs.HQChartCtrl;
  308. hqchartCtrl.ChangeSymbol(symbol);
  309. },
  310. NetworkFilter(data, callback) {
  311. console.log(`[App:NetworkFilter] Name=${data.Name} Explain=${data.Explain}`);
  312. JSHQData.HQData.NetworkFilter(data, callback);
  313. },
  314. }
  315. }
  316. </script>
  317. <style lang="scss">
  318. page {
  319. background-color: #f4f6f8;
  320. }
  321. </style>