金字塔决策交易系统

用户名  找回密码
 

微信登录

微信扫一扫,快速登录

帖子
查看: 2838|回复: 9

随机开仓和持仓管理 python 测试项目

[复制链接]

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
发表于 2025-2-3 09:08 | 显示全部楼层 |阅读模式
本帖最后由 技术006 于 2025-2-3 09:51 编辑

[Python] 复制代码
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!随机开仓模块!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#!/usr/local/bin/python
# -*- coding:utf-8 -*-
##########################################################################################################################################
#import logging     #python 原生内置记录调试输出模块
#print(logging)
#from logging.handlers import RotatingFileHandler
#print( RotatingFileHandler)
#########################################################################################################################################
# 设置打印日志的级别,level级别以上的日志会打印出
# level=logging.DEBUG 、INFO 、WARNING、ERROR、CRITICAL
#     format参数中可能用到的格式化串
#     %(name)s Logger的名字
#     %(levelno)s 数字形式的日志级别
#     %(levelname)s 文本形式的日志级别
#     %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
#     %(filename)s 调用日志输出函数的模块的文件名
#     %(module)s 调用日志输出函数的模块名
#     %(funcName)s 调用日志输出函数的函数名
#     %(lineno)d 调用日志输出函数的语句所在的代码行
#     %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
#     %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
#     %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
#     %(thread)d 线程ID。可能没有
#     %(threadName)s 线程名。可能没有
#     %(process)d 进程ID。可能没有
#     %(message)s用户输出的消息
#######################################################################################################################################
#def logging_fun():
#    # 创建日志的记录等级设
#    logging.basicConfig(level=logging.DEBUG)
#    # 创建日志记录器,指明日志保存的路径,每个日志文件的最大值,保存的日志文件个数上限
#    log_handle = RotatingFileHandler("C://py_ZhangSu_KaiCang_log.txt", maxBytes=1024 * 1024, backupCount=5)
#    # 创建日志记录的格式
#    formatter = logging.Formatter("format = '%(asctime)s - %(filename)s - %(module)s - %(funcName)s - [line:%(lineno)d] - %(levelname)s - %(thread)d - %(threadName)s - %(process)d - %(message)s',")
#    # 为创建的日志记录器设置日志记录格式
#    log_handle.setFormatter(formatter)
#    # 为全局的日志工具对象添加日志记录器
#    logging.getLogger().addHandler(log_handle)
#    logging.warning('用来用来打印警告信息')
#    logging.error('一般用来打印一些错误信息')
#    logging.critical('用来打印一些致命的错误信息,等级最高')
#    pass
#logging_fun()
##########################################################################################################################################
#import unittest        #python 原生内置测试test模块
#print(unittest)
import datetime     #python 原生内置日期模块
print(datetime)
import random        #python 原生内置随机模块
print(random)  
import time        #python 原生内置时间模块
print(time)
#import gc        #python原生内存清理模块
#print(gc)
#import threading    #python原生等待  不支持
#print(threading)
#event = threading.Event()
#event.wait(SleepS)
SleepS = int(datetime.datetime.now().strftime('%S'))
SleepMin = 0.1 #int(datetime.datetime.now().strftime('%f')[:-3])/1000
#设定启动等待时间 秒
#for i in range(SleepS):
#    time.sleep(SleepMin) #time.sleep(SleepS)        #python 原生内置暂停
#event.wait(SleepS)
#if int(datetime.datetime.now().strftime('%S')) == int(SleepS):
print('启动中!等待账户登录后:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])+"/"+str(SleepS)+'秒 启动')
pass
##########################################################################################################################################  
#去掉金字塔 PythonApi  已经强制载入!!!!!!!!!!!!!!!!!!
#from PythonApi import *
#import PythonApi  
#print(PythonApi)
########################去掉的模块########################################################################################################
print('import 环境模块加载完成:######################################'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#  参数定义区,这里定义的参数可以直接在context对象中获取。--(选择实现)
def parameter():
    #input_par('ZongFengXian',1,0,1,0.01)        #设置总风险度持仓比例
    #input_par('DingShiQiS',10,1,60,1)         #定时器设置 秒
    print('def parameter 模块加载完成:###############################'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass
#  在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
    #DingShiQiMs = context.DingShiQiS * 1000    #定时器设置转换毫秒
    #settimer(handle_bar_1,DingShiQiMs)    #handle_bar 定时执行
    #settimer(handle_bar_2,DingShiQiMs)    #handle_bar 定时执行
    #print(settimer)
    #print('####################设置交易模式: 0:自定义品种.1:自选股品种,2:持仓品种=:'+str(context.KC_1_CC_2)+'#################')
    print('def init 模块加载完成####################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
    print('def before_trading 模块加载完成###########################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
def after_trading(context):  
    print('def after_trading 模块加载完成############################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass 
# order_status当委托下单,成交,撤单等与下单有关的动作时,该方法就会被调用。---(选择实现)
def order_status(context,order):
    #print('def order_status_1 模块加载完成#########################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    Orders = get_orders (order_book_id="all", type=1, account="") #合约代码,或者为"all"全部合约,必填项 0:只取未成交订单 1:取全部订单,必须填指定具体的交易帐号,若不指定帐号,则取默认登录帐号
    #print(Orders)
    #print('全部订单列表:'+str(order.order_book_id))
    #判断柜台回报信息,是否为全部成交。
    if order.status=='submitted':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/submitted"已报单未成交'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    if order.status=='tradeing"已成交':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/tradeing"已成交'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass     
    if order.status=='filled':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/filled"全部成交'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='cancelled':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/cancelled"已撤单'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='inactive':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/inactive"无效单'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='connected':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/connected"已连接'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='disconnected':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/disconnected"连接断开'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        return
    #print('def order_status模块计算完成###########################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass #未完成
# order_action当查询交易接口信息时返回的通知---(选择实现)
#注意:该事件函数仅在融资融券、新股申购操作刷新动作时才会触发,一般账户无效。
#def order_action(context,type, account, datas)
    pass
#########################################################################################################################################
#
#
#
#########################################################################################################################################
# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    #print('def handle_bar_1 模块加载完成>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    #获取最近一个订单状态。
    id_list=get_orders(order_book_id="all", type=1, account="")
    if not(id_list == None):
        id_last=get_orders_id (id_list[-1].order_id)
    #如果最近一次订单状态为未成交,则进行撤单操作。
        if  id_last.status =='submitted':
            cancel_order (id_last.order_id)
            pass
    #gc.collect()
    #print(str(gc.get_threshold())+'清理内存')
############################################################################## 在context中保存全局变量###################################
    Test = 0    #检查模式 0 关闭 1开启
    TimeCha = 0    #默认时间差 = 0
    ZongFengXianDu = 1 #context.ZongFengXian         #总账户风险度%
    ZongYingKuiLv = 0.1            #总盈亏率%
    ZongHuiCheBiLi = 0.01        #总账户回撤%
    ZongChengBenBi = 10        #成本比设置
    pass
    HuiLuo = 0.02        #品种回落%
    ZhangDieFu = 0.02        #品种涨跌幅%
    ZhenFu = 0.015            #品种振幅%
    YingKuiLv = 0.001         #品种盈亏率%
    FengXianDu = 0.09        #品种风险度%
    pass  
    BuyFengXianDu = 0            #品种风险度置零
    SellFengXianDu = 0        #品种风险度置零
    BuyAvgHoldingPrice = 0    #开仓持仓成本置零
    SellAvgHoldingPrice = 0    #开空持仓成本置零
    pass
    BuyVol = 1           #设置默认每次下单量
    SellVol = 1           #设置默认每次下单量  
    BuyMaxVol = 1     #设置默认买最大持仓量
    SellMaxVol = 1    #设置默认卖最大持仓量
    FangXiang = 0     #设置默认运行模式方向 = 0: 趋势 = 1,震荡 = 2,风控 = 0
    pass
    lastbuy = 0    #开多挂单置零
    lastbuyping = 0    #平多挂单置零
    lastsell = 0    #开空挂单置零
    lastsellping = 0   #平空挂单置零
    pass
    NewAmount = 255        #设置账户断开
    OrdAmount = 255        #设置账户断开
    KeYongAmount = 255    #设置账户断开
###############################################################################登录账户###################################################
    GetAccountBook = len(get_account_book())    #账户列表
    #print('账户列表:'+str(GetAccountBook))
    AccountBook = (isaccount())        #登录账户
    #print('登录账户:'+str(AccountBook))
    pass
    if 1 == 0 or  GetAccountBook != 1:
        SleepS = int(datetime.datetime.now().strftime('%S'))
        #SleepMin = int(datetime.datetime.now().strftime('%f')[:-3])/1000
        #for i in range(SleepS):
        #    time.sleep(SleepMin)
        #event.wait(SleepS)
        #if int(datetime.datetime.now().strftime('%S')) == int(SleepS):
        print('账户列表:'+str(GetAccountBook)+'登录账户:'+str(AccountBook)+'系统错误!账户断开!交易中断!等待'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])+'/'+str(SleepS)+'秒启动')
        return
##############################################################################时间判断####################################################
    else:  
        if 1!=0:
            DianNaoTime = datetime.datetime.now()  ##获得当前时间->这是时间数组格式
            DianNaoTime = int(DianNaoTime.strftime("%H%M%S"))    #转换为指定的格式:
            OpenTime0900_2300 = (90000 <= DianNaoTime <= 101500) or (103000 <= DianNaoTime <= 113000) \
            or (133000 <= DianNaoTime <= 150000) or (210000 <= DianNaoTime <= 230000#交易时间0900-2300
            OpenTime2300_0100 = (230000 <= DianNaoTime <= 240000) or (0 <= DianNaoTime <= 10000)   #交易时间2300-0100
            OpenTime0100_0230 = (10000 <= DianNaoTime <= 23000)    #交易时间0100-0230
            pass
            OpenTimeQuJian = 100 * 5    #设定开盘区间             
            OpenTime2100 = 210000 <= DianNaoTime <= (210000 + OpenTimeQuJian)  #开盘1
            OpenTime0900 = 90000 <= DianNaoTime <= (90000 + OpenTimeQuJian)  #开盘2-1
            OpenTime1030 = 103000 <= DianNaoTime <= (103000 + OpenTimeQuJian)  #开盘2-2
            OpenTime1330 = 133000 <= DianNaoTime <= (133000 + OpenTimeQuJian)  #开盘2-3
            pass
            CloseTimeQuJian = 100 * 9    #设定收盘区间
            CloseTime2300 = (225959 - CloseTimeQuJian) <= DianNaoTime <= 230000  #收盘1-1
            CloseTime0100 = (5959 - CloseTimeQuJian) <= DianNaoTime <= 10000  #收盘1-2
            CloseTime0230 = (22959 - CloseTimeQuJian) <= DianNaoTime <= 23000  #收盘1-3
            CloseTime1015 = (101459 - CloseTimeQuJian) <= DianNaoTime <= 101500  #收盘2-1
            CloseTime1130 = (112959 - CloseTimeQuJian) <= DianNaoTime <= 113000  #收盘2-2
            CloseTime1500 = (145959 - CloseTimeQuJian) <= DianNaoTime <= 150000  #收盘3
#######################################################################################品种列表###########################################
            RunInfoBaseBookId = context.run_info.base_book_id        #基准合约代码run_info.base_book_id  合约池连续代码 order_book_id
            #print('基准合约代码:'+str(RunInfoBaseBookId))
            BaseGetInblocks = get_inblocks(RunInfoBaseBookId)        #获取指定品种的所属板块
            #print('获取指定品种的所属板块:'+str(BaseGetInblocks))
            pass
            Universe = context.universe        #基准合约代码run_info.base_book_id  合约池连续代码 order_book_id
            ##print('合约池连续代码:'+str(Universe))
            #UniverseGetInblocks=get_inblocks(Universe)        #获取指定品种的所属板块
            ##print('获取指定品种的所属板块:'+str(UniverseGetInblocks))       
            pass
            if 1!=0:#BaseGetInblocks == ['自选:自选股', '系统—指数:连续合约板块']: #'自选股:上海', '系统—指数:连续合约板块':
                #GetBlocks2300_0100 = get_blocks ('自选股',1) #['SQAG00','SQAU00','INSC0000']         #夜盘1:00收盘品种
                #GetBlocks2300_0230 = ['SQAG00','SQAU00','INSC0000']         #夜盘2:30收盘品种
                #GetBlocks0900_2300 = get_blocks ('自选股',1)                                     #日盘交易收盘品种                                
                #print(GetBlocks0)    #自设定池 控制策略交易时间是全部时间最长的品种
                #GetBlocks1 = get_blocks ('自选股',1)    #自选池 1分类板块           #0市场分类 1分类板块 2系统板块 
                #print(GetBlocks1)
                #GetBlocks2 = get_portfolio_book(2,"")  
                #持仓品种   #投资组合持仓品种 指定查询类型,必填项, 期货 0投机 1保值 ; 股票 0普通 1融资 ; 期权 0非备兑 1备兑; 2全部类型, 该参数对回测无效
                #print(GetBlocks2)
                OpenCloseTime = CloseTime2300 == 1 or CloseTime0100 == 1 or  CloseTime0230 == 1 or CloseTime1015 == 1 \
                or CloseTime1130 == 1 or CloseTime1500 == 1 or OpenTime2100 == 1 or OpenTime0900 == 1 or  OpenTime1030 == 1 \
                or OpenTime1330 == 1     #测试
                if OpenCloseTime == 1:
                    GetBlocks = get_portfolio_book(2,"")       #开盘后5分钟和收盘前5分钟 只管理持仓交易!!!!不开新仓!!!!!。
                    random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                    BanKuai='KaiCang_10分钟结算持仓'
                else:
                    if OpenTime0900_2300 ==1:                      
                        GetBlocks = get_blocks ('主力合约板块',1) #context.universe #get_blocks ('自选股',1)    #切换参数设置自动交易模式
                        random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                        BanKuai='KaiCang_0900_2300自选股'
                    else:
                        if OpenTime2300_0100 ==1:
                            GetBlocks = ['SQSS00','SQZN00','SQSN00','SQCU00','SQPB00','SQNI00','SQAL00','SQAG00','SQAU00','INSC0000']
                            random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                            BanKuai='KaiCang_2300_0100自设股'                          
                        else:
                            if OpenTime0100_0230 ==1:
                                GetBlocks = ['SQAG00','SQAU00','INSC0000']     #自定义 黄金 白银 原油
                                random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                                BanKuai='KaiCang_0100_0230自定义'
                            else:
                                GetBlocks = get_portfolio_book(2,"")     #非交易时间检查持仓
                                random.shuffle(GetBlocks)        #随机打乱列表 更随机性                               
                                BanKuai='KaiCang_收市检查'
                                Test = 1                                                           
                #print(GetBlocks)
                #random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                #print(GetBlocks)
                MaxNum = len(GetBlocks)     #总数量
                if  MaxNum == 0:
                    print(str(BanKuai)+str(MaxNum))
                    return
                    #print(str(GetBlocks))
                Num = random.randrange(0,MaxNum,1) # random.randint(1,10)/randrange 随机取列表每次列表一个进行交易
                FengXianDu = round(ZongFengXianDu / MaxNum,6)     #动态风险度=总风险度/最大列表数量
                ##print(str(BanKuai)+'取合约列表:'+str(Num))
                for index in range(len(GetBlocks)):        #随机循环合约池
                    s = GetBlocks[Num]
                    #print(s)
                s1 = get_dynainf(s,210)   #品种主力合约代码
                Name = get_dynainf(s1,219)    #名称
            else:
                print('获取指定品种的所属板块:'+str(BaseGetInblocks))
                print('合约池没有正常设置!自选股必须是连续合约,合约池导入自选股列表,基准合约为空')
                return  
        #print('合约品种列表完成########################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))        
########################################################准备账户刷新#####################################################################
    if get_account(6) <= 255 or get_account(26) <= 255 or get_account(19) <= 255:
        SleepS = int(datetime.datetime.now().strftime('%S'))        
        #SleepMin = int(datetime.datetime.now().strftime('%f')[:-3])/1000
        #for i in range(SleepS):
        #    time.sleep(SleepMin)
        #event.wait(SleepS)
        #if int(datetime.datetime.now().strftime('%S')) == int(SleepS):
        print('账户异常!未登录!退出交易!''等待'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])\
            +'/'+str(SleepS)+'秒启动')           
        return
###############################################################################################行情刷新####################################
    else:
        NewZuoShouJia = round(get_dynainf(s1,3),6)    #获取最新昨收价
        NewOpenJia = round(get_dynainf(s1,4),6)    #获取最新今开价
        NewHighJia = round(get_dynainf(s1,5),6)    #获取最新最高价
        NewLowJia = round(get_dynainf(s1,6),6)    #获取最新最低价
        NewJia = round(get_dynainf(s1,7),6)    #获取最新成交价
        NewJunJia = round(get_dynainf(s1,11),6)    #获取最新均价
        NewZhenFu = round(get_dynainf(s1,13),6)    #获取最新振幅
        NewZhangDieFu = round(get_dynainf(s1,14),6)    #获取最新涨跌幅
        #NewWeiBi = round(get_dynainf(s1,15),6)        #委比
        #NewWeiCha = round(get_dynainf(s1,16),6)        #委差 
        NewBuyJia = round(get_dynainf(s1,20),6)    #委买价
        NewSellJia = round(get_dynainf(s1,21),6)    #委卖价
        NewZhangSu = round(get_dynainf(s1,24),6)        #涨跌速
        NewBuyOneVol = round(get_dynainf(s1,25),6)        #25    买一量
        #print('买一量'+str(NewBuyOneVol))
        NewSellOneVol = round(get_dynainf(s1,31),6)    #31    卖一量
        #print('卖一量'+str(NewSellOneVol))
        #NewJunLiang = round(get_dynainf(s1,38),6)    #获取最新日均量
        NewChiCangLiang = round(get_dynainf(s1,45),6)    #获取45 最新持仓量
        NewZhangTing = round(get_dynainf(s1,54),6)    #获取最新涨停价
        NewDieTing = round(get_dynainf(s1,55),6)    #获取最新跌停价
        NewQianChiCangLiang = round(get_dynainf(s1,60),6)    #获取60 昨持仓量
        NewJinJieSuan = round(get_dynainf(s1,61),6)    #获取最新结算价
        NewQianJieSuan = round(get_dynainf(s1,62),6)    #获取昨日结算价
        #NewUp = round(get_dynainf(s1,204),6)        #上升劲道
        #NewDn = round(get_dynainf(s1,205),6)        #下降劲道
###############################################################################################账户刷新###################################
        #print('handle_bar_Stop'+str(datetime.datetime.now()))
        NewAmountFuDongYingKui = round(get_account(4),0)    #当前交易帐户中的浮动盈亏
        NewAmount = round(get_account(6),0)    #当前交易帐户中的动态权益/资产值
        KeYongAmount = round(get_account(19),0)    #当前可用资金
        OrdAmount = round(get_account(26),0)    #上次结算准备金/期初余额
        BaoZhengJinAmount = round(get_account(28),0)    #28    占用保证金/证券市值
        NewAmountPingCangYingKui = round(get_account(30),0)    #平仓盈亏数额/回报卖出金额/融券盈亏
        NewAmountShouXuFei = round(get_account(31),0)    #当前交易帐户中的手续费
        ZongYinKuiAmount = round((NewAmountFuDongYingKui + NewAmountPingCangYingKui - NewAmountShouXuFei),0)    #账户总盈亏
        if ZongYinKuiAmount==0 or BaoZhengJinAmount==0 or NewAmount==0:
            AmountZongYingKuiLV = 0    #总盈亏率
            AmountZongFengXianDu = 0        #总风险度
        else:              
            AmountZongYingKuiLV = round(ZongYinKuiAmount / BaoZhengJinAmount,6)    #总盈亏率
            if AmountZongYingKuiLV == 0:
                AmountZongFengXianDu = 0
            else:       
                AmountZongFengXianDu = round(BaoZhengJinAmount / NewAmount,6)        #总风险度
                pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/动态权益:'+str(NewAmount)+'/期初余额:'+str(OrdAmount)\
            +'/可用资金:'+str(KeYongAmount)+'/手续费:'+str(NewAmountShouXuFei)+'/平仓盈亏:'+str(NewAmountPingCangYingKui)+'/浮动盈亏:'\
            +str(NewAmountFuDongYingKui)+'/总盈亏率:'+str(AmountZongYingKuiLV)+'/总风险度:'+str(AmountZongFengXianDu))
        pass
        portfolio = get_portfolio (s1, 2)     #账户持仓状态
        pass       
        BuyQuantity = round(portfolio.buy_quantity,4)        #开多持仓量
        BuyMargin = round(portfolio.buy_margin,4)            #开多占用保证金
        BuyAvgHoldingPrice = round(portfolio.buy_avg_holding_price,4)    #开多持仓均价(非结算持仓均价!!!)
        BuyPnl = round(portfolio.pnl,4)                        #开多浮动盈亏
        pass
        SellQuantity = round(portfolio.sell_quantity,4)        #开空持仓量
        SellMargin = round(portfolio.sell_margin,4)        #开空占用保证金
        SellAvgHoldingPrice = round(portfolio.sell_avg_holding_price,4)    #开空持仓均价(非结算持仓均价!!!)
        SellPnl = round(portfolio.pnl,4)                    #开空浮动盈亏
        pass
        if BuyPnl == SellPnl and BuyPnl+SellPnl !=0:    #持仓总盈亏
            ZongPnl=round((BuyPnl+SellPnl)/2,4)
        else:
            ZongPnl=0  
        #print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/总浮动盈亏:'+str(ZongPnl))
        pass
        instruments = get_instruments(s1)        #获取品种的合约基本信息
        #instruments = get_instruments('SQRB00')        #获取品种的合约基本信息
        BuyBaoZhengJinLv = round(instruments.buy_margin_rate,6)    #float    多头保证金率
        #print(str(BuyBaoZhengJin))
        SellBaoZhengJinLv = round(instruments.short_margin_rate,6)    #float    空头保证金率
        #print(str(SellBaoZhengJin))
        HeYueDanWei = round(instruments.multipliter,6)    #int    合约单位乘数
        #print(str(HeYueDanWei))
        MinJia = round(instruments.mintick,6)    #float    最小变动价位
        #print(str(MinJia))
        MeiShouDanWei = round(instruments.round_lot,6)    #int    每手单位,例如股票是100
        #print(str(MeiShouDanWei))
        #print(str(BanKuai)+'合约基本信息'+str(MinJia)+str(DanWei))
        #MinJia = round(get_dynainf(s1,208),6)    #取得合约最新最小变动价
        #ChengShu = round(get_dynainf(s1,209),6)        #取得最新合约的单位乘数
        #print('合约的单位乘数'+str(ChengShu))
###############################################################################################账户计算###################################
        KaiShouXuFei = round(get_charge(s1,get_dynainf(s1,7),1,0),6)   #计算开仓所需手续费费用 交易类型,必填项,0开仓 1平仓
        PingShouXuFei = round(get_charge(s1,get_dynainf(s1,7),1,1),6)   #计算平仓所需手续费费用 交易类型,必填项,0开仓 1平仓
    if 1 != 0 and \
        MinJia * HeYueDanWei * MeiShouDanWei  == 0 or NewQianJieSuan * HeYueDanWei *  BuyBaoZhengJinLv * SellBaoZhengJinLv == 0 \
        or FengXianDu * OrdAmount == 0 or (KaiShouXuFei + PingShouXuFei) ==0
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'!!!!!!!!!!!!!!!合约信息错误!!!更新合约信息!!!!!!!!!!!!!!!!!')
        return
    else:    
        MinJiaCha = round(MinJia * HeYueDanWei * MeiShouDanWei,6)      #计算最小变动定价
        pass
        #计算公式:N手某期货合约占用保证金额=当日结算价×交易单位(合约乘数)×期货保证金率×N手。             
        BuyBaoZhengJin = round(NewQianJieSuan * HeYueDanWei *  BuyBaoZhengJinLv * 1 ,0)                                 #昨日多头保证金
        #print('多头保证金'+str(BuyBaoZhengJin))
        SellBaoZhengJin = round(NewQianJieSuan * HeYueDanWei * SellBaoZhengJinLv * 1 ,0)                                #昨日空头保证金
        #print('空头保证金'+str(SellBaoZhengJin))
        MinChenBenBi = round(MinJiaCha / (KaiShouXuFei + PingShouXuFei),6)        #最小成本比
        OrdBuyMaxVol = round(FengXianDu * OrdAmount / BuyBaoZhengJin ,0)            #昨天 多 最大持仓量
        OrdSellMaxVol = round(FengXianDu * OrdAmount / SellBaoZhengJin ,0)        #昨天 空 最大持仓量
        pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/昨天:'+'最大持仓量:'+str(OrdBuyMaxVol)+':'+str(OrdSellMaxVol)+'/空保证金:'+str(SellBaoZhengJin)+'/空保证金率:'\
            +str(SellBaoZhengJinLv)+'/多保证金:'+str(BuyBaoZhengJin)+'/多保证金率:'+str(BuyBaoZhengJinLv)+'/最小成本比'+str(MinChenBenBi)\
            +'/开手续费:'+str(KaiShouXuFei)+'/平手续费:'+str(PingShouXuFei)+'/最小单位:'+str(MinJia)+'/最小定价:'+str(MinJiaCha)\
            +'/每手单位:'+str(MeiShouDanWei)+'/单位乘数:'+str(HeYueDanWei)+"/")
###############################################################################################多头持仓计算###############################
    if BuyQuantity>0:
        pass
        #print(str(BanKuai)+str(Name)+'/D持仓:'+str(BuyQuantity)+'/均价:'+str(BuyAvgHoldingPrice))                       
        BuyPnl = \
        round((NewSellJia - BuyAvgHoldingPrice) / MinJia * MinJiaCha * BuyQuantity - (KaiShouXuFei + PingShouXuFei) * BuyQuantity,4) #开多浮动盈亏  对手价计算减去双向手续费  
        #print(str(BanKuai)+str(Name)+'/D持仓盈亏:'+str(BuyPnl))              
        if BuyMargin == 0 or get_account(6) == 0:
            BuyFengXianDu = 0
        else:  
            BuyFengXianDu = round(BuyMargin / get_account(6),6)
            #print(str(BanKuai)+str(Name)+'/D持仓风险度:'+str(BuyFengXianDu))           
            pass
        if BuyPnl == 0 or BuyMargin == 0 or BuyAvgHoldingPrice == 0:
            BuyYingKuiLv = 0
            NewBuyBaoZhengJinLv = 0 
        else:
            BuyYingKuiLv = round(BuyPnl / BuyMargin,6)
            #print(str(BanKuai)+str(Name)+'/D盈亏率:'+str(BuyYingKuiLv))
            NewBuyBaoZhengJinLv = round(BuyMargin / BuyAvgHoldingPrice / HeYueDanWei / BuyQuantity  ,6)    #反推真实多头保证金率
            #print('/D持保证金率:'+str(NewBuyBaoZhengJinLv))  
            pass
        if  FengXianDu>0 and KeYongAmount>255 and BuyMargin>0 and BuyQuantity>0:
            BuyMaxVol = round((FengXianDu * KeYongAmount) / (BuyMargin / BuyQuantity),0
            #print(str(BanKuai)+str(Name)+'/D最大持仓:'+str(BuyMaxVol))
            if 1< MinChenBenBi < BuyMaxVol and BuyVol != BuyMaxVol:
                BuyVol = round(int(MinChenBenBi),0)           #设置默认每次下单量
                #SellVol = round(MinChenBenBi,0)          #设置默认每次下单量
                pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/多:最大持:'+str(BuyMaxVol)+'/持:'+str(BuyQuantity)+'/均价:'\
            +str(BuyAvgHoldingPrice)+'/总浮盈亏:'+str(ZongPnl)+'/持盈亏:'+str(BuyPnl)+'/盈亏率:'+str(BuyYingKuiLv)+'/持风险度:'\
            +str(BuyFengXianDu)+'/持保证金率:'+str(NewBuyBaoZhengJinLv)+'/')       
###############################################################################################空头持仓计算##########################
    if SellQuantity>0:
        pass
        #print(str(BanKuai)+str(Name)+'/K持仓:'+str(SellQuantity)+'/均价:'+str(SellAvgHoldingPrice))                       
        SellPnl = \
        round((SellAvgHoldingPrice - NewBuyJia) / MinJia * MinJiaCha * SellQuantity - (KaiShouXuFei + PingShouXuFei) * SellQuantity,4) #开空浮动盈亏 对手价计算减去双向手续费  
        #print(str(BanKuai)+str(Name)+'/K持仓盈亏:'+str(SellPnl))     
        if SellMargin  == 0 or get_account(6) == 0:
            SellFengXianDu = 0
        else:
            SellFengXianDu = round(SellMargin / get_account(6),6)
            #print(str(BanKuai)+str(Name)+'/K持仓风险度:'+str(SellFengXianDu))
            pass           
        if SellPnl  == 0 or SellMargin == 0 or SellAvgHoldingPrice == 0:
            SellYingKuiLv = 0
            NewSellBaoZhengJinLv = 0
        else:                   
            SellYingKuiLv = round(SellPnl / SellMargin,6)
            #print(str(BanKuai)+str(Name)+'/K盈亏率:'+str(SellYingKuiLv)) 
            NewSellBaoZhengJinLv = round(SellMargin / SellAvgHoldingPrice / HeYueDanWei / SellQuantity,6) #反推真实多头保证金率
            #print('/K持保证金率:'+str(NewSellBaoZhengJinLv)) 
            pass
        if FengXianDu > 0 and KeYongAmount > 255 and SellMargin > 0 and SellQuantity > 0:
            SellMaxVol = round((FengXianDu * KeYongAmount) / (SellMargin / SellQuantity),0)              
            #print(str(BanKuai)+str(Name)+'/K最大持仓:'+str(SellMaxVol))                       
            if 1< MinChenBenBi < SellMaxVol and SellVol != SellMaxVol:
                #BuyVol = round(MinChenBenBi,0)           #设置默认每次下单量
                SellVol = round(int(MinChenBenBi),0)          #设置默认每次下单量
                pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/空:最大持:'+str(SellMaxVol)+'/持:'+str(SellQuantity)\
            +'/均价:'+str(SellAvgHoldingPrice)+'/总浮盈亏:'+str(ZongPnl)+'/持盈亏:'+str(SellPnl)+'/盈亏率:'+str(SellYingKuiLv)\
            +'/持风险度:'+str(SellFengXianDu)+'/持保证金率:'+str(NewSellBaoZhengJinLv)+'/')       
##########################################################################################交易条件判断###################################
    if not istradertime(s1):    #不在交易时间,不进入交易段
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/不在交易时间/不进入交易段")
        if Test == 1:
            return
        else:
            return
    else:
        pass
        if 1!=0:
            pass
            if 1!=0:
                DianNaoTime = datetime.datetime.now()  ##获得当前时间->这是时间数组格式
                DianNaoTime = int(DianNaoTime.strftime("%H%M%S"))    #转换为指定的格式:
                ChengJIaoTime = int(round(get_dynainf(s1,207),0))    #行情报价最新一笔成交时间
                #print(str(BanKuai)+str(Name)+'/电脑时间'+str(DianNaoTime))
                #print(str(BanKuai)+str(Name)+'/报价时间'+str(ChengJIaoTime))
                DianNaoTimeH = round(DianNaoTime / 10000,0)    #取电脑时间小时数
                ChengJIaoTimeH = round(ChengJIaoTime / 10000,0)    #取交易时间小时数
                XiaoShiShiCha = (DianNaoTimeH - ChengJIaoTimeH)    #计算小时时间差
                if DianNaoTimeH!=ChengJIaoTimeH:    #小时数相等
                    if DianNaoTimeH == ChengJIaoTimeH:
                        TimeCha = round(DianNaoTime - ChengJIaoTime,0)    #计算成交时间差
                    else:                       
                        if DianNaoTimeH > ChengJIaoTimeH:    #小时数不相等
                            #print('交易小时>电脑小时:'+str(XiaoShiShiCha))                   
                            TimeCha = round(DianNaoTime - (ChengJIaoTime + abs(XiaoShiShiCha * 10000)),0)        #计算成交时间差
                            pass
                        if DianNaoTimeH < ChengJIaoTimeH:    #小时数不相等
                            #print('交易小时<电脑小时:'+str(XiaoShiShiCha))                   
                            TimeCha = round(DianNaoTime - (ChengJIaoTime - abs(XiaoShiShiCha * 10000)),0)        #计算成交时间差
                            pass
    #print('报价不活跃 情况完成######################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))  
########################################################################################总控 方向 模式 ################################
    if NewAmount != 0 or NewAmountShouXuFei != 0 or OrdAmount != 0:
        pass 
        if SellQuantity >= 0 or BuyQuantity >= 0:
            AmountHuiCheJinE = round(NewAmount - NewAmountShouXuFei - OrdAmount,0)    #最新账户回撤金额
            HuiCheJinE = round(OrdAmount * ZongHuiCheBiLi,6)    #设定回撤金额
            print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'设定回撤比例:'+str(ZongHuiCheBiLi)+'/设定回撤金额:'+str(HuiCheJinE) )
            if AmountHuiCheJinE < -HuiCheJinE or AmountHuiCheJinE > HuiCheJinE * 9:
                FangXiang = 0
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'设定回撤比例:'\
                    +str(ZongHuiCheBiLi)+'/账户当日回撤:'+str(AmountHuiCheJinE)+'/大于触发阀值:'+str(HuiCheJinE)+'执行风控退出平仓交易!')                       
            else:
                if ZongPnl == 0 or BaoZhengJinAmount == 0:
                    NewZongHuiCheBiLi = 0
                else:
                    NewZongHuiCheBiLi = round(ZongPnl / BaoZhengJinAmount,6)  
                    if NewZongHuiCheBiLi < -ZongHuiCheBiLi:        #回撤大于设定盈亏率        test!!!
                        FangXiang = 0
                        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'设定回撤比例:'\
                            +str(ZongHuiCheBiLi)+'/账户当日盈亏率:'+str(NewZongHuiCheBiLi)+'/大于回撤比例:'+str(ZongHuiCheBiLi)\
                            +'执行风控重启平仓交易!')
                    else:
                        if abs(int(TimeCha)) > 10 or NewChiCangLiang < 50000 or NewQianChiCangLiang < 50000 or NewBuyJia >= NewZhangTing or NewSellJia <= NewDieTing:  
                            FangXiang = 0
                            print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/时差:'+str(TimeCha)\
                                +'秒/######################报价不活跃=======平仓######################')
                            pass
                        else:
                            if 1 != 0 and ( OpenCloseTime == 1 ):    #测试
                                #FangXiang = 0
                                print(str(BanKuai)+str(Name)+'=====================测试收盘平仓========================')
                                pass
                if 1 != 0:
                    if NewJia > NewLowJia > NewQianJieSuan:    #均价 大于 前均价 趋势多
                        FangXiang = 1
                        pass
                    if NewJia < NewHighJia < NewQianJieSuan:    #均价 小于 前均价 趋势空
                        FangXiang = -1
                        pass  
                    if NewZhenFu < ZhenFu:
                        FangXiang = 0
                        pass           
                    if CloseTime1500 == 1:    #收盘平仓
                        FangXiang = 0
                        pass  
    #print('计算持仓 盈亏 账户 情况完成##############################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#########################################################################################方向检查########################################
    if FangXiang == 0:
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/"+"风控:0:"+str(FangXiang)+'/动态盈亏率:'+str(YingKuiLv)) #调试打印输出
        pass
    if FangXiang == 1:
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/"+"趋势:1:"+str(FangXiang)+'/动态盈亏率:'+str(YingKuiLv)) #调试打印输出
        pass
    if FangXiang == 2:
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/"+"震荡:2:"+str(FangXiang)+'/动态盈亏率:'+str(YingKuiLv)) #调试打印输出  
        pass
    #print('检查方向完成#############################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
