KingData Open Platform
  • Open Platform Introduction
  • How to develop an indicator
    • Step1: Clone Repo
    • Step2: Write Definition.md
    • Step3: Write Logic Code
    • Step4: Write Template
    • Step5: Test and Pull Request
  • Examples
    • Demo with JSON data
    • Demo with HTML data
    • Demo with Socket Data
  • ⚠️ Attention && FAQ
    • How to store data
  • Related Links
  • API DOC
    • Integrate KingData content into your app
Powered by GitBook
On this page
  • For Example
  • So the complete code is
  1. How to develop an indicator

Step4: Write Template

The template can clearly explain the alert data, making it easier for users to understand.

PreviousStep3: Write Logic CodeNextStep5: Test and Pull Request

Last updated 2 years ago

Because the data fields referenced in each indicator are different, there is no reusability. In order to improve the flexibility of the data and make the expression of the alert more understandable, we have separated the processing of the indicator data from the broadcast text, and introduced the template engine. We create an alert template corresponding to the language for each indicator, and the data that needs to be used in the template is replaced by variables. After the logic of the indicators is processed, the corresponding data variables are passed to the template, which can be easily compiled into broadcast text in different languages.

We are using templating engine

Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax. Then the template is passed data to render the final document. More info:

For Example

The corresponding EN template is:

According to KingData monitoring, {% for coin in info%}In the past 4 hours, {{coin.symbol}} Long/Short Ratio across network is {{coin.long_short_rate}}, with {{coin.long_rate}}% longs and  {{coin.short_rate}}% shorts. {%if coin.long_short_rate>1%}Longs outweigh shorts{% else %}Shorts outweigh Longs{% endif %}.
Among leading exchanges:{% for exchange in coin.list %}
{{exchange.exchange_name}}: long {{exchange.long_rate}}%, short {{exchange.short_rate}}%{% endfor %}

{% endfor %}

The rendered EN text is:

According to KingData monitoring, In the past 4 hours, BTC Long/Short Ratio across network is 1.08, with 51.86% longs and  48.14% shorts. Longs outweigh shorts.
Among leading exchanges:
Binance: long 46.4%, short 53.6%
OKX: long 57.96%, short 42.04%
Bitget: long 50.53%, short 49.47%

The corresponding CN template is:

据 KingData 数据监控,{% for coin in info%}最近4小时,{{coin.symbol}}全网合约多空比为 {{coin.long_short_rate}},多单占比 {{coin.long_rate}}%,空单占比{{coin.short_rate}}%,{%if coin.long_short_rate>1%}看多人数大于看空人数{% else %}看空人数大于看多人数{% endif %}。
其中主流交易所:{% for exchange in coin.list %}
{{exchange.exchange_name}}:做多{{exchange.long_rate}}% 做空{{exchange.short_rate}}%{% endfor %}

{% endfor %}

The rendered CN text is:

据 KingData 数据监控,最近4小时,BTC全网合约多空比为 1.08,多单占比 51.86%,空单占比48.14%,看多人数大于看空人数。
其中主流交易所:
Binance:做多46.4% 做空53.6%
OKX:做多57.96% 做空42.04%
Bitget:做多50.53% 做空49.47%

So the complete code is

from crawlers.utils import SpiderBase
from jinja2 import Template
from crawlers.utils.group_alarm import catch_except


def build_coin_info(data):
    return {
        'symbol': data['symbol'],
        'long_short_rate': round(data['longRate'] / data['shortRate'], 2),
        'long_rate': data['longRate'],
        'short_rate': data['shortRate'],
        'list': [{
            'exchange_name': exchange_info['exchangeName'],
            'long_rate': exchange_info['longRate'],
            'short_rate': exchange_info['shortRate']
        } for exchange_info in data['list'][:3]]
    }


class ContractPositionRatio(SpiderBase):
    name = 'idx-contract-position-ratio'

    start_urls = [
        'https://fapi.coinglass.com/api/futures/longShortRate?symbol=BTC&timeType=3',
        'https://fapi.coinglass.com/api/futures/longShortRate?symbol=ETH&timeType=3'
    ]

    @catch_except
    def parse(self, response, **kwargs):
        data = response.json()['data'][0]
        params = {
            'info': [build_coin_info(data)]
        }
        print(Template(self.alert_en_template()).render(params))
        print(Template(self.alert_cn_template()).render(params))

    # must be declare
    def alert_en_template(self):
        return """
According to KingData monitoring, {% for coin in info%}In the past 4 hours, {{coin.symbol}} Long/Short Ratio across network is {{coin.long_short_rate}}, with {{coin.long_rate}}% longs and  {{coin.short_rate}}% shorts. {%if coin.long_short_rate>1%}Longs outweigh shorts{% else %}Shorts outweigh Longs{% endif %}.
Among leading exchanges:{% for exchange in coin.list %}
{{exchange.exchange_name}}: long {{exchange.long_rate}}%, short {{exchange.short_rate}}%{% endfor %}
{% endfor %}
"""

    # must be declare
    def alert_cn_template(self):
        return """
据 KingData 数据监控,{% for coin in info%}最近4小时,{{coin.symbol}}全网合约多空比为 {{coin.long_short_rate}},多单占比 {{coin.long_rate}}%,空单占比{{coin.short_rate}}%,{%if coin.long_short_rate>1%}看多人数大于看空人数{% else %}看空人数大于看多人数{% endif %}。
其中主流交易所:{% for exchange in coin.list %}
{{exchange.exchange_name}}:做多{{exchange.long_rate}}% 做空{{exchange.short_rate}}%{% endfor %}
{% endfor %}
"""
Jinjia2
https://github.com/pallets/jinja