Ich zeige Ihnen, wie man eine Python-Strategie in eine lokale Datei einkapselt.

Schriftsteller:Gutes, Erstellt: 2020-07-09 10:21:31, Aktualisiert: 2023-10-28 15:28:00

img

Viele Entwickler, die Strategien in Python schreiben, möchten die Strategie-Code-Dateien lokal platzieren, da sie sich Sorgen um die Sicherheit der Strategie machen.

Strategiesicherheit

Die Strategie wird auf der FMZ-Plattform entwickelt, und die Strategie ist nur für die FMZ-Kontoinhaber sichtbar.

Weitere Informationen erhalten Sie unter:https://www.fmz.com/api

Ich möchte jedoch sagen, daß wir uns in diesem Zusammenhang mit dem Bericht der Kommission befaßt haben.

Eine Strategie zusammenfassen

Lassen Sie uns eine einfache Python-Strategie für die Demonstration finden, mit dem klassischenDual ThrustStrategie, Strategieadresse:https://www.fmz.com/strategy/21856Wir bemühen uns, keinen Teil des Strategiecodes zu ändern, die Strategie in eine Datei zu verkapseln, die vom Strategiecode auf der FMZ-Plattform aufgerufen werden kann, und das Ausführungsresultat ist genau das gleiche wie die direkte Ausführung der Strategie. Das größte Problem bei der Verkapselung ist, dass die globalen Objekte, globalen Funktionen und Konstantenwerte, die vom Strategiecode auf der FMZ-Plattform aufgerufen werden, nicht in den Dateien zugänglich sind, die wir verkapseln, also müssen wir einen Weg finden, diese Objekte, Funktionen, Variablen und Konstanten an die verkapselte Datei zu übergeben. Lassen Sie es Schritt für Schritt tun.

img

In die Datei einfügentestAvon der lokalen Redaktion eröffnet.

img

Hinzufügen Sie etwas Code, und halten Sie die Strategie Code Teil kopiert und intakt eingefügt

# Function, object
exchanges = None
exchange = None
Log = None
Sleep = None
TA = None
Chart = None
LogProfitReset = None
LogStatus = None
_N = None
_C = None 
LogProfit = None  


# Strategy parameters
ContractTypeIdx = None
MarginLevelIdx = None
NPeriod = None
Ks = None
Kx = None
AmountOP = None
Interval = None
LoopInterval = None
PeriodShow = None  

# constant
ORDER_STATE_PENDING = 0
ORDER_STATE_CLOSED = 1
ORDER_STATE_CANCELED = 2
ORDER_STATE_UNKNOWN = 3
ORDER_TYPE_BUY = 0 
ORDER_TYPE_SELL = 1
PD_LONG = 0
PD_SHORT = 1  


def SetExchanges(es):
    global exchanges, exchange
    exchanges = es
    exchange = es[0]  

def SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit):
    global Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit
    Log = pLog
    Sleep = pSleep
    TA = pTA
    Chart = pChart
    LogStatus = pLogStatus
    LogProfitReset = pLogProfitReset
    _N = p_N
    _C = p_C
    LogProfit = pLogProfit  

def SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow):
    global ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow
    ContractTypeIdx = pContractTypeIdx
    MarginLevelIdx = pMarginLevelIdx
    NPeriod = pNPeriod
    Ks = pKs
    Kx = pKx
    AmountOP = pAmountOP
    Interval = pInterval
    LoopInterval = pLoopInterval
    PeriodShow = pPeriodShow

Die Hauptfunktion des obigen Codes besteht darin, die globalen Funktionen und Variablen, die in der aktuellen Datei verwendet werden, zu deklarieren.SetExchanges, SetParams, SetFuncStrategien auf der FMZ-Plattform rufen diese Funktionen auf und geben einige verwendete Funktionen und Objekte weiter.

Startup-Strategie auf der FMZ-Plattform

Die Startstrategie ist sehr einfach:

img

Es gibt nur ein paar Zeilen Code auf der FMZ-Plattform geschrieben. Es sollte beachtet werden, dass die Parameter dieser Startup-Strategie sind genau die gleichen wie unsere verpackte StrategiePython-Version des OKCoin-Futures-Strategiecodes mit Dual ThrustIn der Tat, können Sie direkt kopierenPython-Version des OKCoin-Futures-Strategiecodes mit Dual ThrustStrategie, dann löschen Sie einfach den Strategiecode und fügen Sie ihn ein.

import sys
# Here I wrote the path where I put the testA file myself. I replaced it with xxx. To put it simply, I set the path of my testA file.
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA

def main():
    # Passing Exchange Object
    testA.SetExchanges(exchanges)
    # Pass global function SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
    testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
    # Passing strategy parameters SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
    testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
    # Execute the main strategy function in the encapsulated testA file
    testA.main()

Auf diese Weise fassen wir den Hauptteil der Strategie-Logik in dentestAWir müssen die Startstrategie speichern, und der Roboter, der diese Startrategie erstellt, kann unsere lokale Datei direkt laden und lokal ausführen.

Vergleich mit Rückprüfung

  • BelastungtestADatei lokal für Backtest

img

  • Originalstrategie, Backtesting auf öffentlichem Server

img

Ein einfacherer Weg

Laden Sie die Datei direkt zur Ausführung. Dieses Mal bereiten wir einetestBDatei mit dem Code für diePython-Version des OKCoin-Futures-Strategiecodes mit Dual Thrust strategy.

import time
class Error_noSupport(BaseException):
    def __init__(self):
        Log("Only OKCoin futures are supported!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("There is a futures position at startup!#FF0000")

ChartCfg = {
    '__isStock': True,
    'title': {
        'text': 'Dual Thrust Top and bottom rail map'
    },
    'yAxis': {

...

Wenn die Strategie zu lang ist, wird sie weggelassen und es ist überhaupt nicht notwendig, den Strategiecode zu ändern.

Dann bereiten Sie sich vor.Python-Version des OKCoin-Futures-Strategiecodes mit Dual Thrust(Strategie starten, direkt ausführentestBWir haben eine neue Strategie für die FMZ-Plattform. Wir erstellen einen Roboter, laden direkt dietestBEs ist zu beachten, dass die Startstrategie auch genau die gleichen Strategieparameter-Einstellungen (Strategie-Schnittstellenparameter) haben muss wie die ursprüngliche Version vonPython-Version des OKCoin-Futures-Strategiecodes mit Dual Thrust.

img

if __name__ == '__main__':
    Log("run...")
    try:
        # The file path is processed, you can write the actual path of your testB file
        f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
        code = f.read()
        exec(code)
    except Exception as e:
        Log(e)

Führen Sie einen Backtest durch:

img

Die Rückprüfungsergebnisse stimmen mit der vorstehenden Prüfung überein.

Natürlich ist die zweite Methode einfacher, sie wird empfohlen.


Mehr