├── First prototype ├── getAPI.py └── parseSignals.py ├── README.md ├── binance-trader.py ├── requirements.txt └── telegram_api.conf /First prototype/getAPI.py: -------------------------------------------------------------------------------- 1 | #CopyRight Cod3rman 2 | #Contact : instagram.com/root_ahor4 3 | #Telegam Auto Trader Bot version:1.1.0 4 | 5 | import telebot 6 | import mpu.io 7 | import os 8 | import json 9 | import re 10 | from telebot import types 11 | 12 | f = open("telegram_api.conf", "r") 13 | bot = telebot.TeleBot(f.read().split()[0]) 14 | # bot = telebot.TeleBot("YOUR Telegram API Key") 15 | 16 | key = "" # MUST BE len() 64 17 | secret = "" # MUST BE len() 64 18 | 19 | data = {} 20 | 21 | 22 | @bot.message_handler(content_types=["text"]) 23 | def hello_user(message): 24 | markup = types.ReplyKeyboardMarkup() 25 | itembtna = types.KeyboardButton("/start") 26 | itembtnb = types.KeyboardButton("/reg") 27 | markup.row(itembtna, itembtnb) 28 | bot.send_message( 29 | message.from_user.id, 30 | "Hello: " + str(message.from_user.username), 31 | reply_markup=markup, 32 | ) 33 | if doesFileExists("%s.json" % message.from_user.id): 34 | 35 | global data 36 | global key 37 | global secret 38 | 39 | with open("%s.json" % message.from_user.id, "r") as read_file: 40 | data = json.load(read_file) 41 | key = data["key"] 42 | secret = data["secret"] 43 | 44 | bot.send_message(message.from_user.id, "Yaa config file it exists!") 45 | bot.send_message(message.from_user.id, "Key is: " + key) 46 | bot.send_message(message.from_user.id, "Secret is: " + secret) 47 | else: 48 | bot.send_message( 49 | message.from_user.id, "Nope! I don't find config file, lets create one..." 50 | ) 51 | bot.send_message(message.from_user.id, "Type /reg") 52 | bot.register_next_step_handler(message, start) 53 | 54 | 55 | def doesFileExists(filePathAndName): 56 | return os.path.exists(filePathAndName) 57 | 58 | 59 | def start(message): 60 | if message.text == "/reg": 61 | bot.send_message(message.from_user.id, "Enter Binance API KEY:") 62 | bot.register_next_step_handler(message, get_key) 63 | else: 64 | bot.send_message(message.from_user.id, "Type /reg") 65 | 66 | 67 | def get_key(message): 68 | global key 69 | if len(message.text) == 64: 70 | key = message.text 71 | bot.send_message(message.from_user.id, "Enter Binance API Secret:") 72 | bot.register_next_step_handler(message, get_secret) 73 | else: 74 | bot.send_message(message.from_user.id, "Wrong API KEY, type /reg again !") 75 | 76 | 77 | def get_secret(message): 78 | global secret 79 | if len(message.text) == 64: 80 | secret = message.text 81 | bot.send_message(message.from_user.id, "ID is: " + str(message.from_user.id)) 82 | bot.send_message(message.from_user.id, "Key is: " + key) 83 | bot.send_message(message.from_user.id, "Secret is: " + secret) 84 | data = {"key": key, "secret": secret} 85 | mpu.io.write("%s.json" % message.from_user.id, data) 86 | else: 87 | bot.send_message(message.from_user.id, "Wrong API SECRET, type /reg again !") 88 | 89 | 90 | 91 | bot.polling(none_stop=True, interval=1) 92 | -------------------------------------------------------------------------------- /First prototype/parseSignals.py: -------------------------------------------------------------------------------- 1 | #CopyRight Cod3rman 2 | #Contact : instagram.com/root_ahor4 3 | #Telegam Auto Trader Bot version:1.1.0 4 | import telebot 5 | import mpu.io 6 | import os 7 | import json 8 | import re 9 | from telebot import types 10 | 11 | f = open("telegram_api.conf", "r") 12 | bot = telebot.TeleBot(f.read().split()[0]) 13 | # bot = telebot.TeleBot("YOUR Telegram API Key") 14 | 15 | signals_data = None 16 | 17 | pair = None # MUST BE LIKE BNBBTC 18 | # MUST BE FLOAT 0.12345678 19 | buy = None 20 | stop_loss = None 21 | sell_1 = None 22 | sell_2 = None 23 | sell_3 = None 24 | sell_4 = None 25 | sell_5 = None 26 | 27 | 28 | @bot.message_handler(content_types=["text"]) 29 | def start(message): 30 | markup = types.ReplyKeyboardMarkup() 31 | itembtna = types.KeyboardButton("/start") 32 | markup.row(itembtna) 33 | bot.send_message( 34 | message.from_user.id, "Forward signal message to me ...", reply_markup=markup 35 | ) 36 | 37 | if message.text == "/start": 38 | bot.register_next_step_handler(message, get_forward) 39 | else: 40 | bot.send_message(message.from_user.id, "Type /start") 41 | 42 | 43 | def get_forward(message): 44 | global signals_data 45 | global pair 46 | global buy 47 | global stop_loss 48 | global sell_1 49 | global sell_2 50 | global sell_3 51 | global sell_4 52 | global sell_5 53 | 54 | signals_data = message.text 55 | 56 | pair_pos_start = signals_data.find("#") 57 | pair_pos_end = signals_data.find("BTC") 58 | sdd = signals_data[pair_pos_start:pair_pos_end] 59 | pair = re.sub(r"[^A-Za-z]", "", sdd) + "BTC" 60 | 61 | buy_pos_start = signals_data.find("Покупка") 62 | buy_tmp = re.findall(r"[-+]?\d*\.\d+|\d+", (signals_data[buy_pos_start:]))[0] 63 | total = 10000000 64 | buy = float("0." + str(buy_tmp).zfill(len(str(total)))) 65 | 66 | stop_loss_pos_start = signals_data.find("Стоп") 67 | stop_loss_tmp = re.findall( 68 | r"[-+]?\d*\.\d+|\d+", (signals_data[stop_loss_pos_start:]) 69 | )[0] 70 | total = 10000000 71 | stop_loss = float("0." + str(stop_loss_tmp).zfill(len(str(total)))) 72 | 73 | sell_pos_start = signals_data.find("Цели") 74 | until_stop_loss_pos = signals_data.find("Стоп") 75 | sell_tmp = re.findall( 76 | r"[-+]?\d*\.\d+|\d+", (signals_data[sell_pos_start:until_stop_loss_pos]) 77 | ) 78 | if len(sell_tmp) == 5: 79 | total = 10000000 80 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 81 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 82 | sell_3 = float("0." + str(sell_tmp[2]).zfill(len(str(total)))) 83 | sell_4 = float("0." + str(sell_tmp[3]).zfill(len(str(total)))) 84 | sell_5 = float("0." + str(sell_tmp[4]).zfill(len(str(total)))) 85 | elif len(sell_tmp) == 4: 86 | total = 10000000 87 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 88 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 89 | sell_3 = float("0." + str(sell_tmp[2]).zfill(len(str(total)))) 90 | sell_4 = float("0." + str(sell_tmp[3]).zfill(len(str(total)))) 91 | sell_5 = None 92 | elif len(sell_tmp) == 3: 93 | total = 10000000 94 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 95 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 96 | sell_3 = float("0." + str(sell_tmp[2]).zfill(len(str(total)))) 97 | sell_4 = None 98 | sell_5 = None 99 | elif len(sell_tmp) == 2: 100 | total = 10000000 101 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 102 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 103 | sell_3 = None 104 | sell_4 = None 105 | sell_5 = None 106 | elif len(sell_tmp) == 1: 107 | total = 10000000 108 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 109 | sell_2 = None 110 | sell_3 = None 111 | sell_4 = None 112 | sell_5 = None 113 | 114 | bot.send_message(message.from_user.id, "Done") 115 | bot.send_message(message.from_user.id, "Pair is: " + str(pair)) 116 | bot.send_message(message.from_user.id, "Buy is: " + str(buy)) 117 | bot.send_message(message.from_user.id, "Stop_loss is: " + str(stop_loss)) 118 | bot.send_message(message.from_user.id, "Sell 1 is: " + str(sell_1)) 119 | bot.send_message(message.from_user.id, "Sell 2 is: " + str(sell_2)) 120 | bot.send_message(message.from_user.id, "Sell 3 is: " + str(sell_3)) 121 | bot.send_message(message.from_user.id, "Sell 4 is: " + str(sell_4)) 122 | bot.send_message(message.from_user.id, "Sell 5 is: " + str(sell_5)) 123 | 124 | 125 | bot.polling(none_stop=True, interval=1) 126 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # binance-trader-bot 2 | 3 | ## This is Auto Trader Telegram Bot 4 | 5 | *** 6 | 7 | [Demo video](https://www.aparat.com/v/875M6) 8 | 9 | *** 10 | ### Here is a ScreenShot from Program Working 11 | 12 | 13 | ![Screen](http://s5.picofile.com/file/8363449334/sc1_1_.png "") 14 | 15 | --- 16 | 17 | Install requirements file using: 18 | pip3 install -r requirements.txt 19 | 20 | [Create telegram bot](https://core.telegram.org/bots#3-how-do-i-create-a-bot) 21 | 22 | Put your telegram bot api key in telegram_api.conf 23 | 24 | Start: 25 | 26 | python3 binance-trader.py 27 | 28 | Contact: 29 | * [Telegram : cod3r_man](https://t.me/cod3r_man) 30 | * [Telegram channel: IT Road Map](https://t.me/ITRoadMap) 31 | * [instagram : root_ahor4](https://instagram.com/root_ahor4) 32 | -------------------------------------------------------------------------------- /binance-trader.py: -------------------------------------------------------------------------------- 1 | #CopyRight Cod3rman 2 | #Contact : instagram.com/root_ahor4 3 | #Telegam Auto Trader Bot version:1.1.0 4 | import telebot 5 | import mpu.io 6 | import os 7 | import sys 8 | import json 9 | import re 10 | from telebot import types 11 | import ccxt 12 | import time 13 | from time import sleep 14 | from numbers import Number 15 | 16 | f = open("telegram_api.conf", "r") 17 | bot = telebot.TeleBot(f.read().split()[0]) 18 | 19 | exchange = None 20 | key = "" 21 | secret = "" 22 | exchange_fee = 0.1 23 | data = {} 24 | 25 | signals_data = None 26 | pair = None 27 | coin = None 28 | buy = None 29 | sdd = None 30 | stop_loss = None 31 | sell_1 = None 32 | sell_2 = None 33 | sell_3 = None 34 | sell_4 = None 35 | sell_5 = None 36 | amount = None 37 | selected_sell_target = None 38 | balance_btc = None 39 | balance_coin = None 40 | buy_after_exchange_fee = None 41 | orders_executed = [] 42 | 43 | example_signal_post = "#BTG Binance\n\nBuy 311200\n\nTargets:\n\n391100\n491100\n591100\n691100\n791100\n\nStop loss 221100" 44 | 45 | 46 | @bot.message_handler(content_types=["text"]) 47 | def hello_user(message): 48 | 49 | global example_signal_post 50 | 51 | bot.send_message( 52 | message.from_user.id, 53 | "Hi " 54 | + str(message.from_user.username) 55 | + "\n" 56 | + "-->If you have any Problem Tell me from this ID : @Cod3r_man" 57 | + "\n" 58 | + "-->If you need reboot me - send /restart", 59 | + "\n" 60 | + "---Join ITRoadMap channel to get news and updates---" 61 | 62 | ) 63 | bot.send_message( 64 | message.from_user.id, 65 | "Bellow example post with signal\nYou should forward post to me it is same format only!\n", 66 | ) 67 | bot.send_message(message.from_user.id, example_signal_post) 68 | 69 | if doesFileExists("%s.json" % message.from_user.id): 70 | with open("%s.json" % message.from_user.id, "r") as read_file: 71 | 72 | global data 73 | global key 74 | global secret 75 | global exchange 76 | 77 | data = json.load(read_file) 78 | key = data["key"] 79 | secret = data["secret"] 80 | exchange = ccxt.binance( 81 | {"apiKey": key, "secret": secret, "enableRateLimit": True} 82 | ) 83 | bot.send_message( 84 | message.from_user.id, "Forward message with signals to me ..." 85 | ) 86 | bot.register_next_step_handler(message, get_forward) 87 | 88 | else: 89 | bot.send_message( 90 | message.from_user.id, "I don't find Your account, let's create one ..." 91 | ) 92 | bot.send_message(message.from_user.id, "Enter Exchange API KEY:") 93 | bot.register_next_step_handler(message, get_key) 94 | 95 | 96 | def doesFileExists(filePathAndName): 97 | return os.path.exists(filePathAndName) 98 | 99 | 100 | def get_key(message): 101 | 102 | global key 103 | 104 | if message.text == "/restart": 105 | restart_bot(message) 106 | 107 | elif len(message.text) == 64: 108 | key = message.text 109 | bot.send_message(message.from_user.id, "Enter Exchange SECRET KEY:") 110 | bot.register_next_step_handler(message, get_secret) 111 | else: 112 | bot.send_message(message.from_user.id, "Wrong API KEY! Check and try again.") 113 | bot.register_next_step_handler(message, get_key) 114 | 115 | 116 | def get_secret(message): 117 | 118 | global secret 119 | global exchange 120 | 121 | if message.text == "/restart": 122 | restart_bot(message) 123 | 124 | elif len(message.text) == 64: 125 | secret = message.text 126 | 127 | bot.send_message( 128 | message.from_user.id, 129 | "Yeah, Your account is created, forward message with signals to me ...", 130 | ) 131 | bot.register_next_step_handler(message, get_forward) 132 | data = {"key": key, "secret": secret} 133 | mpu.io.write("%s.json" % message.from_user.id, data) 134 | exchange = ccxt.binance( 135 | {"apiKey": key, "secret": secret, "enableRateLimit": True} 136 | ) 137 | else: 138 | bot.send_message(message.from_user.id, "Wrong API SECRET! Check and try again.") 139 | bot.register_next_step_handler(message, get_secret) 140 | 141 | 142 | def get_forward(message): 143 | 144 | global signals_data 145 | global pair 146 | global buy 147 | global stop_loss 148 | global sell_1 149 | global sell_2 150 | global sell_3 151 | global sell_4 152 | global sell_5 153 | global exchange 154 | global sdd 155 | 156 | signals_data = message.text 157 | 158 | if (len(str(signals_data)) >= 50) or (message.text == "/restart"): 159 | if message.text == "/restart": 160 | restart_bot(message) 161 | pair_pos_start = signals_data.find("#") 162 | pair_pos_end = signals_data.find(" ") 163 | sdd = signals_data[pair_pos_start:pair_pos_end] 164 | pair = re.sub(r"[^A-Za-z]", "", sdd) + "/BTC" 165 | 166 | buy_pos_start = signals_data.find("Buy") 167 | buy_tmp = re.findall(r"[-+]?\d*\.\d+|\d+", (signals_data[buy_pos_start:]))[0] 168 | total = 10000000 169 | buy = float("0." + str(buy_tmp).zfill(len(str(total)))) 170 | 171 | stop_loss_pos_start = signals_data.find("Stop loss") 172 | stop_loss_tmp = re.findall( 173 | r"[-+]?\d*\.\d+|\d+", (signals_data[stop_loss_pos_start:]) 174 | )[0] 175 | total = 10000000 176 | stop_loss = float("0." + str(stop_loss_tmp).zfill(len(str(total)))) 177 | 178 | sell_pos_start = signals_data.find("Targets") 179 | until_stop_loss_pos = signals_data.find("Stop loss") 180 | sell_tmp = re.findall( 181 | r"[-+]?\d*\.\d+|\d+", (signals_data[sell_pos_start:until_stop_loss_pos]) 182 | ) 183 | 184 | if len(sell_tmp) == 5: 185 | total = 10000000 186 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 187 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 188 | sell_3 = float("0." + str(sell_tmp[2]).zfill(len(str(total)))) 189 | sell_4 = float("0." + str(sell_tmp[3]).zfill(len(str(total)))) 190 | sell_5 = float("0." + str(sell_tmp[4]).zfill(len(str(total)))) 191 | elif len(sell_tmp) == 4: 192 | total = 10000000 193 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 194 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 195 | sell_3 = float("0." + str(sell_tmp[2]).zfill(len(str(total)))) 196 | sell_4 = float("0." + str(sell_tmp[3]).zfill(len(str(total)))) 197 | sell_5 = None 198 | elif len(sell_tmp) == 3: 199 | total = 10000000 200 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 201 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 202 | sell_3 = float("0." + str(sell_tmp[2]).zfill(len(str(total)))) 203 | sell_4 = None 204 | sell_5 = None 205 | elif len(sell_tmp) == 2: 206 | total = 10000000 207 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 208 | sell_2 = float("0." + str(sell_tmp[1]).zfill(len(str(total)))) 209 | sell_3 = None 210 | sell_4 = None 211 | sell_5 = None 212 | elif len(sell_tmp) == 1: 213 | total = 10000000 214 | sell_1 = float("0." + str(sell_tmp[0]).zfill(len(str(total)))) 215 | sell_2 = None 216 | sell_3 = None 217 | sell_4 = None 218 | sell_5 = None 219 | 220 | bot.send_message(message.from_user.id, "Signals received, look like:") 221 | bot.send_message(message.from_user.id, "Pair: " + str(pair)) 222 | bot.send_message(message.from_user.id, "Buy: " + str(buy)) 223 | bot.send_message(message.from_user.id, "Stop-loss: " + str(stop_loss)) 224 | 225 | if sell_1 is not None: 226 | bot.send_message(message.from_user.id, "Sell target 1: " + str(sell_1)) 227 | if sell_2 is not None: 228 | bot.send_message(message.from_user.id, "Sell target 2: " + str(sell_2)) 229 | if sell_3 is not None: 230 | bot.send_message(message.from_user.id, "Sell target 3: " + str(sell_3)) 231 | if sell_4 is not None: 232 | bot.send_message(message.from_user.id, "Sell target 4: " + str(sell_4)) 233 | if sell_5 is not None: 234 | bot.send_message(message.from_user.id, "Sell target 5: " + str(sell_5)) 235 | 236 | bot.send_message(message.from_user.id, "What target do we will use? ") 237 | bot.register_next_step_handler(message, select_sell) 238 | 239 | else: 240 | bot.send_message( 241 | message.from_user.id, "Don't typing to me! Forward message only." 242 | ) 243 | bot.register_next_step_handler(message, get_forward) 244 | 245 | 246 | def select_sell(message): 247 | 248 | global sell_1 249 | global sell_2 250 | global sell_3 251 | global sell_4 252 | global sell_5 253 | global selected_sell_target 254 | global balance_coin 255 | global balance_btc 256 | global coin 257 | 258 | if ( 259 | (message.text == "1" and sell_1 is not None) 260 | or (message.text == "2" and sell_2 is not None) 261 | or (message.text == "3" and sell_3 is not None) 262 | or (message.text == "4" and sell_4 is not None) 263 | or (message.text == "5" and sell_5 is not None) 264 | or (message.text == "/restart") 265 | ): 266 | if message.text == "1": 267 | selected_sell_target = sell_1 268 | elif message.text == "2": 269 | selected_sell_target = sell_2 270 | elif message.text == "3": 271 | selected_sell_target = sell_3 272 | elif message.text == "4": 273 | selected_sell_target = sell_4 274 | elif message.text == "5": 275 | selected_sell_target = sell_5 276 | elif message.text == "/restart": 277 | restart_bot(message) 278 | 279 | bot.send_message( 280 | message.from_user.id, "Selected sell target: " + str(selected_sell_target) 281 | ) 282 | 283 | coin = re.sub(r"[^A-Za-z]", "", sdd) 284 | balance_fetch = exchange.fetch_balance() 285 | balance_coin = float(balance_fetch["free"][coin]) 286 | bot.send_message( 287 | message.from_user.id, "Your " + coin + " balance: " + str(balance_coin) 288 | ) 289 | 290 | balance_btc = float(balance_fetch["free"]["BTC"]) 291 | 292 | bot.send_message( 293 | message.from_user.id, "Your BTC balance: " + str(balance_btc) + " " 294 | ) 295 | bot.send_message( 296 | message.from_user.id, 297 | "What percent from your balance will I use for this trade?\nType number, 10 for example.", 298 | ) 299 | bot.register_next_step_handler(message, get_amount) 300 | 301 | else: 302 | bot.send_message(message.from_user.id, "Type number ONLY! ") 303 | bot.register_next_step_handler(message, select_sell) 304 | 305 | 306 | def get_amount(message): 307 | 308 | global amount 309 | global balance_coin 310 | global balance_btc 311 | global buy_after_exchange_fee 312 | global coin 313 | 314 | min_trade_amount = 10 / exchange.fetch_ticker("BTC/USDT")["low"] 315 | 316 | try: 317 | amount = (float(balance_btc) / 100) * float(message.text) 318 | if amount <= balance_btc and amount > 0: 319 | if amount > min_trade_amount: 320 | buy_after_exchange_fee = (amount / buy) - ( 321 | ((amount / buy) / 100) * exchange_fee 322 | ) # Fee in coin 323 | bot.send_message( 324 | message.from_user.id, 325 | "In this trade I will use " + str(amount) + " BTC", 326 | ) 327 | bot.send_message( 328 | message.from_user.id, 329 | "For them we will receive " 330 | + str(buy_after_exchange_fee)[:10] 331 | + " " 332 | + coin, 333 | ) 334 | bot.send_message(message.from_user.id, "If you agree, type YES") 335 | bot.register_next_step_handler(message, trader) 336 | else: 337 | bot.send_message( 338 | message.from_user.id, 339 | "You want to use" 340 | + " " 341 | + str(amount) 342 | + " BTC\n" 343 | + "but minimal trade amount " 344 | + str(min_trade_amount)[:8] 345 | + " BTC! ~$10", 346 | ) 347 | bot.register_next_step_handler(message, get_amount) 348 | 349 | else: 350 | bot.send_message(message.from_user.id, "It is bigger than your BTC balance") 351 | bot.register_next_step_handler(message, get_amount) 352 | 353 | except: 354 | bot.send_message(message.from_user.id, "Enter correct percent (number only!)") 355 | bot.register_next_step_handler(message, get_amount) 356 | 357 | 358 | def trader(message): 359 | 360 | if message.text == "/restart": 361 | restart_bot(message) 362 | elif message.text == "YES": 363 | bot.send_message(message.from_user.id, "Placing buy order ...") 364 | buy_order(message) 365 | bot.register_next_step_handler(message, buy_order) 366 | else: 367 | bot.send_message(message.from_user.id, "Just send me YES") 368 | bot.register_next_step_handler(message, trader) 369 | 370 | 371 | def buy_order(message): 372 | 373 | global amount 374 | global pair 375 | global buy 376 | global exchange 377 | global orders_executed 378 | global buy_order_fee 379 | 380 | type = "limit" 381 | side = "buy" 382 | amount_to_buy_exchange = amount / buy 383 | params = {} 384 | 385 | buy_order = exchange.create_order( 386 | pair, type, side, amount_to_buy_exchange, buy, params 387 | ) 388 | orders_executed.append(buy_order["id"]) 389 | 390 | bot.send_message( 391 | message.from_user.id, 392 | "I placed buy order, I will notify you when it will executed ...", 393 | ) 394 | check_order_status_and_sell(message) 395 | bot.register_next_step_handler(message, check_order_status_and_sell) 396 | 397 | 398 | def check_order_status_and_sell(message): 399 | 400 | while True: 401 | 402 | global orders_executed 403 | global pair 404 | global exchange 405 | 406 | params = {} 407 | 408 | if exchange.fetchOrder(orders_executed[0], pair, params)["status"] == "closed": 409 | bot.send_message( 410 | message.from_user.id, "Buy order is executed, preparing selling ..." 411 | ) 412 | sell_order(message) 413 | bot.register_next_step_handler(message, sell_order) 414 | break 415 | else: 416 | pass 417 | buy_order_status = exchange.fetchOrder(orders_executed[0], pair, params)[ 418 | "status" 419 | ] 420 | bot.send_message( 421 | message.from_user.id, "Waiting for buy order execution ..." 422 | ) 423 | time.sleep(30) 424 | 425 | 426 | def sell_order(message): 427 | 428 | global pair 429 | global exchange 430 | global orders_executed 431 | global selected_sell_target 432 | global stop_loss 433 | global buy_after_exchange_fee 434 | 435 | buy_after_exchange_fee = float(str(buy_after_exchange_fee)[:10]) 436 | 437 | stop_loss_limit_order = exchange.create_order( 438 | pair, 439 | "stop_loss_limit", 440 | "sell", 441 | buy_after_exchange_fee, 442 | selected_sell_target, 443 | {"stopPrice": stop_loss}, 444 | ) 445 | bot.send_message(message.from_user.id, "Sell order placed, I wish You Profit :)") 446 | bot.send_message( 447 | message.from_user.id, "For use my services again, send me /start :)" 448 | ) 449 | 450 | os.execl(sys.executable, sys.executable, *sys.argv) 451 | 452 | 453 | def restart_bot(message): 454 | 455 | if message.text == "/restart": 456 | bot.send_message(message.from_user.id, "Restart complete, send me /start") 457 | os.execl(sys.executable, sys.executable, *sys.argv) 458 | 459 | 460 | bot.polling(none_stop=True, interval=0) 461 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mpu 2 | ccxt 3 | pyTelegramBotAPI 4 | -------------------------------------------------------------------------------- /telegram_api.conf: -------------------------------------------------------------------------------- 1 | Telegram bot token 2 | --------------------------------------------------------------------------------