avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

아이스버그 위탁 전략의 파이썬 버전

만든 날짜: 2020-03-06 15:26:43, 업데이트 날짜: 2025-06-24 11:21:21
comments   2
hits   3928

아이스버그 위탁 전략의 파이썬 버전

아이스버그 위탁 전략의 파이썬 버전

이 글에서는 두 가지 고전적 전략을 소개합니다: 아이스버그 주문(매수/매도). 이 전략은 Inventor Quantitative Trading Platform의 Iceberg Commission의 클래식 전략 JavaScript 버전에서 이식되었습니다. 전략 주소는 다음과 같습니다: https://www.fmz.com/square/s:%E5%86%B0%E5%B1%B1 %E5%A7%94 %E6%89%981 .

JavaScript 버전 전략 소개 인용:

아이스버그 주문은 투자자들이 대량 거래를 할 때 시장에 너무 큰 영향을 미치지 않기 위해 최신 매수/매도 가격과 고객이 설정한 가격을 기준으로 대량 주문을 자동으로 여러 주문으로 분할하는 상황을 말합니다. . 이 전략은 자동으로 소량 주문을 실행하고, 이전 주문이 완전히 실행되거나 최신 가격이 현재 주문 가격과 크게 달라지면 자동으로 재주문합니다.

많은 거래소의 거래 페이지에는 다양한 기능을 갖춘 아이스버그 주문 도구가 있습니다. 그러나 자신의 필요에 따라 일부 기능을 사용자 지정하거나 수정하려면 더 유연한 도구가 필요합니다. 발명가의 양적 거래 플랫폼은 이 문제를 매우 잘 해결합니다. Strategy Square에는 Python 전략이 많지 않습니다. Python을 사용하여 거래 도구와 전략을 작성하려는 일부 트레이더는 참조 예제가 필요합니다. 따라서, 고전적인 아이스버그 위임 전략이 Python 버전으로 이식되었습니다.

Iceberg Order의 Python 버전 - 전략 코드 및 주석 구매

import random  # 导入随机数库

def CancelPendingOrders():     # CancelPendingOrders 函数作用是取消当前交易对所有挂单。
    while True:                # 循环检测,调用GetOrders 函数,检测当前挂单,如果orders 为空数组,即len(orders) 等于0,说明订单全部取消了,可以退出函数,调用return 退出。
        orders = _C(exchange.GetOrders)
        if len(orders) == 0 :
            return 

        for j in range(len(orders)):     # 遍历当前挂单数组,调用取消订单的函数CancelOrder,逐个取消挂单。
            exchange.CancelOrder(orders[j]["Id"])
            if j < len(orders) - 1:      # 除了最后一个订单,每次都执行Sleep 让程序等待一会儿,避免撤单过于频繁。
                Sleep(Interval)

LastBuyPrice = 0       # 设置一个全局变量,记录最近一次买入的价格。
InitAccount = None     # 设置一个全局变量,记录初始账户资产信息。

def dispatch():        # 冰山委托逻辑的主要函数
    global InitAccount, LastBuyPrice     # 引用全局变量
    account = None                       # 声明一个变量,记录实时获取的账户信息,用于对比计算。
    ticker = _C(exchange.GetTicker)      # 声明一个变量,记录最近行情。
    LogStatus(_D(), "ticker:", ticker)   # 在状态栏输出时间,最新行情
    if LastBuyPrice > 0:                 # 当LastBuyPrice大于0时,即已经委托开始时,执行if条件内代码。
        if len(_C(exchange.GetOrders)) > 0:    # 调用exchange.GetOrders 函数获取当前所有挂单,判断有挂单,执行if条件内代码。
            if ticker["Last"] > LastBuyPrice  and ((ticker["Last"] - LastBuyPrice) / LastBuyPrice) > (2 * (EntrustDepth / 100)):   # 检测偏离程度,如果触发该条件,执行if内代码,撤单。
                Log("偏离过多, 最新成交价:", ticker["Last"], "委托价", LastBuyPrice)
                CancelPendingOrders()
            else :
                return True
        else :    # 如果没有挂单,证明订单完全成交了。
            account = _C(exchange.GetAccount)     # 获取当前账户资产信息。
            Log("买单完成, 累计花费:", _N(InitAccount["Balance"] - account["Balance"]), "平均买入价:", _N((InitAccount["Balance"] - account["Balance"]) / (account["Stocks"] - InitAccount["Stocks"])))  # 打印交易信息。
        LastBuyPrice = 0   # 重置 LastBuyPrice为0

    BuyPrice = _N(ticker["Buy"] * (1 - EntrustDepth / 100))   # 通过当前行情和参数,计算挂单价格。
    if BuyPrice > MaxBuyPrice:    # 判断是否超过参数设置的最大价格
        return True

    if not account:               # 如果 account 为 null ,执行if 语句内代码,重新获取当前资产信息,复制给account
        account = _C(exchange.GetAccount)

    if (InitAccount["Balance"] - account["Balance"]) >= TotalBuyNet:  # 判断买入所花费的总钱数,是不是超过参数设置。
        return False

    RandomAvgBuyOnce = (AvgBuyOnce * ((100.0 - FloatPoint) / 100.0)) + (((FloatPoint * 2) / 100.0) * AvgBuyOnce * random.random())   # 随机数 0~1
    UsedMoney = min(account["Balance"], RandomAvgBuyOnce, TotalBuyNet - (InitAccount["Balance"] - account["Balance"]))

    BuyAmount = _N(UsedMoney / BuyPrice)   # 计算买入数量
    if BuyAmount < MinStock:         # 判断买入数量是否小于 参数上最小买入量限制。
        return False 
    LastBuyPrice = BuyPrice          # 记录本次下单价格,赋值给LastBuyPrice
    exchange.Buy(BuyPrice, BuyAmount, "花费:¥", _N(UsedMoney), "上次成交价", ticker["Last"]) # 下单
    return True

