Jump to content
Jokin

Interessensabfrage: Wer möchte selber einen Tradingbot erstellen?

Empfohlene Beiträge

Geschrieben (bearbeitet)
vor 8 Minuten schrieb MixMax:

Student, 26, so im 3.Semester.

Stimmts? Komm Theo, sei ehrlich.

Ne, falsch.

Ooops, falscher Account

bearbeitet von Jokin

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor einer Stunde schrieb Jokin:

PS: Wer nun wirklich mal die Analyse startet, wird feststellen, dass ich bis Mitte 2018 auch die Umlaute als ae, ue und oe sowie ss geschrieben hatte - das lag daran, dass ich zwei Computer hatte, einen mit DE-Tastatur und einen mit EN-Tastatur. Daher fällt mir das auch auf, wenn jemand "vermutlich" im Ausland sitzt und sowohl DE- als auch EN-Tastaturen benutzt.

Offtopic: Ich wechsel unbewustt oft zwischen ü und ue usw hin und her, weil ich mir fürs programmieren angewöhnt habe auf Umlaute zu verzichten :D

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor einer Stunde schrieb Jokin:

Mit dem Account MixMax hab ich mir aber auch schon Wortgefechte geliefert - da musste ich so tun als ob ich alles über Verschlüsselung und so weiß. Ich denke, ich wirkte auch recht kompetent. Zumindest mein Account "Jokin" hat sich dem Fachwissen des Accounts "MixMax" geschlagen gegeben - ich denke, das war echt eine 1a-Show ... gell, MixMax? 

Ich weis das wirklich nicht mehr. Und wenn schon, nachtragend bin ich ganz bestimmt nicht.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 14 Minuten schrieb Serpens66:

Offtopic: Ich wechsel unbewustt oft zwischen ü und ue usw hin und her, weil ich mir fürs programmieren angewöhnt habe auf Umlaute zu verzichten :D

Ja, Du programmierst ja auch noch tagelang selber - und klickst Dir das nicht alles binnen 1-2 Stunden per Matlab zusammen. ;)

 

 

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor einer Stunde schrieb Theo Kojak:

Hier gibt es sogar ein Buch für Java : 

Danke für die Empfehlung 🙂

vor einer Stunde schrieb Theo Kojak:

die Bots kann man hunderte Weise auf CD bei E-Bay kaufen

Und was zum Geier ist eine "CD"? 😱

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor einer Stunde schrieb Theo Kojak:

as ist allein daher bedingt, dass Du bei Deinem Ansatz client seitige Trade Execution machen musst, das ist viel zu langsam mit PHP. Das bedeutet, Deine Momentum Strategie hat einen viel grösseren Spread als andere und bei schnellen Bewegungen wie im Coinmarkt ist das einfach MIST.

Mein BalanceBot läuft auf einem VPS mit Ubuntu. Ich würde das schon als "serverseitig" bezeichnen.

Spread ist doch beim BalanceBot vollkommen egal, der erstellt eine Order in Abhängigkeit vom aktuellen und dem Max-/Minkurs der letzten 24h. Was juckt mich da Schnelligkeit?

vor einer Stunde schrieb Theo Kojak:

Er sorgt dafür, dass immer neues Frischfleisch in die Coinmärkte drängen und da ihr Geld abliefern. Das ist so wie Schafe zum Schlachten führen oder in einen Wald hungriger Wölfe schicken. Da warten wir dann ...

Du hast Dich offenbar überhaupt nicht mit meiner Strategie beschäftigt.

Was willst Du dann hier?

Mach einfach Deinen Matlab-Kram und troll' hier nicht länger herum.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 30 Minuten schrieb Theo Kojak:

Dein System, Architektur und Konzept sind trotzdem Müll.

Du bist der Profi.

Danke für Deine Erleuchtung.

Amen.

Und nu troll woanders weiter. Danke.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)
vor 26 Minuten schrieb Theo Kojak:

VPS, UBUNTU und dann PHP fürs Trading.

Ja, das ist sicher überzeugend.

Amen.

 

Also das überzeugt mich jetzt doch mehr als, äh... warte... ah, das hier:

 

Zitat von Theo: (Lässt sich nicht richtig einfügen, daher so)

