diff --git a/main/Decision.py b/main/Decision.py index 328056c00f236ec7c6009b75075157bf3447962d..397d47c8cdcf3fd2457626a6e6ab73d043f2b2c6 100644 --- a/main/Decision.py +++ b/main/Decision.py @@ -31,6 +31,7 @@ from DBManagement.DataManagement import getHistoCandles, export_Simulation_All import numpy as np import pandas_ta as ta import matplotlib.pyplot as plt +import math #Class that contains main function and parameters for decision algorithm class Decision: @@ -48,6 +49,8 @@ class Decision: self.sim = None self.crossed = False self.buff_price_indicator = [] + self.nbrWins = 0 + self.nbrLoose = 0 #Params for sma handling self.timePeriod = 0 self.price_SMA = [] @@ -57,6 +60,10 @@ class Decision: #symbol of the simulation self.symbol = symbol self.amount = None + self.balanceMartingale = 0 + self.nbrConsecutiveLoose = 0 + self.maxLooseMartingale = None + self.amountMartingale = None self.export_result = [] self.mas = [] self.timeRandom = [] @@ -80,7 +87,7 @@ class Decision: self.timePeriod = int(sizeCandle_min*60/time_between) print(f"time period = {self.timePeriod}") self.sim.indexTicker +=1 - + print("Indicateur = ",indicator) if indicator == "SMA": #Iterate on each price of a market for SMA calculation for i in range(1,len(sim.histo_prices)): @@ -105,7 +112,7 @@ class Decision: print(f"date End = {date}") #add results to list of results self.export_result.append(sim.endSimulation(mas)) - elif indicator == "random": + elif indicator == "random" or indicator == "randomMartingale": #Iterate on each price of a market for random decision for i in range(1,len(sim.histo_prices)): self.sim.indexTicker +=1 @@ -120,7 +127,7 @@ class Decision: break self.pricesSim.append([price,date]) - self.calculateRandom(date,symbol,price,timeRandom) + self.calculateRandom(date,symbol,price,timeRandom,indicator) if self.indexTickerSim >= len(sim.histo_prices)-1: break print(f"date End = {date}") @@ -149,7 +156,7 @@ class Decision: # mas = [[10,20],[5,15]] if indicator == "SMA": self.mas = [mas] - if indicator == "random": + if indicator == "random" or indicator == "randomMartingale": self.timeRandom = [timeRandom] markets = ["BTCUSDT"] @@ -175,6 +182,10 @@ class Decision: self.symbol = market #amout is 10% of balance self.amount = balance*0.1 + if indicator == "randomMartingale": + #amount = 1% of balance + self.balanceMartingale = balance + self.amount = balance*0.01 if indicator == "SMA": for sl in testSL: @@ -187,7 +198,7 @@ class Decision: print("Amount = ",self.amount) print(self.sim) self.simulationGen(self.sim,market,c,indicator,mas=ma) - if indicator == "random": + if indicator == "random" or indicator == "randomMartingale": for sl in testSL: self.sim.sl = sl for tp in testTP: @@ -210,6 +221,8 @@ class Decision: self.sma = {"BTCUSDT":[],"ETHUSDT":[],"XRPUSDT":[],"BCHUSDT":[]} self.rsi = {} self.init = True + + #Index of the ticker for the simulation self.indexTickerSim = 1 self.pricesSim = [] @@ -217,6 +230,8 @@ class Decision: self.crossed = False self.buff_price_indicator = [] #Params for sma handling + self.nbrWins = 0 + self.nbrLoose = 0 self.timePeriod = 0 self.price_SMA = [] self.sum_SMA1 =0 @@ -224,7 +239,11 @@ class Decision: self.cpt_ma = 0 #symbol of the simulation self.symbol = symbol - self.amount = None + self.amount = 0 + self.balanceMartingale = 0 + self.nbrConsecutiveLoose = 0 + self.maxLooseMartingale = None + self.amountMartingale = 0 self.export_result = [] self.mas = [] self.timeRandom = [] @@ -340,26 +359,66 @@ class Decision: #print(self.sma) #Choose a random time to buy or sell - def calculateRandom(self, date, symbol, price, timeRandom): - if self.init: - self.init = False - self.randomAVorVA(date,price) + def calculateRandom(self, date, symbol, price, timeRandom,indicator): + if indicator == "random": + if self.init: + self.init = False + self.randomAVorVA(date,price,self.amount) + return 1 + if not self.init: + # 1 tick = 10s + if self.sim.end_Active < self.sim.indexTicker and self.tmpRandom == 0: + self.tmpRandom = 1 + rand = random.randint(timeRandom[0],timeRandom[1]) + rand = (rand*60)/10 + self.tickRandom = self.sim.indexTicker + rand + if self.sim.indexTicker == self.tickRandom: + self.tmpRandom = 0 + self.randomAVorVA(date,price,self.amount) + return 1 + elif indicator == "randomMartingale": + if self.init: + self.maxLooseMartingale = math.floor(math.log2((self.amount*100)/self.amount)) + print(f"maxLooseMartingale = {self.maxLooseMartingale}") + self.amountMartingale = self.amount + self.init = False + self.randomAVorVA(date,price,self.amountMartingale) + return 1 + if not self.init: + # 1 tick = 10s + if self.sim.end_Active < self.sim.indexTicker and self.tmpRandom == 0: + self.tmpRandom = 1 + rand = random.randint(timeRandom[0],timeRandom[1]) + rand = (rand*60)/10 + self.tickRandom = self.sim.indexTicker + rand + if self.sim.indexTicker == self.tickRandom: + self.tmpRandom = 0 + if len(self.sim.winsAV) + len(self.sim.winsVA) > self.nbrWins: + self.nbrConsecutiveLoose = 0 + self.nbrWins = len(self.sim.winsAV) + len(self.sim.winsVA) + self.amountMartingale = self.amount + print("Mise : "+ str(self.amountMartingale)) + # remettre le amount de base + self.randomAVorVA(date,price,self.amountMartingale) + elif len(self.sim.lossAV) + len(self.sim.lossVA) > self.nbrLoose: + self.nbrConsecutiveLoose += 1 + if self.nbrConsecutiveLoose >= 7: + print("nbrConsecutiveLoose = ",self.nbrConsecutiveLoose) + self.nbrLoose = len(self.sim.lossAV) + len(self.sim.lossVA) + print("Mise : ", self.amountMartingale) + self.randomAVorVA(date,price,self.amountMartingale) + + else: + print("nbrConsecutiveLoose = ",self.nbrConsecutiveLoose) + self.nbrLoose = len(self.sim.lossAV) + len(self.sim.lossVA) + self.amountMartingale = self.amountMartingale*2 + print("Double la mise : ", self.amountMartingale) + self.randomAVorVA(date,price,self.amountMartingale) return 1 - if not self.init: - # 1 tick = 10s - if self.sim.end_Active < self.sim.indexTicker and self.tmpRandom == 0: - self.tmpRandom = 1 - rand = random.randint(timeRandom[0],timeRandom[1]) - rand = (rand*60)/10 - self.tickRandom = self.sim.indexTicker + rand - if self.sim.indexTicker == self.tickRandom: - self.tmpRandom = 0 - self.randomAVorVA(date,price) - return 1 - def randomAVorVA(self, date,price): + def randomAVorVA(self, date,price,amount): rand = random.randint(0,1) if rand == 0: - self.sim.placeOrder(price,self.amount,date,"AV","GTC") + self.sim.placeOrder(price,amount,date,"AV","GTC") elif rand == 1: - self.sim.placeOrder(price,self.amount,date,"VA","GTC") \ No newline at end of file + self.sim.placeOrder(price,amount,date,"VA","GTC") \ No newline at end of file diff --git a/main/backend.py b/main/backend.py index 5c7a6321c4888e6a4f04044321a1b5518e52d525..7451bfba7d71783c10c421f03f5405ab2ff923b6 100644 --- a/main/backend.py +++ b/main/backend.py @@ -89,7 +89,7 @@ def index(): tmpOrder = [dec.sim.winsAV, dec.sim.lossAV, dec.sim.winsVA, dec.sim.lossVA] if indicatorSim == "SMA": figJson = createFigPyplot(market,tmpOrder, mas=dec.sma[market], arraySma=dec.mas[0]) - if indicatorSim == "random": + if indicatorSim == "random" or indicatorSim == "randomMartingale": figJson = createFigPyplot(market,tmpOrder) results = getResults() reponse = make_response(render_template('index.html', inProgress=simulationInProgress, fig=figJson, res=results, err=dictError, stickyForm=stickyForm)) @@ -143,7 +143,7 @@ def startSimulation(): ma = [int(ma1),int(ma2)] except: return redirect(request.referrer) - elif indicator == "random": + elif indicator == "random" or indicator == "randomMartingale": try: timeMin = int(request.form.get("minimumTime")) timeMax = int(request.form.get("maximumTime")) @@ -468,7 +468,7 @@ def checkGeneralInput(takeprofit, stoploss, candleSize, dateSimStart, dateSimEnd dictError['dateSim'] = 'is-invalid' else : dictError['dateSim'] = 'is-valid' - if indicator == "SMA" or indicator == "random" or indicator == "test": + if indicator == "SMA" or indicator == "random" or indicator == "test" or indicator == "randomMartingale": dictError['indicator'] = 'is-valid' else: dictError['indicator'] = 'is-invalid' @@ -478,7 +478,7 @@ def checkGeneralInput(takeprofit, stoploss, candleSize, dateSimStart, dateSimEnd dictError['ma'] = 'is-invalid' else: dictError['ma'] = 'is-valid' - elif indicator == "random": + elif indicator == "random" or indicator == "randomMartingale": if timeMin > timeMax or timeMin < 15 or timeMax > 1440 or timeMax < timeMin or timeMin == timeMax: dictError['random'] = 'is-invalid' else: diff --git a/main/templates/index.html b/main/templates/index.html index e6a4506986d2a7ef37859e8cbc0b6478d9f11ef3..0ab32601775a2cfd86b6697188c2077fe79712fa 100644 --- a/main/templates/index.html +++ b/main/templates/index.html @@ -113,6 +113,11 @@ <option value="random" selected>Aléatoire</option> {% else %} <option value="random">Aléatoire</option> + {% endif %} + {% if stickyForm['indicatorSelect'] == 'randomMartingale' %} + <option value="randomMartingale" selected>Aléatoire martingale</option> + {% else %} + <option value="randomMartingale">Aléatoire martingale</option> {% endif %} <!-- {% if stickyForm['indicatorSelect'] == 'test' %} <option value="test" selected>test</option> @@ -198,8 +203,46 @@ </div> </div> + + </div> + <div class="row" id="rowRandomMartingale" style="display: none;"> + <div class="col-md-6 mb-4"> + <div class="form-outline"> + <label class="form-label" for="minimumTime">Temps aléatoire minimum + (minute)</label> + <input type="number" class="form-control form-control-lg {{ err['random'] }}" + id="minimumTime" name="minimumTime" max="1440" min="15" + value="{{ stickyForm['minimumTime']}}" step="5"> + <div class="valid-feedback"> + Correct ! + </div> + <div class="invalid-feedback"> + Veuillez entrer un nombre entre 15 et 1440 minutes. Le temps aléatoire minimum + doit être plus petit que le maximum. + </div> + </div> + + </div> + <div class="col-md-6 mb-4"> + <div class="form-outline"> + <label class="form-label" for="maximumTime">Temps aléatoire maximum + (minute)</label> + <input type="number" class="form-control form-control-lg {{ err['random'] }}" + id="maximumTime" name="maximumTime" max="1440" min="15" + value="{{ stickyForm['maximumTime']}}" step="5"> + <div class="valid-feedback"> + Correct ! + </div> + <div class="invalid-feedback"> + Veuillez entrer un nombre entre 15 et 1440 minutes. Le temps aléatoire minimum + doit être plus petit que le maximum. + </div> + </div> + + </div> + </div> - <div class="row" id="rowTest" style="display: none;"> + <!-- <div class="row" id="rowTest" style="display: none;"> <div class="col-md-6 mb-4"> <div class="form-outline"> <label class="form-label" for="M">Test 1</label> @@ -216,7 +259,7 @@ </div> </div> - </div> + </div> --> <div class="row"> <div class="col-md-6 mb-4"> <a href="resetSimulation"><button type="button" @@ -420,6 +463,7 @@ var indicatorSelect = document.getElementById('indicatorSelect'); var SMA = document.getElementById('rowSMA'); var random = document.getElementById('rowRandom'); + var randomMartingale = document.getElementById('rowRandomMartingale'); var test = document.getElementById('rowTest'); var inProgress = {{ inProgress| lower }}; @@ -468,15 +512,22 @@ if (indicatorSelect.value === 'SMA') { SMA.style.display = 'flex'; random.style.display = 'none'; - test.style.display = 'none'; + randomMartingale.style.display = 'none'; + //test.style.display = 'none'; } else if (indicatorSelect.value === 'random') { random.style.display = 'flex'; SMA.style.display = 'none'; - test.style.display = 'none'; - } else if (indicatorSelect.value === 'test') { + randomMartingale.style.display = 'none'; + //test.style.display = 'none'; + /*} else if (indicatorSelect.value === 'test') { test.style.display = 'flex'; SMA.style.display = 'none'; + random.style.display = 'none';*/ + } else if (indicatorSelect.value === 'randomMartingale') { + randomMartingale.style.display = 'flex'; + SMA.style.display = 'none'; random.style.display = 'none'; + //test.style.display = 'none'; } }