####################################################### 下单时对接盘口 #开仓平仓量大于买卖一量 重新计算修改下单量 ###########################
    print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'下单对接盘口之前:'+' BuyVol:'+str(BuyVol)+' SellVol:'+str(SellVol))  
    if BuyVol > NewSellOneVol > 0:
        BuyVol = int(NewSellOneVol)        #卖一量对接
    else:
        BuyVol = int(BuyVol)        #买开平量(开仓下单)
    if SellVol > NewBuyOneVol > 0:
        SellVol = int(NewBuyOneVol)        #买一量对接
    else:
        SellVol = int(SellVol)        #卖开平量(开仓下单)
    if BuyQuantity !=0:
        if BuyQuantity > NewSellOneVol > 0:
            NewBuyVol = int(NewSellOneVol)        #卖一量对接
        else:
            NewBuyVol = int(BuyQuantity)        #买平持仓量(平仓下单)
        #print('下单对接盘口之后:'+' NewBuyVol:'+str(NewBuyVol))    
    if SellQuantity !=0:
        if SellQuantity > NewBuyOneVol > 0:  
            NewSellVol = int(NewBuyOneVol)        #买一量对接
        else:
            NewSellVol = int(SellQuantity)        #卖平持仓量(平仓下单)
        #print('下单对接盘口之后:'+' NewSellVol:'+str(NewSellVol))  
    print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'下单对接盘口之后:'+' BuyVol:'+str(BuyVol)+' SellVol:'+str(SellVol))  
    #print('盘口下单置换完成########################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