Zitat

 

"Ja, das hast Du richtig erkannt. Ich teste gerade Code und das ist so langweilig. Ob ich dann nun Pornos schaue, Monstern das Gehirn wegschiesse oder mich mit ignoranten Besserwissern rumschlage ist dann auch egal. World of X habe ich durch, Apex ist cool, aber nach 500 Kills langweilig. Da ist so ein Forum doch viel unterhaltsamer ... 

Theo "

 

 

 
 
 
Kann mir mal jemand sagen wie man nen Zitat aus nem anderem Thread richtig einfügt?

 

bearbeitet von MixMax

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 2 Stunden schrieb MixMax:

Kann mir mal jemand sagen wie man nen Zitat aus nem anderem Thread richtig einfügt?

Trolle füttern ist immer falsch. Deshalb kann man solche Zitate auch nicht "richtig" einfügen. 🧐

  • Love it 1
  • Haha 1

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)
vor 8 Stunden schrieb Herr Coiner:

Trolle füttern ist immer falsch. Deshalb kann man solche Zitate auch nicht "richtig" einfügen. 🧐

Sorry, das war so nicht meine Absicht.

bearbeitet von MixMax

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 3 Stunden schrieb MixMax:

Sorry, das war so nicht meine Absicht.

In dem Fall nicht tragisch, weil das Zitat immerhin ein klares Bekenntnis zur Trollerei ist. Sowas findet man ja wirklich selten. Dem Kleinkind ist langweilig, also beleidigt es halt Forenteilnehmer um sich etwas Genuss zu verschaffen in seiner ach so langweiligen Welt. 😂

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Sorry, wenn ich mal zurück zum Thema komme ...

... das mit dem Backtesting hab ich mir mal durch den Kopf gehen lassen - wenn ich die OHLC-Hourly-Daten der letzten 24 Monate hätte, könnte ich durchaus einen Backtest durchführen.

Nur woher bekomme ich die Daten? https://coinograph.io/binance-historical-data/ -> die wollen echt 450 USD dafür haben ... nö. Echt nich. Das isses mir nicht wert.

Gibt es die woanders vielleicht auch noch?

Bei Binance bekommt man max. 1.000 Candles zurück. Wenn ich Stundenwerte anfordere, dann sind das lediglich 41 Tage - etwas wenig für einen Backtest.

Ich würde das auch einfach mal mit der Basiswährung ETH laufen lassen und dazu LTC, DASH, XRP und DOGE nehmen. Danach mal schauen wie sich das Ganze entwickelt hätte.
Da ETH Anfang März 2016 lediglich ca. 9,50 USD wert war, dürfte das durchaus spannend werden ob der Bot überhaupt eine Chance gegen einen ETH-Hodler gehabt hätte.
(wahrscheinlich nicht - daher rate ich ja auch immer zum Streuen auf verschiedene Strategien)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)
2 hours ago, Jokin said:

wenn ich die OHLC-Hourly-Daten der letzten 24 Monate hätte, könnte ich durchaus einen Backtest durchführen.

Bei cryptocompare.com geht das mit stündlichen Daten ziemlich weit zurück. Ich habe neulich Daten ab dem 01.01.2017 geholt.

https://min-api.cryptocompare.com/documentation?key=Historical&cat=dataHistohour

bearbeitet von PeWi
URL hinzugefügt.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

einige kostenlose daten gibts hier:
http://api.bitcoincharts.com/v1/csv/

allerdings scheinen die seit ner ganzen weile aufgehöhrt haben neue coins/exchanges aufzunehmen und lassen nur die alten einfach weiter laufen. Oder vllt gibts ja iwo noch eine "v2" oderso.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nur mal für so doofe Backtest-Verweigerer wie mich ...

... ich lade mir also die 1h-OHLC-Daten in die Datenbank für die Pairs, die ich untersuchen möchte.
Danach muss ich mir mein Skript aber immernoch komplett umschreiben dass es
- ich es mit einer Uhrzeit aus der Vergangenheit als Parameter aufrufen kann
- es dann die Daten anstatt von der Excahnge nun aus der Datenbank zieht und vorallem in demselben Format bekommt.
- die Order, die gesetzt werden, muss ich mir in die Datenbank schreiben
- bevor das Skript das nächste Mal läuft muss ich mit einem weiteren Skript prüfen welche Order mit den nächsten OHLC-Daten erfüllt worden wären
- ich müsste auch eine Balance in meiner Datenbank pflegen um die ausgeführten Trades abzubilden

