增加交易策略、交易指标、量化库代码等文件夹
This commit is contained in:
1 parent
ca3b209096
commit
f57150dae8
589 files changed
+854346
-1757
No files matched your search
Binary file not shown.
@@ -0,0 +1 @@
|
||||
eyJ2ZXJzaW9uIjoiMS4wLjAuMiIsImF1dGhvciI6IiIsImF1dGhlbm5hbWUiOiJ2aXAxMCIsImRlc2MiOiIiLCJkYXRhIjoidkkrbXNwbjRMa1VFbnoxUlNoYSthSStsREpXK2JGS2VtM2hOYnJ5NDhpQy96dFhxNlBGOE1VYXo2djNsUXpQeU1hVVQ5MGkySFJ3aUdHWVY4cDduN1FWUGc1ZGdmeTgxbm4raEpUczFnMVE4a0xFUytMTUNCNkhFWnJGQkFkV1Vwanlid2QxWXZGb3puRXVzRU42bUxpMlk2REp3V25OcTFYYmlMd1loZThPK3l2UE9KRDd3OEtOUzVxMURpY01WZ1kxZVBTblhYSU9iZGViano1NUZ6NG0rZFlHbzhoZk9wUEgyQ0V0UldkWkhjRlo1RG5Ud1MrazJiSzYva2NJVS9ETkhNTHJ2YUp2OHY3KzE2QStXS0ZOeE1jYitDZnUvUHBPZnRTZG9NSm9SZFBlbElsUXZQWUpEajhlcnNlVDc3dmZVVkpudDQ1bUF3VlZsUVRRNjZjNE16eUo3dlVZT1JhaW1PODJRZ1B4bU1JYTdZSzl3Ukt1S016K0MvaVZ6NFBNalNZU0VWQmVOcWc5MnlEM2FsMDZhdFNGNUZhMlIySHZrV2lnYUZLcmhEZ1dmYlU4MnR5cEFCaGhXVjN5czZkSGQyN2lWa05HdWY1NENKMk1kLzdPRmNpcEhvV1pCNVR0US9kbzNnc096aFhJcVI2Rm1RUlpmVDN6cXo3VXhBVjRraG9XTGhQNTJiWGFSZXRrLzhHU1pwY2VCajNZbjc3cnZzNiszMGQ1Q01GczJ4VjhzMHJQcWVCWFJaMnZWTm15ZGpCeGN0R3h1UXVsKzNEQkpsRkFINkpUeW5pWTNqWTh6MmZZVk9IVHRGYmx0MlVqOHVhMTk4ZWlFRFE2TUxCZUE3NVZqWHFlRlQ3T01ZRGRSQnpUaitZOVR3L3pUNDJrUVgyOUQ4ZVI1VXo3UFZWc1M1MEtrQ2t4WHlCcG96SDVsTTdsOTRBWFl6UWRRTm1LS0FBd05Iamk5OXY4cmVQR1BTSjRmb1UvdGl2WjNxNTNZcmFsVkxRRWRSTWFCQWFLZ3B5bGNGamo3eVRKTG9GSk16MjVtUnVnVERacEhxdzA2aFdnQlhJN2VFeklPYjQ5ZlYxOWxuaUZ0eEdBeUs5NmhSdnRySndsa3BmZm9FT21XVXdBcGxuNmtlbW5VbGpzYjZ5MnBNSS8rSmhOdXQ5VmpnOWxQQWM0UnJkbklIaVBDNmFpUVpzYStIUC85ejRPMldUK3FjRW8vNGpRdXNhd21KaERaM2U4dDNNL1liaGN0Qk9PcnloR0hhTkJiWTAxNkx6NXBqU2xod1QwUVFSaGV1S2ZEZ3NuY3laQ203NXZIaDBrVkxwQzZaaC83ZU4xMlJFVTdmazFuZVdYbEtleG43SnJXVWNSbVFNTjNINGFoUDQ1Wkl2YXNKL0d3NnNyY2JPRlBuK1FXbU1DbE4wNXNndnZZNTZCZzJsV0JRZEpkYmFvZVdJaGxKWmtUdjIyRG9UaytEREJZVTZmUjA4RVUwSGpTYXB3aHYwMDJQcVljZWxnNDNDcVBFUWg5ai82Sks5SUdzNDZnVkFraTBaMFd4MjBHSURmMDRxVTFaTEZUamdNQ2FXeUdLV2dqZ2tVY3Fvam1vWEJBWWtLZENhZTZRZlZRWUZaTFE0OXM1QStnUFgzZThkVCtEZHl2Vm51QWU4MEVJb2hYU2I2VmxrNnhRS3dxV1ZFeUpnWDlSL3FIUEZDQjVrTGpJR3BWN0o5UzlEeXpyTzVlcG1PTXAzWGtrem1YbTdmK3RPa0xuMUNBanV6U3REWUVyTitQd0tOazBpNFJwQ2RQMTdVQUdvbC91WHlydW5RYldzWlZ5bzlsZnI3RFl0ckxJUVcwaTlzWEVSNDYvRG1TbGJEaHRVZ3ZwK3NpanN4amd2aTQrK3pJdFR3ZmxhdTRoREVLVHNhcDhhaUsyQ3drZUVTZUgxc3JMRWdFQ1RBVThHN002S3JQVUVmZGMyMlRMeU14Rm9RMzRhWFRHcUU1RU93N28xNmp2Rk9vOGYrUTkzVHdCa1FBREI1Q3lEd0dsOW4xa2NWWmMxZUkvZ2Q1d2x2TlRZZWlpWmI4LzhROFZIcXE0b1ZDVXpiWDdaWGF1NENPOERIS1BHeStETFNzYnZlVG90bWRwZFRWTk5SczZVazBPd3Q1Yi9sV2J4RXFmUGJKQStQam1ic2FDeWl4NGNuZ0J3NGJzOURyMmhVMDNyck1PRnR1K1JRUThoVEVTeERsSzN5UUhOUms0UmU4dlhJVkZqZHd0b2JPOUw4TFVYMXUxT2NJYWRlTFJVSkIyWnowWndpKzkyV1FwMmlOaGplQmRTWEFnbkR4SkV2eXliK2FmTFAwMldxMmdKTnlJbFRadTRXTFNYdlc0R1NsOXNQZC95dGdUdzJTdmVndlpuQ2xibjNSOEsxM21XM0I5U20wUCtLV1R1NXBsU1VNbFMzaDRzRjJRVDVSenkvTmo5UUZoNGpqcEhZajEwbHRrQ2dUQWpKT0RFb1l1VTQ5V2RuT2FSSnJIWDZLOHh3YzYrL1FEWWhaYm1MZzBoalpMOFBZQ1pBZnBsRWo4K0RkK0FmTFptdkdvS2wwUHNuQ1JRMUc4NTVSUHdMSnBESTl2QzlQZ3NQSmNoMGN2dzNyUWJZaFFsN0ppZ2doMjlnczMwR2xxL05nbzBRMDRwaHQ3Z2JNSGMwUWlrN2F2R0FZUTAvUkpNYWNDY2h3OTgrRVhiMzQ5RW5lMFhGUHZveU11M1dXY1VNNnFoeUtHekxuelI1MHdsQ2N0OWFVaGRKVmdGNkRHR1VRWGNDY2c3bi9lNDF5WE1SdkdhQzBZK3V1Uktzb2dOdHNRcnZMcFUzM0dTMDFxNitlbUpDL3NNM01ySnUxckpmZzJiU0h0dG5WTzJKZFQrYVVYNHRnVUFOdG1TRTFReFo0RTlhaTBnbUtNTjhqam5TMjBrYld2ZmFEbmY0WXkzNFRwUUhmbzdnakdsNzkvWW0zOGlMWHByWHRLVTJMZk9mczhyMGNlM1VPeGYram1OcENLMXBSK0VuRFA1R1laYnppSFozOStJcFRNRGlIeDcvekR1aGZqYVBNRVU4TENNcUtjSlBtSjRwazRUOUkwZUxiemk3WitLNlYwMlRJS3NpSlQwQnh3cE5JczJUQisyTHFEQktjbm13Vk84dEs2K1UvbW54bm00cTNOMVNJRjVKN25oSDRFSmcvZi9BOWZ5Mk5DVlFZTUoxK0lHSXR4Z2gwNitUYTI5S3R6VHo1UXVHMFVMdUxVNitZYXhiUHZxMGpuYXZZY09ndDRXRzNwZEFLRzZPdVo2TGROZTBmdGMwV2sraUxlRVZKckNNU25MRGs1a0s1OWJJQ28vbHdlK0RXS1lUcHJXU3pFdFdvckxONStnS0MzbVlub3pjQnJKdXBxU2JodGJycnVVY0xLRTdDOGM1d2JJYi8yT0JjaEN2c1lkZ0VpNmZrZFlnTk5yWE80UHlhSWhzRTl6R1g2YVFGNlRiUlM2MS96dkxGeGFZWEF1UjJRTnZaQmtENm12YTdBOXlqZ212eFVjbXA3QURUdVlOU2lYaW8xT3R6eU1CRnZPZUZLZ0tKalZtWkp1UHV1bWdnZjA2N1RBdlVsZENVYkJtNlV6Y0JucmFGUUlHekN2SUd1eGNqdStCbnFNOEtIeXhSSzJZeGxQNGtDclA0clNPN2JweVFxTXZhKzBuV09HU1RDM2VWY1dXc3B0KzhBaUF1b2lDRjZseEVvU0did0NzVFF3RmJ6ajEwNXRRS1RBMyt6WkZhMGwxYlBMU25kM0NyYU1ta3R3ajY5aVFuNkZQMmFPUXh3akRZNW1lRWc5OE5XMGVXWkR5WDUxelorZit0Y3ZBTTlhc1c4eWowYUE0RFVDbWJPQ2t5YkhiSGx4ZU5aZUY2MHZyWFg0blhaUGsySGhwWWFRRG94bzlsWDJPZ1pHTDE3bDNVNXZWRHR0NVV1SXFQZGJxbWZrakRMNWRXRFlJTlliRFJBM0VPUWl0NFZiOWRnc1dicE1DOXR4bWZ3bk50TUtjMHdLd1YzUitmUmlWYkN0MXZYdFYrcndoNFQ4VVNHY0tmaGxuZWxqNDBmSWhNVisrcDRxR01hM3FZdlZPQnR3K1hyV1lKVkEwU1FqTXg1WVkyZThJNWNSR0RNYXJSQy9HaEVSQk81UUIvQWR6RFArakg3MlBvK3c4UVhVQ3hoSk9TdmZlOUVYY1Y5WVFPU3IvT3dhQ0xpcFExb2lBQ0s3b3JkQ0hNbHlZd0t1MUtNcFpaOFFROE1ITEM4dWZ6SlQ3NWVPa3RoUWp2Y2IyUEx3d3RPSGJnMHFzWDE5MGlWdmZ3bzVZK3B2OGFCWVR4YVUvSitJc2xxTXUrNk5XTW11WmdpYnVNUHZ2aXpodGhLTlc4MkJBTWo1QW5pOUtMbGd5VUg2bEFmLzN1Z0dFUm1DUFBDSWVXVmdCZW5sSXpjOWZQZ1Arc2ltdXhLSktuMWs4YVNJZnFhV0hxZWZyVWtPME5GbUlKT21TTXhtZXBYb1IrallzeHNDNkZmTHBzTURoSDhiQmxuaVZRYVYrYjBaaVN5L1dsYTg5WnFQNUpHUmpWRDBINS9LVDFlcFFpMm8rZTdRa1dFS1lDT1hNdlNEWGJ4Z0hiVVJpaVU0N3lzck9XNWxJM1M1UHdsdElHazBXbDNmUUF1SHJHTGhUZnFYbkZMYmZpYTAySXJhU0krZGFpbnQreS9yOStaR3FCL3djZnl2RFdoRXh4Mjk5OExyZWhzcWJCVWJBci9RSXpCZDBHTWJNaHYrWnMyaWpOYVlNVndBSjMvN3ZGSmNGSm1pRkxiS1VCL0dRVjlCOHB3bVRFRGlIVGdqOUZyWHhCY0ZtcHMwSDI0ekQzd0szZzBLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
eyJ2ZXJzaW9uIjoiMS4wLjAuMiIsImF1dGhvciI6IiIsImF1dGhlbm5hbWUiOiJ2aXAxMF9ib2xsQkIiLCJkZXNjIjoiIiwiZGF0YSI6InZJK21zcG40TGtVRW56MVJTaGErYUkrbERKVytiRktlbTNoTmJyeTQ4aUJqbGNLVWJSQjMycDdIcVZHQkxEY1A2Y1lQVDVWK1J3dGNZSnFJeWVsWERkQkk2aFhCSnBUNWs3SERDdVY0L0xhNUZCNGRrZG5jRUE5VXQ1eDVhT0hkZ2FuWXkrOVdzd0JKTnZzQWpTU3RkOXM1S055Tlc3SzJJTXdpYzRBVnBtejQ5WnJER2lhT2tUVDluSnI2ZnhHcDNiNmlvRk9tS2xNc1o5R1pPZTNmR2tXNHpXck5rMEU4MXNhd0JGWXN3YVVqWlhrSmRPSHVCZ1FLTmoxU1gxNDVGYXJtRFp6SzhJRksyak1uaW9KbWRLaTZZM3RGdkQzYzlzV0JsK3BnQWlrNUtFZHUrYVkwbkczWld2OEFWV0Z2TUdtN2t0V0FQSHA5b21LcUxRMFUvM1M4V1FmUlJWMUNIOFB3Y1FvK3NDdUVNNDcveE5XWTZVRXRaY1BOVEY2SW1yeXB1cnM5cm9iekxvWG4zVmxlRXdtd1dKSlV3eWlKbGVvSXE2bWo3VVdtbDJQa0VzTFVFU2JNWmdPV2FyMS9kNTlaYXhUMEZnU1ZGVWJCZjA2Njg3ZWlPTUNHQmc5SE13MnAwcTNvL1JZZGpDTlNQTnZieksyU0VZRWdUWCtwTm1kalN3VVg0b2cxQnRLV2pMWmMydUJFcEpPVnI5TmNnTUM3OTlYRWwzK1VzR2pYN0FqZ0d4VWhDMG5sUlBRZEh2UVhjb2RLRUR3NWZKSTlwRWVBaXcxUkpldmoxUFB6MUMrWlpSaEEvOEVlNjFOaTdpVHF0MW14TnU0ejRlZ0RnbUZDVm9wUk9oaVRiMUpZQTRDV3ZhQkkySUpOejNBUWFjRDIvbWhLT2NOVzVUeTVWT1ZPR2w4SVZVM25FQ0Z0TmRLZ1Q0em83RXNrNlg1YU4zVS93bTNJaFFOTkNUTXlYU0hjODc2a1JmUFRqamczeVQvc3p0MDhDNWo4dVNXODlMczN3V3ZMYk1Od29BN2ZLc3E3cG1Lb0VWaE9zZGhEYVRzK1V3VERQSXpvQktoWmwvYWdGVyt5UnkvVFhNRTd1eXdxVk1UTHBodkcrOXFFV2ppVTJ3VjFzR2dlU25qQTB0MXVjYU14TjhvYXRWS2REUTQ5NDM3QUIrZUhLUWRGOUlaTE5SR1hGbXFWYStVWk5KMGpkV3dabDRXb0xtSy9XK21qSlVVOEhXNXY4OXAybEdwWCtxSVZqaHZpQjRVaitwTWZtMTFZeFdOZ0xDOHdlVG5NcTJWaDFURFV5UWZ5Qll1SFhML3IyMmFZOEdvWFhFYTEzN2JOUFl6VU5aSVppbTlxc1BKWnZ3VUhWQi9aWEprYWZ1bGV2ODJqaHRTSkpuOTl0L0ptSnFURjRPTGpUZXl6VWdQb0p6RjJBNTdlMXpoSEo2N2E2MG12OEUrREhjTzluL3kzSDZIbFkrQnNDUE00MGR6emFmeUVYV2VIZm0xeXRDTGxtT3ArWXdZSEJQNFdYSGRhQ2tadjc0UXhkZUtrUjdFV2p4c252UXppQ3JqS2szTDJPYmFIbGtVZFhqaW5pdXZsRmNMYlhmWVdSSXNJWXQzYmlHcDhMNTNvSGNFMmhySE0vRWdnOStRUlhaejRHNFk3QXZNbE56K1pST3E2U2hlaUk0Y3FMSnRuZVpkZGpIb0R2MVhRNHhNRFEvQXkxU1NISnk1OXZSdGlJNFZKeW1RZ3BQbXFVUUh1VUxyZW16aCtmaHdScm8xNjc5Y1RCV1JuaWNRcnVkWkRCZmR1dFRYSGtENnVzT3lkL2dpcjA1bld2UWJRQnkwUDJ1VUJSQ2VvekJYQU16MDB6ZGJSeHY5WDJ3aW1ZanZVV0x1a2IwYnU5RzhiSTBBMnN6RHJlYlBWOUx5Vk8rc2lFTUdRbS9zUGxBRXdMckVMcGxqNzZWa3VWSGp1YnI4WnBBQjN3emFsMjkvaElwTElDN3VmaE9yUGowSFF4ZjBqS3ZXaXNVN0l3cEpxVjRzYkl1VWhtL2dlbXVUOVlIdWM4cWdvcVJ4NVJrVHg2MWFCdEk0MmxCemhSTW1PY05rOFBCVzU1aHFlMG9scW40VnBvVnlXNWdkSDJHRmYzbkl2WFBoSHRYUFBhZnJ6V2FyRVNBMWxpNlZObHZYUi8rTjlHVllabjg4bmZzdjBQeFRIMjE4alZuWk0ycHRXbUo5UitsWG1ObGR4NUJjL3pkVEt1VFZrbDNQS2V6R1dCd1pIMURzVlNJMWlOVzgwUTU0THdFcTRISHMzNGxtT09YY0hjQ3N0cXR3dTdJaGdlOUFZeEJ6bXF2TndOSTZZaTA5YmRJSUpGU1lQeVVHcGZHSEdWa2pJQVZUVkM2WFBKSjIzc0JlNXdMc21iR0FWbjNuT3JKUVZHNWpJbXgxNFN2UkFWRzMxZlkrb2tVWXBKcGl0eDNTS05KaS9zcXhZUGt5eXgweHp2aS9ISFRUd1VoREs4NU40K2FzM1h4OU5CZklyYXJNSkcwLzRvTVlyRHROT1pHcVlLZzUzYTBxRHdoTnBSMCtUMnVvWVMwQkwwQ3V4eG5VbUd0TkdUekhxbndRbnBRNHJjY3VxMUlQU3FVN0tKTzZNaGpFNTQxM3RmNTBHN1dNVDluRzFoei9haWprYjZvdElyUzRCMmJKYm1sbnNNV1pnaTVsMUphekNGNWE0V2NJVGxJYXFvR0lOcjArL3VkbWZ3VHF0TlN3aFkzU0VPaENhbnZ3NHFSSFFYOXJSSS81VUNKTm1mdWlNRTBnRXZjcUFJTkxDRFNQblRoeEJoL2pObk9jZG1DNTUwdjhRMHRFbDhpUyt4cUhkS3R1TGpXTUhMcC96LzBBQUhLcjVGZEdsYzJFRjlyL0dxOHcyZXJobTZURDdaZ0NYYkJMeE5FSHdjQ1lnRGVaRlJrcnRSSGxYT2xlZVg4cXlnallUUVNzYzQwTmt6blFUT2dDWENROVpmWStIdUVBdFhueTV0UWw1a2VONWhDWGkwQVdlWnpzRXNKSU8vWGFsc2tnOWlyaXVRSTMvTXBjMjhubkxORG1nM21RNTJsS0h1bFg5VGtuMFlCeW5hNHVqdGZsNmRNaFBwYWpDMm1SYnBwaVNZQ3JOSzE3ZW8ySHBaTmVlOEJkWmpnM1NLYUtVck1lMXBqdVZhMk9GVFhlRVFiUnhqd2cyZ3NoUExJc05DbWJUVW5HTjVFdTRwQWlOMkdHZUpCeHdkWkZvV1prSE9GU0R4aUtxVTdpbHhHd1B3NFVuVG9sM0FrQVo2QU00N2tFTWtNeFM5eGVZTmR5Z0QyQ2liNkU1WC9xYWUrTU01UHRoWTExdmZPT210RDYwU3pQSGw1cnROcDZ0ZndIZlhDQUxuUC9ySkM0bUFGd0VjWE12b2ovNGh0bWFvcEZMNXJJb1BEc2FQUXMyYSttM0ZLOWRaaEthd0ZoTjNWSTU3Ukc4NUNsNTZJR3ltSHJibFhqSVZWMVcrR2JhL2tCL2s0RnlsU3JDWWp5M2o2RTRwbmdmaHk1Ky9MZVpIZ1Fzd0VpbVJ6bVlPM2d6dEVTNllycmJJM1F5aTlHWkhCbjJlWVN1ZzBNUEwvQU91UEdNOXlCWGhBZU5nNE1icHpkREtDZS9HcFc3cDV1VTQwa0xMeVhXVUNwNnR0MTdmS3MzTjBySk11VFRpblVDSGVaNE43cWJLK21oUFNHeUEzTWxZSjIxYzJZbmFJNGFNeXdoMmtXM2VQTXllTlZKRnR3b3FTU09vYUNScDUwUStyRm94cVlCUUFVWFFFbkdtNm9tQzVNQU5PYWg5YmpyM2VjZGVMS1c2Rjg5ai9CcVFEeTZQb3phRXc4cG5CUmJ4MW9oZ2FZdEl0QlhkMXpkdVMzakwxQ3l0U29IRmV3OEdPWEZDQ2V1bitKTFRtaVVHclovekNlV2ZSL3ZZWHdLMUpKdHROVnlMSFgxOWR5di9kem1RMkdHSVZmbm8wOU1UbVBOb0ZUamxROU1RMlUzR2JqSks0bjVNN2loNkc2RjNBZFBHQW9melFIbWx2K0JMT0hiYnIzWjkxa0FYZ1NjOWUzbW5haFVWUkwxOHlwU0JNMm5Ld08xdXFBZkZuNnlXNnJwTXV3Tlo0SGxqSy96TXpxZ3RteThzY2xQTEs1ZmhqelJHaUJQcGhXZ3V0WmpUeHBEVVpiODYybEZ0OVJpRUVBeDJ3UU5RYlU5aEhUaElJRzlsNUJiak9zaWtPZ292MDRQTzVEdHZvK1kzaFBPQWNhWG1mSG9WejhmNDB3azdpc1VwUWRwU3ZZdjRiK3hINCtxSVpyclZpWUR3RXJZdWFBSHNrTzBYQSt6NHNad2F3Y2QzOXpaU1JTK1d6UmZLQUNqVU1KODBuaHFMVGVtdFVjNE1UV2NhekpSZitJb3ljVk1uZ2c2QmYySmNpS2xwb1hOUjQrTC82blg3SnlYUXJvVVdWSkhsYTNzYmF3eWhhOHIzblF6eUdNSnZjRmFQZm1sSjZIOTBRYVN1d2ZTMkRKUWUvWTdEaHorTnVPdTJnQ0RGc2tDNDNaSlE5TytTN01hNUVoRkJ6bktPVVdlRm9RdGhvMVRxdGxtNlowNkc1MDJiUGdWL3QvQnVQeFhZY3lrc21LS3VCUHhYWi9XdkFLS00ybXJlOFYycDZGaUVQa0U3SkZSWjh4Q2VSV3FhNWNBU1pJWkhCRmt0bkhqZWRBdk9wV2FoenBKYlE3Q1Q0WHhtVXVVb0J4N2FIM04rVG4xYnFIYWxaMm1jZVlQSVkzOWlWU21VU0wzTktoOHhqY2ZBME1QRXhpbXVwUW9rcHdqQTI2UVNiZnh5SEYrZE1uSHpEM1pmbEVoUHRLine truncated
|
||||
@@ -0,0 +1,179 @@
|
||||
//------------------------------------------------------------------------
|
||||
// 简称: vip09
|
||||
// 名称: vip09
|
||||
// 类别: 公式应用
|
||||
// 类型: 用户应用
|
||||
// 输出: Void
|
||||
//------------------------------------------------------------------------
|
||||
Params
|
||||
//默认螺纹888 1小时
|
||||
Numeric Length(20); //周期
|
||||
Numeric Offset(2); //标准差倍数
|
||||
Numeric X(0.5);
|
||||
Numeric SS(0.01);
|
||||
Numeric TRS(75);//移动止损止盈幅度 参数范围及步长: 5-100,5
|
||||
Numeric Fund(20000); //投入保证金;
|
||||
Vars
|
||||
Numeric Lots(0);
|
||||
Series<Numeric> ma1;
|
||||
Series<Numeric> UpLine; //上轨
|
||||
Series<Numeric> DownLine; //下轨
|
||||
Series<Numeric> MidLine; //中间线
|
||||
Series<Numeric> Band;
|
||||
|
||||
Series<Numeric> cond1;
|
||||
Series<Numeric> cond2;
|
||||
Series<Numeric> cond3;
|
||||
Series<Numeric> cond4;
|
||||
|
||||
Series<Numeric> kcond1;
|
||||
Series<Numeric> kcond2;
|
||||
Series<Numeric> kcond3;
|
||||
Series<Numeric> kcond4;
|
||||
|
||||
//出场变量
|
||||
Series<Numeric> MyPrice;//开仓价格
|
||||
Series<Numeric> MyPrice2;//开仓价格
|
||||
Series<Numeric> HighAfterEntry;//开仓后出现的最高价
|
||||
Series<Numeric> LowAfterEntry;//开仓后出现的最低价
|
||||
Series<Numeric> liQKA;
|
||||
Series<Numeric> DliqPoint;
|
||||
Series<Numeric> KliqPoint;
|
||||
Series<Numeric> barcoutN;
|
||||
Series<Numeric> bar_entry_count;
|
||||
Series<Numeric> kaicang_kg;
|
||||
Series<Numeric> BB;
|
||||
Series<Numeric> WIDTH;
|
||||
Plot plt1;
|
||||
Plot plt2;
|
||||
Events
|
||||
//此处实现事件函数
|
||||
|
||||
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
|
||||
OnInit()
|
||||
{
|
||||
//与数据源有关
|
||||
Range[0:DataCount-1]
|
||||
{
|
||||
//=========数据源相关设置==============
|
||||
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
|
||||
|
||||
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
|
||||
|
||||
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
|
||||
|
||||
//AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
|
||||
plt1.figure(0); //plt_vol单独设置画板,没有指定画板id,系统自动创建
|
||||
plt2.figure(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
|
||||
OnBar(ArrayRef<Integer> indexs)
|
||||
{
|
||||
|
||||
Lots = Max(1, Round(Fund/(O*ContractUnit*BigPointValue* MarginRatio/rollover), 0));
|
||||
MidLine = AverageFC(Close,Length);
|
||||
Band = StandardDev(Close,Length,2);
|
||||
UpLine = MidLine + Offset * Band;
|
||||
DownLine = MidLine - Offset * Band;
|
||||
|
||||
PlotNumeric("MidLine",cond1,cond1,White);
|
||||
PlotNumeric("UpLine",cond2,cond2,red);
|
||||
PlotNumeric("DownLine",cond3,cond3,Green);
|
||||
|
||||
//布林极限(BB)=(收盘价-布林下轨价格)/(布林上轨价格-布林下轨价格)
|
||||
BB=((C-DownLine)/(UpLine-DownLine));
|
||||
//WIDTH=(布林上轨值-布林下轨值)/布林平均值
|
||||
WIDTH=((UpLine-DownLine)/MidLine);
|
||||
plt1.line("BB",BB); //画线
|
||||
plt2.line("WIDTH",WIDTH);
|
||||
|
||||
|
||||
if(MarketPosition!=1 and H>=UpLine[1] and C[1]<UpLine[1] and BB[1]>X and WIDTH[1]>SS)
|
||||
{
|
||||
Buy(Lots,max(open,UpLine[1])); // 如果满足开多条件,则买入
|
||||
LowAfterEntry = EntryPrice;//保存多头开仓价格;
|
||||
kaicang_kg=1; // 标记已开仓
|
||||
bar_entry_count=0; // 重置连续未开仓的Bar计数
|
||||
barcoutN=0; //重置liQKA系数的计算
|
||||
liQKA = 1;
|
||||
}
|
||||
|
||||
if(MarketPosition!=-1 and L<=DownLine[1] and C[1]>DownLine[1] and BB[1]<X and WIDTH[1]>SS)
|
||||
{
|
||||
SellShort(Lots,min(open,DownLine[1])); // 如果满足开空条件,则卖空
|
||||
HighAfterEntry = EntryPrice;//保存空头开仓价格;
|
||||
kaicang_kg=1; // 标记已开仓
|
||||
bar_entry_count=0; // 重置连续未开仓的Bar计数
|
||||
barcoutN=0; //重置liQKA系数的计算
|
||||
liQKA = 1;
|
||||
}
|
||||
|
||||
|
||||
if(kaicang_kg[1] ==1) // 如果在本周期内有开仓操作
|
||||
{
|
||||
bar_entry_count=bar_entry_count+1; // 将开仓计数器加一
|
||||
}
|
||||
Else
|
||||
{
|
||||
bar_entry_count=0; // 如果没有开仓,则将开仓计数器重置为 0
|
||||
}
|
||||
|
||||
//移动出场
|
||||
If(MarketPosition == 0) // 自适应参数默认值;
|
||||
{
|
||||
liQKA = 1;
|
||||
barcoutN=0;
|
||||
}Else if(bar_entry_count>barcoutN) //当有持仓的情况下,liQKA会随着持仓时间的增加而逐渐减小,即止损止盈幅度乘数的减少。
|
||||
{
|
||||
liQKA = liQKA - 0.1;
|
||||
liQKA = Max(liQKA,0.3);
|
||||
barcoutN=bar_entry_count;
|
||||
}
|
||||
|
||||
Commentary("kaicang_kg[1]"+text(kaicang_kg[1]));
|
||||
Commentary("bar_entry_count"+text(bar_entry_count));
|
||||
Commentary("barcoutN"+text(barcoutN));
|
||||
Commentary("liQKA"+text(liQKA));
|
||||
// 记录开仓后的最高点和最低点
|
||||
If(bar_entry_count > 0)
|
||||
{
|
||||
HighAfterEntry = Min(HighAfterEntry,High); // 空头止损,更新最低的最高价
|
||||
LowAfterEntry = Max(LowAfterEntry,Low); // 多头止损,更新最高的最低价
|
||||
}
|
||||
|
||||
if(MarketPosition>0)
|
||||
{
|
||||
DliqPoint = LowAfterEntry - (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
|
||||
}
|
||||
if(MarketPosition<0)
|
||||
{
|
||||
KliqPoint = HighAfterEntry + (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
|
||||
}
|
||||
|
||||
If(KliqPoint[1]>0 and MarketPosition<0)PlotNumeric("KliqPoint[1]",KliqPoint[1]);
|
||||
if(DliqPoint[1]>0 and MarketPosition>0)PlotNumeric("DliqPoint[1]",DliqPoint[1]);
|
||||
|
||||
// 持有多单时
|
||||
If(MarketPosition >0 And bar_entry_count >0 And Low <= DliqPoint[1] and DliqPoint[1]>0 and DliqPoint[1]>0 and bar_entry_count>0)
|
||||
{
|
||||
|
||||
Sell(0,Min(Open,DliqPoint[1]));
|
||||
DliqPoint=0;
|
||||
kaicang_kg=0;
|
||||
}
|
||||
|
||||
// 持有空单时
|
||||
If(MarketPosition <0 And bar_entry_count >0 And High >= KliqPoint[1] and KliqPoint[1]>0 and KliqPoint[1]>0 and bar_entry_count>0)
|
||||
{
|
||||
|
||||
BuyToCover(0,Max(Open,KliqPoint[1]));
|
||||
KliqPoint=0;
|
||||
kaicang_kg=0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,158 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from datetime import datetime\n",
|
||||
"\n",
|
||||
"from vnpy.trader.optimize import OptimizationSetting\n",
|
||||
"from vnpy_ctastrategy.backtesting import BacktestingEngine\n",
|
||||
"# from vnpy_ctastrategy.strategies.vip10 import vip10\n",
|
||||
"from vip10 import vip10"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"engine = BacktestingEngine()\n",
|
||||
"engine.set_parameters(\n",
|
||||
" vt_symbol=\"rb888.SHFE\",\n",
|
||||
" interval=\"1h\",\n",
|
||||
" start=datetime(2020, 1, 1),\n",
|
||||
" end=datetime(2024, 3, 21),\n",
|
||||
" rate=1.5/10000,\n",
|
||||
" slippage=1,\n",
|
||||
" size=10,\n",
|
||||
" pricetick=1,\n",
|
||||
" capital=1_000_00,\n",
|
||||
")\n",
|
||||
"engine.add_strategy(vip10, {})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2024-08-25 20:34:47.539362\t开始加载历史数据\n",
|
||||
"2024-08-25 20:34:47.539362\t加载进度:# [0%]\n",
|
||||
"2024-08-25 20:34:47.747392\t加载进度:# [10%]\n",
|
||||
"2024-08-25 20:34:47.748385\t加载进度:## [20%]\n",
|
||||
"2024-08-25 20:34:47.748385\t加载进度:### [30%]\n",
|
||||
"2024-08-25 20:34:47.749381\t加载进度:#### [40%]\n",
|
||||
"2024-08-25 20:34:47.749381\t加载进度:##### [50%]\n",
|
||||
"2024-08-25 20:34:47.750388\t加载进度:###### [60%]\n",
|
||||
"2024-08-25 20:34:47.750388\t加载进度:####### [70%]\n",
|
||||
"2024-08-25 20:34:47.751394\t加载进度:######## [80%]\n",
|
||||
"2024-08-25 20:34:47.751394\t加载进度:######### [90%]\n",
|
||||
"2024-08-25 20:34:47.751394\t加载进度:########## [100%]\n",
|
||||
"2024-08-25 20:34:47.752372\t历史数据加载完成,数据量:0\n",
|
||||
"2024-08-25 20:34:47.752372\t策略初始化完成\n",
|
||||
"2024-08-25 20:34:47.752372\t开始回放历史数据\n",
|
||||
"2024-08-25 20:34:47.752372\t历史数据回放结束\n",
|
||||
"2024-08-25 20:34:47.752372\t开始计算逐日盯市盈亏\n",
|
||||
"2024-08-25 20:34:47.752372\t回测成交记录为空\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ename": "KeyError",
|
||||
"evalue": "\"None of ['date'] are in the columns\"",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[1;32mIn[3], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m engine\u001b[38;5;241m.\u001b[39mload_data()\n\u001b[0;32m 2\u001b[0m engine\u001b[38;5;241m.\u001b[39mrun_backtesting()\n\u001b[1;32m----> 3\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mengine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcalculate_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4\u001b[0m engine\u001b[38;5;241m.\u001b[39mcalculate_statistics()\n\u001b[0;32m 5\u001b[0m engine\u001b[38;5;241m.\u001b[39mshow_chart()\n",
|
||||
"File \u001b[1;32mc:\\veighna_studio\\lib\\site-packages\\vnpy_ctastrategy\\backtesting.py:283\u001b[0m, in \u001b[0;36mBacktestingEngine.calculate_result\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 280\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, value \u001b[38;5;129;01min\u001b[39;00m daily_result\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__dict__\u001b[39m\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m 281\u001b[0m results[key]\u001b[38;5;241m.\u001b[39mappend(value)\n\u001b[1;32m--> 283\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdaily_df \u001b[38;5;241m=\u001b[39m \u001b[43mDataFrame\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresults\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_index\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdate\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 285\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moutput(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m逐日盯市盈亏计算完成\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 286\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdaily_df\n",
|
||||
"File \u001b[1;32mc:\\veighna_studio\\lib\\site-packages\\pandas\\core\\frame.py:6109\u001b[0m, in \u001b[0;36mDataFrame.set_index\u001b[1;34m(self, keys, drop, append, inplace, verify_integrity)\u001b[0m\n\u001b[0;32m 6106\u001b[0m missing\u001b[38;5;241m.\u001b[39mappend(col)\n\u001b[0;32m 6108\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing:\n\u001b[1;32m-> 6109\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNone of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmissing\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m are in the columns\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 6111\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inplace:\n\u001b[0;32m 6112\u001b[0m frame \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\n",
|
||||
"\u001b[1;31mKeyError\u001b[0m: \"None of ['date'] are in the columns\""
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"engine.load_data()\n",
|
||||
"engine.run_backtesting()\n",
|
||||
"df = engine.calculate_result()\n",
|
||||
"engine.calculate_statistics()\n",
|
||||
"engine.show_chart()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"'''用于参数优化'''\n",
|
||||
"# setting = OptimizationSetting()\n",
|
||||
"# setting.set_target(\"sharpe_ratio\")\n",
|
||||
"# setting.add_parameter(\"Length\", 5, 80, 5)\n",
|
||||
"# setting.add_parameter(\"Offset\", 0.5, 3, 0.5)\n",
|
||||
"# setting.add_parameter(\"X\", 1, 3, 1)\n",
|
||||
"# setting.add_parameter(\"TS\", 5, 80, 5)\n",
|
||||
"# from multiprocessing import cpu_count\n",
|
||||
"# # 获取 CPU 核心数量\n",
|
||||
"# num_cores = cpu_count()\n",
|
||||
"# print(f\"获取 CPU 核心数量:\",round(num_cores/2))\n",
|
||||
"# engine.run_ga_optimization(setting, max_workers=round(num_cores/2))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# engine.run_bf_optimization(setting)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.9"
|
||||
},
|
||||
"vscode": {
|
||||
"interpreter": {
|
||||
"hash": "1b43cb0bd93d5abbadd54afed8252f711d4681fe6223ad6b67ffaee289648f85"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -0,0 +1,211 @@
|
||||
from vnpy_ctastrategy import (
|
||||
CtaTemplate,
|
||||
TargetPosTemplate,
|
||||
StopOrder,
|
||||
TickData,
|
||||
BarData,
|
||||
TradeData,
|
||||
OrderData,
|
||||
BarGenerator,
|
||||
ArrayManager,
|
||||
)
|
||||
import pandas as pd
|
||||
|
||||
class vip10(TargetPosTemplate):
|
||||
""""""
|
||||
author = "松鼠Quant"
|
||||
|
||||
#默认螺纹888 1小时
|
||||
|
||||
Length = 50 #布林周期
|
||||
Offset=2 #标准差倍数倍数
|
||||
X=2 #过滤均线的Length倍数, 范围及步长:1-5,1
|
||||
TS = 60 #移动止损止盈幅度 参数范围及步长: 5-200,5
|
||||
|
||||
|
||||
lots=1 #下单手数
|
||||
|
||||
current_bar = 0
|
||||
|
||||
Highup=0
|
||||
Lowdown=0
|
||||
|
||||
HigherAfterEntry = float('inf')
|
||||
LowerAfterEntry = -float('inf')
|
||||
liQKA = 0
|
||||
DliqPoint = 0
|
||||
KliqPoint = 0
|
||||
OBVValue=[0]
|
||||
MAOBV=[0]
|
||||
M2=[0]
|
||||
|
||||
cond1=[0]*2
|
||||
cond2=[0]*2
|
||||
cond3=[0]*2
|
||||
|
||||
kong_cond1=[0]*2
|
||||
kong_cond2=[0]*2
|
||||
kong_cond3=[0]*2
|
||||
|
||||
|
||||
MA1=0
|
||||
MA2=0
|
||||
MA3=0
|
||||
BB=0
|
||||
WIDTH=0
|
||||
|
||||
|
||||
|
||||
|
||||
parameters = ["Length",'Offset','X',"TS",'lots']
|
||||
variables = ["HigherAfterEntry","LowerAfterEntry","liQKA","DliqPoint","KliqPoint"]
|
||||
|
||||
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
|
||||
""""""
|
||||
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
|
||||
|
||||
#df: pd.DataFrame = pd.read_csv(r"index_contract.csv")
|
||||
#self.contracts_sizes = {row.vt_symbol.split('.')[0]: row.contract_size for _, row in df.iterrows()}
|
||||
|
||||
self.bg = BarGenerator(self.on_bar)
|
||||
self.am = ArrayManager(300)
|
||||
self.pos=0
|
||||
|
||||
def on_init(self):
|
||||
"""
|
||||
Callback when strategy is inited.
|
||||
"""
|
||||
self.write_log("策略初始化")
|
||||
self.load_bar(1)
|
||||
|
||||
def on_start(self):
|
||||
"""
|
||||
Callback when strategy is started.
|
||||
"""
|
||||
self.write_log("策略启动")
|
||||
|
||||
def on_stop(self):
|
||||
"""
|
||||
Callback when strategy is stopped.
|
||||
"""
|
||||
self.write_log("策略停止")
|
||||
|
||||
def on_tick(self, tick: TickData):
|
||||
"""
|
||||
Callback of new tick data update.
|
||||
"""
|
||||
self.bg.update_tick(tick)
|
||||
|
||||
def on_bar(self, bar: BarData):
|
||||
"""
|
||||
Callback of new bar data update.
|
||||
"""
|
||||
self.cancel_all()
|
||||
am = self.am
|
||||
am.update_bar(bar)
|
||||
|
||||
if not am.inited:
|
||||
return
|
||||
# 如果历史数据还没有初始化完毕,则直接返回
|
||||
# 注意:am 是交易系统中的一个数据管理器,可能用于管理历史数据
|
||||
# bar 是当前的K线数据,其中包含了开盘价、最高价、最低价、收盘价和成交量等信息
|
||||
|
||||
self.current_bar=self.current_bar+1 #Bar线计数
|
||||
#print(bar.datetime,"current_bar:",self.current_bar)
|
||||
|
||||
|
||||
# 如果当前Bar的计数器值小于三倍的Length,则直接返回
|
||||
if(self.current_bar<self.Length*self.X):
|
||||
return
|
||||
|
||||
#中轨
|
||||
self.MA1=am.ema(self.Length,array=True)
|
||||
self.MA2=am.ema(self.Length*self.X,array=True)
|
||||
# #上下轨
|
||||
self.boll_up, self.boll_down = am.boll(self.Length, self.Offset,array=True)
|
||||
|
||||
# 多头开仓条件
|
||||
self.cond1=self.MA1 if self.MA1[-1]>self.MA1[-2] and am.close_array[-1] > self.MA1[-2] else self.cond1
|
||||
self.cond2=self.boll_up if self.boll_up[-1] > self.boll_up[-2] and am.high_array[-1] > self.boll_up[-1] else self.cond2
|
||||
self.cond3=self.MA2 if self.MA2[-1] > self.MA2[-2] and am.close_array[-1] > self.MA2[-1] else self.cond3
|
||||
|
||||
|
||||
# 空头开仓条件
|
||||
self.kong_cond1=self.MA1 if self.MA1[-1] < self.MA1[-2] and am.close_array[-1] < self.MA1[-2] else self.kong_cond1
|
||||
self.kong_cond2=self.boll_down if self.boll_down[-1] < self.boll_down[-2] and am.low_array[-1] < self.boll_down[-1] else self.kong_cond2
|
||||
self.kong_cond3=self.MA2 if self.MA2[-1] < self.MA2[-2] and am.close_array[-1] < self.MA2[-1] else self.kong_cond3
|
||||
|
||||
|
||||
#布林极限(BB)=(收盘价-布林下轨价格)/(布林上轨价格-布林下轨价格)
|
||||
self.BB=((am.close_array[-1]-self.boll_down[-1])/(self.boll_up[-1]-self.boll_down[-1]))
|
||||
|
||||
|
||||
#极限宽,WIDTH=(布林上轨值-布林下轨值)/布林平均值,VIP10用不到这个算法,可以自己拓展
|
||||
self.WIDTH=((self.boll_up[-1]-self.boll_down[-1])/self.boll_up[-1])*100
|
||||
|
||||
if self.cond1[-1]>self.cond1[-2] and self.cond2[-1]>self.cond2[-2] and self.cond3[-1]>self.cond3[-2] and self.BB>0.5 :
|
||||
if self.pos!=1 and bar.high_price>=self.cond2[-1] :
|
||||
if self.pos == 0:
|
||||
self.buy(bar.close_price, self.lots)
|
||||
elif self.pos < 0:
|
||||
self.cover(bar.close_price, self.lots)
|
||||
self.buy(bar.close_price, self.lots)
|
||||
self.liQKA = 1
|
||||
self.LowerAfterEntry = bar.close_price
|
||||
|
||||
|
||||
if self.kong_cond1[-1]<self.kong_cond1[-2] and self.kong_cond2[-1]<self.kong_cond2[-2] and self.kong_cond3[-1]<self.kong_cond3[-2] and self.BB<0.5 :
|
||||
if self.pos!=-1 and bar.low_price<=self.kong_cond2[-1] :
|
||||
if self.pos == 0:
|
||||
self.short(bar.close_price, self.lots)
|
||||
elif self.pos > 0:
|
||||
self.sell(bar.close_price, self.lots)
|
||||
self.short(bar.close_price, self.lots)
|
||||
self.liQKA = 1
|
||||
self.HigherAfterEntry = bar.close_price
|
||||
|
||||
|
||||
#记录入场后的最高价和最低价
|
||||
if self.pos>0:
|
||||
#self.HigherAfterEntry = HigherAfterEntry
|
||||
self.LowerAfterEntry = max(self.LowerAfterEntry, bar.low_price)
|
||||
elif self.pos<0:
|
||||
self.HigherAfterEntry = min(self.HigherAfterEntry, bar.high_price)
|
||||
#self.LowerAfterEntry = LowerAfterEntry
|
||||
|
||||
if self.pos == 0:
|
||||
self.liQKA = 1
|
||||
else:
|
||||
self.liQKA = self.liQKA - 0.1
|
||||
self.liQKA = max(self.liQKA, 0.5)
|
||||
|
||||
if self.pos>0:
|
||||
DliqPoint = self.LowerAfterEntry - ((bar.open_price)*self.TS/1000)*self.liQKA
|
||||
#print(bar.datetime,"DliqPoint",DliqPoint,"low_price",bar.low_price,"self.LowerAfterEntry",self.LowerAfterEntry)
|
||||
if self.pos<0:
|
||||
KliqPoint = self.HigherAfterEntry + ((bar.open_price)*self.TS/1000)*self.liQKA
|
||||
#print(bar.datetime,"KliqPoint",KliqPoint,"high_price",bar.high_price,"self.HigherAfterEntry",self.HigherAfterEntry)
|
||||
|
||||
if (self.pos>0 and bar.low_price <= DliqPoint and DliqPoint>0):
|
||||
#多头出场
|
||||
self.sell(bar.close_price, self.lots)
|
||||
elif (self.pos<0 and bar.high_price > KliqPoint and KliqPoint>0):
|
||||
#空头出场
|
||||
self.cover(bar.close_price, self.lots)
|
||||
|
||||
self.current_bar += 1
|
||||
self.put_event()
|
||||
|
||||
|
||||
def on_trade(self, trade: TradeData):
|
||||
"""
|
||||
Callback of new trade data update.
|
||||
"""
|
||||
self.put_event()
|
||||
|
||||
|
||||
def on_stop_order(self, stop_order: StopOrder):
|
||||
"""
|
||||
Callback of stop order update.
|
||||
"""
|
||||
pass
|
||||
Reference in new issue
Block a user