##########################################################总平仓下单#####################################################################
    if 1 != 0\
        and (FangXiang == 0 ):         #开关 1==0 关闭        1 != 0 打开
        if BuyQuantity != 0:          
            sell_close(s1,"ThisClose",volume = NewBuyVol,repeat = 1,serial_id = 1)          #账户回撤大于设定值%
            pass
        if SellQuantity != 0:           
            buy_close(s1,"ThisClose",volume = NewSellVol,repeat = 1,serial_id = 2)         #账户回撤大于设定值%
            pass
        #print('回撤下单完成#########################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
################################################################ 品种结束循环 重启!######################################################
    if 1 != 1 \
        and ( (BuyMaxVol != BuyVol and SellMaxVol != SellVol) or BuyPnl !=0 or SellPnl !=0 or KaiShouXuFei != 0 \
        or PingShouXuFei != 0 or BuyQuantity > BuyVol or SellQuantity > SellVol ):                             ##构建计算条件
        ChengBen = (KaiShouXuFei + PingShouXuFei) * (BuyQuantity + SellQuantity) * ZongChengBenBi        #计算总持仓成本比金额
        BuyChengBen = (KaiShouXuFei + PingShouXuFei) * BuyQuantity * MinChenBenBi                #计算多持仓成本比金额
        SellChengBen = (KaiShouXuFei + PingShouXuFei) * SellQuantity * MinChenBenBi               #计算空持仓成本比金额
        pass
        if ZongPnl > ChengBen  and (BuyPnl > BuyChengBen and SellPnl > SellChengBen):        #多空总持仓都盈利,而且盈利都大于成本比!
            pass
            if BuyQuantity > 0 and SellQuantity > 0#多空  同时持仓盈利 总盈利盈利大于成本比 风控、趋势、震荡、 对平持仓 结束循环
                if BuyQuantity > 0 :
                    pass
                    buy_close(s1,"ThisClose",volume = NewBuyVol,repeat = 0,serial_id = 3)
                if SellQuantity > 0:
                    pass
                    sell_close(s1,"ThisClose",volume = NewSellVol,repeat = 0,serial_id = 4)       
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'多空 同时持仓盈利 风控趋势震荡对平持仓 结束循环重启!')
                pass
            #print('同时持仓盈利下单完成#############################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        elif ZongPnl > ChengBen and (BuyPnl > BuyChengBen or SellPnl > SellChengBen):        #多空总持仓有分别盈亏,总计盈利大于成本比!
            pass
            if BuyQuantity  > 0 or SellQuantity  > 0#多空 分别 (单向或者双向) 持仓盈亏 总盈利盈利大于成本比 风控、趋势、震荡、 对平持仓 结束循环
                if BuyQuantity > 0 :
                    pass
                    buy_close(s1,"ThisClose",volume = NewBuyVol,repeat = 0,serial_id = 5)
                if SellQuantity > 0:
                    pass
                    sell_close(s1,"ThisClose",volume = NewSellVol,repeat = 0,serial_id = 6)       
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'多空 分别 (单向或者双向) 持仓合并盈利 风控趋势震荡对平持仓 结束循环重启!')
        elif ZongPnl < -ChengBen and (BuyPnl < -BuyChengBen or SellPnl < -SellChengBen):        #多空总持仓有分别亏,总计亏大于成本比!
            pass
            if BuyQuantity  > 0 or SellQuantity  > 0#多空 分别 (单向或者双向) 持仓盈亏 总盈利盈利大于成本比 风控、趋势、震荡、 对平持仓 结束循环
                if BuyQuantity > 0 :
                    pass
                    buy_close(s1,"ThisClose",volume = NewBuyVol,repeat = 0,serial_id = 7)
                if SellQuantity > 0:
                    pass
                    sell_close(s1,"ThisClose",volume = NewSellVol,repeat = 0,serial_id = 8)       
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'多空 分别 (单向或者双向) 持仓合并亏损 风控趋势震荡对平持仓 结束循环重启!')
        else:
            pass
            #print('分别持仓盈亏下单完成#####################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
