sthewissen / Mynt

An Azure Functions-based crypto currency trading bot; featuring 10 exchanges, 25 indicators, custom strategy support, backtester and more
BSD 3-Clause "New" or "Revised" License
237 stars 129 forks source link

Improve trading performance #77

Open sthewissen opened 6 years ago

sthewissen commented 6 years ago

Currently the trading process has a serial nature to it. It retrieves all the markets, checks them all for possible trades and then creates all the found trades until no traders are available anymore. This means that a trade may be placed minutes after it was found which is not optimal. The process takes some time and could be optimised further:

LORDofDOOM commented 6 years ago

Sound good. Also parallel processing is IMHO a important change because with sequential processing a buy is possibly to late.

Checking for new trades even if all traders are at work could possibly still be a useful option. If a trader sell it already have a buy option and could check if the TA is still valid

sthewissen commented 6 years ago

I could use input on a lot of things probably when it comes to this.

  1. First off I believe @cryptoandrej had the idea to combine the PaperTradeManager and the LiveTradeManager into one. Switching between the two would then be as simple as a boolean toggle in the constructor. I support that idea.

  2. The Initialize() method seems a bit redundant in many cases. Currently it runs before each buy loop and queries the database to see if it needs to create or change how the current trader instances are set up. This seems like a lot of overhead once the bot is up-and-running. Especially when trading lower timeframes a useless DB call every 1 or 5 mins seems like a total waste of resources. Could we simplify this Trader setup process?

I'm working on this in the trademanager-performance branch if anyone wants to pitch in :) If you have additional ideas on how to go about improving how the trademanager works at the moment, feel free to post here :)

twixwix commented 6 years ago

Hey guys I think we have a thread issue with the initialize(); sometimes when the cron is to fast it hits that twice. So if DB context is already in use we have the problem from asynchronous DB context. We have some ways to get rid of that.

  1. Maybe a pseudo object which contains the DB context and we save it in the end so there would be no lock in database.

  2. Semaphore lock in sell or buy. Therefore only one task can go in the semaphore it is like a queue.

Parallel loops would be must have if we want more frequent trading bots.

But all in all I like the idea to get rid of duplicate code from traders...