We have identified the functionality that the user uses most often and wants to see as soon as they open the application. On the main screen, we brought the chart, order book, orders and quotes of currency pairs. Interface development took almost 2 months. We have prepared 2 versions of the application - for tablets and for phones. Optimized performance on both types of devices. For the design, we chose a dark theme, which is more familiar to users. The rest of the elements were designed in contrasting colors: the text is white, the buttons and graphics are yellow-orange, well readable against a dark background. Optimized graphics rendering.
To do this, we used the TradingView library, a financial Canada Email List visualization platform that allows you to very flexibly customize the charts and indicators that traders need. To embed the library into the application, we used the WebView component, which allows us to display web pages in the Android application. To ensure correct rendering of graphs on both iOS and Android, we used native wrappers in Swift and Kotlin. What difficulties have we encountered? Slow data transfer One of the main complaints of users of crypto exchanges is the low data transfer speed. The application must update them up to 20 times per second. To save bandwidth and increase speed, we combined gRPC, HTTP/2 and protobuf (protocol buffers). This is how quote data was transferred from the server to the client and back, along the way being converted into binary form and “packed” to reduce the size of the data.

There were no problems with Android - at the time of development, gRPC worked fine with Kotlin. For iOS, I had to write an additional interpreter layer for Swift. Device overheating and screen flickering Data is updated up to 20 times per second, so the application has to constantly render graphs and the interface. The device is overloaded, the battery overheats and quickly sits down. The processor cannot cope with processing the event - freezes occur, the screen begins to flicker. To reduce the load on the processor and ensure the normal operation of the battery, we decided to use data stacks. So, if new data arrives at the device while the interface is being rendered, it will be stacked. When it comes time to update the UI data, it uses the topmost (fresh) data on the stack and only renders that.