def handle_trade_R_Breaker(self): | |
#logger.info('Debug by Lu: handle_trade_R_Breaker is called') | |
buy_orders = [] | |
sell_orders = [] | |
# xxxx | |
instrument = self.exchange.get_instrument() | |
if self.is_newDay(): #a new day start | |
self.prevClosePrice = instrument["prevClosePrice"] | |
self.prevHighPrice = self.todayHighPrice | |
self.prevLowPrice = self.todayLowPrice | |
self.Pivot = (self.prevClosePrice + self.prevHighPrice + self.prevLowPrice) / 3 | |
self.buy_break = self.prevHighPrice + 2 * (self.Pivot - self.prevLowPrice) | |
self.sell_setup = self.Pivot + (self.prevHighPrice - self.prevLowPrice) | |
self.sell_enter = 2 * self.Pivot - self.prevLowPrice | |
self.buy_enter = 2 * self.Pivot - self.prevHighPrice | |
self.buy_setup = self.Pivot - (self.prevHighPrice - self.prevLowPrice) | |
self.sell_break = self.prevLowPrice - 2 * (self.prevHighPrice - self.Pivot) | |
self.todayHighPrice = instrument["highPrice"] | |
self.todayLowPrice = instrument["lowPrice"] | |
lastPrice = instrument["lastPrice"] | |
position = self.exchange.get_delta() | |
logger.info('Debug by Lu: prevClosePrice: %.2f, prevHighPrice: %.2f, prevLowPrice: %.2f' %(self.prevClosePrice, self.prevHighPrice,self.prevLowPrice)) | |
logger.info('Debug by Lu: buy_break: %.2f, sell_setup: %.2f, sell_enter: %.2f, buy_enter: %.2f, buy_setup: %.2f, sell_break: %.2f' %(self.buy_break, self.sell_setup, self.sell_enter, self.buy_enter, self.buy_setup, self.sell_break)) | |
logger.info('Debug by Lu: position = %d' % position) | |
if position == 0: | |
if lastPrice > self.buy_break: | |
buyOrder = self.create_order(-self.positionSize,instrument) | |
buy_orders.append(buyOrder) | |
logger.info('Debug by Lu: lastPrice > buy_break, buy triggered: price = %.2f, nummer = %d' % (buyOrder["price"], buyOrder["orderQty"])) | |
if lastPrice < self.sell_break: | |
sellOrder = self.create_order(self.positionSize,instrument) | |
sell_orders.append(sellOrder) | |
logger.info('Debug by Lu: lastPrice < sell_break, sell triggered: price = %.2f, nummer = %d' % (sellOrder["price"], sellOrder["orderQty"])) | |
elif position > 0: | |
if self.todayHighPrice > self.sell_setup and lastPrice < self.sell_enter: | |
sellOrder = self.create_order(self.positionSize * 2,instrument) | |
sell_orders.append(sellOrder) | |
logger.info('Debug by Lu: todayHighPrice > sell_setup and lastPrice < sell_enter, sell triggered: price = %.2f, nummer = %d' % (sellOrder["price"], sellOrder["orderQty"])) | |
elif position < 0: | |
if self.todayLowPrice < self.buy_setup and lastPrice > self.buy_enter: | |
buyOrder = self.create_order(-self.positionSize * 2,instrument) | |
buy_orders.append(buyOrder) | |
logger.info('Debug by Lu: todayLowPrice < buy_setup and lastPrice > buy_enter, buy triggered: price = %.2f, nummer = %d' % (buyOrder["price"], buyOrder["orderQty"])) | |
return self.converge_orders(buy_orders, sell_orders) | |
def settlement(self, plastBidSize, plastBidPrice, plastAskPrice, plastAskSize): #平仓 | |
if self.dynamic_position > 0: | |
if plastBidSize >= self.dynamic_position: | |
self.endPrice_profit = plastBidPrice | |
#print('lastPrice < sell_break, sell triggered: price = %.2f, nummer = %d' % (lastBidPrice, operateposition)) | |
self.benifitCaculate() | |
self.dynamic_position =0 | |
if self.dynamic_position < 0: | |
if plastAskSize >= abs(self.dynamic_position): | |
self.endPrice_profit = plastAskPrice | |
self.benifitCaculate() | |
self.dynamic_position = 0 | |
def Zhishun(self, plastPrice, plastBidSize, plastBidPrice, plastAskPrice, plastAskSize): | |
if self.dynamic_position > 0: | |
pricealpha = (plastPrice - self.startPrice_profit) / self.startPrice_profit | |
if pricealpha < -settings.ZHISHUN_PROZENT: | |
self.settlement(plastBidSize, plastBidPrice, plastAskPrice, plastAskSize) | |
if self.dynamic_position == 0: | |
print("price has decreased more than 5%, sell all") | |
if self.dynamic_position < 0: | |
pricealpha = (plastPrice - self.startPrice_profit) / self.startPrice_profit | |
if pricealpha > settings.ZHISHUN_PROZENT: | |
self.settlement(plastBidSize, plastBidPrice, plastAskPrice, plastAskSize) | |
if self.dynamic_position == 0: | |
print("price has increased more than 5%, buy all") | |
def calcATR(self): | |
N = settings.ATRN | |
TR_List = [] | |
#TR_List_Str = "" | |
for i in range(0,N): | |
TR = self.highPriceQueue[i] - self.lowPriceQueue[i] | |
if TR > 0 and TR < 1000.0: | |
TR_List.append(TR) | |
#print("high = %.2f, low = %.2f, TR = %.2f" % (self.highPriceQueue[i], self.lowPriceQueue[i], TR)) | |
#TR_List_Str += (str(round(TR,2))+" ") | |
ATR = np.array(TR_List).mean() | |
self.ATR = ATR | |
#TR_List_Str += ("ATR = " + str(self.ATR)) | |
#print("ATR = %.2f" % self.ATR) | |
#print(TR_List_Str) | |
def CalcUnit(self, nowPrice): # 计算一个ATR单位的仓位 | |
if settings.IS_BACKTESTING: | |
X = settings.START_BTCOIN + self.totalprofit | |
else: | |
X = self.current_XBT | |
if self.ATR != 0: | |
self.UnitPosition = int(abs(0.02 * X * nowPrice * (nowPrice + self.ATR) / self.ATR)) | |
print(self.todayDate + (": bitcoin = %.4f today UnitPosition = %d, nowPrice = %.2f, ATR = %d, dynamicpostion = %d" % (X, self.UnitPosition, nowPrice, self.ATR, self.dynamic_position))) | |
def tradeTultle(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
if self.TurtlePos == 0: | |
if self.currentPrice > self.maxPreNhighPrice: | |
traderesult = self.backtest_trade(self.UnitPosition, "buy") | |
if traderesult: | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
self.startPrice_profit = self.lastAskPrice | |
print(self.prevDayBacktest + (" 价格向上突破%.2f,建仓:%d, 建仓价为%.2f" %(self.maxPreNhighPrice, self.UnitPosition,self.startPrice_profit))) | |
elif self.currentPrice < self.minPreNlowPrice: | |
traderesult = self.backtest_trade(self.UnitPosition, "sell") | |
if traderesult: | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
sellbreak = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
self.startPrice_profit = self.lastAskPrice | |
print(self.prevDayBacktest + (" 价格向下跌破%.2f,建仓:-%d, 建仓价为%.2f" %(self.minPreNlowPrice, self.UnitPosition, self.startPrice_profit))) | |
elif abs(self.TurtlePos) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - 2 * self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + 2 * self.ATR | |
if self.TurtlePos > 0: | |
if self.currentPrice < self.minPreNlowPrice or self.unrealisedbenifit > settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "sell") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破N日最低价格触发止盈, 平仓价为%.2f" %(self.lastBidPrice))) | |
self.benifitCaculatePos(pos, self.lastBidPrice) | |
return 0 | |
if self.currentPrice < sell_break: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "sell") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破2ATR触发平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
self.benifitCaculatePos(pos, self.lastBidPrice) | |
return 0 | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
traderesult = self.backtest_trade(self.UnitPosition, "buy") | |
if traderesult: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
self.updateStartPriceProfit(self.lastAskPrice, self.UnitPosition) | |
print(self.prevDayBacktest + (" 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.startPrice_profit))) | |
elif self.TurtlePos < 0: | |
if self.currentPrice > self.maxPreNhighPrice or self.unrealisedbenifit > settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "buy") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破N日最高价格触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
self.benifitCaculatePos(pos, self.lastAskPrice) | |
return 0 | |
if self.currentPrice > buy_break: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "buy") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
self.benifitCaculatePos(pos, self.lastAskPrice) | |
return 0 | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
traderesult = self.backtest_trade(self.UnitPosition, "sell") | |
if traderesult: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
self.updateStartPriceProfit(self.lastBidPrice, (self.UnitPosition * (-1))) | |
print(self.prevDayBacktest + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.startPrice_profit))) | |
def tradeMovingAverage(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
traderest = 0.0 | |
successTrade = 0.0 | |
if self.TurtlePos == 0: | |
if self.currentPrice > self.movingAveragePrice: | |
traderest = self.tradeTheRest(self.UnitPosition) | |
successTrade = self.UnitPosition - traderest | |
if abs(successTrade)>0: | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.prevDayBacktest + (" 价格向上突破均线%.2f,建仓:%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition,self.startPrice_profit))) | |
elif self.currentPrice < self.movingAveragePrice: | |
nowBitcoin = settings.START_BTCOIN + self.totalprofit | |
shortFirstPos = self.UnitPosition * (-1) - self.currentPrice * nowBitcoin | |
traderest = self.tradeTheRest(shortFirstPos) | |
successTrade = shortFirstPos - traderest | |
if abs(successTrade)>0: | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.prevDayBacktest + (" 价格向下跌破均线%.2f,建仓:-%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition, self.startPrice_profit))) | |
elif abs(self.TurtlePos) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - 2 * self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + 2 * self.ATR | |
if self.TurtlePos > 0: | |
if self.currentPrice < self.movingAveragePrice or self.currentPrice < sell_break or self.unrealisedbenifit >= settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderest = self.tradeTheRest(pos * (-1)) #sell all the positions | |
successTrade = pos * (-1) - traderest | |
if abs(successTrade) > 0: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破均线/2ATR触发止盈/平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
return traderest | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return traderest | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position >= self.UPPERLIMITPOS: | |
return traderest | |
elif (self.dynamic_position + self.UnitPosition) > self.UPPERLIMITPOS: | |
self.UnitPosition = self.UPPERLIMITPOS - self.dynamic_position | |
traderest = self.tradeTheRest(self.UnitPosition) | |
successTrade = self.UnitPosition - traderest | |
if abs(successTrade) > 0.00: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.prevDayBacktest + (" 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.startPrice_profit))) | |
elif self.TurtlePos < 0: | |
if self.currentPrice > self.movingAveragePrice or self.currentPrice > buy_break or self.unrealisedbenifit >= settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderest = self.tradeTheRest(abs(pos)) #平仓 | |
successTrade = abs(pos) - traderest | |
if abs(successTrade) > 0.0: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破均价/2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
return traderest | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return traderest | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position <= self.UNTERLIMITPOS: | |
return traderest | |
elif (self.dynamic_position - self.UnitPosition) < self.UNTERLIMITPOS: | |
self.UnitPosition = self.dynamic_position - self.UNTERLIMITPOS | |
traderest = self.tradeTheRest(self.UnitPosition*(-1)) | |
successTrade = self.UnitPosition * (-1) - traderest | |
if abs(successTrade) > 0: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.prevDayBacktest + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.startPrice_profit))) | |
return traderest | |
def tradeMovingAverage_real(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
if self.dynamic_position == 0: | |
if self.currentPrice > self.movingAveragePrice: | |
self.tradeTheRest_real(self.UnitPosition) | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.todayDate + self.clockTime + (": 价格向上突破均线%.2f,建仓:%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition,self.lastAskPrice))) | |
elif self.currentPrice < self.movingAveragePrice: | |
shortFirstPos = self.UnitPosition * (-1) - self.currentPrice * self.current_XBT * 2 | |
self.tradeTheRest_real(shortFirstPos) | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.todayDate + self.clockTime + (": 价格向下跌破均线%.2f,建仓:-%d, 建仓价为%.2f" %(self.movingAveragePrice, shortFirstPos, self.lastBidPrice))) | |
elif abs(self.dynamic_position) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + self.ATR | |
if self.dynamic_position > 0: | |
if self.currentPrice < self.movingAveragePrice or self.currentPrice < sell_break: | |
self.sellorbuyAll() | |
print(self.todayDate + self.clockTime + (": 价格向下跌破均线/2ATR触发止盈/平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
return 0 | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position >= self.UPPERLIMITPOS: | |
return 0 | |
elif (self.dynamic_position + self.UnitPosition) > self.UPPERLIMITPOS: | |
self.UnitPosition = self.UPPERLIMITPOS - self.dynamic_position | |
self.tradeTheRest_real(self.UnitPosition) | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.todayDate + self.clockTime + (": 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.lastAskPrice))) | |
elif self.dynamic_position < 0: | |
if self.currentPrice > self.movingAveragePrice or self.currentPrice > buy_break : | |
pos = self.dynamic_position | |
self.sellorbuyAll() | |
print(self.todayDate + self.clockTime + (" 价格向上涨破均价/2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
return 0 | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position <= self.UNTERLIMITPOS: | |
return 0 | |
elif (self.dynamic_position - self.UnitPosition) < self.UNTERLIMITPOS: | |
self.UnitPosition = self.dynamic_position - self.UNTERLIMITPOS | |
self.tradeTheRest_real(-self.UnitPosition) | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.todayDate + self.clockTime + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.lastBidPrice))) | |
return 0 | |
def backtest_trade_rest(self, pos,dir = "buy"): #trade in market price | |
if pos > 0: | |
if self.lastAskSize >= pos: | |
#self.startPrice_profit = self.lastAskPrice | |
self.dynamic_position +=pos | |
return pos | |
else: | |
self.dynamic_position += self.lastAskSize | |
return self.lastAskSize | |
elif pos < 0: | |
if self.lastBidSize >= abs(pos): | |
#self.startPrice_profit = self.lastBidPrice | |
self.dynamic_position +=pos | |
return pos | |
else: | |
self.dynamic_position -= self.lastBidSize | |
return (self.lastBidSize) * (-1) | |
else: | |
return 0 | |
def backtest_trade(self, pos, dir = "buy"): #trade in market price | |
if dir == "buy": | |
if self.lastAskSize >= pos: | |
#self.startPrice_profit = self.lastAskPrice | |
self.dynamic_position +=pos | |
return True | |
else: | |
return False | |
elif dir == "sell": | |
if self.lastBidSize >= pos: | |
#self.startPrice_profit = self.lastBidPrice | |
self.dynamic_position -=pos | |
return True | |
else: | |
return False |
def handle_trade_R_Breaker(self): | |
#logger.info('Debug by Lu: handle_trade_R_Breaker is called') | |
buy_orders = [] | |
sell_orders = [] | |
# xxxx | |
instrument = self.exchange.get_instrument() | |
if self.is_newDay(): #a new day start | |
self.prevClosePrice = instrument["prevClosePrice"] | |
self.prevHighPrice = self.todayHighPrice | |
self.prevLowPrice = self.todayLowPrice | |
self.Pivot = (self.prevClosePrice + self.prevHighPrice + self.prevLowPrice) / 3 | |
self.buy_break = self.prevHighPrice + 2 * (self.Pivot - self.prevLowPrice) | |
self.sell_setup = self.Pivot + (self.prevHighPrice - self.prevLowPrice) | |
self.sell_enter = 2 * self.Pivot - self.prevLowPrice | |
self.buy_enter = 2 * self.Pivot - self.prevHighPrice | |
self.buy_setup = self.Pivot - (self.prevHighPrice - self.prevLowPrice) | |
self.sell_break = self.prevLowPrice - 2 * (self.prevHighPrice - self.Pivot) | |
self.todayHighPrice = instrument["highPrice"] | |
self.todayLowPrice = instrument["lowPrice"] | |
lastPrice = instrument["lastPrice"] | |
position = self.exchange.get_delta() | |
logger.info('Debug by Lu: prevClosePrice: %.2f, prevHighPrice: %.2f, prevLowPrice: %.2f' %(self.prevClosePrice, self.prevHighPrice,self.prevLowPrice)) | |
logger.info('Debug by Lu: buy_break: %.2f, sell_setup: %.2f, sell_enter: %.2f, buy_enter: %.2f, buy_setup: %.2f, sell_break: %.2f' %(self.buy_break, self.sell_setup, self.sell_enter, self.buy_enter, self.buy_setup, self.sell_break)) | |
logger.info('Debug by Lu: position = %d' % position) | |
if position == 0: | |
if lastPrice > self.buy_break: | |
buyOrder = self.create_order(-self.positionSize,instrument) | |
buy_orders.append(buyOrder) | |
logger.info('Debug by Lu: lastPrice > buy_break, buy triggered: price = %.2f, nummer = %d' % (buyOrder["price"], buyOrder["orderQty"])) | |
if lastPrice < self.sell_break: | |
sellOrder = self.create_order(self.positionSize,instrument) | |
sell_orders.append(sellOrder) | |
logger.info('Debug by Lu: lastPrice < sell_break, sell triggered: price = %.2f, nummer = %d' % (sellOrder["price"], sellOrder["orderQty"])) | |
elif position > 0: | |
if self.todayHighPrice > self.sell_setup and lastPrice < self.sell_enter: | |
sellOrder = self.create_order(self.positionSize * 2,instrument) | |
sell_orders.append(sellOrder) | |
logger.info('Debug by Lu: todayHighPrice > sell_setup and lastPrice < sell_enter, sell triggered: price = %.2f, nummer = %d' % (sellOrder["price"], sellOrder["orderQty"])) | |
elif position < 0: | |
if self.todayLowPrice < self.buy_setup and lastPrice > self.buy_enter: | |
buyOrder = self.create_order(-self.positionSize * 2,instrument) | |
buy_orders.append(buyOrder) | |
logger.info('Debug by Lu: todayLowPrice < buy_setup and lastPrice > buy_enter, buy triggered: price = %.2f, nummer = %d' % (buyOrder["price"], buyOrder["orderQty"])) | |
return self.converge_orders(buy_orders, sell_orders) | |
def settlement(self, plastBidSize, plastBidPrice, plastAskPrice, plastAskSize): #平仓 | |
if self.dynamic_position > 0: | |
if plastBidSize >= self.dynamic_position: | |
self.endPrice_profit = plastBidPrice | |
#print('lastPrice < sell_break, sell triggered: price = %.2f, nummer = %d' % (lastBidPrice, operateposition)) | |
self.benifitCaculate() | |
self.dynamic_position =0 | |
if self.dynamic_position < 0: | |
if plastAskSize >= abs(self.dynamic_position): | |
self.endPrice_profit = plastAskPrice | |
self.benifitCaculate() | |
self.dynamic_position = 0 | |
def Zhishun(self, plastPrice, plastBidSize, plastBidPrice, plastAskPrice, plastAskSize): | |
if self.dynamic_position > 0: | |
pricealpha = (plastPrice - self.startPrice_profit) / self.startPrice_profit | |
if pricealpha < -settings.ZHISHUN_PROZENT: | |
self.settlement(plastBidSize, plastBidPrice, plastAskPrice, plastAskSize) | |
if self.dynamic_position == 0: | |
print("price has decreased more than 5%, sell all") | |
if self.dynamic_position < 0: | |
pricealpha = (plastPrice - self.startPrice_profit) / self.startPrice_profit | |
if pricealpha > settings.ZHISHUN_PROZENT: | |
self.settlement(plastBidSize, plastBidPrice, plastAskPrice, plastAskSize) | |
if self.dynamic_position == 0: | |
print("price has increased more than 5%, buy all") | |
def calcATR(self): | |
N = settings.ATRN | |
TR_List = [] | |
#TR_List_Str = "" | |
for i in range(0,N): | |
TR = self.highPriceQueue[i] - self.lowPriceQueue[i] | |
if TR > 0 and TR < 1000.0: | |
TR_List.append(TR) | |
#print("high = %.2f, low = %.2f, TR = %.2f" % (self.highPriceQueue[i], self.lowPriceQueue[i], TR)) | |
#TR_List_Str += (str(round(TR,2))+" ") | |
ATR = np.array(TR_List).mean() | |
self.ATR = ATR | |
#TR_List_Str += ("ATR = " + str(self.ATR)) | |
#print("ATR = %.2f" % self.ATR) | |
#print(TR_List_Str) | |
def CalcUnit(self, nowPrice): # 计算一个ATR单位的仓位 | |
if settings.IS_BACKTESTING: | |
X = settings.START_BTCOIN + self.totalprofit | |
else: | |
X = self.current_XBT | |
if self.ATR != 0: | |
self.UnitPosition = int(abs(0.02 * X * nowPrice * (nowPrice + self.ATR) / self.ATR)) | |
print(self.todayDate + (": bitcoin = %.4f today UnitPosition = %d, nowPrice = %.2f, ATR = %d, dynamicpostion = %d" % (X, self.UnitPosition, nowPrice, self.ATR, self.dynamic_position))) | |
def tradeTultle(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
if self.TurtlePos == 0: | |
if self.currentPrice > self.maxPreNhighPrice: | |
traderesult = self.backtest_trade(self.UnitPosition, "buy") | |
if traderesult: | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
self.startPrice_profit = self.lastAskPrice | |
print(self.prevDayBacktest + (" 价格向上突破%.2f,建仓:%d, 建仓价为%.2f" %(self.maxPreNhighPrice, self.UnitPosition,self.startPrice_profit))) | |
elif self.currentPrice < self.minPreNlowPrice: | |
traderesult = self.backtest_trade(self.UnitPosition, "sell") | |
if traderesult: | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
sellbreak = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
self.startPrice_profit = self.lastAskPrice | |
print(self.prevDayBacktest + (" 价格向下跌破%.2f,建仓:-%d, 建仓价为%.2f" %(self.minPreNlowPrice, self.UnitPosition, self.startPrice_profit))) | |
elif abs(self.TurtlePos) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - 2 * self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + 2 * self.ATR | |
if self.TurtlePos > 0: | |
if self.currentPrice < self.minPreNlowPrice or self.unrealisedbenifit > settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "sell") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破N日最低价格触发止盈, 平仓价为%.2f" %(self.lastBidPrice))) | |
self.benifitCaculatePos(pos, self.lastBidPrice) | |
return 0 | |
if self.currentPrice < sell_break: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "sell") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破2ATR触发平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
self.benifitCaculatePos(pos, self.lastBidPrice) | |
return 0 | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
traderesult = self.backtest_trade(self.UnitPosition, "buy") | |
if traderesult: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
self.updateStartPriceProfit(self.lastAskPrice, self.UnitPosition) | |
print(self.prevDayBacktest + (" 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.startPrice_profit))) | |
elif self.TurtlePos < 0: | |
if self.currentPrice > self.maxPreNhighPrice or self.unrealisedbenifit > settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "buy") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破N日最高价格触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
self.benifitCaculatePos(pos, self.lastAskPrice) | |
return 0 | |
if self.currentPrice > buy_break: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "buy") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
self.benifitCaculatePos(pos, self.lastAskPrice) | |
return 0 | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
traderesult = self.backtest_trade(self.UnitPosition, "sell") | |
if traderesult: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
self.updateStartPriceProfit(self.lastBidPrice, (self.UnitPosition * (-1))) | |
print(self.prevDayBacktest + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.startPrice_profit))) | |
def tradeMovingAverage(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
traderest = 0.0 | |
successTrade = 0.0 | |
if self.TurtlePos == 0: | |
if self.currentPrice > self.movingAveragePrice: | |
traderest = self.tradeTheRest(self.UnitPosition) | |
successTrade = self.UnitPosition - traderest | |
if abs(successTrade)>0: | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.prevDayBacktest + (" 价格向上突破均线%.2f,建仓:%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition,self.startPrice_profit))) | |
elif self.currentPrice < self.movingAveragePrice: | |
nowBitcoin = settings.START_BTCOIN + self.totalprofit | |
shortFirstPos = self.UnitPosition * (-1) - self.currentPrice * nowBitcoin | |
traderest = self.tradeTheRest(shortFirstPos) | |
successTrade = shortFirstPos - traderest | |
if abs(successTrade)>0: | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.prevDayBacktest + (" 价格向下跌破均线%.2f,建仓:-%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition, self.startPrice_profit))) | |
elif abs(self.TurtlePos) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - 2 * self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + 2 * self.ATR | |
if self.TurtlePos > 0: | |
if self.currentPrice < self.movingAveragePrice or self.currentPrice < sell_break or self.unrealisedbenifit >= settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderest = self.tradeTheRest(pos * (-1)) #sell all the positions | |
successTrade = pos * (-1) - traderest | |
if abs(successTrade) > 0: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破均线/2ATR触发止盈/平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
return traderest | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return traderest | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position >= self.UPPERLIMITPOS: | |
return traderest | |
elif (self.dynamic_position + self.UnitPosition) > self.UPPERLIMITPOS: | |
self.UnitPosition = self.UPPERLIMITPOS - self.dynamic_position | |
traderest = self.tradeTheRest(self.UnitPosition) | |
successTrade = self.UnitPosition - traderest | |
if abs(successTrade) > 0.00: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.prevDayBacktest + (" 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.startPrice_profit))) | |
elif self.TurtlePos < 0: | |
if self.currentPrice > self.movingAveragePrice or self.currentPrice > buy_break or self.unrealisedbenifit >= settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderest = self.tradeTheRest(abs(pos)) #平仓 | |
successTrade = abs(pos) - traderest | |
if abs(successTrade) > 0.0: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破均价/2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
return traderest | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return traderest | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position <= self.UNTERLIMITPOS: | |
return traderest | |
elif (self.dynamic_position - self.UnitPosition) < self.UNTERLIMITPOS: | |
self.UnitPosition = self.dynamic_position - self.UNTERLIMITPOS | |
traderest = self.tradeTheRest(self.UnitPosition*(-1)) | |
successTrade = self.UnitPosition * (-1) - traderest | |
if abs(successTrade) > 0: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.prevDayBacktest + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.startPrice_profit))) | |
return traderest | |
def tradeMovingAverage_real(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
if self.dynamic_position == 0: | |
if self.currentPrice > self.movingAveragePrice: | |
self.tradeTheRest_real(self.UnitPosition) | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.todayDate + self.clockTime + (": 价格向上突破均线%.2f,建仓:%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition,self.lastAskPrice))) | |
elif self.currentPrice < self.movingAveragePrice: | |
shortFirstPos = self.UnitPosition * (-1) - self.currentPrice * self.current_XBT * 2 | |
self.tradeTheRest_real(shortFirstPos) | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.todayDate + self.clockTime + (": 价格向下跌破均线%.2f,建仓:-%d, 建仓价为%.2f" %(self.movingAveragePrice, shortFirstPos, self.lastBidPrice))) | |
elif abs(self.dynamic_position) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + self.ATR | |
if self.dynamic_position > 0: | |
if self.currentPrice < self.movingAveragePrice or self.currentPrice < sell_break: | |
self.sellorbuyAll() | |
print(self.todayDate + self.clockTime + (": 价格向下跌破均线/2ATR触发止盈/平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
return 0 | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position >= self.UPPERLIMITPOS: | |
return 0 | |
elif (self.dynamic_position + self.UnitPosition) > self.UPPERLIMITPOS: | |
self.UnitPosition = self.UPPERLIMITPOS - self.dynamic_position | |
self.tradeTheRest_real(self.UnitPosition) | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.todayDate + self.clockTime + (": 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.lastAskPrice))) | |
elif self.dynamic_position < 0: | |
if self.currentPrice > self.movingAveragePrice or self.currentPrice > buy_break : | |
pos = self.dynamic_position | |
self.sellorbuyAll() | |
print(self.todayDate + self.clockTime + (" 价格向上涨破均价/2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
return 0 | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position <= self.UNTERLIMITPOS: | |
return 0 | |
elif (self.dynamic_position - self.UnitPosition) < self.UNTERLIMITPOS: | |
self.UnitPosition = self.dynamic_position - self.UNTERLIMITPOS | |
self.tradeTheRest_real(-self.UnitPosition) | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.todayDate + self.clockTime + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.lastBidPrice))) | |
return 0 | |
def backtest_trade_rest(self, pos,dir = "buy"): #trade in market price | |
if pos > 0: | |
if self.lastAskSize >= pos: | |
#self.startPrice_profit = self.lastAskPrice | |
self.dynamic_position +=pos | |
return pos | |
else: | |
self.dynamic_position += self.lastAskSize | |
return self.lastAskSize | |
elif pos < 0: | |
if self.lastBidSize >= abs(pos): | |
#self.startPrice_profit = self.lastBidPrice | |
self.dynamic_position +=pos | |
return pos | |
else: | |
self.dynamic_position -= self.lastBidSize | |
return (self.lastBidSize) * (-1) | |
else: | |
return 0 | |
def backtest_trade(self, pos, dir = "buy"): #trade in market price | |
if dir == "buy": | |
if self.lastAskSize >= pos: | |
#self.startPrice_profit = self.lastAskPrice | |
self.dynamic_position +=pos | |
return True | |
else: | |
return False | |
elif dir == "sell": | |
if self.lastBidSize >= pos: | |
#self.startPrice_profit = self.lastBidPrice | |
self.dynamic_position -=pos | |
return True | |
else: | |
return False |
def handle_trade_R_Breaker(self): | |
#logger.info('Debug by Lu: handle_trade_R_Breaker is called') | |
buy_orders = [] | |
sell_orders = [] | |
# xxxx | |
instrument = self.exchange.get_instrument() | |
if self.is_newDay(): #a new day start | |
self.prevClosePrice = instrument["prevClosePrice"] | |
self.prevHighPrice = self.todayHighPrice | |
self.prevLowPrice = self.todayLowPrice | |
self.Pivot = (self.prevClosePrice + self.prevHighPrice + self.prevLowPrice) / 3 | |
self.buy_break = self.prevHighPrice + 2 * (self.Pivot - self.prevLowPrice) | |
self.sell_setup = self.Pivot + (self.prevHighPrice - self.prevLowPrice) | |
self.sell_enter = 2 * self.Pivot - self.prevLowPrice | |
self.buy_enter = 2 * self.Pivot - self.prevHighPrice | |
self.buy_setup = self.Pivot - (self.prevHighPrice - self.prevLowPrice) | |
self.sell_break = self.prevLowPrice - 2 * (self.prevHighPrice - self.Pivot) | |
self.todayHighPrice = instrument["highPrice"] | |
self.todayLowPrice = instrument["lowPrice"] | |
lastPrice = instrument["lastPrice"] | |
position = self.exchange.get_delta() | |
logger.info('Debug by Lu: prevClosePrice: %.2f, prevHighPrice: %.2f, prevLowPrice: %.2f' %(self.prevClosePrice, self.prevHighPrice,self.prevLowPrice)) | |
logger.info('Debug by Lu: buy_break: %.2f, sell_setup: %.2f, sell_enter: %.2f, buy_enter: %.2f, buy_setup: %.2f, sell_break: %.2f' %(self.buy_break, self.sell_setup, self.sell_enter, self.buy_enter, self.buy_setup, self.sell_break)) | |
logger.info('Debug by Lu: position = %d' % position) | |
if position == 0: | |
if lastPrice > self.buy_break: | |
buyOrder = self.create_order(-self.positionSize,instrument) | |
buy_orders.append(buyOrder) | |
logger.info('Debug by Lu: lastPrice > buy_break, buy triggered: price = %.2f, nummer = %d' % (buyOrder["price"], buyOrder["orderQty"])) | |
if lastPrice < self.sell_break: | |
sellOrder = self.create_order(self.positionSize,instrument) | |
sell_orders.append(sellOrder) | |
logger.info('Debug by Lu: lastPrice < sell_break, sell triggered: price = %.2f, nummer = %d' % (sellOrder["price"], sellOrder["orderQty"])) | |
elif position > 0: | |
if self.todayHighPrice > self.sell_setup and lastPrice < self.sell_enter: | |
sellOrder = self.create_order(self.positionSize * 2,instrument) | |
sell_orders.append(sellOrder) | |
logger.info('Debug by Lu: todayHighPrice > sell_setup and lastPrice < sell_enter, sell triggered: price = %.2f, nummer = %d' % (sellOrder["price"], sellOrder["orderQty"])) | |
elif position < 0: | |
if self.todayLowPrice < self.buy_setup and lastPrice > self.buy_enter: | |
buyOrder = self.create_order(-self.positionSize * 2,instrument) | |
buy_orders.append(buyOrder) | |
logger.info('Debug by Lu: todayLowPrice < buy_setup and lastPrice > buy_enter, buy triggered: price = %.2f, nummer = %d' % (buyOrder["price"], buyOrder["orderQty"])) | |
return self.converge_orders(buy_orders, sell_orders) | |
def settlement(self, plastBidSize, plastBidPrice, plastAskPrice, plastAskSize): #平仓 | |
if self.dynamic_position > 0: | |
if plastBidSize >= self.dynamic_position: | |
self.endPrice_profit = plastBidPrice | |
#print('lastPrice < sell_break, sell triggered: price = %.2f, nummer = %d' % (lastBidPrice, operateposition)) | |
self.benifitCaculate() | |
self.dynamic_position =0 | |
if self.dynamic_position < 0: | |
if plastAskSize >= abs(self.dynamic_position): | |
self.endPrice_profit = plastAskPrice | |
self.benifitCaculate() | |
self.dynamic_position = 0 | |
def Zhishun(self, plastPrice, plastBidSize, plastBidPrice, plastAskPrice, plastAskSize): | |
if self.dynamic_position > 0: | |
pricealpha = (plastPrice - self.startPrice_profit) / self.startPrice_profit | |
if pricealpha < -settings.ZHISHUN_PROZENT: | |
self.settlement(plastBidSize, plastBidPrice, plastAskPrice, plastAskSize) | |
if self.dynamic_position == 0: | |
print("price has decreased more than 5%, sell all") | |
if self.dynamic_position < 0: | |
pricealpha = (plastPrice - self.startPrice_profit) / self.startPrice_profit | |
if pricealpha > settings.ZHISHUN_PROZENT: | |
self.settlement(plastBidSize, plastBidPrice, plastAskPrice, plastAskSize) | |
if self.dynamic_position == 0: | |
print("price has increased more than 5%, buy all") | |
def calcATR(self): | |
N = settings.ATRN | |
TR_List = [] | |
#TR_List_Str = "" | |
for i in range(0,N): | |
TR = self.highPriceQueue[i] - self.lowPriceQueue[i] | |
if TR > 0 and TR < 1000.0: | |
TR_List.append(TR) | |
#print("high = %.2f, low = %.2f, TR = %.2f" % (self.highPriceQueue[i], self.lowPriceQueue[i], TR)) | |
#TR_List_Str += (str(round(TR,2))+" ") | |
ATR = np.array(TR_List).mean() | |
self.ATR = ATR | |
#TR_List_Str += ("ATR = " + str(self.ATR)) | |
#print("ATR = %.2f" % self.ATR) | |
#print(TR_List_Str) | |
def CalcUnit(self, nowPrice): # 计算一个ATR单位的仓位 | |
if settings.IS_BACKTESTING: | |
X = settings.START_BTCOIN + self.totalprofit | |
else: | |
X = self.current_XBT | |
if self.ATR != 0: | |
self.UnitPosition = int(abs(0.02 * X * nowPrice * (nowPrice + self.ATR) / self.ATR)) | |
print(self.todayDate + (": bitcoin = %.4f today UnitPosition = %d, nowPrice = %.2f, ATR = %d, dynamicpostion = %d" % (X, self.UnitPosition, nowPrice, self.ATR, self.dynamic_position))) | |
def tradeTultle(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
if self.TurtlePos == 0: | |
if self.currentPrice > self.maxPreNhighPrice: | |
traderesult = self.backtest_trade(self.UnitPosition, "buy") | |
if traderesult: | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
self.startPrice_profit = self.lastAskPrice | |
print(self.prevDayBacktest + (" 价格向上突破%.2f,建仓:%d, 建仓价为%.2f" %(self.maxPreNhighPrice, self.UnitPosition,self.startPrice_profit))) | |
elif self.currentPrice < self.minPreNlowPrice: | |
traderesult = self.backtest_trade(self.UnitPosition, "sell") | |
if traderesult: | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
sellbreak = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
self.startPrice_profit = self.lastAskPrice | |
print(self.prevDayBacktest + (" 价格向下跌破%.2f,建仓:-%d, 建仓价为%.2f" %(self.minPreNlowPrice, self.UnitPosition, self.startPrice_profit))) | |
elif abs(self.TurtlePos) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - 2 * self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + 2 * self.ATR | |
if self.TurtlePos > 0: | |
if self.currentPrice < self.minPreNlowPrice or self.unrealisedbenifit > settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "sell") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破N日最低价格触发止盈, 平仓价为%.2f" %(self.lastBidPrice))) | |
self.benifitCaculatePos(pos, self.lastBidPrice) | |
return 0 | |
if self.currentPrice < sell_break: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "sell") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破2ATR触发平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
self.benifitCaculatePos(pos, self.lastBidPrice) | |
return 0 | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
traderesult = self.backtest_trade(self.UnitPosition, "buy") | |
if traderesult: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
self.updateStartPriceProfit(self.lastAskPrice, self.UnitPosition) | |
print(self.prevDayBacktest + (" 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.startPrice_profit))) | |
elif self.TurtlePos < 0: | |
if self.currentPrice > self.maxPreNhighPrice or self.unrealisedbenifit > settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "buy") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破N日最高价格触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
self.benifitCaculatePos(pos, self.lastAskPrice) | |
return 0 | |
if self.currentPrice > buy_break: | |
pos = self.dynamic_position | |
traderesult = self.backtest_trade(abs(self.dynamic_position), "buy") | |
if traderesult: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
self.benifitCaculatePos(pos, self.lastAskPrice) | |
return 0 | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
traderesult = self.backtest_trade(self.UnitPosition, "sell") | |
if traderesult: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
self.updateStartPriceProfit(self.lastBidPrice, (self.UnitPosition * (-1))) | |
print(self.prevDayBacktest + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.startPrice_profit))) | |
def tradeMovingAverage(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
traderest = 0.0 | |
successTrade = 0.0 | |
if self.TurtlePos == 0: | |
if self.currentPrice > self.movingAveragePrice: | |
traderest = self.tradeTheRest(self.UnitPosition) | |
successTrade = self.UnitPosition - traderest | |
if abs(successTrade)>0: | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.prevDayBacktest + (" 价格向上突破均线%.2f,建仓:%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition,self.startPrice_profit))) | |
elif self.currentPrice < self.movingAveragePrice: | |
nowBitcoin = settings.START_BTCOIN + self.totalprofit | |
shortFirstPos = self.UnitPosition * (-1) - self.currentPrice * nowBitcoin | |
traderest = self.tradeTheRest(shortFirstPos) | |
successTrade = shortFirstPos - traderest | |
if abs(successTrade)>0: | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.prevDayBacktest + (" 价格向下跌破均线%.2f,建仓:-%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition, self.startPrice_profit))) | |
elif abs(self.TurtlePos) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - 2 * self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + 2 * self.ATR | |
if self.TurtlePos > 0: | |
if self.currentPrice < self.movingAveragePrice or self.currentPrice < sell_break or self.unrealisedbenifit >= settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderest = self.tradeTheRest(pos * (-1)) #sell all the positions | |
successTrade = pos * (-1) - traderest | |
if abs(successTrade) > 0: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向下跌破均线/2ATR触发止盈/平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
return traderest | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return traderest | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position >= self.UPPERLIMITPOS: | |
return traderest | |
elif (self.dynamic_position + self.UnitPosition) > self.UPPERLIMITPOS: | |
self.UnitPosition = self.UPPERLIMITPOS - self.dynamic_position | |
traderest = self.tradeTheRest(self.UnitPosition) | |
successTrade = self.UnitPosition - traderest | |
if abs(successTrade) > 0.00: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.prevDayBacktest + (" 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.startPrice_profit))) | |
elif self.TurtlePos < 0: | |
if self.currentPrice > self.movingAveragePrice or self.currentPrice > buy_break or self.unrealisedbenifit >= settings.ZHIYINGUSD: | |
pos = self.dynamic_position | |
traderest = self.tradeTheRest(abs(pos)) #平仓 | |
successTrade = abs(pos) - traderest | |
if abs(successTrade) > 0.0: | |
self.TurtlePos = 0 | |
print(self.prevDayBacktest + (" 价格向上涨破均价/2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
return traderest | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return traderest | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position <= self.UNTERLIMITPOS: | |
return traderest | |
elif (self.dynamic_position - self.UnitPosition) < self.UNTERLIMITPOS: | |
self.UnitPosition = self.dynamic_position - self.UNTERLIMITPOS | |
traderest = self.tradeTheRest(self.UnitPosition*(-1)) | |
successTrade = self.UnitPosition * (-1) - traderest | |
if abs(successTrade) > 0: | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.prevDayBacktest + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.startPrice_profit))) | |
return traderest | |
def tradeMovingAverage_real(self): | |
sell_break = 0.0 | |
buy_break = 0.0 | |
if self.dynamic_position == 0: | |
if self.currentPrice > self.movingAveragePrice: | |
self.tradeTheRest_real(self.UnitPosition) | |
self.AddPrice[0] = self.lastAskPrice + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.todayDate + self.clockTime + (": 价格向上突破均线%.2f,建仓:%d, 建仓价为%.2f" %(self.movingAveragePrice, self.UnitPosition,self.lastAskPrice))) | |
elif self.currentPrice < self.movingAveragePrice: | |
shortFirstPos = self.UnitPosition * (-1) - self.currentPrice * self.current_XBT * 2 | |
self.tradeTheRest_real(shortFirstPos) | |
self.AddPrice[0] = self.lastBidPrice - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.todayDate + self.clockTime + (": 价格向下跌破均线%.2f,建仓:-%d, 建仓价为%.2f" %(self.movingAveragePrice, shortFirstPos, self.lastBidPrice))) | |
elif abs(self.dynamic_position) > 0: | |
sell_break = self.AddPrice[abs(self.TurtlePos) - 1] - self.ATR | |
buy_break = self.AddPrice[abs(self.TurtlePos) - 1] + self.ATR | |
if self.dynamic_position > 0: | |
if self.currentPrice < self.movingAveragePrice or self.currentPrice < sell_break: | |
self.sellorbuyAll() | |
print(self.todayDate + self.clockTime + (": 价格向下跌破均线/2ATR触发止盈/平仓, 平仓价为%.2f" %(self.lastBidPrice))) | |
return 0 | |
elif abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
elif self.currentPrice > self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position >= self.UPPERLIMITPOS: | |
return 0 | |
elif (self.dynamic_position + self.UnitPosition) > self.UPPERLIMITPOS: | |
self.UnitPosition = self.UPPERLIMITPOS - self.dynamic_position | |
self.tradeTheRest_real(self.UnitPosition) | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] + 0.5 * self.ATR | |
self.TurtlePos += 1 | |
print(self.todayDate + self.clockTime + (": 价格向上突破%.2f, 加仓 %d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition, self.dynamic_position, self.lastAskPrice))) | |
elif self.dynamic_position < 0: | |
if self.currentPrice > self.movingAveragePrice or self.currentPrice > buy_break : | |
pos = self.dynamic_position | |
self.sellorbuyAll() | |
print(self.todayDate + self.clockTime + (" 价格向上涨破均价/2ATR触发平仓, 平仓价为%.2f" %(self.lastAskPrice))) | |
return 0 | |
if abs(self.TurtlePos) >= settings.ADDTIME: | |
return 0 | |
if self.currentPrice < self.AddPrice[abs(self.TurtlePos) - 1]: | |
if self.dynamic_position <= self.UNTERLIMITPOS: | |
return 0 | |
elif (self.dynamic_position - self.UnitPosition) < self.UNTERLIMITPOS: | |
self.UnitPosition = self.dynamic_position - self.UNTERLIMITPOS | |
self.tradeTheRest_real(-self.UnitPosition) | |
self.AddPrice[abs(self.TurtlePos)] = self.AddPrice[abs(self.TurtlePos) - 1] - 0.5 * self.ATR | |
self.TurtlePos -= 1 | |
print(self.todayDate + self.clockTime + (" 价格向下突破%.2f, 卖出加仓 -%d, 现仓位为%.d, 仓位均价%.2f" %(self.AddPrice[abs(self.TurtlePos) - 2],self.UnitPosition,self.dynamic_position, self.lastBidPrice))) | |
return 0 | |
def backtest_trade_rest(self, pos,dir = "buy"): #trade in market price | |
if pos > 0: | |
if self.lastAskSize >= pos: | |
#self.startPrice_profit = self.lastAskPrice | |
self.dynamic_position +=pos | |
return pos | |
else: | |
self.dynamic_position += self.lastAskSize | |
return self.lastAskSize | |
elif pos < 0: | |
if self.lastBidSize >= abs(pos): | |
#self.startPrice_profit = self.lastBidPrice | |
self.dynamic_position +=pos | |
return pos | |
else: | |
self.dynamic_position -= self.lastBidSize | |
return (self.lastBidSize) * (-1) | |
else: | |
return 0 | |
def backtest_trade(self, pos, dir = "buy"): #trade in market price | |
if dir == "buy": | |
if self.lastAskSize >= pos: | |
#self.startPrice_profit = self.lastAskPrice | |
self.dynamic_position +=pos | |
return True | |
else: | |
return False | |
elif dir == "sell": | |
if self.lastBidSize >= pos: | |
#self.startPrice_profit = self.lastBidPrice | |
self.dynamic_position -=pos | |
return True | |
else: | |
return False |