def main():
    global LoopInterval, InitAccount    # 引用 LoopInterval, InitAccount 全局变量
    CancelPendingOrders()               # 开始运行时,取消所有挂单
    InitAccount = _C(exchange.GetAccount)   # 初始记录 开始时的账户资产
    Log(InitAccount)                        # 打印初始账户信息
    if InitAccount["Balance"] < TotalBuyNet:    # 如果初始时资产不足,则抛出错误,停止程序
        raise Exception("账户余额不足")
    LoopInterval = max(LoopInterval, 1)      # 设置LoopInterval至少为1
    while dispatch():                        # 主要循环,不停调用 冰山委托逻辑函数 dispatch ,当dispatch函数 return false 时才停止循环。
        Sleep(LoopInterval * 1000)           # 每次循环都暂停一下,控制轮询频率。
    Log("委托全部完成", _C(exchange.GetAccount))   # 当循环执行跳出时,打印当前账户资产信息。

Iceberg Order의 Python 버전 - 판매

“Python 버전의 Iceberg Order - Sell” 코드를 읽어볼 수 있습니다. 전략 로직은 Buy와 동일하며, 약간의 차이만 있습니다.

import random

def CancelPendingOrders():
    while True:
        orders = _C(exchange.GetOrders)
        if len(orders) == 0:
            return
        
        for j in range(len(orders)):
            exchange.CancelOrder(orders[j]["Id"])
            if j < len(orders) - 1:
                Sleep(Interval)

LastSellPrice = 0
InitAccount = None

def dispatch():
    global LastSellPrice, InitAccount
    account = None
    ticker = _C(exchange.GetTicker)
    LogStatus(_D(), "ticker:", ticker)   
    if LastSellPrice > 0:
        if len(_C(exchange.GetOrders)) > 0:
            if ticker["Last"] < LastSellPrice and ((LastSellPrice - ticker["Last"]) / ticker["Last"]) > (2 * (EntrustDepth / 100)):
                Log("偏离过多,最新成交价:", ticker["Last"], "委托价", LastSellPrice)
                CancelPendingOrders()
            else :
                return True
        else :
            account = _C(exchange.GetAccount)
            Log("买单完成,累计卖出:", _N(InitAccount["Stocks"] - account["Stocks"]), "平均卖出价:", _N((account["Balance"] - InitAccount["Balance"]) / (InitAccount["Stocks"] - account["Stocks"])))
            LastSellPrice = 0

    SellPrice = _N(ticker["Sell"] * (1 + EntrustDepth / 100))
    if SellPrice < MinSellPrice:
        return True

    if not account:
        account = _C(exchange.GetAccount)

    if (InitAccount["Stocks"] - account["Stocks"]) >= TotalSellStocks:
        return False 

    RandomAvgSellOnce = (AvgSellOnce * ((100.0 - FloatPoint) / 100.0)) + (((FloatPoint * 2) / 100.0) * AvgSellOnce * random.random())
    SellAmount = min(TotalSellStocks - (InitAccount["Stocks"] - account["Stocks"]), RandomAvgSellOnce)
    if SellAmount < MinStock:
        return False 

    LastSellPrice = SellPrice
    exchange.Sell(SellPrice, SellAmount, "上次成交价", ticker["Last"])
    return True

def main():
    global InitAccount, LoopInterval
    CancelPendingOrders()
    InitAccount = _C(exchange.GetAccount)
    Log(InitAccount)
    if InitAccount["Stocks"] < TotalSellStocks:
        raise Exception("账户币数不足")
    LoopInterval = max(LoopInterval, 1)
    while dispatch():
        Sleep(LoopInterval)
    Log("委托全部完成", _C(exchange.GetAccount))

전략 실행

wexApp을 사용하여 교환 테스트를 시뮬레이션하세요: 그것을 구입하세요 아이스버그 위탁 전략의 파이썬 버전

팔다 아이스버그 위탁 전략의 파이썬 버전

전략 로직은 복잡하지 않습니다. 전략이 실행되면 주문은 전략 매개변수와 현재 시장 가격에 따라 동적으로 배치되고 취소됩니다. 거래 금액/코인 수가 매개변수 설정 금액에 도달하거나 근접하면 전략이 중지됩니다. 전략 코드는 매우 간단하고 초보자에게 적합합니다. 관심이 있는 학생은 이를 수정하여 자신의 거래 스타일에 맞는 전략을 설계할 수 있습니다. 이 전략은 교육 목적으로만 사용되며 실제 거래에서는 주의해서 사용해야 합니다.