From cc58d054770ea968a737c7137f2b166712cf9dba Mon Sep 17 00:00:00 2001 From: andrew saintway Date: Wed, 3 Feb 2021 09:51:25 +0900 Subject: [PATCH] gainable_unit_cc_sold_jpy -> gainable_unit_cc_sold_ratio --- graph/main-martingale.ipynb | 41 +++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/graph/main-martingale.ipynb b/graph/main-martingale.ipynb index c7fd9ea..1e1489c 100644 --- a/graph/main-martingale.ipynb +++ b/graph/main-martingale.ipynb @@ -34,17 +34,16 @@ "\n", "TRADE_UNIT = Decimal('0.0001')\n", "\n", - "GAINABLE_UNIT_CC_SOLD_JPY = 25000 # TODO: self-adaptive by trend analysis\n", + "GAINABLE_UNIT_CC_SOLD_RATIO = Decimal('0.1') # TODO: self-adaptive by trend analysis\n", "LOSSABLE_UNIT_CC_BOUGHT_RATIO = Decimal('0.9')\n", "\n", "MIN_UNIT_CC_TRADE_JPY = 5000\n", - "MAX_UNIT_CC_TRADE_JPY = MIN_UNIT_CC_TRADE_JPY << 10\n", + "MAX_UNIT_CC_TRADE_JPY = Decimal('Infinity')\n", "LOSSABLE_UNIT_CC_SELL_JPY = MAX_UNIT_CC_TRADE_JPY\n", "\n", - "import sys\n", - "MAX_GAIN_JPY = sys.maxsize # useless\n", - "MAX_LOSS_JPY = sys.maxsize # useless\n", - "MAX_LOST_JPY = sys.maxsize" + "MAX_GAIN_JPY = Decimal('Infinity') # useless\n", + "MAX_LOSS_JPY = Decimal('Infinity') # useless\n", + "MAX_LOST_JPY = Decimal('Infinity')" ] }, { @@ -125,7 +124,17 @@ " robot_status_description = f'{self.bought_average_fiat_price:.2f} / {robot_status_description}'\n", " return f'{self.robot_name} ({robot_status_description}) at {datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")}'\n", "\n", + " def has_enough_unused_fiat_money(self, fiat_money):\n", + " return fiat_money <= self.unused_fiat_money * Decimal('0.75')\n", + "\n", + " def has_buyable_fiat_price(self):\n", + " return self.now_buy_fiat_price > MIN_UNIT_CC_TRADE_JPY and self.now_buy_fiat_price < MAX_UNIT_CC_TRADE_JPY\n", + "\n", + " def is_fiat_price_lower_than_average(self):\n", + " return self.bought_average_fiat_price is not None and self.now_buy_fiat_price < self.bought_average_fiat_price\n", + "\n", " def get_gain_fiat_money(self):\n", + " self.gain_fiat_money = self.now_sell_fiat_price * self.bought_amount - self.used_fiat_money\n", " return self.now_sell_fiat_price * self.bought_amount - self.used_fiat_money\n", "\n", " def get_total_gain_fiat_money(self):\n", @@ -570,6 +579,7 @@ "metadata": {}, "outputs": [], "source": [ + "from decimal import Decimal\n", "import math\n", "from scipy import optimize as opt\n", "from numpy.lib import scimath\n", @@ -581,6 +591,7 @@ " lossable_unit_cc_bought_jpy = (status.bought_average_fiat_price - MIN_UNIT_CC_TRADE_JPY) * LOSSABLE_UNIT_CC_BOUGHT_RATIO\n", " min_unit_cc_diff_jpy = float(lossable_unit_cc_bought_jpy) / scimath.log(float(status.get_max_used_fiat_money() / status.used_fiat_money))\n", " status.min_bought_average_fiat_price = status.bought_average_fiat_price - lossable_unit_cc_bought_jpy\n", + " status.max_next_buy_fiat_price = status.bought_average_fiat_price - Decimal(repr(min_unit_cc_diff_jpy))\n", "\n", " bought_average_fiat_price = float(status.bought_average_fiat_price)\n", " now_buy_fiat_price = float(status.now_buy_fiat_price)\n", @@ -601,8 +612,9 @@ " sold_unit_amount = float(status.sold_unit_amount)\n", " unit_cc_diff_jpy = float(abs(status.now_sell_fiat_price - status.sold_average_fiat_price))\n", "\n", - " min_unit_cc_diff_jpy = float(GAINABLE_UNIT_CC_SOLD_JPY) / scimath.log(float(status.get_max_sold_unit_amount() / status.sold_unit_amount))\n", - " status.max_sold_average_fiat_price = status.sold_average_fiat_price + GAINABLE_UNIT_CC_SOLD_JPY\n", + " status.max_sold_average_fiat_price = status.bought_average_fiat_price * (1 + GAINABLE_UNIT_CC_SOLD_RATIO)\n", + " min_unit_cc_diff_jpy = float(status.max_sold_average_fiat_price - status.sold_average_fiat_price) / scimath.log(float(status.get_max_sold_unit_amount() / status.sold_unit_amount))\n", + " status.min_next_sell_fiat_price = status.sold_average_fiat_price + Decimal(repr(min_unit_cc_diff_jpy))\n", "\n", " return math.ceil(\n", " sold_unit_amount * opt.fsolve(\n", @@ -732,14 +744,17 @@ "# continue\n", "\n", " init_buy_jpy = status.get_max_used_fiat_money() / Decimal(math.exp(LOSSABLE_UNIT_CC_BOUGHT_RATIO / (1 - LOSSABLE_UNIT_CC_BOUGHT_RATIO)))\n", - " if status.used_fiat_money < init_buy_jpy and init_buy_jpy - status.used_fiat_money <= (status.get_max_used_fiat_money() - status.used_fiat_money) * Decimal('0.75') \\\n", - " and status.now_buy_fiat_price > MIN_UNIT_CC_TRADE_JPY and status.now_buy_fiat_price < MAX_UNIT_CC_TRADE_JPY:\n", + " if status.used_fiat_money == 0 and status.has_enough_unused_fiat_money(init_buy_jpy) and status.has_buyable_fiat_price():\n", + " status.sample_number = 0\n", + " status.please_buy_unit_amount = math.ceil(init_buy_jpy / status.now_buy_fiat_price / status.trade_unit)\n", + "\n", + " if status.used_fiat_money < init_buy_jpy and status.is_fiat_price_lower_than_average() and status.has_enough_unused_fiat_money(init_buy_jpy - status.used_fiat_money) and status.has_buyable_fiat_price():\n", " status.sample_number = 0\n", " status.please_buy_unit_amount = math.ceil((init_buy_jpy - status.used_fiat_money) / status.now_buy_fiat_price / status.trade_unit)\n", "\n", - " if status.used_fiat_money >= init_buy_jpy and status.bought_average_fiat_price is not None and status.now_buy_fiat_price < status.bought_average_fiat_price:\n", + " if status.used_fiat_money >= init_buy_jpy and status.is_fiat_price_lower_than_average():\n", " trade_unit_amount = get_buy_unit_amount(status)\n", - " while trade_unit_amount > 0 and status.now_buy_fiat_price * status.trade_unit * trade_unit_amount > (status.get_max_used_fiat_money() - status.used_fiat_money) * Decimal('0.75'):\n", + " while trade_unit_amount > 0 and not status.has_enough_unused_fiat_money(status.now_buy_fiat_price * status.trade_unit * trade_unit_amount):\n", " trade_unit_amount >>= 1\n", " if trade_unit_amount > 0:\n", " status.sample_number = 0\n", @@ -800,7 +815,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.0" + "version": "3.6.7" } }, "nbformat": 4,