Open AlphaAlex1 opened 3 years ago
Yes!
Work is being done on this. I use discord often but I'm leaning towards prioritising the Telegram bot before the discord scraper. It's hard to judge what the better option might be.
The panic sell button is coming very soon
Thank you!
Actually the telegram tag come faster then the discord one. I'm looking for the telegram option but to register to the channel you have to ask to the admin to put your bot listening the channel. And they ask moeny for this :-(. I suppose it is the same with discord?
Okay....im thinking if there is some other way around this.
Actually the events comes only from Telegram or discord. No better idea
From what I have researched, the Mproto core library acts as a telegram client just like your phone would. It shouldn't require adding a bot to the group
Well that would be awesome, if that is the case.
Hi, I've made it working with telegram
Cool. I cant wait to try it out!
I will send a PM to Yomi tomorrow
@ffbboy30 Could you upload the code for me to try somewhere?
You could put it in this thread too
from telethon import TelegramClient, sync, events import pandas as pd import time import os import sys import keyboard
api_id = xxxxxxxx api_hash = 'xxxxxxxxxxxx' group_username = 'aaaaaaaaa'
client = TelegramClient('yyyyy', api_id, api_hash).start()
@client.on(events.NewMessage)
async def my_event_handler(event):
print(event.message.message)
client.start()
client.run_until_disconnected()
keyboard.wait('esc')
print('Close')
client.disconnect()
now it need to parse the message text with regex to get the coin, correct?
@ffbboy30 think i actually need to wait for the integration from @abayomi185. i will mess it up otherwise :)
Okey, so this is python? i think we are working on nodejs now
@ffbboy30 however, i got it working aswell, though
txt = event.message.message
clean = re.search(r"\b\w+/", txt)
clean = clean.group()[:-1]
print(clean)
works with eg.
The coin we picked is BTM/BTC
ELA/USDT
Coin is: YOP/USDT
but not coins without the /
so this is nothing fancy
Here is some previous pump with channels
Now the most important is to share channels with no VIP pumps to have chance to make money.
Thanks! I should have some time to work on this later today. I'm currently looking at having both manual and telegram entry work simultaneously, particularly while it's still untested how performant it would be.
I'm looking if there is a solution equivalent with discord , to have the both in parallel and take the first message received
It's possible. I've made the UI in the last Node commit to choose multiple pump-groups at launch.
@ffbboy30 did you manage to add it to send the coin to the prompt in the bot-kucoin.py? if so, then do you have the code?
I suck on the Regex formula, here is the different sentence I've found 'Coin is: YOP/USDT' 'Coin is: YOP' 'YOP/USDT' 'YOP'
I thoughtabout a loop waiting while the sentence size is not null, and I put the Coin detected in the Event like this the loop break and you can make the order instantly. What do you think of that. I'm not Python expert :-)
Nice. It's similar to how I want to implement it in Node. I haven't used Regex extensively so I would have to learn it.
The @calamarcus regex works for Coin is: YOP/USDT YOP/USDT but not works for Coin is: YOP YOP
I can check more regex tomorrow!
this works with all. although feel free to change anything.
clean = event.message.message.replace("COIN IS", "coin is")
clean = re.search(r"(\b\w[A-Z]+)", clean)
clean = clean.group()
i hope this works with the nodejs also....please try that @abayomi185 when you have time.
@ffbboy30 Could you integrate the telegram function into the pythoncode?
I will look at it tonight What is nodejs , I don't see java code on this repo ?
.js files in the node_wip folder. but @abayomi185 will look at that as the python version is no priority for him. but i think you can try to integrate the telegram function into the python bot. i know most of everything except programming well :-)
Ok, I've seen it Thanks
The final regex is like this 👍
clean = event.message.message.upper()
if ':' in clean:
clean = clean.split(":") # remove before ':' if present in string
clean = clean[1]
clean = re.search(r"(\b\w[A-Z]+)", clean)
clean = clean.group()
print(clean)
I've problem to make the event message non blocking
from future import print_function, unicode_literals from time import sleep, time import PyInquirer as Inquirer from pprint import pprint from pyfiglet import Figlet from colorama import Fore, Back, Style from timeit import default_timer as timer import threading import concurrent.futures import asyncio import os import json import yaml import math import uuid import time
from telethon import TelegramClient, sync, events import pandas as pd import time import os import sys import keyboard import re
from kucoin.client import Market from kucoin.client import Trade from kucoin.client import User
import sqlite3
conn = sqlite3.connect('records.db') c = conn.cursor()
conf_Telegram = "./conf-Telegram.yaml" conf_import = "./conf-kucoin.yaml" secrets = "./secrets-kucoin.yaml" coin = None config = None
with open(conf_import, "r") as conf_file: config = yaml.safe_load(conf_file)
with open(conf_Telegram, "r") as conf_file: Telegramconfig = yaml.safe_load(conf_file)
with open(secrets, "r") as secrets_file: api_keys = yaml.safe_load(secrets_file)
config['api_key'] = api_keys['api_key'] config['api_secret'] = api_keys['api_secret'] config['api_passphrase'] = api_keys['api_passphrase']
question1 = [ { 'type': 'list', 'name': 'trade_conf', 'message': 'Please select trade configuration?', 'choices': list(config["trade_configs"].keys()), } ] question2 = [ { 'type': 'input', 'name': 'coin', 'message': 'Please enter coin for Pump?', } ] question3 = [ { 'type': 'confirm', 'name': 'continue', 'message': 'Do you wish to proceed?', 'default': True, } ]
def show_header(): fig = Figlet(font='slant') print(fig.renderText('crypto-bot'))
def debug_mode(client):
time_res = client.get_server_timestamp()
print(f"Server Time: {time_res}")
# There is an error for this function in the kucoin library
status = client.get_server_status()
print(f"Server Status: {status['status']}")
def acct_balance():
acct_balance = user_client.get_account_list(config['trade_configs'][selected_config]['pairing'], 'trade')
print('\nYour {} balance is {}\n'.format(config['trade_configs'][selected_config]['pairing'], acct_balance[0]['available']))
print(Fore.YELLOW + 'Please ensure Config is correct before proceeding\n' + Fore.RESET)
if float(acct_balance[0]['available']) < 0.001:
print(Fore.RED + 'A minimum balance may be required for trade on Kucoin\n' + Fore.RESET)
return acct_balance
def acct_balance2():
acct_balance = user_client.get_account_list(config['trade_configs'][selected_config]['pairing'], 'trade')
print('\nYour {} balance after trading is {}\n'.format(config['trade_configs'][selected_config]['pairing'], acct_balance[0]['available']))
float_acct_balance = float(acct_balance[0]['available'])
float_balance = float(balance[0]['available'])
difference = float_acct_balance - float_balance
percentage = (difference/float_balance) * 100
if float_acct_balance < float_balance:
print(Fore.YELLOW + 'A {:.2f}% loss\n'.format(percentage) + Fore.RESET)
if float_acct_balance > float_balance:
print(Fore.GREEN + 'A {:.2f}% gain\n'.format(percentage) + Fore.RESET)
return acct_balance
def pump_duration(start_time, end_time): time_delta = end_time - start_time time_delta = round(time_delta, 2) print(f"Time elapsed for pump is {time_delta}s\n")
def trading_amount(): avail_trading_amount = float(balance[0]['available']) * config['trade_configs'][selected_config]['buy_qty_from_wallet'] return avail_trading_amount
def market_order(selected_coin_pair, order_type):
if order_type == 'buy':
avail_trading_amount = trading_amount()
current_price = client.get_ticker(symbol=selected_coin_pair)
buy_qty = math.floor(avail_trading_amount / float(current_price['price']))
# order = client.order_market_buy(symbol=selected_coin_pair, quantity=buy_qty)
# print(f"buy_qty: {str(buy_qty)}")
order_id = trade.create_market_order(selected_coin_pair, 'buy', clientOid=str(uuid.uuid4()), size=str(buy_qty))
return order_id
elif order_type == 'sell':
# coin_balance = user_client.get_withdrawal_quota(selected_coin.upper())
coin_balance = user_client.get_account_list(selected_coin.upper(), 'trade')
# current_price = client.get_symbol_ticker(symbol=selected_coin_pair)
# sell_qty = math.floor(coin_balance * float(current_price['price']))
sell_qty = math.floor(float(coin_balance[0]['available']) * config['trade_configs'][selected_config]['sell_qty_from_wallet'])
# order = client.order_market_sell(symbol=selected_coin_pair, quantity=sell_qty)
order_id = trade.create_market_order(selected_coin_pair, 'sell', str(uuid.uuid4()), size=str(sell_qty))
return order_id
def display_order_details(order): return json.dumps(order, sort_keys=True, indent=4)
async def check_margin():
global pending_sell_order_id
# pending_sell_order_id = None
margin = config['trade_configs'][selected_config]['profit_margin']
fallback_task = asyncio.create_task(fallback_action())
# count = 0
while True:
# avg_price = client.get_avg_price(symbol=selected_coin_pair)
current_price = client.get_ticker(symbol=selected_coin_pair)
# print(float(buy_order_data['dealFunds'])/float(buy_order_data['dealSize']))
# count+=1
try:
if float(current_price['price']) >= ((float(buy_order_data['dealFunds'])/float(buy_order_data['dealSize'])) * (1.0 + margin)):
if pending_sell_order_id == None:
pending_sell_order_id = market_order(selected_coin_pair, 'sell')
break
else:
# sleep((config['trade_configs'][selected_config]['refresh_interval']/1000))
await asyncio.sleep(config['trade_configs'][selected_config]['refresh_interval']/1000)
except:
pass
if pending_sell_order_id:
break
# print(count)
return pending_sell_order_id
async def fallback_action():
global pending_sell_order_id
# sleep((config['trade_configs'][selected_config]['sell_fallback_timeout_ms']/1000))
await asyncio.sleep((config['trade_configs'][selected_config]['sell_fallback_timeout_ms']/1000))
if pending_sell_order_id == None:
pending_sell_order_id = market_order(selected_coin_pair, 'sell')
def insert_into_db(order, order_id):
# trade.get_order_details(order_id)
symbol = order['symbol']
symbol = symbol.split("-", 1)[0]
price = float(order['dealFunds']) / float(order['dealSize'])
c.execute("INSERT INTO Orders VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
("Kucoin", order['clientOid'], order_id, order['id'],
order['symbol'], order['type'], order['side'], order['timeInForce'],
order['createdAt'], symbol,
price, order['fee'],
order['size'], order['dealFunds']))
conn.commit()
async def main():
global buy_order_data
# coin_pair_info = client.get_symbol_info(selected_coin_pair)
# coin_pair_info = client.get_ticker(selected_coin_pair)
start_time = time.time()
buy_order = market_order(selected_coin_pair, 'buy')
# print(f"buy_order: {buy_order}")
buy_order_data = trade.get_order_details(buy_order['orderId'])
# Execution using threading
with concurrent.futures.ThreadPoolExecutor() as executor:
#Print buy order details
buy_order_details = executor.submit(display_order_details, buy_order_data)
print('\n' + buy_order_details.result() + '\n')
sell_order = await check_margin()
end_time = time.time()
sell_order_data = trade.get_order_details(sell_order['orderId'])
sell_order_details = display_order_details(sell_order_data)
print('\n' + sell_order_details + '\n')
insert_into_db(order=buy_order_data, order_id=buy_order['orderId'])
insert_into_db(order=sell_order_data, order_id=sell_order['orderId'])
conn.close()
balance2 = acct_balance2()
pump_duration(start_time, end_time)
if name == 'main':
show_header()
client = Market(url='https://api.kucoin.com')
trade = Trade(key=config['api_key'], secret=config['api_secret'],
passphrase=config['api_passphrase'], is_sandbox=False, url='')
user_client = User(config['api_key'], config['api_secret'], config['api_passphrase'])
if config['debug_mode']:
debug_mode(client=client)
print('\n')
print(Fore.GREEN + '-- Kucoin Edition --\n' + Fore.RESET)
#Start Telegram API
client = TelegramClient(Telegramconfig['UserName'], Telegramconfig['api_id'], Telegramconfig['api_hash']).start()
selected_coin = ''
#Telegram Event
#@client.on(events.NewMessage)
@client.on(events.NewMessage(chats=(Telegramconfig['group_username'])))
async def my_event_handler(event):
clean = event.message.message.upper()
if ':' in clean:
clean = clean.split(":") # remove before ':' if present in string
clean = clean[1]
clean = re.search(r"(\b\w[A-Z]+)", clean)
clean = clean.group()
global selected_coin
selected_coin = clean
client.start()
#client.run_until_disconnected()
#Question1
answer1 = Inquirer.prompt(question1)
selected_config = answer1['trade_conf']
#Retrieve current coin balance here
balance = acct_balance()
#Question2
#answer2 = Inquirer.prompt(question2)
#selected_coin = answer2['coin']
print('Wait for Telegram message')
async def main():
while (selected_coin == ''):
#print('Wait Telegram')
await asyncio.sleep(0.01)
client.loop.run_until_complete(main())
#Coin Pair
selected_coin_pair = selected_coin.upper() + "-" +\
config['trade_configs'][selected_config]['pairing']
buy_order_data = None
pending_sell_order_id = None
print('Receive : ' + selected_coin_pair)
asyncio.run(main())
from future import print_function, unicode_literals from time import sleep, time import PyInquirer as Inquirer from pprint import pprint from pyfiglet import Figlet from colorama import Fore, Back, Style from timeit import default_timer as timer import threading import concurrent.futures import asyncio import os import json import yaml import math import time
from telethon import TelegramClient, sync, events import pandas as pd import time import os import sys import keyboard import re
from binance.client import Client
import sqlite3
conn = sqlite3.connect('records.db') c = conn.cursor()
conf_Telegram = "./conf-Telegram.yaml" conf_import = "./conf-binance.yaml" secrets = "./secrets-binance.yaml" coin = None config = None
with open(conf_import, "r") as conf_file: config = yaml.safe_load(conf_file)
with open(conf_Telegram, "r") as conf_file: Telegramconfig = yaml.safe_load(conf_file)
with open(secrets, "r") as secrets_file: api_keys = yaml.safe_load(secrets_file)
config['api_key'] = api_keys['api_key'] config['api_secret'] = api_keys['api_secret']
question1 = [ { 'type': 'list', 'name': 'trade_conf', 'message': 'Please select trade configuration?', 'choices': list(config["trade_configs"].keys()), } ] question2 = [ { 'type': 'input', 'name': 'coin', 'message': 'Please enter coin for Pump?', } ] question3 = [ { 'type': 'confirm', 'name': 'continue', 'message': 'Do you wish to proceed?', 'default': True, } ]
def show_header(): fig = Figlet(font='slant') print(fig.renderText('crypto-bot'))
def debug_mode(client):
time_res = client.get_server_time()
print("Server Time: {}".format(time_res["serverTime"]))
status = client.get_system_status()
print("System Status: {}".format(status["msg"]))
def acct_balance(send_output=False): acct_balance = client.get_asset_balance(asset=config['trade_configs'] [selected_config]['pairing'])
print('\nYour {} balance is {}\n'.format(config['trade_configs'][selected_config]['pairing'], acct_balance['free']))
print(Fore.YELLOW + 'Please ensure Config is correct before proceeding\n' + Fore.RESET)
if config['trade_configs'][selected_config]['pairing'] == 'BTC':
if float(acct_balance['free']) < 0.001:
print(Fore.RED + 'Binance requires min balance of 0.001 BTC for trade\n' + Fore.RESET)
else:
print(Fore.RED + 'A min balance is often required for trade on Binance\n' + Fore.RESET)
return acct_balance
def acct_balance2(send_output=False): acct_balance = client.get_asset_balance(asset=config['trade_configs'] [selected_config]['pairing'])
print('\nYour {} balance after trading is {}\n'.format(config['trade_configs'][selected_config]['pairing'], acct_balance['free']))
difference = acct_balance['free'] - balance['free']
percentage = (difference/balance) * 100
if float(acct_balance['free']) < balance:
print(Fore.YELLOW + 'A {:.2f}% loss\n'.format(percentage) + Fore.RESET)
if float(acct_balance['free']) > balance:
print(Fore.GREEN + 'A {:.2f}% gain\n'.format(percentage) + Fore.RESET)
return acct_balance
def pump_duration(start_time, end_time): time_delta = end_time - start_time time_delta = round(time_delta, 2) print(f"Time elapsed for pump is {time_delta}s\n")
def trading_amount(): avail_trading_amount = float(balance['free']) * config['trade_configs'][selected_config]['buy_qty_from_wallet'] return avail_trading_amount
def market_order(client, selected_coin_pair, order_type, coin_pair_info, balance):
if order_type == 'buy':
avail_trading_amount = trading_amount()
current_price = client.get_symbol_ticker(symbol=selected_coin_pair)
buy_qty = math.floor(avail_trading_amount / float(current_price['price']))
order = client.order_market_buy(symbol=selected_coin_pair, quantity=buy_qty)
return order
elif order_type == 'sell':
#This here is a potential bottle neck and may introduce delays
coin_balance = client.get_asset_balance(asset=selected_coin.upper())
# print(coin_balance)
# current_price = client.get_symbol_ticker(symbol=selected_coin_pair)
# print(current_price)
# sell_qty = math.floor(coin_balance * float(current_price['price']))
sell_qty = math.floor(float(coin_balance['free']) * config['trade_configs'][selected_config]['sell_qty_from_wallet'])
order = client.order_market_sell(symbol=selected_coin_pair, quantity=sell_qty)
return order
def display_order_details(order): return json.dumps(order, sort_keys=True, indent=4)
async def check_margin():
global pending_sell_order
margin = config['trade_configs'][selected_config]['profit_margin']
fallback_task = asyncio.create_task(fallback_action())
while True:
# avg_price = client.get_avg_price(symbol=selected_coin_pair)
current_price = client.get_symbol_ticker(symbol=selected_coin_pair)
# print(current_price)
# print(current_price['price'])
try:
if float(current_price['price']) >= (buy_order['fills'][0]['price'] * (1.0 + margin)):
if pending_sell_order == None:
pending_sell_order = market_order(client, selected_coin_pair, 'sell', coin_pair_info, balance)
break
else:
await asyncio.sleep((config['trade_configs'][selected_config]['refresh_interval']/1000))
except:
pass
if pending_sell_order:
break
return pending_sell_order
async def fallback_action():
global pending_sell_order
await asyncio.sleep((config['trade_configs'][selected_config]['sell_fallback_timeout_ms']/1000))
if pending_sell_order == None:
pending_sell_order = market_order(client, selected_coin_pair, 'sell', coin_pair_info, balance)
def insert_into_db(order):
c.execute("INSERT INTO Orders VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
("Binance", order['clientOrderId'], order['orderId'], order['fills'][0]['tradeId'],
order['symbol'], order['type'], order['side'], order['timeInForce'],
order['transactTime'], order['fills'][0]['commissionAsset'],
order['fills'][0]['price'], order['fills'][0]['commission'],
order['fills'][0]['qty'], order['cummulativeQuoteQty']))
conn.commit()
async def main():
coin_pair_info = client.get_symbol_info(selected_coin_pair)
start_time = time.time()
buy_order = market_order(client, selected_coin_pair, 'buy', coin_pair_info, balance)
# Execution using threading
with concurrent.futures.ThreadPoolExecutor() as executor:
#Print buy order details
buy_order_details = executor.submit(display_order_details, buy_order)
print('\n' + buy_order_details.result() + '\n')
sell_order = await check_margin()
end_time = time.time()
sell_order_details = display_order_details(sell_order)
print('\n' + sell_order_details + '\n')
insert_into_db(order=buy_order)
insert_into_db(order=sell_order)
conn.close()
balance2 = acct_balance2()
pump_duration(start_time, end_time)
if name == 'main':
show_header()
client = Client(config["api_key"], config["api_secret"])
if config['debug_mode']:
debug_mode(client=client)
print('\n')
print(Fore.YELLOW + '-- Binance Edition --\n' + Fore.RESET)
#Start Telegram API
Tlgclient = TelegramClient(Telegramconfig['UserName'], Telegramconfig['api_id'], Telegramconfig['api_hash']).start()
selected_coin = ''
#Telegram Event
#@Tlgclient.on(events.NewMessage)
@Tlgclient.on(events.NewMessage(chats=(Telegramconfig['group_username'])))
async def my_event_handler(event):
clean = event.message.message.upper()
if ':' in clean:
clean = clean.split(":") # remove before ':' if present in string
clean = clean[1]
clean = re.search(r"(\b\w[A-Z]+)", clean)
clean = clean.group()
global selected_coin
selected_coin = clean
Tlgclient.start()
#Tlgclient.run_until_disconnected()
#Question1
answer1 = Inquirer.prompt(question1)
selected_config = answer1['trade_conf']
#Retrieve current coin balance here
balance = acct_balance()
#Question2
#answer2 = Inquirer.prompt(question2)
#selected_coin = answer2['coin']
print('Wait for Telegram message')
async def main():
while (selected_coin == ''):
#print('Wait Telegram')
await asyncio.sleep(0.01)
Tlgclient.loop.run_until_complete(main())
#Coin Pair
selected_coin_pair = selected_coin.upper() + \
config['trade_configs'][selected_config]['pairing']
buy_order = None
coin_pair_info = None
pending_sell_order = None
print('Receive : ' + selected_coin_pair)
asyncio.run(main())
i tried telegram with binance just now. i think it took 5 seconds for the telegram message to reach the function. That will not work unless there is something to do to fix it..
And i am getting the message fast in my telegram windows app, and 4-5 seconds later in the python function.
I test the code with a chat channel it works without delay. I've seen that some channel are able to detect Bot and add 5 to 12 sec delay. Maybe you can test on chat channel maybe the problem is on your side ? Which channel do you test ?
Hey @calamarcus and @ffbboy30 how do I go about getting the group channel id?
If you click on the name of the channel, in the telegram window you should see the channel properties.
Possibly even right click on the channelname in the list of channels on the left side in telegram, to get a dropdown option list.
What platform and client should I do this on? I have yet to see it on the web client and iOS app
Sorry, its windows i was referring to.
I've just start a Discord server to list all the usefull pump channel without VIP or pre pump. If you have some informations informations I will add them . I don't know how it works but the channel ID is : 847330841586696193 and the name of the server is pumpchannellist's server and the link https://discord.gg/CWvNtX4T
Just an update, I have done some testing and I'm able to get messages from telegram groups with no perceivable delay. I have yet to parse the messages and feed them into the exchange bot.
I am able to commit time into this after next week. If you have more suggestions. I'm happy to hear and implement them.
Yes i think for a tiny log during pump to have delay feedback for the next pump. For example : Timestamp; Price
Le ven. 4 juin 2021 à 19:39, Yomi Ikuru @.***> a écrit :
Just an update, I have done some testing and I'm able to get messages from telegram groups with no perceivable delay. I have yet to parse the messages and feed them into the exchange bot.
I am able to commit time into this after next week. If you have more suggestions. I'm happy to hear and implement them.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/abayomi185/simple-pump-and-dump-bot/issues/34#issuecomment-854896308, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABUEJ427GDUDECPELVELZQ3TREFTVANCNFSM45K2WV5Q .
I am doing some testing @ffbboy30 Your regex was helpful. I've refined it to allow for different text formats.
Hey! Is there some way we could integrate this bot into discord so it automatically buys the coin for us? It would really help out! Also, is there a panic sell button on the bot?