در این مطلب میخوام خیلی سریع و کوتاه نحوه ساخت یک ربات ترید ارز دیحیتال رو بهتون یاد بدم. اگر میخواید یک ربات ترید یا معامله گر بسازید ولی نمیدونید از کجا شروع کنید حتما این مطلب رو تا انتها مشاهده کنید.
آموزش ساخت ربات ترید ارز دیجیتال
در این مطلب طراحی و ایجاد یک ربات ترید رو در 5 گام به شما آموزش می دهیم. همچنین قبل از هرچیزی باید بهتون بگم که تمام سورس کدهای این آموزش رو میتونید از این لینک مشاهده کنید. تمام کدها با پایتون نسخه 3.8 تست شدن.
1- انتخاب فریم ورک مناسب برای ربات تریدر
برای ساخت یک ربات ترید، کتابخانهها، پکیجها و منابع زیادی در دسترس هستند. برای یافتن ابزار مناسب خود، میتوانید به لیست منابع نگاهی بیندازید. در این آموزش از چارچوب Investing Algorithm استفاده خواهیم کرد. این یک چارچوب مبتنی بر پایتون است که به شما امکان میدهد ربات ترید خود را بسازید. این چارچوب متنباز و رایگان است.
۲- ایجاد یک استراتژی با Investing Algorithm
فریم ورک Investing Algorithm گزینههای مختلفی برای ساخت ربات ترید و پیادهسازی استراتژی ارائه میدهد. برخی از سوالات کلیدی که هنگام ساخت استراتژی باید به آنها توجه کنید عبارتند از:
- ربات من هر چند وقت یکبار باید اجرا شود؟
- ربات من از چه دادههای بازاری استفاده کند؟
- ربات من از کدام اندیکاتورها استفاده کند؟
- ربات من در کدام صرافی یا کارگزاری معامله کند؟
برای ربات ترید خود، قصد داریم یک استراتژی ساده را پیاده سازی کنیم که بر اساس مجموعه ای از اندیکاتورهای ساده، خرید و فروش ارز دیجیتال بیتکوین را انجام دهد. این استراتژی هر ۲ ساعت یکبار اجرا خواهد شد. به این معنا که ربات هر ۲ ساعت یکبار قیمت بیتکوین را بررسی کرده و تصمیم میگیرد که خرید یا فروش انجام دهد.
2.1 – راهاندازی ربات ترید ارز دیجیتال
برای راهاندازی ربات ترید، ابتدا باید فریم ورک Investing Algorithm را نصب کنیم.
1 |
pip install investing-algorithm-framework |
۲.۲- مشخص کردن داده های بازار
در مرحله بعد، باید مشخص کنیم که ربات از چه دادههای بازاری استفاده خواهد کرد. Investing Algorithm از انواع مختلف دادههای بازار پشتیبانی میکند. برای این مثال، از داده های قیمت تاریخی بیت کوین بهصورت نمودار شمعی استفاده خواهیم کرد. در اصطلاحات ترید، به این دادهها OHLCV (Open, High, Low, Close, Volume) گفته میشود.
ابتدا یک فایل پایتون به نام market_data.py ایجاد کنید و محتوای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from datetime import datetime, timedelta from investing_algorithm_framework import CCXTOHLCVMarketDataSource, \ CCXTTickerMarketDataSource bitvavo_btc_eur_ohlcv_2h = CCXTOHLCVMarketDataSource( identifier="BTC/EUR-ohlcv", market="BITVAVO", symbol="BTC/EUR", timeframe="2h", # We want to retrieve data from the last 17 days (17 days * 12(2h) = 204 candlesticks) start_date_func=lambda: datetime.utcnow() - timedelta(days=17) ) # Ticker data to track orders, trades and positions we make with symbol BTC/EUR bitvavo_btc_eur_ticker = CCXTTickerMarketDataSource( identifier="BTC/EUR-ticker", market="BITVAVO", symbol="BTC/EUR", ) |
2.3- ایجاد یک استراتژی معاملاتی برای ربات ارز دیجیتال
اکنون که منابع دادههای بازار را برای ربات ترید خود راهاندازی کردهایم، میتوانیم استراتژی معاملاتی را پیادهسازی کنیم. برای این مثال، یک استراتژی ساده را پیادهسازی خواهیم کرد که زمانی که یک تقاطع طلایی بین میانگین متحرک سریع و کند رخ دهد، بیتکوین میخرد. تقاطع طلایی یک سیگنال صعودی است که زمانی رخ میدهد که میانگین متحرک کوتاهمدت (سریع) از میانگین متحرک بلندمدت (کند) عبور کند.
برای سیگنال فروش، از حالت معکوس استفاده خواهیم کرد. زمانی که تقاطع مرگ بین دورههای میانگین متحرک سریع و کند رخ دهد، بیتکوین را میفروشیم. تقاطع مرگ یک سیگنال نزولی است که زمانی رخ میدهد که میانگین متحرک کوتاهمدت (سریع) از زیر میانگین متحرک بلندمدت (کند) عبور کند.
به طور خلاصه:
- زمانی که میانگین متحرک سریع از میانگین متحرک کند عبور کند (تقاطع طلایی)، خرید میکنیم.
- زمانی که میانگین متحرک سریع از زیر میانگین متحرک کند عبور کند (تقاطع مرگ)، فروش انجام میدهیم.
برای پیادهسازی این استراتژی، باید از دادههای بازار که از صرافی دریافت کردهایم، استفاده کنیم. از دادههای OHLCV (نمودار شمعی) برای محاسبه میانگینهای متحرک استفاده خواهیم کرد و از دادههای ticker برای دریافت آخرین قیمت بیتکوین استفاده میکنیم.
این کد از کتابخانه Tulipy برای محاسبه میانگینهای متحرک استفاده میکند. Tulipy یک رابط پایتون برای کتابخانه تحلیل تکنیکال (tulipindicators) است.
یک فایل جدید به نام strategy.py
ایجاد کنید و کد زیر را به آن اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from investing_algorithm_framework import TradingStrategy, TimeUnit, Algorithm class GoldenCrossDeathCrossTradingStrategy(TradingStrategy): time_unit = TimeUnit.HOUR interval = 2 market_data_sources = [ "BTC/EUR-ohlcv", "BTC/EUR-ticker", ] symbols = ["BTC/EUR"] def apply_strategy(self, algorithm: Algorithm, market_data: dict): pass |
سپس متد apply_strategy
را پیادهسازی میکنیم. این متد هر بار که استراتژی معاملاتی اجرا میشود فراخوانی میشود. همانطور که قبلاً تعریف شد، استراتژی هر ۲ ساعت یکبار اجرا میشود.
در متد apply_strategy
ابتدا بررسی میکنیم که آیا هیچ سفارشی برای نماد مورد نظر باز است یا خیر. اگر هیچ سفارش باز نداشتیم، بررسی میکنیم که آیا تقاطع طلایی (golden cross) یا تقاطع مرگ (death cross) وجود دارد یا نه.
مطالب مرتبط با ارز دیحیتال
دلیل اینکه ابتدا بررسی میکنیم آیا سفارشی باز وجود دارد یا خیر، این است که نمیخواهیم زمانی که هنوز یک سفارش باز داریم که توسط صرافی بسته (یا تکمیل) نشده است، سفارش جدیدی باز کنیم. تنها زمانی میخواهیم یک موقعیت جدید باز کنیم که هیچ سفارش بازی نداشته باشیم.
سپس بررسی میکنیم که آیا تقاطع طلایی (golden cross) یا تقاطع مرگ (death cross) وجود دارد. اگر تقاطع طلایی وجود داشته باشد، بیتکوین میخریم. اگر تقاطع مرگ وجود داشته باشد، بیتکوین میفروشیم
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
from investing_algorithm_framework import TradingStrategy, TimeUnit, \ Algorithm, OrderSide import tulipy as tp import pandas as pd def is_crossover(fast_series, slow_series): """ Expect two numpy series (fast and slow). With the given series it will check if the fast has a crossover with the slow series """ return fast_series[-2] <= slow_series[-2] \ and fast_series[-1] > slow_series[-1] def is_crossunder(fast_series, slow_series): """ Expect two numpy series (fast and slow). With the given series it will check if the fast has a crossunder with the slow series """ return fast_series[-2] >= slow_series[-2] \ and fast_series[-1] < slow_series[-1] class GoldenCrossDeathCrossTradingStrategy(TradingStrategy): time_unit = TimeUnit.HOUR interval = 2 market_data_sources = [ "BTC/EUR-ohlcv", "BTC/EUR-ticker", ] symbols = ["BTC/EUR"] def apply_strategy(self, algorithm: Algorithm, market_data: dict): for symbol in self.symbols: target_symbol = symbol.split('/')[0] # Don't open a new order when we already have an open order if algorithm.has_open_orders(target_symbol): continue ohlcv_data = market_data[f"{symbol}-ohlcv"] df = pd.DataFrame( ohlcv_data, columns=['Datetime', 'Open', 'High', 'Low', 'Close', 'Volume'] ) fast = tp.sma(df["Close"].to_numpy(), period=9) slow = tp.sma(df["Close"].to_numpy(), period=50) price = market_data[f"{symbol}-ticker"]["bid"] if algorithm.has_position(target_symbol) and is_crossunder(fast, slow): algorithm.close_position(target_symbol) elif not algorithm.has_position(target_symbol) and is_crossover(fast, slow): algorithm.create_limit_order( target_symbol=target_symbol, order_side=OrderSide.BUY, price=price, percentage_of_portfolio=25, precision=4 ) |
3- آزمایش استراتژی معاملاتی
اکنون که استراتژی معاملاتی خود را پیادهسازی کردهایم، میتوانیم آن را آزمایش کنیم. برای آزمایش استراتژی خود از قابلیت بکتست (backtesting) در چارچوب الگوریتم سرمایهگذاری استفاده میکنیم. این امکان به ما میدهد تا استراتژی خود را روی دادههای تاریخی تست کنیم.
یک فایل جدید به نام backtest.py
ایجاد کنید و کد زیر را به آن اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import sys from datetime import datetime from investing_algorithm_framework import PortfolioConfiguration, \ pretty_print_backtest from app import app def convert_to_datetime(datetime_str): try: return datetime.strptime(datetime_str, "%Y-%m-%d") except ValueError: print(f"Error: Invalid datetime format for '{datetime_str}'. Please use the format 'YYYY-MM-DD HH:MM:SS'") sys.exit(1) app.add_portfolio_configuration( PortfolioConfiguration( market="BITVAVO", trading_symbol="EUR", initial_balance=400 ) ) if __name__ == "__main__": if len(sys.argv) != 3: print( "Error: Please provide two datetime " "strings as command-line arguments." ) sys.exit(1) # Get datetime strings from command-line arguments start_date_str = sys.argv[1] end_date_str = sys.argv[2] # Convert datetime strings to datetime objects start_date = convert_to_datetime(start_date_str) end_date = convert_to_datetime(end_date_str) backtest_report = app.backtest( start_date=start_date, end_date=end_date, pending_order_check_interval="2h" ) pretty_print_backtest(backtest_report) |
اجرای این کد به شما خروجی زیر را خواهد داد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<span id="f5b4" class="ou ne gk or b bg ov ow l ox oy" data-selectable-paragraph="">$ python backtest 2023-01-01 2023-12-30 ====================Backtest report=============================== * Start <span class="hljs-built_in">date</span>: 2023-01-01 00:00:00 * End <span class="hljs-built_in">date</span>: 2023-12-30 00:00:00 * Number of days: 363 * Number of runs: 4357 ====================Portfolio overview============================ * Number of orders: 128 * Initial balance: 400.0000 EUR * Final balance: 468.1028 EUR * Total net gain: 68.1028 EUR * Total net gain percentage: 17.0257% * Growth rate: 17.0257% * Growth 68.1028 EUR ====================Positions overview======================== ╭────────────┬──────────┬──────────────────┬──────────────┬───────────────┬───────────────────────────┬────────────────┬───────────────╮ │ Position │ Amount │ Pending amount │ Cost (EUR) │ Value (EUR) │ Percentage of portfolio │ Growth (EUR) │ Growth_rate │ ├────────────┼──────────┼──────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤ │ EUR │ 468.103 │ 0 │ 468.103 │ 468.103 │ 100.0000% │ 0 │ 0.0000% │ ╰────────────┴──────────┴──────────────────┴──────────────┴───────────────┴───────────────────────────┴────────────────┴───────────────╯ ====================Trades overview=========================== * Number of trades closed: 64 * Number of trades open: 0 * Percentage of positive trades: 29.6875% * Percentage of negative trades: 70.3125% * Average trade size: 108.4551 EUR * Average trade duration: 77.125 hours .... All trades overview</span> |
همانطور که مشاهده میکنید، این استراتژی معاملاتی با نرخ رشد ۱۷٪ روی معاملات بستهشده سودآور است. هنگام ایجاد یک استراتژی معاملاتی، بسیار مهم است که این استراتژی را در یک بازه زمانی که بازار برای داراییهای انتخابشده شما نزولی بوده آزمایش کنید. این کار به شما کمک میکند تا مشخص کنید که آیا استراتژی معاملاتی شما به اندازه کافی مقاوم است تا بتواند در برابر نزول بازار مقاومت کند یا خیر.
برای بیتکوین، بازه زمانی از ۱۱ نوامبر ۲۰۲۱ تا ۱۱ نوامبر ۲۰۲۲ به عنوان یک دوره نزولی بازار در نظر گرفته میشود. با اجرای استراتژی معاملاتی خود در این بازه زمانی، نتایج زیر را به دست میآوریم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ python backtest 2021-11-11 2022-11-11 ====================Backtest report=============================== * Start date: 2021-11-11 00:00:00 * End date: 2022-11-11 00:00:00 * Number of days: 365 * Number of runs: 4381 ====================Portfolio overview============================ * Number of orders: 130 * Initial balance: 400.0000 EUR * Final balance: 356.0855 EUR * Total net gain: -43.9145 EUR * Total net gain percentage: -10.9786% * Growth rate: -10.9786% * Growth -43.9145 EUR ====================Positions overview======================== ╭────────────┬──────────┬──────────────────┬──────────────┬───────────────┬───────────────────────────┬────────────────┬───────────────╮ │ Position │ Amount │ Pending amount │ Cost (EUR) │ Value (EUR) │ Percentage of portfolio │ Growth (EUR) │ Growth_rate │ ├────────────┼──────────┼──────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤ │ EUR │ 356.086 │ 0 │ 356.086 │ 356.086 │ 100.0000% │ 0 │ 0.0000% │ ╰────────────┴──────────┴──────────────────┴──────────────┴───────────────┴───────────────────────────┴────────────────┴───────────────╯ ====================Trades overview=========================== * Number of trades closed: 65 * Number of trades open: 0 * Percentage of positive trades: 29.230769230769234% * Percentage of negative trades: 70.76923076923077% * Average trade size: 89.5404 EUR * Average trade duration: 59.96923076923077 hours .... All trades overview |
همانطور که مشاهده میکنید، این استراتژی معاملاتی با نرخ سود -۴٪ در معاملات بستهشده، سودآور نیست. در بخش بعدی سعی خواهیم کرد آن را بهبود بخشیم. نکته مهمی که باید در اینجا توجه کنید این است که استراتژی معاملاتی ما به اندازه کافی مقاوم نیست تا بتواند در برابر نزولهای بازار مقاومت کند.
4- بهبود استراتژی معاملاتی
در بخش قبلی مشاهده کردیم که ربات معاملاتی ما سودآور نبوده است. در این بخش سعی خواهیم کرد تا استراتژی معاملاتی خود را بهبود دهیم. هر زمان که یک ربات معاملاتی ایجاد میکنید، باید همیشه با معیارها و پارامترهای مختلف آزمایش کنید. در این بخش، سعی خواهیم کرد استراتژی معاملاتی خود را با انجام تغییرات زیر بهبود دهیم:
- افزودن استاپ لاسها به معاملات باز: به طوری که بتوانیم به صورت پیشگیرانه معاملات خود را زمانی که قیمت به زیر یک قیمت معین میافتد، ببندیم.
- افزودن یک خط روند به استراتژی معاملاتی: به طوری که تنها زمانی بفروشیم که قیمت زیر خط روند باشد، به جای استفاده از میانگین متحرک کند.
- تغییر میانگین متحرک سریع از میانگین متحرک ساده به میانگین متحرک نمایی: که به قیمتهای اخیر وزن بیشتری میدهد.
ابتدا، یک خط روند (میانگین متحرک ساده ۱۰۰ دورهای) اضافه خواهیم کرد و میانگین متحرک ساده سریع (SMA) را به میانگین متحرک نمایی سریع (EMA) تغییر خواهیم داد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class ImprovedGoldenCrossDeathCrossTradingStrategy(TradingStrategy): time_unit = TimeUnit.HOUR interval = 2 market_data_sources = [ "BTC/EUR-ohlcv", "BTC/EUR-ticker", ] symbols = ["BTC/EUR"] def apply_strategy(self, algorithm: Algorithm, market_data: dict): for symbol in self.symbols: target_symbol = symbol.split('/')[0] # Don't open a new order when we already have an open order if algorithm.has_open_orders(target_symbol): continue ohlcv_data = market_data[f"{symbol}-ohlcv"] df = pd.DataFrame( ohlcv_data, columns=['Datetime', 'Open', 'High', 'Low', 'Close', 'Volume'] ) fast = tp.sma(df["Close"].to_numpy(), period=9) # Changed fast sma to fast ema slow = tp.ema(df["Close"].to_numpy(), period=50) # Calculate trend line trend = tp.sma(df["Close"].to_numpy(), period=100) price = market_data[f"{symbol}-ticker"]["bid"] .... Remaining code |
در نهایت، تریگرهای خرید و فروش را تغییر خواهیم داد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
def apply_strategy(self, algorithm: Algorithm, market_data: dict): for symbol in self.symbols: target_symbol = symbol.split('/')[0] # Don't open a new order when we already have an open order if algorithm.has_open_orders(target_symbol): continue ohlcv_data = market_data[f"{symbol}-ohlcv"] df = pd.DataFrame( ohlcv_data, columns=['Datetime', 'Open', 'High', 'Low', 'Close', 'Volume'] ) fast = tp.sma(df["Close"].to_numpy(), period=9) # Changed fast sma to fast ema slow = tp.ema(df["Close"].to_numpy(), period=50) # Calculate trend line trend = tp.sma(df["Close"].to_numpy(), period=100) price = market_data[f"{symbol}-ticker"]["bid"] # Sell when crossunder with trend if algorithm.has_position(target_symbol) \ and is_crossunder(fast, trend): algorithm.close_position(target_symbol) # Only buy when crossover elif not algorithm.has_position(target_symbol) \ and is_crossover(fast, slow) \ algorithm.create_limit_order( target_symbol=target_symbol, order_side=OrderSide.BUY, price=price, percentage_of_portfolio=25, precision=4 ) # Checking manual stopp losses with a 6% stop loss open_trades = algorithm.get_open_trades(target_symbol) for open_trade in open_trades: filtered_df = df[open_trade.opened_at <= df['Datetime']] close_prices = filtered_df['Close'].tolist() current_price = market_data[f"{symbol}-ticker"] if open_trade.is_manual_stop_loss_trigger( prices=close_prices, current_price=current_price["bid"], stop_loss_percentage=6 ): algorithm.close_trade(open_trade) |
وقتی این استراتژی معاملاتی را برای همان بازه زمانی قبلی اجرا میکنیم، نتیجه زیر را به دست میآوریم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ python backtest 2021-11-11 2022-11-11 ====================Backtest report=============================== * Start date: 2021-11-11 00:00:00 * End date: 2022-11-11 00:00:00 * Number of days: 365 * Number of runs: 4381 ====================Portfolio overview============================ * Number of orders: 34 * Initial balance: 400.0000 EUR * Final balance: 378.3081 EUR * Total net gain: -21.6919 EUR * Total net gain percentage: -5.4230% * Growth rate: -5.4230% * Growth -21.6919 EUR ====================Positions overview======================== ╭────────────┬──────────┬──────────────────┬──────────────┬───────────────┬───────────────────────────┬────────────────┬───────────────╮ │ Position │ Amount │ Pending amount │ Cost (EUR) │ Value (EUR) │ Percentage of portfolio │ Growth (EUR) │ Growth_rate │ ├────────────┼──────────┼──────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤ │ EUR │ 378.308 │ 0 │ 378.308 │ 378.308 │ 100.0000% │ 0 │ 0.0000% │ ╰────────────┴──────────┴──────────────────┴──────────────┴───────────────┴───────────────────────────┴────────────────┴───────────────╯ ====================Trades overview=========================== * Number of trades closed: 17 * Number of trades open: 0 * Percentage of positive trades: 11.76470588235294% * Percentage of negative trades: 88.23529411764706% * Average trade size: 95.9035 EUR * Average trade duration: 69.29411764705883 hours .... All trades overview |
اگر استراتژی بهروزشده را برای بازه زمانی مطلوب اجرا کنیم، نتیجه زیر را به دست میآوریم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ python backtest.py 2023-01-01 2023-12-30 ====================Backtest report=============================== * Start date: 2023-01-01 00:00:00 * End date: 2023-12-30 00:00:00 * Number of days: 363 * Number of runs: 4357 ====================Portfolio overview============================ * Number of orders: 90 * Initial balance: 400.0000 EUR * Final balance: 464.3659 EUR * Total net gain: 64.3659 EUR * Total net gain percentage: 16.0915% * Growth rate: 16.0915% * Growth 64.3659 EUR ====================Positions overview======================== ╭────────────┬──────────┬──────────────────┬──────────────┬───────────────┬───────────────────────────┬────────────────┬───────────────╮ │ Position │ Amount │ Pending amount │ Cost (EUR) │ Value (EUR) │ Percentage of portfolio │ Growth (EUR) │ Growth_rate │ ├────────────┼──────────┼──────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤ │ EUR │ 464.366 │ 0 │ 464.366 │ 464.366 │ 100.0000% │ 0 │ 0.0000% │ ╰────────────┴──────────┴──────────────────┴──────────────┴───────────────┴───────────────────────────┴────────────────┴───────────────╯ ====================Trades overview=========================== * Number of trades closed: 45 * Number of trades open: 0 * Percentage of positive trades: 31.11111111111111% * Percentage of negative trades: 68.88888888888889% * Average trade size: 109.6916 EUR * Average trade duration: 123.28888888888889 hours .... All trades overview |
5- استقرار ربات معاملاتی ارز دیجیتال
برای استقرار ربات معاملاتیمان، یک تابع در Azure ایجاد خواهیم کرد که هر ۲ ساعت یکبار ربات معاملاتی ما را اجرا کند. قبل از شروع، لطفاً مطمئن شوید که موارد زیر نصب و پیکربندی شده است:
- شما نیاز به یک حساب کاربری Microsoft Azure برای استقرار ربات معاملاتی دارید. میتوانید یک حساب کاربری رایگان ایجاد کنید اینجا.
- همچنین باید Azure CLI را نصب کرده باشید. میتوانید دستورالعملهای نصب را اینجا پیدا کنید.
- علاوه بر این، نیاز به نصب ابزارهای هستهای Azure Function دارید. میتوانید دستورالعملهای نصب را اینجا پیدا کنید.
- مطمئن شوید که با استفاده از Azure CLI وارد Azure شدهاید. میتوانید این کار را با اجرای دستور زیر انجام دهید:
1 |
az login |
host.json
ایجاد کنید و محتوای زیر را به آن اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[4.*, 5.0.0)" } } |
requirements.txt
ایجاد کنید و محتوای زیر را به آن اضافه کنید:
1 2 3 |
azure-functions investing-algorithm-framework==2.0.4 tulipy==0.4.0 |
function_app.py
ایجاد کنید و محتوای زیر را به آن اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import azure.functions as func from investing_algorithm_framework import StatelessAction, \ PortfolioConfiguration, MarketCredential from app import app as trading_bot_app trading_bot_app.add_portfolio_configuration( PortfolioConfiguration( market="BITVAVO", trading_symbol="EUR" ) ) trading_bot_app.add_market_credential( MarketCredential( market="BITVAVO", api_key="<YOUR_BITVAVO_API_KEY>", secret_key="<YOUR_BITVAVO_SECRET_KEY>" ) ) app = func.FunctionApp() @app.timer_trigger( schedule="0 */2 * * * *", arg_name="myTimer", run_on_startup=True, use_monitor=False ) def trading_bot_azure_function(myTimer: func.TimerRequest) -> None: trading_bot_app.run(payload={"ACTION": StatelessAction.RUN_STRATEGY.value}) |
create_resources.sh
ایجاد کنید و محتوای زیر را در آن کپی کنید. این اسکریپت منابع لازم را در Azure برای ربات معاملاتی ما ایجاد خواهد کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# Variables, you can change these if you want resourceGroupName="Trading-bot-rg" functionAppName="trading-bot-function-app" storageAccountName="tradingbotstorageaccount" location="westeurope" # Create a resource group az group create --name $resourceGroupName --location $location # Create a storage account az storage account create --name $storageAccountName --location $location --resource-group $resourceGroupName --sku Standard_LRS # Retrieve the storage account connection string storageConnectionString=$(az storage account show-connection-string --name $storageAccountName --resource-group $resourceGroupName --query connectionString --output tsv) # Create a consumption plan function app with Python 3.8 az functionapp create \ --name $functionAppName \ --resource-group $resourceGroupName \ --storage-account $storageAccountName \ --consumption-plan-location $location \ --runtime python \ --runtime-version 3.8 \ --functions-version 4 \ --os-type Linux \ --disable-app-insights true # Configure the storage connection string in the function app az functionapp config appsettings set \ --name $functionAppName \ --resource-group $resourceGroupName \ --settings AzureWebJobsStorage=$storageConnectionString |
1 |
<span id="3af0" class="ou ne gk or b bg ov ow l ox oy" data-selectable-paragraph="">sh create_resources.<span class="hljs-property">sh</span></span> |
azure functions
استفاده کنیم تا ربات معاملاتی خود را در Azure مستقر کنیم:
1 |
<span id="0782" class="ou ne gk or b bg ov ow l ox oy" data-selectable-paragraph="">func azure functionapp publish trading-bot-function-app</span> |
نتیجه گیری
در آموزش ساخت ربات ترید ارز دیجیتال به شما نشان دادیم که چگونه با استفاده از چارچوب الگوریتم سرمایه گذاری یک ربات معاملاتی بسازید. همچنین به شما نشان دادیم که چگونه ربات معاملاتی خود را تست کنید و برخی بهبودهای کوچک را برای عملکرد بهتر آن اعمال کنید. در نهایت، نحوه استقرار ربات معاملاتی خود در Azure را توضیح دادیم.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۲۶ شهریور ۱۴۰۳
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- رپورتاژ
- فروشگاه
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- Go
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس