리소스 로딩... 로딩...

한 가지 종류의 전략에서 여러 가지 종류의 전략으로 전환하는 방법을 알려줍니다.

저자:발명가들의 수량화 - 작은 꿈, 2020-01-20 17:33:36, 업데이트: 2023-10-17 21:18:46

img

첫 번째, 손잡이가 파이썬의 단일 계통을 다중 계통으로 바꾸는 방법을 알려줍니다.

지난 기사에서는 매우 간단한 파이썬 전략을 구현했습니다."Python 버전의 추격 및 추락 전략"이 전략은 하나의 계정을 조작하여 거래 쌍에 대한 절차적 거래를 수행할 수 있으며, 원리는 매우 간단합니다. 때로는 동일한 거래 논리를 사용하여 다른 거래 쌍을 조작하고자합니다. 여러 로봇을 만들 수 있으며, 다양한 거래 쌍을 설정하여 다양한 화폐를 거래 할 수 있습니다. 전략이 복잡하지 않은 경우, 발명자가 거래 플랫폼을 양적화하는 강력한 유연성을 고려하면. 하나의 전략을 여러 가지 전략으로 쉽게 바꿀 수 있습니다.

이 문서는 다른 문장과 다른 문장들을 포함하고 있습니다.

'''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": ["账户信息"], 
            "rows": []
        }        

        tblTick = {
            "type" : "table",
            "title": "ticker",
            "cols": ["行情信息"], 
            "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)

두 번째, 다른 것을 찾아라.

이 코드는 이전 기사에서 발견한 것과는 크게 다르지 않은가요? 실제로 거래 논리는 완전히 동일하며, 어떠한 변화도 없이, 단지 우리가 전략을 다종으로 수정하면, 이전 의 단일 변수를 과 같은 형태의 전략 매개 변수로 사용할 수 없습니다. 보다 합리적인 해결책은 매개 변수를 배열로 만드는 것입니다. 배열의 각 위치의 인덱스는 추가된 거래 쌍에 대응합니다.

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":[]
    }
    

    이러한 디자인은 각 거래 쌍이 자신의 매개 변수를 가질 수 있도록 해줍니다. 왜냐하면 각각의 거래는 가능한 가격에 큰 차이를 가지고 있기 때문에 매개 변수에도 차이가있을 수 있으며 때로는 차별화 설정이 필요합니다.

  • CancelAll 함수

    이 함수의 변화와 비교해 볼 수 있다. 함수는 단지 코드를 조금만 수정하고, 그 다음에는 그 변경의 의도를 생각해 본다.

  • 상태 탭 그래프 데이터

    상태 탭에 시장 데이터와 계정 자산 데이터를 보여주는 그래프를 추가하여 각 거래소 대상의 해당 자산과 시장이 실시간으로 표시될 수 있습니다.

위의 모든 디자인 아이디어를 가지고, Python의 전략을 다중으로 바꾸는 것이 쉬운 일이 아닐까요?

세 번째, 재검토 테스트

img

img

img

이 전략은 레퍼런스 학습, 리테스트 테스트, 업그레이드를 최적화 할 수있는 관심사를 위한 것입니다.전략적 주소


관련

더 많은

2009년 총장님, 왜 이 전략을 쓰기 위해 exchange.SetDirection (<"구입">) 를 설정하지 않고 e.가 있습니다.

동전의 검은 말이 전략의 최소 자본은 얼마일까요?

동전의 검은 말왜 거래하지 않는가, 반일 동안 반응이 없습니다.

동전의 검은 말좋아요, 좋아요, 잘 됐습니다. 저는 동전을 만들었어요.

동전의 검은 말/upload/asset/164f3fe6e84331d800583.png 지금은 괜찮아요, 하지만 내 계좌에는 돈이 있습니다. 당신의 전략은 최소한의 자본을 얼마나 투자해야합니까?

동전의 검은 말/upload/asset/16495fcb1185338f8af27.png 추가된 관리자 IP입니다.

동전의 검은 말GetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"} IP는 API에 추가했습니다.

동전의 검은 말/upload/asset/164330beccf32fc55e7b6.png 이 문제를 해결하는 방법

동전의 검은 말로봇의 K 라인 주기가 얼마나 설정되는지

발명가들의 수량화 - 작은 꿈실제 디스크가 없으므로, 이 전략은 교육 전략이며, 학습이 주요이며, 직접 수정, 확장, 최적화 할 수 있습니다.

발명가들의 수량화 - 작은 꿈이 전략의 소스코드를 구체적으로 살펴보면, 전략은 공개되어 있으며, 전략 논리는 간단합니다. 이것은 디지털 통화 현금 전략이며, 선물로 실행할 수 없으며, 선물로 수정 할 수 있습니다.

발명가들의 수량화 - 작은 꿈API KEY를 요청할 때 IP 주소가 허용되는 Whitelist 주소가 설정됩니다. 당신이 설정한 후, 이 IP 주소가 당신의 API KEY를 사용하여 API 인터페이스에 액세스 할 수 있습니다. 당신은 당신의 호스트의 IP 주소를 설정합니까?

발명가들의 수량화 - 작은 꿈관리자가 있는 서버에 python을 설치하십시오.

발명가들의 수량화 - 작은 꿈이 정책은 K 라인을 고려하지 않고 임의로 설정할 수 있으며, 재검토 단어가 틱 입자성에 영향을 미치기 때문에 1분으로 설정됩니다.