Jokin Geschrieben 6. März 2019 Autor Teilen Geschrieben 6. März 2019 (bearbeitet) vor 8 Minuten schrieb MixMax: Student, 26, so im 3.Semester. Stimmts? Komm Theo, sei ehrlich. Ne, falsch. Ooops, falscher Account Bearbeitet 6. März 2019 von Jokin 2 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 6. März 2019 Teilen Geschrieben 6. März 2019 Jokin: Chatbot V7.3.1, von Google, 5Jahre alt. 2 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Serpens66 Geschrieben 6. März 2019 Teilen Geschrieben 6. März 2019 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 3 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 6. März 2019 Teilen Geschrieben 6. März 2019 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. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 6. März 2019 Autor Teilen Geschrieben 6. März 2019 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 Ja, Du programmierst ja auch noch tagelang selber - und klickst Dir das nicht alles binnen 1-2 Stunden per Matlab zusammen. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 6. März 2019 Teilen Geschrieben 6. März 2019 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"? 😱 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 6. März 2019 Autor Teilen Geschrieben 6. März 2019 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. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 6. März 2019 Autor Teilen Geschrieben 6. März 2019 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. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 6. März 2019 Teilen Geschrieben 6. März 2019 (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 6. März 2019 von MixMax Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Herr Coiner Geschrieben 6. März 2019 Teilen Geschrieben 6. März 2019 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. 🧐 1 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 (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 7. März 2019 von MixMax Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Herr Coiner Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 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. 😂 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 7. März 2019 Autor Teilen Geschrieben 7. März 2019 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) Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PeWi Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 (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 7. März 2019 von PeWi URL hinzugefügt. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Serpens66 Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 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. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 7. März 2019 Autor Teilen Geschrieben 7. März 2019 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? Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 (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 7. März 2019 von MixMax Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 7. März 2019 Autor Teilen Geschrieben 7. März 2019 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. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MixMax Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 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. 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Serpens66 Geschrieben 7. März 2019 Teilen Geschrieben 7. März 2019 (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 7. März 2019 von Serpens66 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PeWi Geschrieben 8. März 2019 Teilen Geschrieben 8. März 2019 (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 8. März 2019 von PeWi Falsches Emoji. Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PeWi Geschrieben 8. März 2019 Teilen Geschrieben 8. März 2019 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! Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jokin Geschrieben 8. März 2019 Autor Teilen Geschrieben 8. März 2019 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 :-( Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Serpens66 Geschrieben 8. März 2019 Teilen Geschrieben 8. März 2019 (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 8. März 2019 von Serpens66 1 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PeWi Geschrieben 8. März 2019 Teilen Geschrieben 8. März 2019 (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 8. März 2019 von PeWi Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden