---
title: 'Project documentation template'
disqus: hackmd
---
加密貨幣交易策略
===



## Table of Contents
[TOC]
## Beginners Guide
If you are a total beginner to this, start here!
1. Visit crypt arsenal
2. Click "Sign in"
3. write a program to start
Project
---
```gherkin=
class Strategy():
# option setting needed
def __setitem__(self, key, value):
self.options[key] = value
# option setting needed
def __getitem__(self, key):
return self.options.get(key, '')
def __init__(self):
# strategy property
self.subscribedBooks = {
'Binance': {
'pairs': ['BTC-USDT'],
},
}
self.period = 1 *60 * 60
self.options = {}
#self.period=60*60
# user defined class attribute
self.last_type = 'sell'
self.last_cross_status = False
self.close_price_trace = np.array([])
self.ma_long = 14
self.ma_short = 5
self.UP = True
self.DOWN = False
self.mult=1
self.trigger=False
self.triggerwait=False
self.new_time = np.array([])
def on_order_state_change(self, order):
Log("on order state change message: " + str(order) + " order price: " + str(order["price"]))
def bband(self):
up, mid, low = talib.BBANDS(self.close_price_trace, timeperiod=70, nbdevup=2 ,nbdevdn=2.1, matype=0)
bband = ((self.close_price_trace- low) / (up - low))[-1]
Log(str(bband))
return float(bband)
def stop(self):
s_ema2 = talib.MA(self.close_price_trace,timeperiod=1,matype=1)[-2]
s_ema = talib.MA(self.close_price_trace,timeperiod=1,matype=1)[-1]
stop=(s_ema2*0.95)-s_ema
return float(stop)
def rsi(self):
#close_price = information['candles'][exchange][pair][0]['close']
rsi=talib.RSI(self.close_price_trace, 7)[-1]
#Log(str(rsi))
return float(rsi)
def l_ema(self):
l_ema = talib.MA(self.close_price_trace,timeperiod=9,matype=1)[-1]
return float(l_ema)
def s_ema(self):
s_ema = talib.MA(self.close_price_trace,timeperiod=1,matype=1)[-1]
return float(s_ema)
def get_current_ma_cross(self):
#s_ma = talib.SMA(self.close_price_trace, self.ma_short)[-1]
s_ema = talib.MA(self.close_price_trace,timeperiod=1,matype=1)[-1]
#s_ema=np.ndarray.tolist(s_ema)[-1]
#l_ma = talib.SMA(self.close_price_trace, self.ma_long)[-1]
l_ema = talib.MA(self.close_price_trace,timeperiod=9,matype=1)[-1]
#l_ema=np.ndarray.tolist(l_ema)[-1]
Log(str(s_ema))
Log(str(l_ema))
#if np.isnan(s_ema) or np.isnan(l_ema):
# return None
if s_ema > l_ema:
self.last_cross_status = self.UP
return self.last_cross_status
if s_ema < l_ema:
self.last_cross_status = self.DOWN
return self.last_cross_status
# called every self.period
def trade(self, information):
exchange = list(information['candles'])[0]
pair = list(information['candles'][exchange])[0]
target_currency = pair.split('-')[0] #BTC
base_currency = pair.split('-')[1] #USDT
base_currency_amount = self['assets'][exchange][base_currency]
target_currency_amount = self['assets'][exchange][target_currency]
# add latest price into trace
close_price = information['candles'][exchange][pair][0]['close']
open_price = information['candles'][exchange][pair][0]['open']
high_price = information['candles'][exchange][pair][0]['high']
low_price = information['candles'][exchange][pair][0]['low']
volume_price = information['candles'][exchange][pair][0]['volume']
time=information['candles'][exchange][pair][0]['time']
self.close_price_trace = np.append(self.close_price_trace, [float(close_price)])
# only keep max length of ma_long count elements
#self.close_price_trace = self.close_price_trace[-self.ma_long:]
#Log(str(self.close_price_trace))
#Log(str(close_price))
rsi=self.rsi()
bband=self.bband()
#s_sma=self.sma()
stop=self.stop()
get_current_ma_cross=self.get_current_ma_cross()
s_ema=self.s_ema()
l_ema=self.l_ema()
pair = list(information['candles'][exchange])[0] #BTC-USDT
target_currency = pair.split('-')[0] #BTC
base_currency = pair.split('-')[1] #USDT
base_currency_amount = self['assets'][exchange][base_currency]
target_currency_amount = self['assets'][exchange][target_currency]
#Log(str(base_currency_amount))
#Log(str(target_currency_amount))
buynum=float(base_currency_amount*0.05)/close_price
#####Log(str(buynum))
sellnum=float(-target_currency_amount*0.1)
#####Log(str(sellnum))
time=np.datetime64(time)
# cross up
#########################################Log(str(time))################################
if self.trigger==True and self.triggerwait==False:
self.new_time=time + np.timedelta64(5, 'h')
Log(str(self.new_time))
self.triggerwait=True
if self.new_time==time:
self.trigger=False
self.triggerwait=False
Log(str(time))
#2021-04-22T14:20:00Z
if bband<0 or stop>0 and self.trigger==False:
self.last_type = 'sell'
self.trigger=True
#self.sleep(1800)
return [
{
'exchange': exchange,
'amount': -target_currency_amount,
'price': -1,
'type': 'MARKET',
'pair': pair,
}
]
if l_ema > s_ema and rsi<20 and self.trigger==False:
self.last_type = 'buy'
self.mult=3
return [
{
'exchange': exchange,
'amount': buynum*self.mult,
'price': -1,
'type': 'MARKET',
'pair': pair,
}
]
if l_ema > s_ema and rsi<30 and self.trigger==False:
self.last_type = 'buy'
self.mult=1
return [
{
'exchange': exchange,
'amount': buynum*self.mult,
'price': -1,
'type': 'MARKET',
'pair': pair,
}
]
# cross down
if l_ema < s_ema and rsi>75 and self.trigger==False:
self.last_type = 'sell'
self.mult=1
return [
{
'exchange': exchange,
'amount': sellnum*self.mult,
'price': -1,
'type': 'MARKET',
'pair': pair,
}
]
if l_ema < s_ema and rsi>85 and self.trigger==False:
self.last_type = 'sell'
self.mult=3
return [
{
'exchange': exchange,
'amount': sellnum*self.mult,
'price': -1,
'type': 'MARKET',
'pair': pair,
}
]
return []
```
> 策略發想 停損 遮罩 時間回測一小時 [name=kiwi]
> Read more for my github here: ........
User flows
---
```sequence
kiwi->crypt arsenal server: when you see bband<0 or next sma broke 5% sell all
Note right of kiwi: kiwi think it is a stoploss Strategy
Note right of kiwi: kiwi stop buy or sell for few hours
kiwi->crypt arsenal server: if rsi and MACD match buy and sell
```
> this program only fit for this platform
Project picture
---


## Appendix and FAQ
:::info
**Find this document incomplete?** Leave a comment!
:::
###### tags: `加密貨幣` `交易策略`