from urllib.parse import quote_plus from dotenv import load_dotenv from pymongo import MongoClient from mexc_sdk import Spot import yaml import os from datetime import timedelta load_dotenv() with open("coin.yaml", "r") as file: data = yaml.safe_load(file) interest_coins = data["interest"] MONGO_URI = f'mongodb://{quote_plus(os.getenv("DB_USER"))}:{quote_plus(os.getenv("DB_PWD"))}@{os.getenv("DB_HOST")}:{os.getenv("DB_PORT")}' client = MongoClient(MONGO_URI) db = client[os.getenv("DB_NAME")] # Replace with your database name if __name__ == "__main__": target = interest_coins[0] + "USDT" + "_kline" collection = db[target.lower()] latest_doc = collection.find_one(sort=[("T", -1)]) latest_end_time = latest_doc["T"] time_threshold = latest_end_time - ( 60 * 100 ) # 100 minutes before the latest endTime pipeline = [ # Filter based on endTime {"$match": {"T": {"$gte": time_threshold}}}, # Group by start time and end time { "$group": { "_id": {"startTime": "$t", "endTime": "$T"}, "open": {"$first": "$o"}, "high": {"$max": "$h"}, "low": {"$min": "$l"}, "close": {"$last": "$c"}, "volume": {"$sum": "$v"}, "weighted_price": {"$sum": {"$multiply": ["$c", "$v"]}}, "count": {"$sum": 1}, } }, # Sort by start time {"$sort": {"_id.startTime": 1}}, # Reshape for output { "$project": { "_id": 0, "time": {"$multiply": ["$_id.startTime", 1000]}, "open": 1, "high": 1, "low": 1, "close": 1, "volume": 1, "vwap": {"$divide": ["$weighted_price", "$volume"]}, "trades": "$count", "endTime": "$_id.endTime", } }, ] candles = list(collection.aggregate(pipeline)) print(candles)