######################################################################## 开始构建信号下单 ###############################################
    #使用buy_open、sell_close等方法下单
    #下单示例:
    #buy_open(s1, "Market", volume=100)    #  市价开多
    pass
######################################################################趋势开多########################################################
    if ( NewZhangSu < -(NewZhenFu * ZhenFu) ) and FangXiang == 1:    #判断趋势 做多
        ##print(s1+'趋势多')
        if BuyQuantity == 0:
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 9)    #开多试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率              
            #sell_open(s1,"ThisClose",volume = SellVol,repeat=0,serial_id = 2)
            pass
        #if BuyQuantity != 0 and BuyQuantity < BuyMaxVol:
            #buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 8)
#####################################################################多止盈止损########################################################
    if BuyQuantity > 0 and  FangXiang == 1:
        ##print(s1)
        ##print(BuyAvgHoldingPrice)
        #BuyHuiLuo = (NewJia - BuyAvgHoldingPrice) / BuyAvgHoldingPrice
        ##print(s1+"/"+str(BuyHuiLuo)+"/"+str(HuiLuo))       
        if BuyQuantity > BuyMaxVol:  
            sell_close(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 10)         #持仓量大于最大持仓量  平多
            pass
        #if BuyYingKuiLv < -YingKuiLv and SellQuantity < SellMaxVol:
            #sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 10)         #多亏阀值止损 反手开空
            pass
#####################################################################趋势开空#########################################################
    if (  NewZhangSu > (NewZhenFu * ZhenFu) ) and FangXiang == -1:    #判断趋势 做空
        #print(s1+'趋势空')
        if SellQuantity == 0:
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 11#开空试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            #buy_open(s1,"ThisClose",volume = BuyVol,repeat=0,serial_id = 5)
            pass
        #if SellQuantity != 0 and SellQuantity < SellMaxVol:
            #sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 11)
#####################################################################空止盈止损########################################################
    if SellQuantity > 0 and  FangXiang == -1:
        ##print(s1)
        ##print(SellAvgHoldingPrice)
        #SellHuiLuo =  (SellAvgHoldingPrice - NewJia) / SellAvgHoldingPrice
        ##print(s1+"/"+str(SellHuiLuo)+"/"+str(HuiLuo))     
        if SellQuantity > SellMaxVol:  
            buy_close(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 12)         #持仓量大于最大持仓量  平空
            pass
        #if SellYingKuiLv < -YingKuiLv and BuyQuantity < BuyMaxVol:
            #buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 14)         #空亏阀值止损 反手开多
            pass  
    #print('趋势下单完成#############################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#####################################################################震荡开仓###########################################################
    if BuyQuantity == 0 and  FangXiang == 2:                                #震荡做多
        ##print(s1+'震荡多')
        if NewZhangSu < -(NewZhenFu * ZhenFu):
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 13)    #开多试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    if BuyQuantity != 0  and  FangXiang == 2:                                #震荡做多
        if BuyQuantity < BuyMaxVol and NewZhangSu < -(NewZhenFu * ZhenFu):
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 14)    #开多仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    if SellQuantity == 0 and FangXiang == 2:                                #震荡做空
        ##print(s1+'震荡空')
        if NewZhangSu > (NewZhenFu * ZhenFu):
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 15)    #开空试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    if SellQuantity != 0 and FangXiang == 2:                                #震荡做空
        if SellQuantity < SellMaxVol and NewZhangSu > (NewZhenFu * ZhenFu):
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 16)     #开空仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    #print('震荡下单完成#############################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#########################################################################################################################################
#
#
#
#
#########################################################################################################################################
#!!!!!!!!!!!!!!!!!!!! 系统有BUG   去掉     !!!!!!!!!!
# exit函数会在测评结束或者停止策略运行时会被调用。---(选择实现)
#def exit(context):
    #killtimer(handle_bar_1)    #终止计时器
    #killtimer(handle_bar_2)    #终止计时器
    #print("终止计时器/策略手动已退出!")
    #gc.collect()
    #print(str(gc.get_threshold())+'清理内存')
    #return
    #print('最后一行完成<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    return
 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!持仓管理模块!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#!/usr/local/bin/python
# -*- coding:utf-8 -*-
##########################################################################################################################################
#import logging     #python 原生内置记录调试输出模块
#print(logging)
#from logging.handlers import RotatingFileHandler
#print( RotatingFileHandler)
#########################################################################################################################################
# 设置打印日志的级别,level级别以上的日志会打印出
# level=logging.DEBUG 、INFO 、WARNING、ERROR、CRITICAL
#     format参数中可能用到的格式化串
#     %(name)s Logger的名字
#     %(levelno)s 数字形式的日志级别
#     %(levelname)s 文本形式的日志级别
#     %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
#     %(filename)s 调用日志输出函数的模块的文件名
#     %(module)s 调用日志输出函数的模块名
#     %(funcName)s 调用日志输出函数的函数名
#     %(lineno)d 调用日志输出函数的语句所在的代码行
#     %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
#     %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
#     %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
#     %(thread)d 线程ID。可能没有
#     %(threadName)s 线程名。可能没有
#     %(process)d 进程ID。可能没有
#     %(message)s用户输出的消息
#######################################################################################################################################
#def logging_fun():
#    # 创建日志的记录等级设
#    logging.basicConfig(level=logging.DEBUG)
#    # 创建日志记录器,指明日志保存的路径,每个日志文件的最大值,保存的日志文件个数上限
#    log_handle = RotatingFileHandler("C://py_ZhangSu_ChiCang_log.txt", maxBytes=1024 * 1024, backupCount=5)
#    # 创建日志记录的格式
#    formatter = logging.Formatter("format = '%(asctime)s - %(filename)s - %(module)s - %(funcName)s - [line:%(lineno)d] - %(levelname)s - %(thread)d - %(threadName)s - %(process)d - %(message)s',")
#    # 为创建的日志记录器设置日志记录格式
#    log_handle.setFormatter(formatter)
#    # 为全局的日志工具对象添加日志记录器
#    logging.getLogger().addHandler(log_handle)
#    logging.warning('用来用来打印警告信息')
#    logging.error('一般用来打印一些错误信息')
#    logging.critical('用来打印一些致命的错误信息,等级最高')
#    pass
#logging_fun()
##########################################################################################################################################
#import unittest        #python 原生内置测试test模块
#print(unittest)
import datetime     #python 原生内置日期模块
print(datetime)
import random        #python 原生内置随机模块
print(random)  
import time        #python 原生内置时间模块
print(time)
#import gc        #python原生内存清理模块
#print(gc)
#import threading    #python原生等待  不支持
#print(threading)
#event = threading.Event()
#event.wait(SleepS)
SleepS = int(datetime.datetime.now().strftime('%S'))
SleepMin = 0.1 #int(datetime.datetime.now().strftime('%f')[:-3])/1000
#设定启动等待时间 秒
#for i in range(SleepS):
#    time.sleep(SleepMin) #time.sleep(SleepS)        #python 原生内置暂停
#event.wait(SleepS)
#if int(datetime.datetime.now().strftime('%S')) == int(SleepS):
print('启动中!等待账户登录后:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])+"/"+str(SleepS)+'秒 启动')
pass
##########################################################################################################################################  
#去掉金字塔 PythonApi  已经强制载入!!!!!!!!!!!!!!!!!!
#from PythonApi import *
#import PythonApi  
#print(PythonApi)
########################去掉的模块########################################################################################################
print('import 环境模块加载完成:######################################'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#  参数定义区,这里定义的参数可以直接在context对象中获取。--(选择实现)
def parameter():
    #input_par('ZongFengXian',1,0,1,0.01)        #设置总风险度持仓比例
    #input_par('DingShiQiS',10,1,60,1)         #定时器设置 秒
    print('def parameter 模块加载完成:###############################'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass
#  在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
    #DingShiQiMs = context.DingShiQiS * 1000    #定时器设置转换毫秒
    #settimer(handle_bar_1,DingShiQiMs)    #handle_bar 定时执行
    #settimer(handle_bar_2,DingShiQiMs)    #handle_bar 定时执行
    #print(settimer)
    #print('####################设置交易模式: 0:自定义品种.1:自选股品种,2:持仓品种=:'+str(context.KC_1_CC_2)+'#################')
    print('def init 模块加载完成####################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
    print('def before_trading 模块加载完成###########################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
def after_trading(context):  
    print('def after_trading 模块加载完成############################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass 
# order_status当委托下单,成交,撤单等与下单有关的动作时,该方法就会被调用。---(选择实现)
def order_status(context,order):
    #print('def order_status_1 模块加载完成#########################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    Orders = get_orders (order_book_id="all", type=1, account="") #合约代码,或者为"all"全部合约,必填项 0:只取未成交订单 1:取全部订单,必须填指定具体的交易帐号,若不指定帐号,则取默认登录帐号
    #print(Orders)
    #print('全部订单列表:'+str(order.order_book_id))
    #判断柜台回报信息,是否为全部成交。
    if order.status=='submitted':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/submitted"已报单未成交'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    if order.status=='tradeing"已成交':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/tradeing"已成交'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass     
    if order.status=='filled':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/filled"全部成交'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='cancelled':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/cancelled"已撤单'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='inactive':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/inactive"无效单'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='connected':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/connected"已连接'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        pass
    if order.status=='disconnected':
    #订单状态 "submitted"已报单未成交 "tradeing"已成交 "filled"全部成交 "cancelled"已撤单 "inactive"无效单 "connected"已连接 "disconnected"连接断开
        print('全部订单列表:'+str(order.order_book_id)+':'+str(order.status)+'/disconnected"连接断开'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        return
    #print('def order_status模块计算完成###########################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    pass #未完成
# order_action当查询交易接口信息时返回的通知---(选择实现)
#注意:该事件函数仅在融资融券、新股申购操作刷新动作时才会触发,一般账户无效。
#def order_action(context,type, account, datas)
    pass
#########################################################################################################################################
#
#
#
#########################################################################################################################################
#########################################################################################################################################
#
#
#
#
#########################################################################################################################################
# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    #print('def handle_bar_2 模块加载完成:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    #print('def handle_bar_1 模块加载完成>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    #获取最近一个订单状态。
    id_list=get_orders(order_book_id="all", type=1, account="")
    if not(id_list == None):
        id_last=get_orders_id (id_list[-1].order_id)
    #如果最近一次订单状态为未成交,则进行撤单操作。
        if  id_last.status =='submitted':
            cancel_order (id_last.order_id)
            pass
    #gc.collect()
    #print(str(gc.get_threshold())+'清理内存')
############################################################################## 在context中保存全局变量###################################
    Test = 0    #检查模式 0 关闭 1开启
    TimeCha = 0    #默认时间差 = 0
    ZongFengXianDu = 1 #context.ZongFengXian         #总账户风险度%
    ZongYingKuiLv = 0.1            #总盈亏率%
    ZongHuiCheBiLi = 0.01        #总账户回撤%
    ZongChengBenBi = 10        #成本比设置
    pass
    HuiLuo = 0.02        #品种回落%
    ZhangDieFu = 0.02        #品种涨跌幅%
    ZhenFu = 0.015            #品种振幅%
    YingKuiLv = 0.02         #品种盈亏率%
    FengXianDu = 0.09        #品种风险度%
    pass  
    BuyFengXianDu = 0            #品种风险度置零
    SellFengXianDu = 0        #品种风险度置零
    BuyAvgHoldingPrice = 0    #开仓持仓成本置零
    SellAvgHoldingPrice = 0    #开空持仓成本置零
    pass
    BuyVol = 1           #设置默认每次下单量
    SellVol = 1           #设置默认每次下单量  
    BuyMaxVol = 1     #设置默认买最大持仓量
    SellMaxVol = 1    #设置默认卖最大持仓量
    FangXiang = 0     #设置默认运行模式方向 = 0: 趋势 = 1,震荡 = 2,风控 = 0
    pass
    lastbuy = 0    #开多挂单置零
    lastbuyping = 0    #平多挂单置零
    lastsell = 0    #开空挂单置零
    lastsellping = 0   #平空挂单置零
    pass
    NewAmount = 255        #设置账户断开
    OrdAmount = 255        #设置账户断开
    KeYongAmount = 255    #设置账户断开
###############################################################################登录账户###################################################
    GetAccountBook = len(get_account_book())    #账户列表
    #print('账户列表:'+str(GetAccountBook))
    AccountBook = (isaccount())        #登录账户
    #print('登录账户:'+str(AccountBook))
    pass
    if 1 == 0 or  GetAccountBook != 1:
        SleepS = int(datetime.datetime.now().strftime('%S'))
        #SleepMin = int(datetime.datetime.now().strftime('%f')[:-3])/1000
        #for i in range(SleepS):
        #    time.sleep(SleepMin)
        #event.wait(SleepS)
        #if int(datetime.datetime.now().strftime('%S')) == int(SleepS):
        print('账户列表:'+str(GetAccountBook)+'登录账户:'+str(AccountBook)+'系统错误!账户断开!交易中断!等待'\
            +str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])+'/'+str(SleepS)+'秒启动')
        return
##############################################################################时间判断####################################################
    else:  
        if 1!=0:
            DianNaoTime = datetime.datetime.now()  ##获得当前时间->这是时间数组格式
            DianNaoTime = int(DianNaoTime.strftime("%H%M%S"))    #转换为指定的格式:
            OpenTime0900_2300 = (90000 <= DianNaoTime <= 101500) or (103000 <= DianNaoTime <= 113000) \
            or (133000 <= DianNaoTime <= 150000) or (210000 <= DianNaoTime <= 230000#交易时间0900-2300
            OpenTime2300_0100 = (230000 <= DianNaoTime <= 240000) or (0 <= DianNaoTime <= 10000)   #交易时间2300-0100
            OpenTime0100_0230 = (10000 <= DianNaoTime <= 23000)    #交易时间0100-0230
            pass
            OpenTimeQuJian = 100 * 5    #设定开盘区间             
            OpenTime2100 = 210000 <= DianNaoTime <= (210000 + OpenTimeQuJian)  #开盘1
            OpenTime0900 = 90000 <= DianNaoTime <= (90000 + OpenTimeQuJian)  #开盘2-1
            OpenTime1030 = 103000 <= DianNaoTime <= (103000 + OpenTimeQuJian)  #开盘2-2
            OpenTime1330 = 133000 <= DianNaoTime <= (133000 + OpenTimeQuJian)  #开盘2-3
            pass
            CloseTimeQuJian = 100 * 9    #设定收盘区间
            CloseTime2300 = (225959 - CloseTimeQuJian) <= DianNaoTime <= 230000  #收盘1-1
            CloseTime0100 = (5959 - CloseTimeQuJian) <= DianNaoTime <= 10000  #收盘1-2
            CloseTime0230 = (22959 - CloseTimeQuJian) <= DianNaoTime <= 23000  #收盘1-3
            CloseTime1015 = (101459 - CloseTimeQuJian) <= DianNaoTime <= 101500  #收盘2-1
            CloseTime1130 = (112959 - CloseTimeQuJian) <= DianNaoTime <= 113000  #收盘2-2
            CloseTime1500 = (145959 - CloseTimeQuJian) <= DianNaoTime <= 150000  #收盘3
#######################################################################################品种列表###########################################
            RunInfoBaseBookId = context.run_info.base_book_id        #基准合约代码run_info.base_book_id  合约池连续代码 order_book_id
            #print('基准合约代码:'+str(RunInfoBaseBookId))
            BaseGetInblocks = get_inblocks(RunInfoBaseBookId)        #获取指定品种的所属板块
            #print('获取指定品种的所属板块:'+str(BaseGetInblocks))
            pass
            Universe = context.universe        #基准合约代码run_info.base_book_id  合约池连续代码 order_book_id
            ##print('合约池连续代码:'+str(Universe))
            #UniverseGetInblocks=get_inblocks(Universe)        #获取指定品种的所属板块
            ##print('获取指定品种的所属板块:'+str(UniverseGetInblocks))       
            pass
            if 1!=0:#BaseGetInblocks == ['自选:自选股', '系统—指数:连续合约板块']: #'自选股:上海', '系统—指数:连续合约板块':
                #GetBlocks2300_0100 = get_blocks ('自选股',1) #['SQAG00','SQAU00','INSC0000']         #夜盘1:00收盘品种
                #GetBlocks2300_0230 = ['SQAG00','SQAU00','INSC0000']         #夜盘2:30收盘品种
                #GetBlocks0900_2300 = get_blocks ('自选股',1)                                     #日盘交易收盘品种                                
                #print(GetBlocks0)    #自设定池 控制策略交易时间是全部时间最长的品种
                #GetBlocks1 = get_blocks ('自选股',1)    #自选池 1分类板块           #0市场分类 1分类板块 2系统板块 
                #print(GetBlocks1)
                #GetBlocks2 = get_portfolio_book(2,"")  
                #持仓品种   #投资组合持仓品种 指定查询类型,必填项, 期货 0投机 1保值 ; 股票 0普通 1融资 ; 期权 0非备兑 1备兑; 2全部类型, 该参数对回测无效
                #print(GetBlocks2)
                OpenCloseTime = CloseTime2300 == 1 or CloseTime0100 == 1 or  CloseTime0230 == 1 or CloseTime1015 == 1 \
                or CloseTime1130 == 1 or CloseTime1500 == 1 or OpenTime2100 == 1 or OpenTime0900 == 1 or  OpenTime1030 == 1 \
                or OpenTime1330 == 1     #测试
                if OpenCloseTime == 1:
                    GetBlocks = get_portfolio_book(2,"")       #开盘后5分钟和收盘前5分钟 只管理持仓交易!!!!不开新仓!!!!!。
                    random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                    BanKuai='ChiCang_10分钟结算持仓'
                else:
                    if OpenTime0900_2300 ==1:                      
                        GetBlocks = get_portfolio_book(2,"")    #get_blocks ('自选股',1)    #切换参数设置自动交易模式
                        random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                        BanKuai='ChiCang_0900_2300自选股'
                    else:
                        if OpenTime2300_0100 ==1:
                            GetBlocks = get_portfolio_book(2,"")    #get_blocks ('自设股',1)     #切换参数设置自动交易模式
                            random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                            BanKuai='ChiCang_2300_0100自设股'                          
                        else:
                            if OpenTime0100_0230 ==1:
                                GetBlocks = get_portfolio_book(2,"") #['SQAG00','SQAU00','INSC0000']     #自定义 黄金 白银 原油
                                random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                                BanKuai='ChiCang_0100_0230自定义'
                            else:
                                GetBlocks = get_portfolio_book(2,"")     #非交易时间检查持仓
                                random.shuffle(GetBlocks)        #随机打乱列表 更随机性                               
                                BanKuai='ChiCang_收市检查'
                                Test = 1                                                           
                #print(GetBlocks)
                #random.shuffle(GetBlocks)        #随机打乱列表 更随机性
                #print(GetBlocks)
                MaxNum = len(GetBlocks)     #总数量
                if  MaxNum == 0:
                    print(str(BanKuai)+str(MaxNum))
                    return
                    #print(str(GetBlocks))
                Num = random.randrange(0,MaxNum,1) # random.randint(1,10)/randrange 随机取列表每次列表一个进行交易
                FengXianDu = round(ZongFengXianDu / MaxNum,6)     #动态风险度=总风险度/最大列表数量
                ##print(str(BanKuai)+'取合约列表:'+str(Num))
                for index in range(len(GetBlocks)):        #随机循环合约池
                    s = GetBlocks[Num]
                    #print(s)
                s1 = get_dynainf(s,210)   #品种主力合约代码
                Name = get_dynainf(s1,219)    #名称
            else:
                print('获取指定品种的所属板块:'+str(BaseGetInblocks))
                print('合约池没有正常设置!自选股必须是连续合约,合约池导入自选股列表,基准合约为空')
                return  
        #print('合约品种列表完成########################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))        
########################################################准备账户刷新#####################################################################
    if get_account(6) <= 255 or get_account(26) <= 255 or get_account(19) <= 255:
        SleepS = int(datetime.datetime.now().strftime('%S'))        
        #SleepMin = int(datetime.datetime.now().strftime('%f')[:-3])/1000
        #for i in range(SleepS):
        #    time.sleep(SleepMin)
        #event.wait(SleepS)
        #if int(datetime.datetime.now().strftime('%S')) == int(SleepS):
        print('账户异常!未登录!退出交易!''等待'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])\
            +'/'+str(SleepS)+'秒启动')           
        return
###############################################################################################行情刷新####################################
    else:
        NewZuoShouJia = round(get_dynainf(s1,3),6)    #获取最新昨收价
        NewOpenJia = round(get_dynainf(s1,4),6)    #获取最新今开价
        NewHighJia = round(get_dynainf(s1,5),6)    #获取最新最高价
        NewLowJia = round(get_dynainf(s1,6),6)    #获取最新最低价
        NewJia = round(get_dynainf(s1,7),6)    #获取最新成交价
        NewJunJia = round(get_dynainf(s1,11),6)    #获取最新均价
        NewZhenFu = round(get_dynainf(s1,13),6)    #获取最新振幅
        NewZhangDieFu = round(get_dynainf(s1,14),6)    #获取最新涨跌幅
        #NewWeiBi = round(get_dynainf(s1,15),6)        #委比
        #NewWeiCha = round(get_dynainf(s1,16),6)        #委差 
        NewBuyJia = round(get_dynainf(s1,20),6)    #委买价
        NewSellJia = round(get_dynainf(s1,21),6)    #委卖价
        NewZhangSu = round(get_dynainf(s1,24),6)        #涨跌速
        NewBuyOneVol = round(get_dynainf(s1,25),6)        #25    买一量
        #print('买一量'+str(NewBuyOneVol))
        NewSellOneVol = round(get_dynainf(s1,31),6)    #31    卖一量
        #print('卖一量'+str(NewSellOneVol))
        #NewJunLiang = round(get_dynainf(s1,38),6)    #获取最新日均量
        NewChiCangLiang = round(get_dynainf(s1,45),6)    #获取45 最新持仓量
        NewZhangTing = round(get_dynainf(s1,54),6)    #获取最新涨停价
        NewDieTing = round(get_dynainf(s1,55),6)    #获取最新跌停价
        NewQianChiCangLiang = round(get_dynainf(s1,60),6)    #获取60 昨持仓量
        NewJinJieSuan = round(get_dynainf(s1,61),6)    #获取最新结算价
        NewQianJieSuan = round(get_dynainf(s1,62),6)    #获取昨日结算价
        #NewUp = round(get_dynainf(s1,204),6)        #上升劲道
        #NewDn = round(get_dynainf(s1,205),6)        #下降劲道
###############################################################################################账户刷新###################################
        #print('handle_bar_Stop'+str(datetime.datetime.now()))
        NewAmountFuDongYingKui = round(get_account(4),0)    #当前交易帐户中的浮动盈亏
        NewAmount = round(get_account(6),0)    #当前交易帐户中的动态权益/资产值
        KeYongAmount = round(get_account(19),0)    #当前可用资金
        OrdAmount = round(get_account(26),0)    #上次结算准备金/期初余额
        BaoZhengJinAmount = round(get_account(28),0)    #28    占用保证金/证券市值
        NewAmountPingCangYingKui = round(get_account(30),0)    #平仓盈亏数额/回报卖出金额/融券盈亏
        NewAmountShouXuFei = round(get_account(31),0)    #当前交易帐户中的手续费
        ZongYinKuiAmount = round((NewAmountFuDongYingKui + NewAmountPingCangYingKui - NewAmountShouXuFei),0)    #账户总盈亏
        if ZongYinKuiAmount==0 or BaoZhengJinAmount==0 or NewAmount==0:
            AmountZongYingKuiLV = 0    #总盈亏率
            AmountZongFengXianDu = 0        #总风险度
        else:              
            AmountZongYingKuiLV = round(ZongYinKuiAmount / BaoZhengJinAmount,6)    #总盈亏率
            if AmountZongYingKuiLV == 0:
                AmountZongFengXianDu = 0
            else:       
                AmountZongFengXianDu = round(BaoZhengJinAmount / NewAmount,6)        #总风险度
                pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/动态权益:'+str(NewAmount)+'/期初余额:'+str(OrdAmount)\
            +'/可用资金:'+str(KeYongAmount)+'/手续费:'+str(NewAmountShouXuFei)+'/平仓盈亏:'+str(NewAmountPingCangYingKui)+'/浮动盈亏:'\
            +str(NewAmountFuDongYingKui)+'/总盈亏率:'+str(AmountZongYingKuiLV)+'/总风险度:'+str(AmountZongFengXianDu))
        pass
        portfolio = get_portfolio (s1, 2)     #账户持仓状态
        pass       
        BuyQuantity = round(portfolio.buy_quantity,4)        #开多持仓量
        BuyMargin = round(portfolio.buy_margin,4)            #开多占用保证金
        BuyAvgHoldingPrice = round(portfolio.buy_avg_holding_price,4)    #开多持仓均价(非结算持仓均价!!!)
        BuyPnl = round(portfolio.pnl,4)                        #开多浮动盈亏
        pass
        SellQuantity = round(portfolio.sell_quantity,4)        #开空持仓量
        SellMargin = round(portfolio.sell_margin,4)        #开空占用保证金
        SellAvgHoldingPrice = round(portfolio.sell_avg_holding_price,4)    #开空持仓均价(非结算持仓均价!!!)
        SellPnl = round(portfolio.pnl,4)                    #开空浮动盈亏
        pass
        if BuyPnl == SellPnl and BuyPnl+SellPnl !=0:    #持仓总盈亏
            ZongPnl=round((BuyPnl+SellPnl)/2,4)
        else:
            ZongPnl=0  
        #print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/总浮动盈亏:'+str(ZongPnl))
        pass
        instruments = get_instruments(s1)        #获取品种的合约基本信息
        #instruments = get_instruments('SQRB00')        #获取品种的合约基本信息
        BuyBaoZhengJinLv = round(instruments.buy_margin_rate,6)    #float    多头保证金率
        #print(str(BuyBaoZhengJin))
        SellBaoZhengJinLv = round(instruments.short_margin_rate,6)    #float    空头保证金率
        #print(str(SellBaoZhengJin))
        HeYueDanWei = round(instruments.multipliter,6)    #int    合约单位乘数
        #print(str(HeYueDanWei))
        MinJia = round(instruments.mintick,6)    #float    最小变动价位
        #print(str(MinJia))
        MeiShouDanWei = round(instruments.round_lot,6)    #int    每手单位,例如股票是100
        #print(str(MeiShouDanWei))
        #print(str(BanKuai)+'合约基本信息'+str(MinJia)+str(DanWei))
        #MinJia = round(get_dynainf(s1,208),6)    #取得合约最新最小变动价
        #ChengShu = round(get_dynainf(s1,209),6)        #取得最新合约的单位乘数
        #print('合约的单位乘数'+str(ChengShu))
###############################################################################################账户计算###################################
        KaiShouXuFei = round(get_charge(s1,get_dynainf(s1,7),1,0),6)   #计算开仓所需手续费费用 交易类型,必填项,0开仓 1平仓
        PingShouXuFei = round(get_charge(s1,get_dynainf(s1,7),1,1),6)   #计算平仓所需手续费费用 交易类型,必填项,0开仓 1平仓
    if 1 != 0 and \
        MinJia * HeYueDanWei * MeiShouDanWei  == 0 or NewQianJieSuan * HeYueDanWei *  BuyBaoZhengJinLv * SellBaoZhengJinLv == 0 \
        or FengXianDu * OrdAmount == 0 or (KaiShouXuFei + PingShouXuFei) ==0 :
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'!!!!!!!!!!!!!!!合约信息错误!!!更新合约信息!!!!!!!!!!!!!!!!!')
        return
    else:    
        MinJiaCha = round(MinJia * HeYueDanWei * MeiShouDanWei,6)      #计算最小变动定价
        pass
        #计算公式:N手某期货合约占用保证金额=当日结算价×交易单位(合约乘数)×期货保证金率×N手。             
        BuyBaoZhengJin = round(NewQianJieSuan * HeYueDanWei *  BuyBaoZhengJinLv * 1 ,0)                                 #昨日多头保证金
        #print('多头保证金'+str(BuyBaoZhengJin))
        SellBaoZhengJin = round(NewQianJieSuan * HeYueDanWei * SellBaoZhengJinLv * 1 ,0)                                #昨日空头保证金
        #print('空头保证金'+str(SellBaoZhengJin))
        MinChenBenBi = round(MinJiaCha / (KaiShouXuFei + PingShouXuFei),6)        #最小成本比
        OrdBuyMaxVol = round(FengXianDu * OrdAmount / BuyBaoZhengJin ,0)            #昨天 多 最大持仓量
        OrdSellMaxVol = round(FengXianDu * OrdAmount / SellBaoZhengJin ,0)        #昨天 空 最大持仓量
        pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/昨天:'+'最大持仓量:'+str(OrdBuyMaxVol)+':'+str(OrdSellMaxVol)+'/空保证金:'+str(SellBaoZhengJin)+'/空保证金率:'\
            +str(SellBaoZhengJinLv)+'/多保证金:'+str(BuyBaoZhengJin)+'/多保证金率:'+str(BuyBaoZhengJinLv)+'/最小成本比'+str(MinChenBenBi)\
            +'/开手续费:'+str(KaiShouXuFei)+'/平手续费:'+str(PingShouXuFei)+'/最小单位:'+str(MinJia)+'/最小定价:'+str(MinJiaCha)\
            +'/每手单位:'+str(MeiShouDanWei)+'/单位乘数:'+str(HeYueDanWei)+"/")
###############################################################################################多头持仓计算###############################
    if BuyQuantity>0:
        pass
        #print(str(BanKuai)+str(Name)+'/D持仓:'+str(BuyQuantity)+'/均价:'+str(BuyAvgHoldingPrice))                       
        BuyPnl = \
        round((NewSellJia - BuyAvgHoldingPrice) / MinJia * MinJiaCha * BuyQuantity - (KaiShouXuFei + PingShouXuFei) * BuyQuantity,4) #开多浮动盈亏  对手价计算减去双向手续费  
        #print(str(BanKuai)+str(Name)+'/D持仓盈亏:'+str(BuyPnl))              
        if BuyMargin == 0 or get_account(6) == 0:
            BuyFengXianDu = 0
        else:  
            BuyFengXianDu = round(BuyMargin / get_account(6),6)
            #print(str(BanKuai)+str(Name)+'/D持仓风险度:'+str(BuyFengXianDu))           
            pass
        if BuyPnl == 0 or BuyMargin == 0 or BuyAvgHoldingPrice == 0:
            BuyYingKuiLv = 0
            NewBuyBaoZhengJinLv = 0 
        else:
            BuyYingKuiLv = round(BuyPnl / BuyMargin,6)
            #print(str(BanKuai)+str(Name)+'/D盈亏率:'+str(BuyYingKuiLv))
            NewBuyBaoZhengJinLv = round(BuyMargin / BuyAvgHoldingPrice / HeYueDanWei / BuyQuantity  ,6)    #反推真实多头保证金率
            #print('/D持保证金率:'+str(NewBuyBaoZhengJinLv))  
            pass
        if  FengXianDu>0 and KeYongAmount>255 and BuyMargin>0 and BuyQuantity>0:
            BuyMaxVol = round((FengXianDu * KeYongAmount) / (BuyMargin / BuyQuantity),0
            #print(str(BanKuai)+str(Name)+'/D最大持仓:'+str(BuyMaxVol))
            if 1< MinChenBenBi < BuyMaxVol and BuyVol != BuyMaxVol:
                BuyVol = round(int(MinChenBenBi),0)           #设置默认每次下单量
                #SellVol = round(MinChenBenBi,0)          #设置默认每次下单量
                pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/多:最大持:'+str(BuyMaxVol)+'/持:'+str(BuyQuantity)+'/均价:'\
            +str(BuyAvgHoldingPrice)+'/总浮盈亏:'+str(ZongPnl)+'/持盈亏:'+str(BuyPnl)+'/盈亏率:'+str(BuyYingKuiLv)+'/持风险度:'\
            +str(BuyFengXianDu)+'/持保证金率:'+str(NewBuyBaoZhengJinLv)+'/')       
###############################################################################################空头持仓计算##########################
    if SellQuantity>0:
        pass
        #print(str(BanKuai)+str(Name)+'/K持仓:'+str(SellQuantity)+'/均价:'+str(SellAvgHoldingPrice))                       
        SellPnl = \
        round((SellAvgHoldingPrice - NewBuyJia) / MinJia * MinJiaCha * SellQuantity - (KaiShouXuFei + PingShouXuFei) * SellQuantity,4) #开空浮动盈亏 对手价计算减去双向手续费  
        #print(str(BanKuai)+str(Name)+'/K持仓盈亏:'+str(SellPnl))     
        if SellMargin  == 0 or get_account(6) == 0:
            SellFengXianDu = 0
        else:
            SellFengXianDu = round(SellMargin / get_account(6),6)
            #print(str(BanKuai)+str(Name)+'/K持仓风险度:'+str(SellFengXianDu))
            pass           
        if SellPnl  == 0 or SellMargin == 0 or SellAvgHoldingPrice == 0:
            SellYingKuiLv = 0
            NewSellBaoZhengJinLv = 0
        else:                   
            SellYingKuiLv = round(SellPnl / SellMargin,6)
            #print(str(BanKuai)+str(Name)+'/K盈亏率:'+str(SellYingKuiLv)) 
            NewSellBaoZhengJinLv = round(SellMargin / SellAvgHoldingPrice / HeYueDanWei / SellQuantity,6) #反推真实多头保证金率
            #print('/K持保证金率:'+str(NewSellBaoZhengJinLv)) 
            pass
        if FengXianDu > 0 and KeYongAmount > 255 and SellMargin > 0 and SellQuantity > 0:
            SellMaxVol = round((FengXianDu * KeYongAmount) / (SellMargin / SellQuantity),0)              
            #print(str(BanKuai)+str(Name)+'/K最大持仓:'+str(SellMaxVol))                       
            if 1< MinChenBenBi < SellMaxVol and SellVol != SellMaxVol:
                #BuyVol = round(MinChenBenBi,0)           #设置默认每次下单量
                SellVol = round(int(MinChenBenBi),0)          #设置默认每次下单量
                pass
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/空:最大持:'+str(SellMaxVol)+'/持:'+str(SellQuantity)\
            +'/均价:'+str(SellAvgHoldingPrice)+'/总浮盈亏:'+str(ZongPnl)+'/持盈亏:'+str(SellPnl)+'/盈亏率:'+str(SellYingKuiLv)\
            +'/持风险度:'+str(SellFengXianDu)+'/持保证金率:'+str(NewSellBaoZhengJinLv)+'/')       
##########################################################################################交易条件判断###################################
    if not istradertime(s1):    #不在交易时间,不进入交易段
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/不在交易时间/不进入交易段")
        if Test == 1:
            return
        else:
            return
    else:
        pass
        if 1!=0:
            pass
            if 1!=0:
                DianNaoTime = datetime.datetime.now()  ##获得当前时间->这是时间数组格式
                DianNaoTime = int(DianNaoTime.strftime("%H%M%S"))    #转换为指定的格式:
                ChengJIaoTime = int(round(get_dynainf(s1,207),0))    #行情报价最新一笔成交时间
                #print(str(BanKuai)+str(Name)+'/电脑时间'+str(DianNaoTime))
                #print(str(BanKuai)+str(Name)+'/报价时间'+str(ChengJIaoTime))
                DianNaoTimeH = round(DianNaoTime / 10000,0)    #取电脑时间小时数
                ChengJIaoTimeH = round(ChengJIaoTime / 10000,0)    #取交易时间小时数
                XiaoShiShiCha = (DianNaoTimeH - ChengJIaoTimeH)    #计算小时时间差
                if DianNaoTimeH!=ChengJIaoTimeH:    #小时数相等
                    if DianNaoTimeH == ChengJIaoTimeH:
                        TimeCha = round(DianNaoTime - ChengJIaoTime,0)    #计算成交时间差
                    else:                       
                        if DianNaoTimeH > ChengJIaoTimeH:    #小时数不相等
                            #print('交易小时>电脑小时:'+str(XiaoShiShiCha))                   
                            TimeCha = round(DianNaoTime - (ChengJIaoTime + abs(XiaoShiShiCha * 10000)),0)        #计算成交时间差
                            pass
                        if DianNaoTimeH < ChengJIaoTimeH:    #小时数不相等
                            #print('交易小时<电脑小时:'+str(XiaoShiShiCha))                   
                            TimeCha = round(DianNaoTime - (ChengJIaoTime - abs(XiaoShiShiCha * 10000)),0)        #计算成交时间差
                            pass
    #print('报价不活跃 情况完成######################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))  
########################################################################################总控 方向 模式 ################################
    if NewAmount != 0 or NewAmountShouXuFei != 0 or OrdAmount != 0:
        pass 
        if SellQuantity >= 0 or BuyQuantity >= 0:
            AmountHuiCheJinE = round(NewAmount - NewAmountShouXuFei - OrdAmount,0)    #最新账户回撤金额
            HuiCheJinE = round(OrdAmount * ZongHuiCheBiLi,6)    #设定回撤金额
            print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'设定回撤比例:'+str(ZongHuiCheBiLi)+'/设定回撤金额:'+str(HuiCheJinE) )
            if AmountHuiCheJinE < -HuiCheJinE or AmountHuiCheJinE > HuiCheJinE * 9:
                FangXiang = 0
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'设定回撤比例:'\
                    +str(ZongHuiCheBiLi)+'/账户当日回撤:'+str(AmountHuiCheJinE)+'/大于触发阀值:'+str(HuiCheJinE)+'执行风控退出平仓交易!')                       
            else:
                if ZongPnl == 0 or BaoZhengJinAmount == 0:
                    NewZongHuiCheBiLi = 0
                else:
                    NewZongHuiCheBiLi = round(ZongPnl / BaoZhengJinAmount,6)  
                    if NewZongHuiCheBiLi < -ZongHuiCheBiLi:        #回撤大于设定盈亏率        test!!!
                        FangXiang = 0
                        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'设定回撤比例:'\
                            +str(ZongHuiCheBiLi)+'/账户当日盈亏率:'+str(NewZongHuiCheBiLi)+'/大于回撤比例:'+str(ZongHuiCheBiLi)\
                            +'执行风控重启平仓交易!')
                    else:
                        if abs(int(TimeCha)) > 10 or NewChiCangLiang < 50000 or NewQianChiCangLiang < 50000 or NewBuyJia >= NewZhangTing or NewSellJia <= NewDieTing:  
                            FangXiang = 0
                            print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'/时差:'+str(TimeCha)\
                                +'秒/######################报价不活跃=======平仓######################')
                            pass
                        else:
                            if 1 != 0 and ( OpenCloseTime == 1 ):    #测试
                                #FangXiang = 0
                                print(str(BanKuai)+str(Name)+'=====================测试收盘平仓========================')
                                pass
                if 1 != 0:
                    if NewJia > NewLowJia > NewQianJieSuan:    #均价 大于 前均价 趋势多
                        FangXiang = 1
                        pass
                    if NewJia < NewHighJia < NewQianJieSuan:    #均价 小于 前均价 趋势空
                        FangXiang = -1
                        pass  
                    if NewZhenFu < ZhenFu:
                        FangXiang = 0
                        pass           
                    if CloseTime1500 == 1:    #收盘平仓
                        FangXiang = 0
                        pass  
    #print('计算持仓 盈亏 账户 情况完成##############################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#########################################################################################方向检查########################################
    if FangXiang == 0:
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/"+"风控:0:"+str(FangXiang)+'/动态盈亏率:'+str(YingKuiLv)) #调试打印输出
        pass
    if FangXiang == 1:
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/"+"趋势:1:"+str(FangXiang)+'/动态盈亏率:'+str(YingKuiLv)) #调试打印输出
        pass
    if FangXiang == 2:
        print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+"/"+"震荡:2:"+str(FangXiang)+'/动态盈亏率:'+str(YingKuiLv)) #调试打印输出  
        pass
    #print('检查方向完成#############################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
