예제 #1
0
    def handle_depth(self, timestamp, depth):
        bp = depth['buy'][0][0]  #price buy
        ba = depth['buy'][0][1]  #amount buy
        sp = depth['sell'][0][0] #price sell
        sa = depth['sell'][0][1] #amount sell
        self.n_depth_handle += 1
        gap = gaps(bp, sp)
        if gap > 0.3:
            log.dbg("gap=%f low volume, don't operate!"%(gap))
            sslot.robot_log("gap=%f low volume, don't operate!"%(gap))
            return

        indicator = cfg.get_indicator()
        if indicator == 'bbands':
            self.bbands.ta_signal(timestamp, (bp+sp)/2)
            signal = self.stoch.sig
        elif indicator == 'macd':
            self.macd.ta_signal(timestamp, (bp+sp)/2)
            signal = self.macd.sig
        elif indicator == 'stoch':
            self.stoch.ta_signal(timestamp, (bp+sp)/2)
            signal = self.stoch.sig
        else:
            signal = 'standby'
        #log.dbg("get signal! %s"%signal)
        self.trade(timestamp, signal, bp, ba, sp, sa)
        self.update_profit((bp+sp)/2)
        if self.testing == False and self.n_depth_handle%12 == 0:
            sslot.robot_status(1)
예제 #2
0
파일: coinex.py 프로젝트: jjmonster/trade
    def signed_request(self, method, api_url, **payload):
        """request a signed url"""
        param = ''
        payload['access_id'] = cfg.get_cfg('id')
        payload['tonce'] = int(time.time()*1000)
        if payload:
            sort_pay = sorted(payload.items())
            for k in sort_pay:
                param += '&' + str(k[0]) + '=' + str(k[1])
            param = param.lstrip('&')
        sig_str = param + '&' + 'secret_key=' + cfg.get_cfg('secret_key')
        signature = self.get_signed_md5(sig_str)
            
        r_url = cfg.get_cfg('base_url') + api_url
        if method == 'GET' or method == 'DELETE':
            if param:
                r_url = r_url + '?' + param

        log.dbg(r_url)
        try:
            headers = cfg.get_cfg_header()
            headers['authorization'] = signature
            #log.dbg(headers)
        except:
            log.err("Fail load section from config file")
            return
        
        try:
            r = requests.request(method, r_url, headers = headers, json=payload,timeout=20)
            r.raise_for_status()
        except requests.exceptions.HTTPError as err:
            log.err(err)
            log.err(r.text)
        if r.status_code == 200:
            return r.json()
예제 #3
0
    def testback(self):
        self.testing = True
        self.trade_history.drop(self.trade_history.index, inplace=True) #clear history
        days = 10
        kl_1hour = fwk.get_kline(cfg.get_pair(), dtype="1hour", limit=min(days*24, 2000))
        if kl_1hour.size > 0:
            self.bbands.handle_data(kl_1hour)
            self.macd.handle_data(kl_1hour)
            self.stoch.handle_data(kl_1hour)

        if True:
            kl_5min = fwk.get_kline(cfg.get_pair(), dtype="5min", limit=min(days*24*60/5, 2000))
            if(kl_5min.size <= 0):
                return
            p = kl_5min['c']
            t = kl_5min['t']
        else:
            p = kl_1hour['c']
            t = kl_1hour['t']

        for i in range(t.size):
            dummy_depth = {'buy':[[p[i]*0.999, 1000]],'sell':[[p[i]*1.001, 1000]]}
            self.handle_depth(t[i], dummy_depth)
        log.dbg("test done... user_info:%s"%(self.user_info))
        log.dbg("test done... future_position:%s"%(self.future_position))
        sslot.trade_history(self.trade_history)
        sslot.robot_status(1)
        self.testing = False
예제 #4
0
 def stop(self):
     if self.running == 1:
         log.dbg("robot stopping...")
         mkt.unregister_handle('depth', self.handle_depth)
         self.bbands.stop()
         self.macd.stop()
         self.stoch.stop()
         self.running = 0
예제 #5
0
파일: market.py 프로젝트: jjmonster/trade
 def unregister_handle(self, dtype, func):
     log.dbg("unregister_handle %s %s"%(dtype, func))
     handles = self.data_handles[dtype]
     if func in handles['func']:
         handles['func'].remove(func)
         handles['reg'] -= 1
         if handles['reg'] == 0:
             handles['thandle'].cancel()
예제 #6
0
 def unregister_handle(self, dtype, func):
     log.dbg("unregister_handle %s %s" % (dtype, func))
     handles = self.data_handles[dtype]
     if func in handles['func']:
         handles['func'].remove(func)
         handles['reg'] -= 1
         if handles['reg'] == 0:
             handles['thandle'].cancel()
예제 #7
0
 def start(self):
     if self.running == 0:
         log.dbg("robot starting...")
         self.running = 1
         self.bbands.start()
         self.macd.start()
         self.stoch.start()
         mkt.register_handle('depth', self.handle_depth)
     else:
         log.dbg("robot already running!")
예제 #8
0
파일: market.py 프로젝트: jjmonster/trade
 def register_handle(self, dtype, func):
     log.dbg("register_handle %s %s"%(dtype, func))
     handles = self.data_handles[dtype]
     if func in handles['func']:
         log.war(" %s already handled!"%(func))
         return
     #as kline have long period, the newly obj callback func can't been called immediately.
     #so call it when first register.
     if dtype == 'kline' and handles['data'].size > 0:
         func(handles['data'])
     handles['func'].append(func)
     handles['reg'] += 1
     #print("register_handle", handles)
     if handles['reg'] == 1:
         handles['thandle'] = threading.Timer(1, handles['tfunc']) #first start timer 1s period
         handles['thandle'].start()
