schema.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. """
  2. 数据库表结构定义
  3. 定义所有表的基本结构和关系
  4. 根据BRD文档定义的表结构:
  5. 1. future_info - 期货标的基础信息表
  6. 2. transaction_records - 交易记录表,记录每一笔开仓平仓的具体数据
  7. 3. trade_records - 交易汇总表,对一组开仓平仓交易的汇总记录
  8. 4. monitor_records - 监控标的信息表
  9. 5. 维度相关表:
  10. - strategy_info - 交易策略表
  11. - candle_info - K线形态表
  12. - trend_info - 走势类型基本信息表
  13. - dim_time_range - 走势类型的时间范围
  14. - dim_amplitude - 走势类型的幅度范围
  15. - dim_position - 走势类型的位置范围
  16. - dim_speed_type - 走势类型的速度范围
  17. - dim_trend_type - 走势类型的趋势范围
  18. 6. future_daily - 每日期货数据更新表
  19. 7. roll_trade_records - 期货换月交易记录表
  20. """
  21. from app.database.db_manager import db
  22. from sqlalchemy import MetaData, text
  23. import os
  24. import pandas as pd
  25. # 定义元数据,用于创建表
  26. metadata = MetaData()
  27. def create_schemas(app):
  28. """
  29. 创建数据库表结构
  30. Args:
  31. app: Flask应用实例
  32. """
  33. with app.app_context():
  34. # 导入所有模型以确保它们被注册到元数据中
  35. import app.models.future_info
  36. import app.models.transaction
  37. import app.models.trade
  38. import app.models.monitor
  39. import app.models.dimension
  40. import app.models.system
  41. # 创建所有表
  42. db.create_all()
  43. # 初始化维度数据(如果需要)
  44. _initialize_dimension_data()
  45. # 初始化系统配置数据(如果需要)
  46. _initialize_system_config()
  47. # 添加表和列的注释
  48. _add_comments()
  49. def _add_comments():
  50. """
  51. 添加表和列的详细注释
  52. 基于BRD文档中的描述
  53. """
  54. # 这里添加注释逻辑,SQLite不支持注释,所以这里只是作为文档记录
  55. # 如果之后切换到支持注释的数据库(如MySQL或PostgreSQL),可以实现这部分逻辑
  56. # 例如在PostgreSQL中:
  57. # db.session.execute(text("COMMENT ON TABLE future_info IS '期货标的基础信息表';"))
  58. # db.session.execute(text("COMMENT ON COLUMN future_info.contract_letter IS '合约字母:1位或者2位的英文字母,这是唯一的';"))
  59. pass
  60. def _initialize_dimension_data():
  61. """
  62. 初始化维度数据
  63. 创建基本的维度数据,如时间范围、幅度范围、位置范围等
  64. BRD文档中描述的维度数据:
  65. 1. dim_time_range - 短期、中期、长期
  66. 2. dim_amplitude - 小幅、中幅、大幅
  67. 3. dim_position - 低位、中位、高位
  68. 4. dim_speed_type - 急速、连续、震荡
  69. 5. dim_trend_type - 上涨、下跌、震荡
  70. """
  71. from app.models.dimension import (
  72. DimTimeRange, DimAmplitude, DimPosition,
  73. DimSpeedType, DimTrendType, StrategyInfo, CandleInfo
  74. )
  75. # 如果表中没有数据,添加初始数据
  76. if db.session.query(DimTimeRange).count() == 0:
  77. time_ranges = [
  78. DimTimeRange(name="短期"),
  79. DimTimeRange(name="中期"),
  80. DimTimeRange(name="长期")
  81. ]
  82. db.session.add_all(time_ranges)
  83. if db.session.query(DimAmplitude).count() == 0:
  84. amplitudes = [
  85. DimAmplitude(name="小幅"),
  86. DimAmplitude(name="中幅"),
  87. DimAmplitude(name="大幅")
  88. ]
  89. db.session.add_all(amplitudes)
  90. if db.session.query(DimPosition).count() == 0:
  91. positions = [
  92. DimPosition(name="低位"),
  93. DimPosition(name="中位"),
  94. DimPosition(name="高位")
  95. ]
  96. db.session.add_all(positions)
  97. if db.session.query(DimSpeedType).count() == 0:
  98. speed_types = [
  99. DimSpeedType(name="急速"),
  100. DimSpeedType(name="连续"),
  101. DimSpeedType(name="震荡")
  102. ]
  103. db.session.add_all(speed_types)
  104. if db.session.query(DimTrendType).count() == 0:
  105. trend_types = [
  106. DimTrendType(name="上涨"),
  107. DimTrendType(name="下跌"),
  108. DimTrendType(name="震荡")
  109. ]
  110. db.session.add_all(trend_types)
  111. # 添加基础策略数据
  112. if db.session.query(StrategyInfo).count() == 0:
  113. strategies = [
  114. StrategyInfo(name="趋势假突破", open_close_type=0, strategy_type=2),
  115. StrategyInfo(name="趋势真突破", open_close_type=0, strategy_type=2),
  116. StrategyInfo(name="趋势真跌破", open_close_type=0, strategy_type=2),
  117. StrategyInfo(name="趋势假跌破", open_close_type=0, strategy_type=2),
  118. StrategyInfo(name="压力位真突破", open_close_type=0, strategy_type=0),
  119. StrategyInfo(name="压力位假突破", open_close_type=0, strategy_type=0),
  120. StrategyInfo(name="支撑位真跌破", open_close_type=0, strategy_type=1),
  121. StrategyInfo(name="支撑位假跌破", open_close_type=0, strategy_type=1),
  122. StrategyInfo(name="换月", open_close_type=1, strategy_type=3),
  123. StrategyInfo(name="涨破5K", open_close_type=1, strategy_type=3),
  124. StrategyInfo(name="涨破10K", open_close_type=1, strategy_type=3),
  125. StrategyInfo(name="涨破20K", open_close_type=1, strategy_type=3),
  126. StrategyInfo(name="涨破30K", open_close_type=1, strategy_type=3),
  127. StrategyInfo(name="跌破5K", open_close_type=1, strategy_type=3),
  128. StrategyInfo(name="跌破10K", open_close_type=1, strategy_type=3),
  129. StrategyInfo(name="跌破20K", open_close_type=1, strategy_type=3),
  130. StrategyInfo(name="跌破30K", open_close_type=1, strategy_type=3),
  131. StrategyInfo(name="盘中比例止损", open_close_type=1, strategy_type=3),
  132. StrategyInfo(name="涨破支撑位", open_close_type=1, strategy_type=3),
  133. StrategyInfo(name="跌破支撑位", open_close_type=1, strategy_type=3),
  134. StrategyInfo(name="涨破压力位", open_close_type=1, strategy_type=3),
  135. StrategyInfo(name="跌破压力位", open_close_type=1, strategy_type=3),
  136. StrategyInfo(name="跌破手画压力位", open_close_type=1, strategy_type=3),
  137. StrategyInfo(name="换月不继续", open_close_type=1, strategy_type=3),
  138. StrategyInfo(name="比例止损", open_close_type=1, strategy_type=3),
  139. ]
  140. db.session.add_all(strategies)
  141. # 添加基础K线形态数据
  142. if db.session.query(CandleInfo).count() == 0:
  143. # 从CSV文件加载K线形态数据
  144. csv_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'config', 'candle_info.csv')
  145. if os.path.exists(csv_path):
  146. df = pd.read_csv(csv_path)
  147. candle_patterns = []
  148. for _, row in df.iterrows():
  149. if pd.notna(row['name']): # 只添加name不为空的记录
  150. candle_patterns.append(CandleInfo(
  151. id=row['id'],
  152. name=row['name']
  153. ))
  154. if candle_patterns:
  155. db.session.add_all(candle_patterns)
  156. else:
  157. # 如果CSV文件不存在,使用默认数据
  158. candle_patterns = [
  159. CandleInfo(name="连续阳线"),
  160. CandleInfo(name="连续阴线"),
  161. CandleInfo(name="长阳破位"),
  162. CandleInfo(name="长阴破位"),
  163. CandleInfo(name="上下影线"),
  164. CandleInfo(name="十字星")
  165. ]
  166. db.session.add_all(candle_patterns)
  167. # 提交事务
  168. db.session.commit()
  169. def register_models():
  170. """
  171. 注册所有模型
  172. 确保所有模型都已导入并注册到SQLAlchemy
  173. """
  174. import app.models.future_info
  175. import app.models.transaction
  176. import app.models.trade
  177. import app.models.monitor
  178. import app.models.dimension
  179. def _initialize_system_config():
  180. """
  181. 初始化系统配置数据
  182. 从CSV文件中读取配置参数并插入到数据库中
  183. 如果system_config表中已有数据,则跳过初始化
  184. """
  185. from app.models.system import SystemConfig
  186. import csv
  187. import os
  188. # 如果表中已有数据,跳过初始化
  189. if db.session.query(SystemConfig).count() > 0:
  190. print("system_config表已有数据,跳过初始化")
  191. return
  192. # 配置CSV文件路径
  193. csv_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'data', 'config_parameters.csv')
  194. if not os.path.exists(csv_path):
  195. print(f"配置文件不存在: {csv_path}")
  196. return
  197. try:
  198. print("开始初始化系统配置数据...")
  199. configs = []
  200. with open(csv_path, 'r', encoding='utf-8') as f:
  201. reader = csv.DictReader(f)
  202. for row_num, row in enumerate(reader, start=2): # 从第2行开始(第1行是表头)
  203. try:
  204. # 验证必要字段
  205. parameter_name = row.get('参数名称', '').strip()
  206. if not parameter_name:
  207. print(f"第{row_num}行:参数名称为空,跳过")
  208. continue
  209. current_value = row.get('当前值', '').strip()
  210. parameter_type = row.get('参数类型', 'string').strip()
  211. category = row.get('所属分类', '').strip()
  212. # 创建配置对象
  213. config = SystemConfig(
  214. parameter_name=parameter_name,
  215. current_value=current_value,
  216. parameter_type=parameter_type,
  217. category=category,
  218. code_location=row.get('代码位置', '').strip(),
  219. description=row.get('参数说明', '').strip(),
  220. hot_update_support=row.get('热更新支持', '热更新').strip(),
  221. edit_permission=row.get('修改权限', '管理员').strip(),
  222. importance_level=row.get('重要程度', '中').strip(),
  223. notes=row.get('备注', '').strip(),
  224. is_active=True
  225. )
  226. configs.append(config)
  227. except Exception as e:
  228. print(f"解析第{row_num}行配置数据时出错: {e}")
  229. continue
  230. # 批量插入数据库
  231. if configs:
  232. db.session.add_all(configs)
  233. db.session.commit()
  234. print(f"成功初始化 {len(configs)} 条系统配置数据")
  235. else:
  236. print("没有有效的配置数据可插入")
  237. except Exception as e:
  238. print(f"初始化系统配置数据时出错: {e}")
  239. db.session.rollback()
  240. """
  241. BRD文档中表结构详细描述:
  242. future_info表:
  243. - id: 序号,主键
  244. - contract_letter: 合约字母,1位或者2位的英文字母,唯一标识
  245. - name: 名称,可能是中文(还可能包含数字),也可能是英文
  246. - market: 市场,分为国内(0)和国外(1)
  247. - exchange: 交易所,3-5位的英文字母
  248. - contract_multiplier: 合约乘数,数字
  249. - long_margin_rate: 做多保证金率(按金额),数字
  250. - short_margin_rate: 做空保证金率(按金额),数字
  251. - open_fee: 开仓费用(按手),数字
  252. - close_fee: 平仓费用(按手),数字
  253. - close_today_rate: 平今费率(按金额),数字
  254. - close_today_fee: 平今费用(按手),数字
  255. - th_main_contract: 同花主力合约,字母加上4位数字如PG2503
  256. - current_main_contract: 当前主力合约,同"同花主力合约"
  257. - th_order: 同花顺顺序,数字
  258. - long_term_trend: 长期趋势
  259. transaction_records表:
  260. - id: 自动生成,主键
  261. - trade_id: 记录从属于哪个交易,对应"trade_records"里的id
  262. - transaction_time: 成交时间,年月日小时分
  263. - contract_code: 合约代码,格式和"同花主力合约"一致
  264. - name: 名称,和"名称"一致
  265. - account: 账户,中文,记录期货账户,默认为"华安期货"
  266. - strategy_ids: 操作策略ID,对应"strategy_info"里的序号
  267. - strategy_name: 操作策略,对应"strategy_info"里的名称
  268. - position_type: 多空仓位,0代表开多,1代表平多,2代表开空,3代表平空
  269. - candle_pattern_id: K线形态ID,对应"candle_info"的id
  270. - candle_pattern: K线形态,类似"连续上跳+长阳突破"这样的数据
  271. - price: 成交价格,1位小数
  272. - volume: 成交手数,实数
  273. - contract_multiplier: 合约乘数,对应"future_info"的合约乘数
  274. - transaction_amount: 成交金额,等于成交价格*成交手数*合约乘数
  275. - fee: 手续费,根据开平仓类型计算
  276. - volume_change: 手数变化,开仓为正,平仓为负
  277. - cash_flow: 现金流,根据开平仓类型计算
  278. - margin: 保证金,根据开平仓类型和合约规则计算
  279. - trade_type: 交易类别,0代表模拟交易,1代表真实交易
  280. - status: 交易状态,0代表进行,1代表暂停,2代表暂停进行,3代表结束
  281. - latest_price: 最新价格,1位小数
  282. - actual_yield_rate: 实际收益率,百分比2位小数
  283. - actual_yield: 实际收益,1位小数
  284. - stop_loss_price: 止损价格,1位小数
  285. - stop_loss_ratio: 止损比例,1位小数
  286. - stop_loss_yield: 止损收益,1位小数
  287. - operation_time: 操作时间,默认为成交时间
  288. - confidence: 信心指数,0-2
  289. - similarity: 相似度评估
  290. - long_term_trend_ids: 长期趋势id,"trend_info"id的list
  291. - long_term_trend_name: 长期趋势name,多个name合并
  292. - mid_term_trend_ids: 中期趋势id,"trend_info"id的list
  293. - mid_term_trend_name: 中期趋势name,多个name合并
  294. trade_records表:
  295. - id: 自动生成
  296. - roll_trade_main_id: 换月交易主id,可选
  297. - contract_code: 合约代码,格式和"同花主力合约"一致
  298. - name: 名称,格式和"transaction_records"的"名称"一致
  299. - account: 账户,格式和"transaction_records"的"账户"一致
  300. - strategy_ids: 操作策略ID,对应"strategy_info"里的序号
  301. - strategy_name: 操作策略,对应"strategy_info"里的名称
  302. - position_type: 多空仓位,0代表多头仓位,1代表空头仓位
  303. - candle_pattern_id: K线形态ID
  304. - candle_pattern: K线形态
  305. - open_time: 开仓时间
  306. - close_time: 平仓时间
  307. - volume: 持仓手数
  308. - contract_multiplier: 合约乘数
  309. - cost_price: 过往持仓成本
  310. - avg_sell_price: 平均售价
  311. - single_profit: 单笔收益
  312. - investment_profit: 投资收益
  313. - investment_yield: 投资收益率
  314. - hold_days: 持仓天数
  315. - annual_yield: 投资年化收益率
  316. - trade_type: 交易类别,0代表模拟交易,1代表真实交易
  317. - confidence: 信心指数,0-2
  318. - similarity: 相似度评估
  319. - long_term_trend_ids: 长期趋势ids
  320. - long_term_trend_name: 长期趋势name
  321. - mid_term_trend_ids: 中期趋势ids
  322. - mid_term_trend_name: 中期趋势name
  323. monitor_records表:
  324. - id: 序号,相当于ID
  325. - contract: 合约,类似"future_info"的"同花主力合约"
  326. - name: 名称
  327. - market: 市场,分为国内和国外
  328. - opportunity: 机会
  329. - key_price: 关键价格,1位小数
  330. - long_price: 开多价格,1位小数
  331. - short_price: 开空价格,1位小数
  332. - status: 状态,0代表有效,1代表失效,等
  333. - latest_price: 最新价格
  334. - long_trigger_price: 开多触发价格,1位小数
  335. - short_trigger_price: 开空触发价格,1位小数
  336. - long_margin: 开多一手保证金,1位小数
  337. - short_margin: 开空一手保证金,1位小数
  338. - candle_pattern_id: K线形态ID
  339. - candle_pattern: K线形态
  340. - long_term_trend_ids: 长期趋势id
  341. - long_term_trend_name: 长期趋势name
  342. - mid_term_trend_ids: 中期趋势id
  343. - mid_term_trend_name: 中期趋势name
  344. - similarity: 相似度评估
  345. - possible_trigger_price: 可能触发价格
  346. - ratio_ref_price: 比例对照价格,0代表最新价格,1代表关键价格
  347. - ratio: 相应比例
  348. 工具类表格:
  349. 1. roll_trade_records - 专门记录期货的换月交易记录
  350. 2. strategy_info - 记录交易策略
  351. 3. candle_info - 记录K线形态
  352. 4. trend_info - 走势类型的基本信息
  353. 5. dim_time_range - 走势类型的时间范围
  354. 6. dim_amplitude - 走势类型的幅度范围
  355. 7. dim_position - 走势类型的位置范围
  356. 8. dim_speed_type - 走势类型的速度范围
  357. 9. dim_trend_type - 走势类型的趋势类型
  358. """