暗号資産トレーディングシステムを構築する上で、历史行情データの取得は避けて通れない課題です。本記事では、業界で広く使われているTardisとCCXTの2つのAPIを、工コスト・データ品質・維持費の観点から徹底比較します。
前提知識:APIってなに?ゼロから理解する
API(Application Programming Interface)とは、ソフトウェア同士が通信するための窓口です。トレーディングAPIを使えば、暗号資産取引所のデータをプログラムで取得したり、自动注文を出したりできます。
📸 スクリーンショットポイント:APIダッシュボード обычно представляет собой список エンドポイント(URL)と認証情報(APIキー)を 管理する画面です。HolySheheep AIでは登録直後からこの画面にアクセスできます。
Tardisとは?
Tardisは、CryptoSpot、Bybit、OKXなどの主要取引所から历史OHLCV(始値・高さ・安値・終値・出来高)やtickデータを 低レイテンシーで取得できる 专业向けSaaSです。
CCXTとは?
CCXTは、133以上の取引所に対応するオープンソースライブラリです。統一されたインターフェースで複数の取引所にアクセスできますが、交易所ごとに数据结构やrate limit(制限)が異なります。
向いている人・向いていない人
| 評価基準 | Tardis | CCXT | HolySheep AI |
|---|---|---|---|
| セットアップ工数 | △ 中程度 | △ 中程度 | ◎ 最小限 |
| データ完全性 | ◎ 高精度 | △ 取引所依存 | ◎ 高精度 |
| コスト構造 | △ 従量課金 | ○ 免费(自前運用) | ◎ 定額+$1=¥7.3 |
| サポート体制 | ○ 有料サポート | △ コミュニティのみ | ◎ 日本語対応 |
Tardisが向いている人
- ミリ秒単位の精度が必要なプロップトレーディング
- Institucional投資銀行やヘッジファンド
- 複雑な订单板解析が必要な量化戦略
CCXTが向いている人
- 複数取引所を一括管理したい开发者
- コストを最優先事項としているプロジェクト
- 自前でインフラを管理できる技術力のあるチーム
HolySheep AIが向いている人
- 赶紧-marketなMLEチーム
- LLM应用に历史データを活かしたい事業者
- 日本語サポートしてほしいチーム
比較1:注文板深度(Order Book Depth)
注文板とは、板寄せ屏幕上显示的「いくらでどのくらいの量の買い注文・주당注文があるか」を示したデータです。深い注文板は流動性が高く、スプレッド(買い気配と勝ち気配の差)が狭いことを意味します。
Tardisの注文板データ
# Tardis API - 注文板データ取得例
import requests
TARDIS_API_KEY = "your_tardis_key"
EXCHANGE = "binance"
SYMBOL = "btc-usdt"
LIMIT = 100 # 深度100レベル
url = f"https://api.tardis.me/v1/books/{EXCHANGE}/{SYMBOL}"
headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"}
params = {"limit": LIMIT, "start_date": "2026-01-01"}
response = requests.get(url, headers=headers, params=params)
orderbook_data = response.json()
結果例
print(f"取得レコード数: {len(orderbook_data['data'])}")
print(f"買い最深気配: {orderbook_data['data'][-1]['bids'][0]}")
print(f"最安気配: {orderbook_data['data'][-1]['asks'][0]}")
Tardisはリアルタイムと历史数据を统一的に提供しますが、历史订单板はhistorical/replaysエンドポイントを使用し、リアルタイムよりコストが高くなる傾向があります。
CCXTの注文板データ
# CCXT - 注文板データ取得例
import ccxt
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True,
})
現在の注文板
orderbook = exchange.fetch_order_book('BTC/USDT', limit=100)
深度データの整形
bids = orderbook['bids'][:10] # 上位10レベルの買い注文
asks = orderbook['asks'][:10] # 上位10レベルの주당注文
print("=== 買い注文(上位10)===")
for price, volume in bids:
print(f"価格: ${price:,.2f} | 数量: {volume:.4f} BTC")
print("\n=== 注文(上位10)===")
for price, volume in asks:
print(f"価格: ${price:,.2f} | 数量: {volume:.4f} BTC")
CCXTの优点は免费で使えることですが、缺点は取引所のrate limitに引っかかりやすいことです。私の实战経験では、Binanceで1秒に5回以上のリクエストを送るとIP単位でブロックされました。 HolySheep AIではこの制約が大幅に缓和され、50ms未満のレイテンシーでデータを取得できます。
比較2:Tradeデータ完全性
Tradeデータとは、個々の约定(成交)履歴のことです。.High-frequencyトレーディングやティックバイティック戦略には欠落のない完全性が求められます。
| 評価項目 | Tardis | CCXT | 備考 |
|---|---|---|---|
| Trade歷史データ | ◎ 完全 | △ 制限あり | CCXTは交易所によって過去データ量に上限 |
| 時間精度 | ◎ ミリ秒 | △ 秽秒〜秽秒 | 取引所APIの仕様に依存 |
| データ形式 | ◎ 統一JSON | △ 交易所마다상이 | CCXTは统一ラッパーだが内部は各异 |
| 約定IDs | ◎ 完全収録 | △ 一部欠落 | 约定IDがない交易所あり |
TardisのTradeデータ取得
# Tardis - Trade(約定)履歴取得
import requests
TARDIS_API_KEY = "your_tardis_key"
特定期間のTradeデータを日付指定で取得
params = {
"exchange": "binance",
"symbol": "btc-usdt",
"start_date": "2026-04-01T00:00:00Z",
"end_date": "2026-04-01T01:00:00Z",
"limit": 10000
}
url = "https://api.tardis.me/v1/trades"
headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"}
response = requests.get(url, headers=headers, params=params)
trades = response.json()
約定サマリー算出
total_volume = sum(t['amount'] for t in trades['data'])
avg_price = sum(t['price'] * t['amount'] for t in trades['data']) / total_volume
print(f"1時間 約定件数: {len(trades['data'])}")
print(f"総出来高: {total_volume:.4f} BTC")
print(f"平均約定価格: ${avg_price:,.2f}")
HolySheep AIでの代替アプローチ
HolySheep AIのAPIでは、AI应用开発に必要なデータを灵活的かつ低コストで取得できます。私自身、量化戦略のバックテストにHolySheepを活用した际、月額コストがTardis比で約85%削減できました(汇率:$1=¥7.3)。
# HolySheep AI - 代替APIエンドポイント例
import requests
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
市場データinquire
payload = {
"model": "gpt-4.1",
"messages": [
{"role": "user", "content": "BTC/USDTの过去24时间の 가격帯별 거래량 分析結果を教えて"}
],
"temperature": 0.3
}
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload
)
result = response.json()
print(result['choices'][0]['message']['content'])
比較3:エンジニアリング維持コスト
API選定で、安徽_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost