Tangan-tangan mengajar anda untuk mengubah dasar tunggal Python menjadi pelbagai strategi.

Penulis:Mimpi kecil, Dicipta: 2020-01-20 17:33:36, Dikemas kini: 2023-10-17 21:18:46

img

Pertama, tangan dengan tangan mengajar anda mengubah dasar tunggal Python menjadi pelbagai strategi.

Dalam artikel sebelumnya, kami telah melaksanakan strategi Python yang sangat mudah:"Strategi Mencari dan Menjatuhkan Python"Strategi ini boleh mengendalikan satu akaun untuk berdagang secara terprogram pada pasangan dagangan tertentu, prinsipnya sangat mudah, iaitu mengejar dan menjatuhkan. Kadang-kadang kita ingin menggunakan logik dagangan yang sama untuk mengendalikan pasangan dagangan yang berbeza. Anda boleh membuat beberapa bot, menetapkan pasangan dagangan yang berbeza, untuk berdagang dalam pelbagai mata wang. Jika strategi tidak begitu rumit, memandangkan pencipta menjimatkan fleksibiliti platform dagangan yang kuat.

Kod sumber strategi yang telah diubah:

'''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)

Kedua, cari perbezaan.

Jika kita lihat pada kodnya, adakah ia berbeza dengan kod dalam artikel sebelumnya? Sebenarnya, logik urus niaga adalah sama, tidak ada perubahan, hanya kita mengubah strategi menjadi pelbagai, tidak boleh menggunakan pembolehubah tunggal yang sebelumnya sebagai bentuk parameter strategi. Penyelesaian yang lebih munasabah adalah, membuat parameter menjadi array, indeks setiap kedudukan array sepadan dengan pasangan urus niaga yang ditambahkan.

img

Kemudian, kita bungkus bahagian kod logik urus niaga ini menjadi satu fungsi.processDalam strategi utama, pada loop utama, fungsi ini dipanggil berdasarkan transaksi yang ditambahkan untuk mengulang, supaya setiap pasangan transaksi menjalankan satu kod logik transaksi.

  • Perkataan yang berulang-ulang:

    for i in range(len(exchanges)): 
        process(exchanges[i], i)
    
  • Parameter strategi:

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

    Dengan reka bentuk sedemikian, setiap pasangan dagangan boleh mempunyai parameternya sendiri, kerana setiap dagangan mempunyai perbezaan harga yang mungkin besar, parameter yang mungkin berbeza, dan kadang-kadang memerlukan tetapan pembezaan.

  • Fungsi CancelAll

    Sebagai perbandingan, perubahan fungsi ini. Fungsi ini hanya mengubah sedikit kod, dan kemudian berfikir, niat untuk mengubahnya.

  • Data Rajah Bar Status

    Tambahan carta yang memaparkan data pasaran dan data aset akaun pada tetingkap status untuk memaparkan aset dan pasaran yang berkaitan dengan setiap objek bursa secara langsung.

Jika anda mempunyai idea-idea reka bentuk di atas, adakah ia mudah untuk mengubah strategi Python menjadi pelbagai?

3. Ujian semula.

img

img

img

Strategi ini hanya untuk rujukan pembelajaran, ujian ulangan, dan berminat untuk mengoptimumkan peningkatan.Alamat Strategi


Berkaitan

Lebih lanjut

bbbwwed2009Meng, boleh saya tanya kenapa anda tidak perlu menetapkan arah exchange.SetDirection (("buy") untuk menggunakan strategi ini, dan ada e. bukan exchange.

Kuda HitamBerapa jumlah modal minimum untuk strategi ini?

Kuda HitamSaya tidak mahu berurusan, tidak ada tindak balas selama setengah hari.

Kuda HitamBaiklah, baiklah, saya berjaya, saya berjaya, tidak hairanlah.

Kuda Hitam/upload/asset/164f3fe6e84331d800583.png Sekarang baik, tetapi saya mempunyai wang dalam akaun saya, berapa jumlah modal minimum yang perlu anda letakkan dalam strategi ini, adakah wang dalam akaun saya tidak mencukupi?

Kuda Hitam/upload/asset/16495fcb1185338f8af27.png adalah IP pentadbir yang ditambahkan

Kuda HitamGetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message:"Invalid IP"} IP. Saya telah menambahkannya ke dalam API.

Kuda Hitam/upload/asset/164330beccf32fc55e7b6.png Bagaimana untuk menyelesaikan masalah ini?

Kuda HitamBerapa banyak kitaran K-line robot

Mimpi kecilTidak ada piringan sebenar, strategi ini adalah strategi pengajaran, pembelajaran utama, yang boleh diubah, diperluaskan, dioptimumkan sendiri.

Mimpi kecilSecara khusus, anda boleh melihat kod sumber strategi ini, strategi terbuka, logik strategi sangat mudah untuk mengejar dan menjatuhkan. Perhatikan, ini adalah strategi mata wang digital yang tidak dapat dijalankan dengan masa hadapan, yang boleh diubah menjadi masa depan sendiri.

Mimpi kecilApabila anda meminta API KEY, alamat IP yang ditetapkan adalah alamat senarai putih yang dibenarkan untuk diakses, dan selepas anda menetapkannya, hanya alamat IP ini yang boleh digunakan untuk mengakses API API dengan API KEY anda. Adakah anda menetapkan alamat IP hos anda?

Mimpi kecilPemasang Python pada pelayan di mana pentadbir berada.

Mimpi kecilKaedah ini tidak melihat garis K, apa pun yang ditetapkan boleh dilakukan, perkataan ulangan kerana ia memberi kesan kepada butiran tik, ditetapkan untuk 1 minit.