Uff ... das erscheint mir mehr Arbeit als das Programm an sich verschlungen hatte - und das nur um am Ende festzustellen, dass die Vergangenheitsdaten keine Vorhersage für die Zukunft sein können?

Hmm ...

@Serpens66 ... machst Du solche Backtests? 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)

Wenn du es so machst, ist dein Testprogramm, ein völlig anders, wie dein Originales. Mit der Folge, dass Fehler im Originalen nicht zwingend auch
im Testprogramm sind. Also keine gute Idee so.

Leider ist der bessere Weg noch aufwendiger. Nämlich eine eigene Binance-API als TestNet aufzubauen um dann dort dein Programm zu testen.
Ich würde allerdings eher auf der Originalen API testen, halt nur nicht mit echten Coins, wenn das geht. Und mir die Zeit nehmen es in real time laufen zu lassen.

bearbeitet von MixMax

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hmm, das stimmt allerdings - ich müsste ja nur die Binance-API-Calls umbauen.

Der Aufwand wäre zwar auch immens weil ich ja auch die Serverseite mit der Ausführung der Order programmieren muss ...

Hmm, derzeit bin ich eher geneigt weitere Testbots einzusetzen - jeweils mit einem Monat Versatz.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 1 Minute schrieb Jokin:

Hmm, derzeit bin ich eher geneigt weitere Testbots einzusetzen - jeweils mit einem Monat Versatz.

Ja, würde ich auch so machen. Den Aufwand würde ich mir dafür auch nicht geben.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)
vor 1 Stunde schrieb Jokin:

 

@Serpens66 ... machst Du solche Backtests? 

 

Mit Strategien habe ich bisher ausschließlich über backtests rumprobiert (nicht ernsthaft) mithilfe des backtraders ( python https://www.backtrader.com/), welches von der Struktur her eben schon auf backtesting ausgelegt ist.
Sieht dann so aus, dass alle x Minuten eine Fkt aufgerufen wird, welche die aktuellen Preisdaten (typische Ticker daten) kennt und diese kann man entsprechend seiner strategie auswerten und gegebenenfalls eine buy oder sell order platzieren. Die ganze Arbeit im Hintergund übernimmt dabei zum glück der backtrader. Vllt findest du ja auch ein enstprechendes modul oderso, wo du relativ leicht deine eigene strategie einpflanzen kannst.

bearbeitet von Serpens66

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)
11 hours ago, MixMax said:

Wenn du es so machst, ist dein Testprogramm, ein völlig anders, wie dein Originales. Mit der Folge, dass Fehler im Originalen nicht zwingend auch
im Testprogramm sind.

Aus dem Grund so viel wie möglich der originalen Botfunktionen verwenden. Wenn man neue Funktionen für den Backtest schreibt, ist es echt aufwendig, gleiches Verhalten sicherzustellen.

Lieber minimale Weichen in den bestehenden Funktionen - das geht zugegebenermaßen leichter, wenn man bereits bei der Entwicklung des Bots das Backtesten im Blick hat.

11 hours ago, MixMax said:

Leider ist der bessere Weg noch aufwendiger. Nämlich eine eigene Binance-API als TestNet aufzubauen um dann dort dein Programm zu testen.

Das halte ich für unnötig. Die Verbesserungen damit sind IMHO gering, die wirklichen Probleme - Zustand des Orderbook u. Ausführung der Orders - bekommt man damit auch nicht.

11 hours ago, MixMax said:

Ich würde allerdings eher auf der Originalen API testen, halt nur nicht mit echten Coins, wenn das geht. Und mir die Zeit nehmen es in real time laufen zu lassen.