####################################################### 下单时对接盘口 #开仓平仓量大于买卖一量 重新计算下单量 ###########################
    print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'下单对接盘口之前:'+' BuyVol:'+str(BuyVol)+' SellVol:'+str(SellVol))  
    if BuyVol > NewSellOneVol > 0:
        BuyVol = int(NewSellOneVol)        #卖一量对接
    else:
        BuyVol = int(BuyVol)        #买开平量(开仓下单)
    if SellVol > NewBuyOneVol > 0:
        SellVol = int(NewBuyOneVol)        #买一量对接
    else:
        SellVol = int(SellVol)        #卖开平量(开仓下单)
    if BuyQuantity !=0:
        if BuyQuantity > NewSellOneVol > 0:
            NewBuyVol = int(NewSellOneVol)        #卖一量对接
        else:
            NewBuyVol = int(BuyQuantity)        #买平持仓量(平仓下单)
        #print('下单对接盘口之后:'+' NewBuyVol:'+str(NewBuyVol))    
    if SellQuantity !=0:
        if SellQuantity > NewBuyOneVol > 0:  
            NewSellVol = int(NewBuyOneVol)        #买一量对接
        else:
            NewSellVol = int(SellQuantity)        #卖平持仓量(平仓下单)
        #print('下单对接盘口之后:'+' NewSellVol:'+str(NewSellVol))  
    print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'下单对接盘口之后:'+' BuyVol:'+str(BuyVol)+' SellVol:'+str(SellVol))  
    #print('盘口下单置换完成########################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
