def return_rest2acc(Order, AccumSumToSell): Account2Sell = get_account(user=Order.user, currency=Order.currency1) add_trans2(Account2Sell, AccumSumToSell, Order, "deal_return") system_notify(order_return_unused(Order, Account2Sell.currency(), AccumSumToSell), Order.user)
def return_rest2acc(Order, AccumSumToSell): Account2Sell = get_account(Order.user, Order.currency1) add_trans(Order.transit_1, AccumSumToSell, Order.currency1, Account2Sell, Order, "deal_return") system_notify( order_return_unused( Order, AccumSumToSell ), Order.user )
def finish_create_order(TradePair, SumToBuy, AccumSumToSell, Order): ##base currency if Order.currency1 == TradePair.currency_on: if AccumSumToSell < TradePair.min_trade_base: system_notify(order_finish(Order), Order.user) return 0 else: return SumToBuy else: if SumToBuy < TradePair.min_trade_base: system_notify(order_finish(Order), Order.user) return 0 else: return SumToBuy
def finish_create_order(TradePair, SumToBuy, AccumSumToSell, Order): ##base currency if Order.currency1 == TradePair.currency_on : if AccumSumToSell < TradePair.min_trade_base : system_notify(order_finish(Order), Order.user) return 0 else: return SumToBuy else: if SumToBuy < TradePair.min_trade_base : system_notify(order_finish(Order), Order.user) return 0 else: return SumToBuy
def finish_create_order(TradePair, SumToBuy, Order): ##base currency if Order.currency1 == TradePair.currency_on : if SumToBuy <= TradePair.min_trade_base : system_notify(order_finish(Order), Order.user) return 0 else: return SumToBuy else: FromSumToBuy = Order.sum1 / Order.price if FromSumToBuy <= TradePair.min_trade_base : system_notify(order_finish(Order), Order.user) return 0 else: return SumToBuy
def process_small_orders( TradePairUrl ): CurrentTradePair = TradePairs.objects.get(url_title = TradePairUrl) for item in Orders.objects.filter(trade_pair = CurrentTradePair, status="processing"): if item.currency1 == CurrentTradePair.currency_on : if item.sum1 < CurrentTradePair.min_trade_base : system_notify(order_finish(item), item.user) return_rest2acc(item, item.sum1) item.sum1 = 0 item.status = "processed" item.save() else: if item.sum2 < CurrentTradePair.min_trade_base : system_notify(order_finish(item), item.user) return_rest2acc(item, item.sum1) item.sum1 = 0 item.status = "processed" item.save()
def buy(Req, Trade_pair): FreqKey = "orders" + str(Req.user.id) Start = time.time() if not check_freq(FreqKey, 3): Response = HttpResponse('{"status":false}') Response['Content-Type'] = 'application/json' return Response getcontext().prec = settings.TRANS_PREC try: Count = Req.REQUEST.get("count") Price = Req.REQUEST.get("price") Count = Decimal(Count.replace(",", ".").strip()) Price = Decimal(Price.replace(",", ".").strip()) Count = to_prec(Count, settings.TRANS_PREC) Price = to_prec(Price, settings.TRANS_PREC) except: Response = HttpResponse(process_mistake(Req, "invalid_params")) Response['Content-Type'] = 'application/json' return Response if Price <= 0: Response = HttpResponse(process_mistake(Req, "SumLess0")) Response['Content-Type'] = 'application/json' return Response if Count <= 0: Response = HttpResponse(process_mistake(Req, "CountLess0")) Response['Content-Type'] = 'application/json' return Response TradePair = TradePairs.objects.get(url_title=Trade_pair) LOCK = "trades" + TradePair.url_title if TradePair.min_trade_base > Count: Response = HttpResponse(process_mistake(Req, "MinCount")) Response['Content-Type'] = 'application/json' return Response Custom = "0.0005" # Req.session["deal_comission"] Comission = Decimal(Custom) CurrencyOnS = Req.REQUEST.get("currency") CurrencyBaseS = Req.REQUEST.get("currency1") Amnt1 = Price * Count Amnt2 = Count CurrencyBase = Currency.objects.get(title=CurrencyBaseS) CurrencyOn = Currency.objects.get(title=CurrencyOnS) TradeLock = my_lock(LOCK) order = Orders(user=Req.user, currency1=CurrencyBase, currency2=CurrencyOn, price=Price, sum1_history=Amnt1, sum2_history=Amnt2, sum1=Amnt1, sum2=Amnt2, transit_1=TradePair.transit_from, transit_2=TradePair.transit_on, trade_pair=TradePair, comission=Comission) order.save() try: FromAccount = Accounts.objects.get(user=Req.user, currency=CurrencyBase) add_trans(FromAccount, Amnt1, CurrencyBase, TradePair.transit_from, order, "deposit") order.status = "processing" order.save() system_notify(deposit_funds(order), Req.user) ResAuto = make_auto_trade(order, TradePair, order.price, CurrencyBase, Amnt1, CurrencyOn, Amnt2) Response = HttpResponse(process_auto(Req, ResAuto, TradePair)) my_release(TradeLock) Response['Content-Type'] = 'application/json' End = time.time() measure = OrderTimer(order=order, time_work=str(End - Start)) measure.save() return Response except TransError as e: order.status = "canceled" order.save() Status = e.value Response = HttpResponse(process_mistake(Req, Status)) Response['Content-Type'] = 'application/json' my_release(TradeLock) End = time.time() measure = OrderTimer(order=order, time_work=str(End - Start)) measure.save() return Response
def process_order(AccountBuyer, ComisBuy, AccumSum, AccumSumToSell, item, Order, TradePair, ComisSell): ##TODO move to settings for every user ComisPercentSeller = item.comission ComisPercentBuyer = Order.comission if item.sum1 > AccumSum: ## a danger of low overflow Diff = AccumSum / item.sum1 TransSum = item.sum2 * Diff #TransSum = AccumSumToSell AccountSeller = get_account(item.user, item.currency2) add_trans(item.transit_2, TransSum, item.currency2, AccountSeller, item, "deal", Out_order_id=Order.id) add_trans(AccountSeller, TransSum * ComisPercentSeller, item.currency2, ComisSell, item, "comission", Out_order_id=Order.id) add_trans(item.transit_1, AccumSum, item.currency1, AccountBuyer, item, "deal", Out_order_id=Order.id) add_trans(AccountBuyer, AccumSum * ComisPercentBuyer, item.currency1, ComisBuy, Order, "comission", Out_order_id=Order.id) ##comission item.sum1 = item.sum1 - AccumSum item.sum2 = item.sum2 - TransSum item.save() try: system_notify( order_description_sell(AccumSum, TransSum, item, TradePair), AccountSeller.user) system_notify( order_description_buy(TransSum, AccumSum, Order, item, TradePair), AccountBuyer.user) except: pass return (0, AccumSumToSell - TransSum) if item.sum1 <= AccumSum: TransSum = item.sum2 NotifySum = item.sum1 AccountSeller = get_account(item.user, item.currency2) add_trans(item.transit_2, TransSum, item.currency2, AccountSeller, item, "deal", Out_order_id=Order.id) add_trans(AccountSeller, TransSum * ComisPercentSeller, item.currency2, ComisSell, item, "comission", Out_order_id=Order.id) add_trans(item.transit_1, NotifySum, item.currency1, AccountBuyer, item, "deal", Out_order_id=Order.id) add_trans(AccountBuyer, NotifySum * ComisPercentBuyer, item.currency1, ComisBuy, Order, "comission", Out_order_id=Order.id) ##comission item.status = "processed" item.sum1 = 0 item.sum2 = 0 item.save() try: system_notify( order_description_sell(NotifySum, TransSum, item, TradePair), AccountSeller.user) system_notify( order_description_buy(TransSum, NotifySum, Order, item, TradePair), AccountBuyer.user) system_notify(order_finish(item), AccountSeller.user) except: pass return (AccumSum - NotifySum, AccumSumToSell - TransSum)
def buy(Req, Trade_pair): FreqKey = "orders" + str(Req.user.id) Start = time.time() if not check_freq(FreqKey, 3) : Response = HttpResponse('{"status":false}') Response['Content-Type'] = 'application/json' return Response getcontext().prec = settings.TRANS_PREC try : Count = Req.REQUEST.get("count") Price = Req.REQUEST.get("price") Count = Decimal( Count.replace(",",".").strip() ) Price = Decimal( Price.replace(",",".").strip() ) Count = to_prec(Count, settings.TRANS_PREC ) Price = to_prec(Price, settings.TRANS_PREC ) except: Response = HttpResponse(process_mistake(Req, "invalid_params")) Response['Content-Type'] = 'application/json' return Response if Price <= 0: Response = HttpResponse(process_mistake(Req, "SumLess0")) Response['Content-Type'] = 'application/json' return Response if Count<=0: Response = HttpResponse(process_mistake(Req, "CountLess0")) Response['Content-Type'] = 'application/json' return Response TradePair = TradePairs.objects.get(url_title = Trade_pair) LOCK = "trades" + TradePair.url_title if TradePair.min_trade_base > Count: Response = HttpResponse(process_mistake(Req, "MinCount")) Response['Content-Type'] = 'application/json' return Response Custom = "0.0005"# Req.session["deal_comission"] Comission = Decimal(Custom) CurrencyOnS = Req.REQUEST.get("currency") CurrencyBaseS = Req.REQUEST.get("currency1") Amnt1 = Price * Count Amnt2 = Count CurrencyBase = Currency.objects.get(title = CurrencyBaseS ) CurrencyOn = Currency.objects.get(title = CurrencyOnS ) TradeLock = my_lock(LOCK) order = Orders(user = Req.user, currency1 = CurrencyBase, currency2 = CurrencyOn, price = Price, sum1_history = Amnt1, sum2_history = Amnt2, sum1 = Amnt1, sum2 = Amnt2, transit_1 = TradePair.transit_from, transit_2 = TradePair.transit_on, trade_pair = TradePair, comission = Comission ) order.save() try: FromAccount = Accounts.objects.get(user = Req.user, currency = CurrencyBase) add_trans(FromAccount, Amnt1, CurrencyBase, TradePair.transit_from, order, "deposit") order.status = "processing" order.save() system_notify(deposit_funds(order), Req.user) ResAuto = make_auto_trade(order, TradePair, order.price, CurrencyBase, Amnt1, CurrencyOn, Amnt2) Response = HttpResponse(process_auto(Req, ResAuto, TradePair)) my_release(TradeLock) Response['Content-Type'] = 'application/json' End = time.time() measure = OrderTimer(order = order,time_work = str(End - Start)) measure.save() return Response except TransError as e: order.status = "canceled" order.save() Status = e.value Response = HttpResponse(process_mistake(Req, Status)) Response['Content-Type'] = 'application/json' my_release(TradeLock) End = time.time() measure = OrderTimer(order = order,time_work = str(End - Start)) measure.save() return Response
def process_order(AccountBuyer, ComisBuy, AccumSum, AccumSumToSell, item, Order, TradePair, ComisSell ): ##TODO move to settings for every user ComisPercentSeller = item.comission ComisPercentBuyer = Order.comission if item.sum1 > AccumSum : ## a danger of low overflow Diff = AccumSum / item.sum1 TransSum = item.sum2*Diff #TransSum = AccumSumToSell AccountSeller = get_account(item.user, item.currency2) add_trans(item.transit_2, TransSum, item.currency2, AccountSeller, item, "deal", Out_order_id = Order.id ) add_trans(AccountSeller , TransSum*ComisPercentSeller, item.currency2, ComisSell, item, "comission", Out_order_id = Order.id ) add_trans(item.transit_1, AccumSum, item.currency1, AccountBuyer, item, "deal", Out_order_id = Order.id ) add_trans(AccountBuyer, AccumSum*ComisPercentBuyer, item.currency1, ComisBuy, Order, "comission", Out_order_id = Order.id) ##comission item.sum1 = item.sum1 - AccumSum item.sum2 = item.sum2 - TransSum item.save() try: system_notify(order_description_sell(AccumSum, TransSum, item, TradePair), AccountSeller.user) system_notify(order_description_buy(TransSum, AccumSum, Order, item, TradePair), AccountBuyer.user) except : pass return (0, AccumSumToSell - TransSum ) if item.sum1 <= AccumSum : TransSum = item.sum2 NotifySum = item.sum1 AccountSeller = get_account(item.user, item.currency2) add_trans(item.transit_2, TransSum, item.currency2, AccountSeller, item, "deal", Out_order_id = Order.id) add_trans(AccountSeller , TransSum*ComisPercentSeller, item.currency2, ComisSell, item, "comission", Out_order_id = Order.id) add_trans(item.transit_1, NotifySum, item.currency1, AccountBuyer, item, "deal", Out_order_id = Order.id) add_trans(AccountBuyer, NotifySum*ComisPercentBuyer, item.currency1, ComisBuy, Order, "comission", Out_order_id = Order.id) ##comission item.status = "processed" item.sum1 = 0 item.sum2 = 0 item.save() try : system_notify(order_description_sell(NotifySum, TransSum, item, TradePair), AccountSeller.user) system_notify(order_description_buy(TransSum, NotifySum, Order, item, TradePair), AccountBuyer.user) system_notify(order_finish(item), AccountSeller.user) except : pass return (AccumSum - NotifySum, AccumSumToSell - TransSum )
def buy(Req, Trade_pair): getcontext().prec = settings.TRANS_PREC try : Count = Req.REQUEST.get("count") Price = Req.REQUEST.get("price") Count = Decimal( Count.replace(",",".").strip() ) Price = Decimal( Price.replace(",",".").strip() ) Count = to_prec(Count, settings.TRANS_PREC ) Price = to_prec(Price, settings.TRANS_PREC ) except: Response = HttpResponse(process_mistake(Req, "invalid_params")) Response['Content-Type'] = 'application/json' return Response if Price <= 0: Response = HttpResponse(process_mistake(Req, "SumLess0")) Response['Content-Type'] = 'application/json' return Response if Count<=0: Response = HttpResponse(process_mistake(Req, "CountLess0")) Response['Content-Type'] = 'application/json' return Response TradePair = TradePairs.objects.get(url_title = Trade_pair) if TradePair.min_trade_base > Count: Response = HttpResponse(process_mistake(Req, "MinCount")) Response['Content-Type'] = 'application/json' return Response CurrencyOnS = Req.REQUEST.get("currency") CurrencyBaseS = Req.REQUEST.get("currency1") Amnt1 = Price * Count Amnt2 = Count CurrencyBase = Currency.objects.get(title = CurrencyBaseS ) CurrencyOn = Currency.objects.get(title = CurrencyOnS ) order = Orders(user = Req.user, currency1 = CurrencyBase, currency2 = CurrencyOn, price = Price, sum1_history = Amnt1, sum2_history = Amnt2, sum1 = Amnt1, sum2 = Amnt2, transit_1 = TradePair.transit_from, transit_2 = TradePair.transit_on, trade_pair = TradePair ) order.save() try: FromAccount = Accounts.objects.get(user = Req.user, currency = CurrencyBase) add_trans(FromAccount, Amnt1, CurrencyBase, TradePair.transit_from, order, "deposit") order.status = "processing" order.save() system_notify(deposit_funds(order), Req.user) ResAuto = make_auto_trade(order, TradePair, order.price, CurrencyBase, Amnt1, CurrencyOn, Amnt2) Response = HttpResponse(process_auto(Req, ResAuto, TradePair)) Response['Content-Type'] = 'application/json' return Response except TransError as e: order.status = "canceled" order.save() Status = e.value Response = HttpResponse(process_mistake(Req, Status)) Response['Content-Type'] = 'application/json' return Response
def system_notify_async(Msg, User): system_notify(Msg, User)