Da muss man halt unter Umständen sehr viel Geduld haben. Bei meinem aktuellen Bot habe ich im Spätsommer/Herbst 2018 monatelang warten dürfen, ohne passende Bullen-Kurse zu erleben. :(

bearbeitet von PeWi
Falsches Emoji.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
10 hours ago, Serpens66 said:

mithilfe des backtraders ( python https://www.backtrader.com/), welches von der Struktur her eben schon auf backtesting ausgelegt ist.

Der liest sich recht interessant - danke für den Tip!

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 10 Stunden schrieb Serpens66:

Mit Strategien habe ich bisher ausschließlich über backtests rumprobiert (nicht ernsthaft) mithilfe des backtraders ( python https://www.backtrader.com/), welches von der Struktur her eben schon auf backtesting ausgelegt ist.

Das klingt wirklich interessant, zumal sogar irgendwas hinsichtlich Balancing schon drin ist:

Zitat

Multiple Strategies

Run multiple strategies simultaneously to balance the portfolio with different algorithms

Muss ich mir bei Gelegenheit mal näher anschauen ... und verflixt, das ist mal wieder Python. Es sieht so aus als käme ich da nicht drumrum :-(

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)

ich hab die Doku vom backtrader auch noch nicht vollständig durch, aber ich glaube fertige Strategien sind da eher nicht/wenige implementiert. Sollte aber nicht schwer sein, das selbst zu schreiben.

Hier mal ein simpler Code mit EMAcross bzw SMACross Strategie, den ich an meine Nicht-Trading Freunde geschickt hab, damit sie für mich mal ein bisschen mit dem backtesting rumprobieren (und vllt durch zufall was lukratives finden :D):

 

# ein simples backtesting skript

# Installation von backtrader:
# "pip install backtrader[plotting]"
# um Ta-Lib nutzen zu können siehe hier: https://github.com/mrjbq7/ta-lib (vor pip install muss erst der Teil unter dem Stichwort "depencies" erfuellt werden)
# die meisten Indikatoren kann man aber auch ohne TA-Lib nutzen, zb backtrader.indicators.SimpleMovingAverage(period=30)
# -> Ta-Lib muss nicht installiert werden, ist auch ziemlich kompliziert zu installieren


import datetime
# Import the backtrader platform
import backtrader as bt
import backtrader.feeds as btfeeds # 
import time

# zum Rausfinden welche Indikatoren am hilfreichsten sind, ist es am sinnvollsten Seiten wie cyrptowat.ch/coinigy zu verwenden und sich charts mit den indikatoren anzuschane.

# Indikatoren im backtrader:
# https://www.backtrader.com/docu/indautoref.html
# Ta-lib indikatoren:
# https://mrjbq7.github.io/ta-lib/doc_index.html


# "fiat" ist die Währung mit der bezahlt wird. "stakes" ist das was man kauft/verkauft
# das hier sind die Einstellungen mit denen man experimentieren kann. Darunter braucht man eig nur was ändern, wenn man eine neue Strategie bauen will, oder bei vorhandenen mehr als nur die Werte ändern will.
params ={
    "filename" : "binanceBNBUSDT_backHourly", # der Name der Datei mit den backtest-Daten  # bitstampUSD_ForBacktraderHourly # binanceBNBUSDT_backHourly
    "periodlength" : 3600, #in sekunden -> 3600 = 60 minuten = 1h
    "fromdate" : None, # datetime.datetime(2014, 1, 1), # year, month, day. Oder einfach None eintragen, wenn kompletter Zeitraum der Daten-Datei genommen werden soll
    "todate" : None, # datetime.datetime(2015, 1, 1), # year, month, day. Oder einfach None eintragen, wenn kompletter Zeitraum der Daten-Datei genommen werden soll
    "ordersizeQ" : 1, # Order größe in Einheit "stakes" zb BNB, wird verwendet wenn "inFiat" False
    "ordersize" : 50, # Order größe in Einheit "fiat" zb Kaufe stakes fuer insg x USD, wird verwendet wenn "inFiat" True
    "inFiat" : True, # siehe oben
    "cash" : 100, # startgeld in fiat
    "commission" : 0.05/100, # Handelsgebührebühr zb 0.05% = 0.05/100
    "strategy" : "EMACross", # SMACross/EMACross die Strategy die verwendet werden soll. Aktuell gibts nur die beiden Strategien, aber neue Strategien können aufdieselbe weise erstellt werden.
    "plotten" : True, # Preis in Chart zeichnen
    "strategyplotten": True, # indikatoren zb sma/ema in chart zeichnen
    "print": False, # jeden einzelnen Trade printen?
    "mindiff":0.005, # nur bei EMACross verwendet. so groß muss die Differenz aus EMA1 und EMA2 mind sein, bevor gekauft wird (der Wert hängt vom Preis ab, also bei Preisen um 10USD ist 0.01 vermutlich ganz gut, während bei Preisen von 1000USD eben 1 ganz gut ist). Man kann natürlich auch programmieren, dass dieser Wert automatisch anhand des Preises berechnet wird ;)
    }

                
# Create a Stratey
class TestStrategy(bt.Strategy):

    def __init__(self):
        self.dataclose = self.datas[0].close # den close preis im chart zeigen, muss einfach so definiert werden.
        self.order = None
        
        self.first = True
        
        self.mycash = params["cash"] # unsere start balance
        self.myvalue = params["cash"]
        self.mystakes = 0
        self.mystakesvalue = 0
        
        if params["strategy"]=="EMACross": # hier zuerst den Indikator erstellen
            self.ema1 = bt.indicators.ExponentialMovingAverage(period=30,plot=params["strategyplotten"])
            self.ema2 = bt.indicators.ExponentialMovingAverage(period=90,plot=params["strategyplotten"])
            self.shl = bt.indicators.Stochastic(plot=params["strategyplotten"])
        elif params["strategy"]=="SMACross":
            self.sma1 = bt.indicators.SimpleMovingAverage(period=30,plot=params["strategyplotten"])
            self.sma2 = bt.indicators.SimpleMovingAverage(period=90,plot=params["strategyplotten"])
            

    
    def next(self): # bei jeder neuer candle wird diese funktion aufgerufen. wir rufen dann unsere strategie auf und prüfen ob wir jetzt kaufen/verkaufen sollten
        if self.order: # prüfen ob vorherige order schon erfuellt, wenn nicht warten
            return
        
        if params["strategy"]=="EMACross":
            self.EMACross()
        if params["strategy"]=="SMACross":
            self.SMACross()


    def EMACross(self):
        if self.order:
            return

        EMA1 = self.ema1[0]
        EMA2 = self.ema2[0]
        lastlow = self.datas[0].low # das low der aktuellen candle
        lasthigh = self.datas[0].high
        diff = abs(EMA1-EMA2)/((EMA1+EMA2)/2)
        
        mindiff = params["mindiff"]

        if not self.position: # wenn wir noch keine position haben (also noch nicht gekauft), dann prüfen ob kaufen

            if EMA1 > EMA2 and (lastlow>EMA1 and lastlow>EMA2) and diff>mindiff:
                self.order = self.trade("buy")
        else: # und wenn wir schon eine position haben, also schon gekauft, dann prüfen ob verkaufen
            if EMA1 < EMA2 and (lasthigh<EMA1 and lasthigh<EMA2):
                self.order = self.trade("sell")
    
    def SMACross(self):
        if self.order:
            return
            
        SMA1 = self.sma1[0]
        SMA2 = self.sma2[0]
        
        if not self.position: # Check if we are in the market
            if SMA1 > SMA2:
                self.order = self.trade("buy") # Keep track of the created order to avoid a 2nd order
        else:
            if SMA1 < SMA2:
                self.order = self.trade("sell") # Keep track of the created order to avoid a 2nd order

    ####################################################################################################
              # jetzt kommen nur noch "def" die nicht geändert werden brauchen, sind gut so #
    ####################################################################################################
    
    def notify_trade(self, trade):
        if not trade.isclosed:
            return
        self.log('TRADE PROFIT, NET %.8f' %
                 (trade.pnlcomm))
    
    def notify_cashvalue(self, cash, value): # die funktion speichert die aktuelle Balance in die self. Variablen
        self.mycash = cash # ist mein vorhandenes fiat, bzw bei altcoin meine corhandenen btc
        self.myvalue = value # ist alles zusammengerechnet in fiat
        self.mystakes = self.position and self.position.size or 0 # anzahl meiner altcoins
        self.mystakesvalue = self.position and self.position.size * self.position.price or 0
    
    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            # Buy/Sell order submitted/accepted to/by broker - Nothing to do
            return

        # Check if an order has been completed
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(
                    'BUY EXECUTED, Price: %.8f, Cost: %.8f, Size: %.8f, Comm %.8f' %
                    (order.executed.price,
                     order.executed.value,
                     order.executed.size,
                     order.executed.comm))
            else:  # Sell
                self.log('SELL EXECUTED, Price: %.8f, Cost: %.8f, Size: %.8f, Comm %.8f' %
                         (order.executed.price,
                          order.executed.value,
                          order.executed.size,
                          order.executed.comm))
            self.order = None

        elif order.status in [order.Rejected]:
            self.log('ORDER REJECTED')
            self.order = None # dennoch wieder frei für weitere Order machen
        elif order.status in [order.Canceled]:
            self.log('ORDER Canceled')
            self.order = None # dennoch wieder frei für weitere Order machen
        elif order.status in [order.Margin]:
            self.log('ORDER REJECTED Margin (zb nicht genug balance fuer marktpreis)')
            self.order = None # dennoch wieder frei für weitere Order machen
    
    def trade(self,kind,amount=0.1,price=None,inFiat=None): #price None heißt einfach zum Marktpreis kaufen. trade passt die menge automatisch der balance an, falls nicht genug balance.
        if kind=="buy":
            if inFiat==None: # fuer buy müssen wir noch die Menge finden
                inFiat = params["inFiat"]
            rechnungspreis = price or self.datas[0].high[0] # der preis mit dem wir prüfen ob unsere balance reichen würde. wenn price nicht definiert, dann High der letzten candle nehmen
            if inFiat:
                amount = params["ordersize"] # zb stakes für insg 100€ kaufen
                if amount>self.mycash: # wenn die menge größer als unsere balance ist
                    amount = self.mycash # dann automatisch maximal unserere balance nehmen
                amount = amount / rechnungspreis # amount muss immer in Einheit stakes sein, also ausrechnen, wieviele stakes wir mit dem Einsatz zum letzten close kaufen könnten
            else:
                amount = params["ordersizeQ"] # zb 100 stakes kaufen
                if amount>self.mycash/rechnungspreis: # wenn menge groeßer als unsere balance
                    amount = self.mycash/rechnungspreis # dann anpassen
            self.log('buy create at ~price: {}, amount: {}'.format(price or rechnungspreis, amount))
            o = self.buy(size=amount,price=price)
        elif kind=="sell":
            amount = self.mystakes # einfach alles verkaufen was da ist
            self.log('sell create at ~price: {}, amount: {}'.format(price or self.datas[0].low[0], amount))
            o = self.sell(size=amount,price=price)
        return o
        
    def log(self, txt, dt=None): # log wird zum printen verwendet. Es packt einfach nur noch das Datum davor und printet dann was du als txt übergeben hast, sofern params["printen"] wahr ist
        ''' Logging function fot this strategy'''
        if params["print"]:
            dt = dt or self.datas[0].datetime.date(0)
            print('%s: %s' % (dt.isoformat(), txt))
    
    
if __name__ == '__main__':
    # Create a cerebro entity

    
    cerebro = bt.Cerebro()

    # Add a strategy
    cerebro.addstrategy(TestStrategy)

    filename = params["filename"]
    # csv Datei laden
    data = btfeeds.GenericCSVData(
        dataname=filename+'.csv',
        fromdate=params["fromdate"],
        todate=params["todate"],
        nullvalue=0.0,
        dtformat=('%Y-%m-%d %H:%M:%S'), 
        timeframe = bt.TimeFrame.Minutes,
        compression = int(params["periodlength"]/60), # in Einheit "timeframe" (zb minuten) 60 minutes , 1440minutes is daily. da einheit periodlength sekunden ist, also durch 60 teilen
        headers = True,
        datetime=0,
        high=1,
        low=2,
        open=3,
        close=4,
        volume=5,
        openinterest=-1
    )
    cerebro.adddata(data)

    # Mit wieviel Geld wollen wir starten?
    cerebro.broker.setcash(params["cash"])

    # Printen mit wieviel wir starten
    print('Starting Portfolio Value: %.8f' % cerebro.broker.getvalue())
    
    # Handelsgebühren festlegen
    cerebro.broker.setcommission(commission = params["commission"] ) # 0.05%
    
    # set default trading amount
    # cerebro.addsizer(bt.sizers.FixedSize, stake=200)
    
    # Run over everything
    cerebro.run()
    
    # Print out the final result
    print('Final Portfolio Value: %.8f' % cerebro.broker.getvalue())
    if params["plotten"]:
        cerebro.plot(style = 'line',loc="grey") # line plotting, candle

und hier noch mein Code wie ich die candlestickdata von binance in das backtrader format umwandle:

 


def binancetocsv(self,data):
    with open("binance_back.csv", 'w') as neu :   # eine eigene Datei erstellen. wenn bereits vorhanden wirds überschrieben
        neu.write("Date, High, Low, Open, Close, Volume\n") # add a header, cause this is also default in backtrader
        for entry in data:# [1499040000000 Open time   "0.01634790" Open   "0.80000000" High    "0.01575800" Low  "0.01577100" Close   "148976.11427815" Volume   1499644799999 Close time    "2434.19055334" Quote asset volume    308 Number of trades    "1756.87402397" Taker buy base asset volume    "28.46694368" Taker buy quote asset volume     "17928899.62484339" Ignore]
            date = "{}".format(datetime.fromtimestamp(int(entry[0]/1000)).strftime('%Y-%m-%d %H:%M:%S'))
            high = entry[2]
            low = entry[3]
            op = entry[1]
            close = entry[4]
            volume = entry[5]
            neu.write("{}, {}, {}, {}, {}, {}\n".format(date,high,low,op,close,volume)) # sortieren nicht noetig, da in liste bereits sortiert
            
startTime = int(time.time()*1000) - (60*60*24*365*2*1000)# 2 jahre in vergangenheit
symbol = "BNBUSDT"
periode = "1d"
endTime = None
sammlung = []
limit = 500
alen = limit
while alen==limit: # solange wir noch nicht in der gegenwart sind, werden es immer limit einträge sein
    time.sleep(1) # eine sekunde zwischen jedem call warten um nicht gesperrt zu werden
    a = b.get_candledata(symbol,periode,startTime,endTime,limit) # b ist mein binance api skript (welches ich nicht teile)
    alen = len(a)
    if alen!=0:
        for entry in a:
            sammlung.append(entry)
        startTime = a[-1][6] + 1 # neue startzeit ist die endTime des letzten eintrages +1 (weil endTime eine 9999999 zahl ist)
import tradetocsv # sollte im Trading/backtrader Ordner sein
t = tradetocsv.tradestocsv()
t.binancetocsv(sammlung)

 

bearbeitet von Serpens66

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Geschrieben (bearbeitet)
2 hours ago, Jokin said:

Das klingt wirklich interessant, zumal sogar irgendwas hinsichtlich Balancing schon drin ist:

("Run multiple strategies simultaneously to balance the portfolio with different algorithms")

Das meint nur, dass man am besten gleichzeitig verschiedene Strategien laufen lassen sollte, die am besten nach unterschiedlichen Methoden vorgehen.

Z.B. dein Rebalancing für den Seitwärtsmarkt, eine Trendstrategie für den Bullenmarkt, und ??? für den Bärenmarkt. Noch besser wären mehrere für jede Marktphase, weil jede Methode ihre Stärken und Schwächen hat, und sich die Vor- und Nachteile bei einer Kombination teilweise ausmitteln und so für einen glatteren Verlauf der Equity und seltenere und weniger tiefe Drawdowns sorgen.

Ein richtig guter Bot würde tatsächlich in jeder Marktphase mit mehreren Methoden und auf unterschiedlichen Timeframes gleichzeitig laufen.

Der Pluspunkt von BackTrader ist hier nur, dass er es unterstützt, dass du parallel mehrere eigene Strategien laufen lassen kannst.

bearbeitet von PeWi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


×
×
  • Neu erstellen...

Wichtige Information

Wir speichern Cookies auf Ihrem Gerät, um diese Seite besser zu machen. Sie können Ihre Cookie-Einstellungen anpassen, ansonsten gehen wir davon aus, dass Sie damit einverstanden sind. In unseren Datenschutzerklärungen finden sie weitere Informationen.