##########################################################总平仓下单#####################################################################
    if 1 != 0\
        and (FangXiang == 0 ):         #开关 1==0 关闭        1 != 0 打开
        if BuyQuantity != 0:          
            sell_close(s1,"ThisClose",volume = NewBuyVol,repeat = 1,serial_id = 1)          #账户回撤大于设定值%
            pass
        if SellQuantity != 0:           
            buy_close(s1,"ThisClose",volume = NewSellVol,repeat = 1,serial_id = 2)         #账户回撤大于设定值%
            pass
        #print('回撤下单完成#########################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
################################################################ 品种结束循环 重启!######################################################
    if 1 != 1 \
        and ( (BuyMaxVol != BuyVol and SellMaxVol != SellVol) or BuyPnl !=0 or SellPnl !=0 or KaiShouXuFei != 0 \
        or PingShouXuFei != 0 or BuyQuantity > BuyVol or SellQuantity > SellVol ):                             ##构建计算条件
        ChengBen = (KaiShouXuFei + PingShouXuFei) * (BuyQuantity + SellQuantity) * ZongChengBenBi        #计算总持仓成本比金额
        BuyChengBen = (KaiShouXuFei + PingShouXuFei) * BuyQuantity * MinChenBenBi                #计算多持仓成本比金额
        SellChengBen = (KaiShouXuFei + PingShouXuFei) * SellQuantity * MinChenBenBi               #计算空持仓成本比金额
        pass
        if ZongPnl > ChengBen  and (BuyPnl > BuyChengBen and SellPnl > SellChengBen):        #多空总持仓都盈利,而且盈利都大于成本比!
            pass
            if BuyQuantity > 0 and SellQuantity > 0#多空  同时持仓盈利 总盈利盈利大于成本比 风控、趋势、震荡、 对平持仓 结束循环
                if BuyQuantity > 0 :
                    pass
                    buy_close(s1,"ThisClose",volume = NewBuyVol,repeat = 0,serial_id = 3)
                if SellQuantity > 0:
                    pass
                    sell_close(s1,"ThisClose",volume = NewSellVol,repeat = 0,serial_id = 4)       
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'多空 同时持仓盈利 风控趋势震荡对平持仓 结束循环重启!')
                pass
            #print('同时持仓盈利下单完成#############################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
        elif ZongPnl > ChengBen and (BuyPnl > BuyChengBen or SellPnl > SellChengBen):        #多空总持仓有分别盈亏,总计盈利大于成本比!
            pass
            if BuyQuantity  > 0 or SellQuantity  > 0#多空 分别 (单向或者双向) 持仓盈亏 总盈利盈利大于成本比 风控、趋势、震荡、 对平持仓 结束循环
                if BuyQuantity > 0 :
                    pass
                    buy_close(s1,"ThisClose",volume = NewBuyVol,repeat = 0,serial_id = 5)
                if SellQuantity > 0:
                    pass
                    sell_close(s1,"ThisClose",volume = NewSellVol,repeat = 0,serial_id = 6)       
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'多空 分别 (单向或者双向) 持仓合并盈利 风控趋势震荡对平持仓 结束循环重启!')
        elif ZongPnl < -ChengBen and (BuyPnl < -BuyChengBen or SellPnl < -SellChengBen):        #多空总持仓有分别亏,总计亏大于成本比!
            pass
            if BuyQuantity  > 0 or SellQuantity  > 0#多空 分别 (单向或者双向) 持仓盈亏 总盈利盈利大于成本比 风控、趋势、震荡、 对平持仓 结束循环
                if BuyQuantity > 0 :
                    pass
                    buy_close(s1,"ThisClose",volume = NewBuyVol,repeat = 0,serial_id = 7)
                if SellQuantity > 0:
                    pass
                    sell_close(s1,"ThisClose",volume = NewSellVol,repeat = 0,serial_id = 8)       
                print(str(BanKuai)+':'+str(MaxNum)+':'+str(Num)+':'+str(Name)+'多空 分别 (单向或者双向) 持仓合并亏损 风控趋势震荡对平持仓 结束循环重启!')
        else:
            pass
            #print('分别持仓盈亏下单完成#####################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
######################################################################## 开始构建信号下单 ###############################################
    #使用buy_open、sell_close等方法下单
    #下单示例:
    #buy_open(s1, "Market", volume=100)    #  市价开多
    pass
######################################################################趋势开多########################################################
    if ( NewZhangSu < -(NewZhenFu * ZhenFu) ) and FangXiang == 1:    #判断趋势 做多
        ##print(s1+'趋势多')
        if BuyQuantity == 0:
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 9)    #开多试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率              
            #sell_open(s1,"ThisClose",volume = SellVol,repeat=0,serial_id = 2)
            pass
        if BuyQuantity != 0 and BuyQuantity < BuyMaxVol:
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 10)
#####################################################################多止盈止损########################################################
    if BuyQuantity > 0 and  FangXiang == 1:
        ##print(s1)
        ##print(BuyAvgHoldingPrice)
        #BuyHuiLuo = (NewJia - BuyAvgHoldingPrice) / BuyAvgHoldingPrice
        ##print(s1+"/"+str(BuyHuiLuo)+"/"+str(HuiLuo))       
        if BuyQuantity > BuyMaxVol:  
            sell_close(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 11)         #持仓量大于最大持仓量  平多
            pass
        #if BuyYingKuiLv < -YingKuiLv and SellQuantity < SellMaxVol:
            #sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 10)         #多亏阀值止损 反手开空
            pass
#####################################################################趋势开空#########################################################
    if (  NewZhangSu > (NewZhenFu * ZhenFu) ) and FangXiang == -1:    #判断趋势 做空
        #print(s1+'趋势空')
        if SellQuantity == 0:
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 12#开空试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            #buy_open(s1,"ThisClose",volume = BuyVol,repeat=0,serial_id = 5)
            pass
        if SellQuantity != 0 and SellQuantity < SellMaxVol:
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 13)
#####################################################################空止盈止损########################################################
    if SellQuantity > 0 and  FangXiang == -1:
        ##print(s1)
        ##print(SellAvgHoldingPrice)
        #SellHuiLuo =  (SellAvgHoldingPrice - NewJia) / SellAvgHoldingPrice
        ##print(s1+"/"+str(SellHuiLuo)+"/"+str(HuiLuo))     
        if SellQuantity > SellMaxVol:  
            buy_close(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 14)         #持仓量大于最大持仓量  平空
            pass
        #if SellYingKuiLv < -YingKuiLv and BuyQuantity < BuyMaxVol:
            #buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 14)         #空亏阀值止损 反手开多
            pass  
    #print('趋势下单完成#############################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#####################################################################震荡开仓###########################################################
    if BuyQuantity == 0 and  FangXiang == 2:                                #震荡做多
        ##print(s1+'震荡多')
        if NewZhangSu < -(NewZhenFu * ZhenFu):
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 15)    #开多试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    if BuyQuantity != 0  and  FangXiang == 2:                                #震荡做多
        if BuyQuantity < BuyMaxVol and NewZhangSu < -(NewZhenFu * ZhenFu):
            buy_open(s1,"ThisClose",volume = BuyVol,repeat = 0,serial_id = 16)    #开多仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    if SellQuantity == 0 and FangXiang == 2:                                #震荡做空
        ##print(s1+'震荡空')
        if NewZhangSu > (NewZhenFu * ZhenFu):
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 17)    #开空试仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    if SellQuantity != 0 and FangXiang == 2:                                #震荡做空
        if SellQuantity < SellMaxVol and NewZhangSu > (NewZhenFu * ZhenFu):
            sell_open(s1,"ThisClose",volume = SellVol,repeat = 0,serial_id = 18)     #开空仓 取持仓信息 保证金 杠杆 手续费 风险度 盈亏率
            pass
    #print('震荡下单完成#############################################:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
#!!!!!!!!!!!!!!!!!!!! 系统有BUG   去掉     !!!!!!!!!!
# exit函数会在测评结束或者停止策略运行时会被调用。---(选择实现)
#def exit(context):
    #killtimer(handle_bar_1)    #终止计时器
    #killtimer(handle_bar_2)    #终止计时器
    #print("终止计时器/策略手动已退出!")
    #gc.collect()
    #print(str(gc.get_threshold())+'清理内存')
    #return
    #print('最后一行完成<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:'+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]))
    return

回复

举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2025-2-6 11:10 | 显示全部楼层
<think> 嗯,我现在在看这个Python策略代码,感觉有点复杂。首先,这个策略是用于期货交易的,对吧?它用了多个指标,比如KDJ和MACD,还有布林带。这些指标都是技术分析中常用的,但我不太确定它们是如何被结合起来使用的。
代码一开始定义了一些参数,比如最小订单量、空头和多头的最大仓位,这可能是在风险控制方面的设置。然后初始化了一些变量,包括KDJ线、MACD线和布林带的相关参数。这部分我大概明白,就是设定了一些初始值。

接下来是on_bar_callback函数,每当有新的TICK数据到达时就会触发。这里面计算了最新的收盘价,然后更新了KDJ、MACD和布林带的数据。这里我看到用到了talib库,这个库提供了很多技术分析指标,能很方便地计算出这些值。不过,我不太清楚这些参数的具体含义,比如KDJ中的3, 3, 5是什么意思?是快线、慢线和信号线的周期吗?

然后代码进入了策略逻辑部分。首先看空头仓位是否超过了一定的比例,如果超过了,就平掉一部分空头仓位。这可能是一种风险控制机制,防止仓位过大导致的风险。同样地,对于多头仓位也做了类似处理。

接下来是关于布林带和KDJ的交叉点的判断。当价格触碰到下布林带,并且KDJ的黄金交叉(即J > K)发生时,策略会开多仓;反之,当价格触碰上布林带并且出现死亡交叉(K > J),则开空仓。这里我不太明白为什么黄金交叉和死亡交叉的条件是这样设置的,是不是根据经验或者某种理论来的?

然后是MACD部分,如果MACD在0线之上,并且出现了金叉,就加多仓;如果在0线以下并出现死叉,则加空仓。这里我有点疑惑,为什么只看是否在0线以上或以下,而不是考虑其他情况?比如,信号线和MACD线的交叉点。

接下来是关于仓位管理的部分,如果多头仓位超过了一定比例,就平掉一部分;同样地,如果空头仓位过高,也会平掉一部分。这似乎是在控制仓位风险,防止过大的仓位导致的大幅波动。

然后还有其他条件,比如当价格在布林带中间时,可能会平仓,这取决于当前的仓位方向。这里我不太确定这是否是一个有效的策略,因为有时候价格在中间区域可能意味着趋势不明朗,不应该轻易平仓。

接下来是关于震荡操作的部分,当价格回到均线并且满足某些条件时,会开多或空仓。这可能是在利用均线作为支撑或阻力来进行交易决策。但我觉得这里面的逻辑有点混乱,不知道具体的数据是什么样的。

最后,还有一系列检查和平仓操作,比如检查当前是否有持仓,以及价格是否触发了止损点。这些都是必要的风险控制措施,但可能需要更详细地设置止损位,而不仅仅是基于某个条件。

整体来看,这个策略试图结合多个指标来进行多空操作,包括趋势跟踪和震荡交易。不过,我觉得代码中有些地方可能存在逻辑问题,比如在判断KDJ交叉点的时候,是否正确地捕捉到了买卖...

model: Ollama (deepseek-r1:70b), time: 11:10



补充内容 (2025-2-6 11:25):


以下是针对上述问题的逐步解释和建议:

1. **理解策略逻辑**:
    - 首先,分析代码中的各个指标(KDJ、MACD、布林带)如何被利用来识别买卖信号。例如,黄金交叉通常意味着上涨趋势,而死亡交叉则可能预示下跌。

2. **检查条件判断**:
    - 确保所有的条件判断是否正确捕捉到了所需的市场信号。比如,当价格触碰到布林带且KDJ出现黄金交叉时,确实应该开多仓吗?是否存在其他因素可能干扰这个信号?

3. **优化代码结构**:
    - 将重复使用的代码块封装成函数,如开仓、加仓和平仓操作,这样可以提高代码的可读性和维护性,减少冗余。

4. **完善风险控制**:
    - 除了仓位管理和止损,可以考虑增加止盈机制,以锁定利润。同时,可以设置最大回撤限制,以防止过大的亏损。

5. **参数优化**:
    - 对KDJ、MACD和布林带的参数进行调优,看看是否有更好的组合可以提高策略的表现。这可能需要通过大量历史数据回测来确定最佳参数。

6. **实时交易考虑因素**:
    - 考虑到延迟和滑点,评估这些因素对策略执行的影响。在实际交易中,确保订单能够及时准确地执行,避免由于延迟导致的重大误差。

7. **回测与验证**:
    - 使用历史数据进行详细的回测,分析策略在不同市场环境下的表现。检查策略在多种情况下是否稳定可靠,如牛市、熊市和震荡市。

8. **监控与调整**:
    - 在实盘交易中持续监控策略表现,及时发现并解决出现的问题。根据市场变化,动态调整策略参数或逻辑,以适应不同的市场条件。

通过以上步骤,可以更全面地理解和优化这个期货交易策略,使其在实际应用中更加稳定和有效。
回复

举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2025-2-6 11:36 | 显示全部楼层
<think> 嗯,我看到用户提交了一个Python脚本,似乎是一个交易策略的代码。首先,我需要理解这个代码的大致功能和结构,以便能够有效地帮助他。
从文件内容来看,这个代码是为期货交易设计的,使用了多个函数,比如on_tick、on_bar,以及一些辅助函数,如strategy_position、order_price、get_holding_pnl等。看起来这是一个基于tick数据和bar数据的自动交易系统。