예제 #9
0
 def register_handle(self, dtype, func):
     log.dbg("register_handle %s %s" % (dtype, func))
     handles = self.data_handles[dtype]
     if func in handles['func']:
         log.war(" %s already handled!" % (func))
         return
     #as kline have long period, the newly obj callback func can't been called immediately.
     #so call it when first register.
     if dtype == 'kline' and handles['data'].size > 0:
         func(handles['data'])
     handles['func'].append(func)
     handles['reg'] += 1
     #print("register_handle", handles)
     if handles['reg'] == 1:
         handles['thandle'] = threading.Timer(
             1, handles['tfunc'])  #first start timer 1s period
         handles['thandle'].start()
예제 #10
0
    def signed_request(self, method, api_url, **payload):
        """request a signed url"""
        param = ''
        payload['access_id'] = cfg.get_cfg('id')
        payload['tonce'] = int(time.time() * 1000)
        if payload:
            sort_pay = sorted(payload.items())
            for k in sort_pay:
                param += '&' + str(k[0]) + '=' + str(k[1])
            param = param.lstrip('&')
        sig_str = param + '&' + 'secret_key=' + cfg.get_cfg('secret_key')
        signature = self.get_signed_md5(sig_str)

        r_url = cfg.get_cfg('base_url') + api_url
        if method == 'GET' or method == 'DELETE':
            if param:
                r_url = r_url + '?' + param

        log.dbg(r_url)
        try:
            headers = cfg.get_cfg_header()
            headers['authorization'] = signature
            #log.dbg(headers)
        except:
            log.err("Fail load section from config file")
            return

        try:
            r = requests.request(method,
                                 r_url,
                                 headers=headers,
                                 json=payload,
                                 timeout=20)
            r.raise_for_status()
        except requests.exceptions.HTTPError as err:
            log.err(err)
            log.err(r.text)
        if r.status_code == 200:
            return r.json()
예제 #11
0
    def update_variables(self, trade_param):
        if self.trade_history.index.size > 100:
            self.trade_history = self.trade_history.drop(0)
        self.trade_history.loc[self.trade_history.index.size] = trade_param ##may need use append instead
        if self.testing == False:
            sslot.trade_history(self.trade_history)
        hist.info("%s"%(trade_param))

        if self.simulate:
            param = self.trade_history.iloc[-1]
            a = param['amount'] * (1-0.001) ##take off trans fee
            info_contracts = self.user_info[cfg.get_coin1()]['contracts'][0]
            position = self.future_position
            if param['type'] == 'open_buy':
                if cfg.is_future():
                    oldfund = position['buy_amount'] * position['buy_price_avg']
                    newfund = a * param['price']
                    position['buy_amount'] += a
                    position['buy_available'] += a
                    position['buy_price_avg'] = (oldfund + newfund) / position['buy_amount']
                    position['buy_bond'] += a/position['lever_rate']

                    info_contracts['available'] -= param['amount']/position['lever_rate']
                    info_contracts['bond'] += a/position['lever_rate']

            if param['type'] == 'margin_buy':
                if cfg.is_future():
                    position['buy_amount'] -= param['amount']
                    position['buy_available'] -= param['amount']
                    position['buy_bond'] -= param['amount']/position['lever_rate']

                    info_contracts['available'] += a/position['lever_rate']
                    info_contracts['bond'] -= param['amount']/position['lever_rate']
                    profit = (param['price'] - position['buy_price_avg'])/position['buy_price_avg'] * a
                    info_contracts['profit'] += profit
                    info_contracts['available'] += profit
                    self.update_profit(param['price'])

            if param['type'] == 'open_sell':
                if cfg.is_future():
                    oldfund = position['sell_amount'] * position['sell_price_avg']
                    newfund = param['amount'] * param['price']
                    position['sell_amount'] += a
                    position['sell_available'] += a
                    position['sell_price_avg'] = (oldfund + newfund) / position['sell_amount']
                    position['sell_bond'] += a/position['lever_rate']

                    info_contracts['available'] -= param['amount']/position['lever_rate']
                    info_contracts['bond'] += a/position['lever_rate']

            if param['type'] == 'margin_sell':
                if cfg.is_future():
                    position['sell_amount'] -= param['amount']
                    position['sell_available'] -= param['amount']
                    position['sell_bond'] -= param['amount']/position['lever_rate']

                    info_contracts['available'] += a/position['lever_rate']
                    info_contracts['bond'] -= param['amount']/position['lever_rate']
                    profit = (position['sell_price_avg'] - param['price'])/position['sell_price_avg'] * a
                    info_contracts['profit'] += profit
                    info_contracts['available'] += profit
                    self.update_profit(param['price'])

            log.dbg("user_info:%s"%(self.user_info))
            log.dbg("future_position:%s"%(self.future_position))

        else:
            if cfg.get_cfg_plat() == '': #reserve
                pass
            else:
                if cfg.is_future():
                    self.user_info = fwk.get_user_info()
                    self.future_position = fwk.get_future_position(cfg.get_pair())
                    log.dbg("user_info:%s"%(self.user_info))
                    log.dbg("future_position:%s"%(self.future_position))
                else:
                    pass