def close(self): message.info("close start") has_position = False while True: try: self.api.cancelallchildorders( product_code=self.PRODUCT_CODE) position = self.__get_position() has_completed_close = \ position["side"] is None or position["size"] < 0.01 if has_completed_close: message.info("close complete") return has_position else: has_position = True side = self.__reverse_side(side=position["side"]) size = position["size"] price = self.__get_order_price(side=side) assert self.is_valid_side(side=side) assert self.is_valid_size(size=size) assert self.is_valid_price(price=price) self.__send_order(side=side, size=size, price=price) time.sleep(1) except Exception: message.error(traceback.format_exc()) time.sleep(3)
def initialize(): sql = "select * from ticker" ticker = repository.read_sql(database=database, sql=sql) if ticker.empty: message.info("initialize ticker") sql = "insert into ticker values (now(),0,0)" repository.execute(database=database, sql=sql, write=False)
def has_changed_side(side): try: sql = "select * from entry" entry = \ repository.read_sql(database=DATABASE, sql=sql) if entry.empty: message.warning("entry empty") return True latest_side = entry.at[0, "side"] if latest_side != side: message.info("change side from", side, "to", latest_side) return True else: return False except Exception: message.error(traceback.format_exc())
def order(self, side): message.info(side, "order start") while True: try: self.api.cancelallchildorders( product_code=self.PRODUCT_CODE) position = self.__get_position() has_position = position["side"] is not None should_close = has_position \ and (side != position["side"] and position["size"] >= 0.01) if should_close: self.close() continue price = self.__get_order_price(side=side) size = self.__get_order_size( price=price, position_size=position["size"]) has_completed_order = size < 0.01 \ or self.__has_changed_side(side=side) if has_completed_order: message.info(side, "order complete") order_side = side order_size = \ self.__get_order_size(price=price, position_size=0) order_size = float(math.round_down(order_size, -2)) return order_side, order_size assert self.is_valid_side(side=side) assert self.is_valid_size(size=size) assert self.is_valid_price(price=price) self.__send_order(side=side, size=size, price=price) time.sleep(1) except Exception: message.error(traceback.format_exc()) time.sleep(3)
def __send_order(self, side, size, price, minute_to_expire=1): try: side, size, price = \ self.__order_normalize(side=side, size=size, price=price) self.api.sendchildorder( product_code=self.PRODUCT_CODE, child_order_type="LIMIT", side=side, size=size, price=price, minute_to_expire=minute_to_expire, time_in_force="GTC" ) sendchildorder_content = \ "side={side}, size={size}, price={price}"\ .format(side=side, size=size, price=price) message.info("sendchildorder", sendchildorder_content) except Exception: message.error(traceback.format_exc()) time.sleep(3)
def execute(database: str, sql: str, log=True, write=True) -> tuple: conn = MySQL(database=database).conn cur = conn.cursor() try: cur.execute(sql) sql_lower = sql.lower() if "select" in sql_lower and "from" in sql_lower: result = cur.fetchall() return result else: conn.commit() if write: if log: message.info(sql) else: print(sql) except Exception: message.error(traceback.format_exc()) finally: conn.commit() conn.close() cur.close()
def save_entry(side): message.info(side, "entry") sql = "update entry set side='{side}'".format(side=side) repository.execute(database=DATABASE, sql=sql, write=False)
sql = "select * from entry" entry = repository.read_sql(database=DATABASE, sql=sql) if entry.empty: continue side = entry.at[0, "side"] except Exception: message.error(traceback.format_exc()) continue if latest_side is None \ or latest_side != side: if side == "CLOSE": bitflyer.close() if retry_sleep(secs=120, side=side): message.info("close retry") bitflyer.close() message.info("close retry complete") latest_side = side else: # side is BUY or SELL bitflyer.order(side=side) if retry_sleep(secs=120, side=side): message.info("order retry") bitflyer.order(side=side) message.info("order retry complete") latest_side = side
high_line --------- |¯| low_line --------- |_| | <- break """ invalid_trading = break_high_line and break_low_line if invalid_trading: candlestick_Minute = Date.minute while True: minute = \ datetime.datetime.now().minute if candlestick_Minute != minute: break time.sleep(1) message.info("invalid trading") continue else: entry_buy = break_high_line and not has_buy entry_sell = break_low_line and not has_sell if entry_buy: save_entry(side="BUY") has_buy = True has_sell = False if entry_sell: save_entry(side="SELL") has_buy = False has_sell = True
'RESOLUTION': '800x600', 'COMPRESSION': 'gzip', 'VRAM': '256', 'ISO': '', 'DEB': '', 'HOOK': '', 'KERNEL': 'default', 'PURGE_KERNEL': True, } ) if not os.path.isfile('/etc/customizer.conf'): message.warning('Configuration file does not exist', '/etc/customizer.conf') conf.read('/etc/customizer.conf') message.info('Read Configuration file', '/etc/customizer.conf') for section in ('preferences', 'saved'): if not conf.has_section(section): conf.add_section(section) # Make sure these end up to be strings in both python2 and python3. WORK_DIR = '{}'.format(conf.get('preferences', 'WORK_DIR')) LOCALES = '{}'.format(conf.get('preferences', 'LOCALES')) RESOLUTION = '{}'.format(conf.get('preferences', 'RESOLUTION')) COMPRESSION = '{}'.format(conf.get('preferences', 'COMPRESSION')) VRAM = '{}'.format(conf.get('preferences', 'VRAM')) ISO = '{}'.format(conf.get('saved', 'ISO')) DEB = '{}'.format(conf.get('saved', 'DEB')) HOOK = '{}'.format(conf.get('saved', 'HOOK')) KERNEL = '{}'.format(conf.get('saved', 'KERNEL'))
def insert_data(): message.info("initial entry") sql = "insert into entry values('CLOSE')" repository.execute(database=DATABASE, sql=sql, write=False)
api_secret=Bitflyer.Api.value.SECRET.value) balance = api.getbalance() if "error_message" in balance: raise ConfigException() def truncate_table(): sql = "truncate entry" repository.execute(database=DATABASE, sql=sql) def insert_data(): message.info("initial entry") sql = "insert into entry values('CLOSE')" repository.execute(database=DATABASE, sql=sql, write=False) if __name__ == "__main__": DATABASE = "tradingbot" stdout.AA() print("tradingbot amateras start !!") message.info("initialize start") config_test() truncate_table() insert_data() message.info("initialize complete")