接下来,我注意到用户提到了“exit”函数的问题,并指出系统存在BUG,特别是关于计时器的部分被注释掉了。这可能意味着在策略停止或测评结束时,计时器没有正确终止,导致潜在的资源泄漏或其他问题。

我还注意到代码中有许多被注释掉的print语句,这些可能是在调试过程中使用的,但现在已经不需要了。同时,有一些条件判断和逻辑结构,特别是关于订单的执行、止盈止损的设置,这些都需要仔细检查是否正确。

另外,我看到代码中有一些全局变量,如futa_glo、ftu_glo等,用于存储持仓信息和订单信息。这些在多线程或多函数调用时可能会有问题,需要确保它们的访问是线程安全的。

还有一个重要的问题是,这段代码没有包含任何错误处理机制。如果在执行订单时出现异常,比如网络问题或者其他意外情况,策略可能会崩溃,而不是优雅地处理错误并继续运行。

最后,我注意到用户试图在exit函数中终止计时器,但相关代码被注释了。这部分需要修复,以确保在策略停止时,所有的资源都能正确释放,避免潜在的问题。

综上所述,这段代码虽然结构清晰,但存在一些潜在的问题,比如错误处理、资源管理和多线程安全等。接下来,我应该逐步...

model: Ollama (deepseek-r1:70b), time: 11:36









deepseek-

补充内容 (2025-2-6 11:38):
持仓管理模块 python
回复

举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2025-2-6 11:56 | 显示全部楼层
以下是对您提交的代码的详细分析以及改进建议:

1. 文件结构与命名
问题:文件内容包含多个函数,但整体结构不够清晰,缺乏明确的模块划分。
建议:
将相关功能模块化,如将与订单执行、持仓管理、策略逻辑等分开,便于维护和扩展。
使用更具描述性的函数和变量命名,避免简写,如on_tick可以改为handle_tick_event。
2. 错误处理
问题:代码中缺乏错误处理机制,可能导致策略在出现异常时崩溃。
建议:
在关键操作(如订单执行)周围添加try-except块,捕捉和记录异常。
实现重试机制,处理暂时性的网络或系统错误。
3. 资源管理
问题:exit函数中注释掉的计时器终止代码可能导致资源泄漏。
建议:
移除注释,正确调用killtimer函数,以确保计时器在策略停止时正确终止。
确保所有系统资源(如数据库连接、文件句柄等)在退出时被妥善释放。
4. 全局变量管理
问题:使用全局变量可能导致多线程访问时的竞态条件,影响数据一致性。
建议:
使用线程安全的数据结构或互斥锁来保护对全局变量的访问。
考虑将全局变量替换为类属性,封装在一个策略管理器中,以提高代码的可维护性。
5. 注释与调试信息
问题:代码中存在大量被注释的调试语句,这可能导致代码混乱。
建议:
移除不必要的注释和调试代码,或使用日志系统来记录关键信息。
使用版本控制工具跟踪代码变更,避免在生产代码中保留过多的注释。
6. 逻辑结构
问题:条件判断部分较为复杂,可能影响可读性和维护性。
建议:
将复杂的条件逻辑拆分成小函数,每个函数负责一个特定的判断。
使用设计模式(如策略模式)来管理不同的交易逻辑。
7. 安全与合规
问题:缺乏输入验证和数据有效性检查,可能导致安全漏洞或意外行为。
建议:
在处理用户输入或外部数据时,进行充分的验证和过滤。
确保所有交易操作符合相关法律法规,并遵循合规要求。
回复

举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2025-2-11 16:17 | 显示全部楼层
20250211

无源码KaiCang无源码ChiCang.zip

12.6 KB, 下载次数: 1766

回复

举报

2

主题

5

帖子

5

积分

Rank: 1

等级: 新手上路

注册:
2025-2-13
曾用名:
发表于 2025-2-22 19:31 | 显示全部楼层
能帮我写个策略吗?用py编写,我可以付薪酬给!


补充内容 (2025-2-22 19:32):
联系方式yesing@126.com
回复

举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2025-3-25 18:53 | 显示全部楼层
星星知我心 发表于 2025-2-22 19:31
能帮我写个策略吗?用py编写,我可以付薪酬给!

抱歉 我就是写了你估计也不会用的。
只是交流一下想法而已。再没有自己的交易系统之前不能当交易使用。
回复

举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2025-3-25 19:10 | 显示全部楼层
<think>
好的,我现在需要仔细阅读用户提供的这段Python代码,并理解它的功能,然后给出一个清晰的解释。首先,这段代码看起来像是一个量化交易策略,可能用于自动化交易平台,比如聚宽或者掘金之类的。让我先通读一遍,看看各个部分的作用。

首先,代码开头有一些注释,可能是用户对代码结构的说明。然后,定义了一个context变量,这在量化策略中通常用来存储上下文信息,比如参数、持仓等。接着是init函数,这是策略的初始化函数。在这里,用户初始化了一些变量,比如symbol_list、参数设置、定时器handle_bar_1和handle_bar_2,以及一些持仓相关的变量。

接下来是handle_bar函数,这是策略的主要逻辑入口,负责处理每个周期的交易信号。里面先获取当前时间,并检查是否在交易时段(09:00到15:00)。然后遍历每个合约(symbol),获取当前价格、持仓情况等数据。

接下来有几个处理逻辑:止损止盈、仓位管理和开仓条件。止损止盈部分,用户可能根据当前价格与基准价的比较,决定是否平仓。仓位管理部分似乎根据波动率调整仓位数量。然后根据趋势判断(趋势或震荡)来决定开仓方向和数量。

之后是关于开仓的具体逻辑,包括趋势和震荡条件下的开仓,以及平仓条件。代码中还涉及一些买卖点的计算,比如最高价、最低价、波动率等。

用户可能在代码中遇到了问题,比如内存泄漏、订单执行错误,或者逻辑上的漏洞。例如,代码中有exit函数的注释,但被注释掉了,可能需要注意是否需要处理退出时的资源释放。另外,变量命名和逻辑结构可能需要优化,比如参数过多,或者条件判断复杂。

可能的问题点包括:
1. 定时器的使用是否正确?handle_bar函数被两个定时器调用,可能产生竞争条件或重复执行。
2. 变量命名可能存在混淆,比如BuyVol和SellVol是固定值,但代码中有时用BuyVol * (1+波动率)来调整仓位,可能导致计算错误。
3. 波动率的计算是否正确?比如zhenfu的计算可能使用了当前周期的最高价和最低价,但可能应该使用历史数据来平滑波动率。
4. 在止损止盈部分,条件判断是否合理?比如,价格超过基准价的一定比例才平仓,可能在快速波动时错过机会。
5. 是否存在未处理的异常情况?比如,获取历史数据时可能出错,或者订单提交失败的情况未被处理。
6. 内存管理问题,虽然有gc.collect(),但可能需要更有效的资源管理。

优化建议:
- 参数集中管理:将所有参数放在一个字典或类中,便于调整和维护。
- 波动率计算改进:使用滑动窗口或多个周期的平均波动率,而非单周期的最高最低价差。
- 条件逻辑简化:将复杂的条件拆分成函数,提高可读性。
- 错误处理:添加异常捕获,确保策略的鲁棒性。
- 资源释放:确保定时器在策略退出时正确终止,避免内存泄漏。
- 注释和文档:增加注释,解释关键步骤和变量的用途,方便他人理解。

此外,代码中的变量命名有些混乱,比如BuyVol和SellVol可能应该是固定的,但后面又用它们乘以波动率调整,这可能会导致误解。应该明确变量的作用,比如波动率调整的变量名更清晰。

还有,趋势判断的条件可能需要更详细的分析,比如使用移动平均线或RSI等指标来判断趋势方向,而不仅仅是当前涨跌幅。当前的判断逻辑可能过于简单,容易产生频繁的信号。

最后,订单执行部分需要确保没有重复提交订单,或者在未成交的情况下如何处理,比如检查订单状态或使用队列管理。
</think>

这段代码是一个基于趋势和震荡策略的期货量化交易策略,主要逻辑包括仓位管理、止损止盈以及动态调整买卖点。以下是详细分析和建议:

---

### **代码结构分析**
1. **初始化函数 `init()`**:
   - **参数设置**:定义交易品种、参数(如止损比例、波动率系数、最大持仓量等)。
   - **定时器**:设置两个定时器(`handle_bar_1` 和 `handle_bar_2`)分别在每天 15:00 和 23:59 触发策略逻辑。
   - **持仓初始化**:使用字典存储各合约的持仓量、基准价等信息。

2. **主逻辑函数 `handle_bar()`**:
   - **时间过滤**:仅在交易时段(09:00-15:00)执行策略。
   - **市场数据获取**:获取当前价格、成交量、历史最高/最低价等数据。
   - **波动率计算**:通过当前周期的最高价和最低价计算单日波动率。
   - **趋势判断**:
     - **趋势判断**:比较当前涨跌幅与阈值(如 `zd_rate`)判断趋势方向(多头、空头或震荡)。
     - **震荡判断**:若涨跌幅未达阈值,视为震荡市场。
   - **仓位管理**:
     - **止损止盈**:根据当前价格与基准价的偏离程度决定是否平仓。
     - **动态调整**:根据波动率调整买卖点和仓位比例。
   - **开平仓逻辑**:
     - **趋势跟随**:在趋势市场中根据方向开仓。
     - **震荡策略**:在震荡市场中寻找突破机会。

3. **订单处理**:
   - 使用 `order_volume` 函数提交订单,控制买卖数量和方向。
   - 订单提交后更新持仓基准价。

---

### **潜在问题与优化建议**

#### **1. 波动率计算的不合理性**
- **问题**:波动率 `zhenfu` 直接使用当前周期的最高价和最低价计算,可能过于敏感,导致策略频繁调整。
- **优化建议**:
  - 使用多周期的移动平均波动率(如5日平均波动率)平滑数据。
  - 示例:
    ```python
    # 计算过去5天的平均波动率
    h = history(5, '1m', 'high')['high']
    l = history(5, '1m', 'low')['low']
    avg_zhenfu = (h.max() - l.min()) / (h.mean() + l.mean())
    ```

#### **2. 参数管理混乱**
- **问题**:参数分散在代码中(如 `zd_rate`、`ch_rate`),难以统一调整。
- **优化建议**:
  - 将参数集中管理,例如使用字典或类:
    ```python
    params = {
        'zd_rate': 0.015,    # 趋势判断阈值
        'ch_rate': 0.15,     # 止损比例
        'max_vol': 500,      # 最大持仓量
        # ...其他参数
    }
    ```

#### **3. 条件逻辑复杂,可读性差**
- **问题**:`if-elif` 嵌套过多,导致代码难以维护。
- **优化建议**:
  - 将条件判断封装为函数,例如:
    ```python
    def determine_strategy(context, symbol):
        price = context.data[symbol].close
        # 计算涨跌幅、趋势方向等
        return 'trend_up', volume  # 返回策略类型和目标仓位
    ```

#### **4. 定时器配置风险**
- **问题**:两个定时器可能在非交易时段触发策略,导致无效计算。
- **优化建议**:
  - 添加时间过滤,确保仅在交易时段执行核心逻辑:
    ```python
    now = context.now
    if not (now.hour >= 9 and now.hour < 15):
        return
    ```

#### **5. 内存泄漏与资源管理**
- **问题**:频繁的 `gc.collect()` 调用可能暗示内存管理不当。
- **优化建议**:
  - 避免不必要的全局变量,减少数据存储。
  - 使用上下文管理器(如 `with`)管理临时资源。

#### **6. 仓位控制风险**
- **问题**:仓位调整基于波动率,可能导致过度交易。
- **优化建议**:
  - 添加仓位限制(如最大持仓比例):
    ```python
    target_vol = min(BuyVol * (1 + vol_rate), params['max_vol'])
    ```

---

### **代码优化示例**
以下是关键部分的优化示例:

```python
def handle_bar(context):
    now = context.now
    if not (9 <= now.hour < 15):
        return

    for symbol in context.symbol_list:
        price = context.data[symbol].close
        # 计算多周期波动率
        h = history(5, '1m', 'high')['high']
        l = history(5, '1m', 'low')['low']
        avg_zhenfu = (h.max() - l.min()) / (h.mean() + l.mean())

        # 动态调整买卖点
        buy_point = price * (1 + avg_zhenfu * 0.7)
        sell_point = price * (1 - avg_zhenfu * 0.7)

        # 策略判断
        strategy, target_vol = determine_strategy(context, symbol, avg_zhenfu)

        # 执行交易
        if strategy == 'trend_up':
            order_volume(symbol, target_vol - context.portfolio.positions[symbol].total_amount)
        elif strategy == 'trend_down':
            order_volume(symbol, -target_vol)  # 平仓或做空
        # ...其他策略
```

---

### **总结**
通过参数化、模块化和更健壮的条件判断,可显著提升策略的可维护性和鲁棒性。建议结合回测工具(如Backtrader、Zipline)验证优化后的策略表现。同时,需注意市场环境变化(如流动性、政策影响)对模型的影响,定期进行策略再校准。
回复

举报

0

主题

1

帖子

1

积分

Rank: 1

等级: 新手上路

注册:
2025-3-26
曾用名:
发表于 2025-3-26 23:06 | 显示全部楼层
回复

举报

7

主题

19

帖子

19

积分

Rank: 1

等级: 新手上路

注册:
2025-3-18
曾用名:
发表于 2025-3-29 09:53 | 显示全部楼层
在金字塔中如何测评你的代码? 我把你的代码复制黏贴保存为 随机开仓和持仓管理.py 或 .jpy, 系统都不识别,提示“不file:///C:/Users/Libang/Desktop/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250329095036.png是金字塔分系统文件”
回复

举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-7-31 03:34 , Processed in 0.110137 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表