파이썬의 단일 종 전략을 다종 전략으로 바꾸는 법을 가르쳐줍니다.

저자:리디아, 창작: 2022-12-20 17:26:27, 업데이트: 2023-09-20 09:45:28

img

파이썬 단일 통화 전략을 다화화 통화 전략으로 변환하는 법을 가르쳐

I. 파이썬의 단일 통화 전략을 다화폐 전략으로 변환하는 법을 가르쳐라

지난 기사에서는 매우 간단한 파이썬 전략을 구현했습니다.파이썬 버전의 우승자를 구매하는 전략, 이 전략은 특정 거래 쌍에서 프로그램 거래를 수행하는 계정을 운영할 수 있습니다. 원리는 매우 간단합니다. 즉, 증가 한 후 추격하고 감소 한 후 죽입니다. 때로는 다른 거래 쌍을 운영하는 데 동일한 거래 논리를 사용하기를 원합니다. 여러 로봇을 만들고 다양한 통화에서 거래를 수행하기 위해 다른 거래 쌍을 설정할 수 있습니다. 전략이 매우 복잡하지 않은 경우 FMZ 양자 거래 플랫폼의 강력한 유연성을 고려하여 전략을 여러 종의 전략으로 변환하는 것이 쉽습니다.

변환 후 전략 소스 코드:

'''backtest
start: 2019-02-20 00:00:00
end: 2020-01-10 00:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"},{"eid":"OKEX","currency":"ETH_USDT","stocks":30},{"eid":"OKEX","currency":"LTC_USDT","stocks":100}]
'''

import time
import json

params = {
    "arrBasePrice": [-1, -1, -1],     # -1
    "arrRatio": [0.05, 0.05, 0.05],         # 0.05
    "arrAcc": [],           # _C(exchange.GetAccount)
    "arrLastCancelAll": [0, 0, 0], # 0
    "arrMinStocks": [0.01, 0.01, 0.01],     # 0.01
    "arrPricePrecision": [2, 2, 2], # 2
    "arrAmountPrecision": [3, 2, 2], # 2
    "arrTick":[]
}

def CancelAll(e):
    while True : 
        orders = _C(e.GetOrders)
        for i in range(len(orders)) :
            e.CancelOrder(orders[i]["Id"], orders[i])
        if len(orders) == 0 :
            break
        Sleep(1000)

def process(e, index):
    global params
    ticker = _C(e.GetTicker)
    params["arrTick"][index] = ticker
    if params["arrBasePrice"][index] == -1 :
        params["arrBasePrice"][index] = ticker.Last
    if ticker.Last - params["arrBasePrice"][index] > 0 and (ticker.Last - params["arrBasePrice"][index]) / params["arrBasePrice"][index] > params["arrRatio"][index]:
        params["arrAcc"][index] = _C(e.GetAccount)
        if params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last > params["arrMinStocks"][index]:
            e.Buy(ticker.Last, params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last)
            params["arrBasePrice"][index] = ticker.Last
    if ticker.Last - params["arrBasePrice"][index] < 0 and (params["arrBasePrice"][index] - ticker.Last) / params["arrBasePrice"][index] > params["arrRatio"][index]: 
        params["arrAcc"][index] = _C(e.GetAccount)
        if params["arrAcc"][index].Stocks * params["arrRatio"][index] > params["arrMinStocks"][index]:
            e.Sell(ticker.Last, params["arrAcc"][index].Stocks * params["arrRatio"][index])
            params["arrBasePrice"][index] = ticker.Last
    ts = time.time()
    if ts - params["arrLastCancelAll"][index] > 60 * 5 :
        CancelAll(e)
        params["arrLastCancelAll"][index] = ts 

def main():
    global params
    
    for i in range(len(exchanges)) :    
        params["arrAcc"].append(_C(exchanges[i].GetAccount))
        params["arrTick"].append(_C(exchanges[i].GetTicker))
        exchanges[i].SetPrecision(params["arrPricePrecision"][i], params["arrAmountPrecision"][i])

    for key in params :
        if len(params[key]) < len(exchanges):
            raise "params error!"

    while True:
        tblAcc = {
            "type" : "table",
            "title": "account",
            "cols": ["Account information"], 
            "rows": []
        }        

        tblTick = {
            "type" : "table",
            "title": "ticker",
            "cols": ["Market information"], 
            "rows": []
        }
        for i in range(len(exchanges)): 
            process(exchanges[i], i)

        for i in range(len(exchanges)):
            tblAcc["rows"].append([json.dumps(params["arrAcc"][i])])
            tblTick["rows"].append([json.dumps(params["arrTick"][i])])

        LogStatus(_D(), "\n`" + json.dumps([tblAcc, tblTick]) + "`")
        Sleep(500)

II. 차이점 을 찾아라

이 코드 를 비교 해 보면, 이전 기사 의 코드 와 크게 다르다는 것 을 발견 해 보셨습니까? 사실, 거래 논리는 전혀 변경되지 않고 정확히 동일합니다. 우리는 단지 여러 종으로 전략을 수정합니다, 우리는 전략 매개 변수로서 이전 형태의 단일 변수를 사용할 수 없습니다. 더 합리적인 해결책은 매개 변수를 배열로 만들고 배열의 각 포지션의 인덱스는 추가 된 거래 쌍에 대응합니다.

img

다음에는 함수로 거래 논리의 코드를 캡슐화process. 메인 전략 루프에서, 추가 트레이딩 페어에 따라 반복적으로 이 함수를 호출하고, 각 트레이딩 페어가 트레이딩 로직 코드를 한 번 실행하도록 합니다.

  • 반복 (횡단) 호출:
for i in range(len(exchanges)): 
    process(exchanges[i], i)
  • 전략 매개 변수
params = {
    "arrBasePrice": [-1, -1, -1],           # -1
    "arrRatio": [0.05, 0.05, 0.05],         # 0.05
    "arrAcc": [],                           # _C(exchange.GetAccount)
    "arrLastCancelAll": [0, 0, 0],          # 0
    "arrMinStocks": [0.01, 0.01, 0.01],     # 0.01
    "arrPricePrecision": [2, 2, 2],         # 2
    "arrAmountPrecision": [3, 2, 2],        # 2
    "arrTick":[]
}

이 디자인은 각 거래 쌍이 자신의 매개 변수를 가질 수 있도록 허용합니다. 왜냐하면 각 거래 쌍은 큰 가격 차이를 가질 수 있기 때문에 매개 변수 또한 다를 수 있으며 때로는 차분 설정을 필요로 할 수 있습니다.

  • 모든 함수를 취소 이 함수의 변화를 비교해 볼 수 있습니다. 이 함수는 단지 작은 코드를 수정하고, 그런 수정의 의도를 생각해보세요.

  • 상태 표시줄 차트 데이터 상태 표시줄에 시장 데이터와 계정 자산 데이터를 표시하기 위해 차트를 추가하여 각 거래 대상의 대응 자산과 시장을 실시간으로 표시 할 수 있습니다. 위 디자인 아이디어를 익힌 후 파이썬 전략을 다종 전략으로 바꾸는 것이 쉽나요?

III. 뒷검사

img img img

이 전략은 학습 및 백테스팅 목적으로만 사용되며, 관심있는 경우 최적화 및 업그레이드 할 수 있습니다.전략 주소


관련

더 많은