در این صفحه نحوه سفارشی سازی استراتژی های خود ، اضافه کردن شاخص های جدید و تنظیم قوانین معاملات توضیح داده شده است.
لطفاً ابتدا خود را با اصول اولیه Freqtrade آشنا کنید ، که اطلاعات کلی در مورد نحوه عملکرد BOT را ارائه می دهد.
استراتژی خود را توسعه دهید
این ربات شامل یک فایل استراتژی پیش فرض است. همچنین چندین استراتژی دیگر در مخزن استراتژی موجود است.
با این حال شما به احتمال زیاد ایده خود را برای یک استراتژی خواهید داشت. این سند قصد دارد به شما در تبدیل ایده استراتژی خود به استراتژی خود کمک کند.
برای شروع ، از FreqTrade New-Strategy-استراتژی Awesomestrategy استفاده کنید (بدیهی است که می توانید از نامگذاری خود برای استراتژی خود استفاده کنید). این یک فایل استراتژی جدید از یک الگوی ایجاد می کند ، که در زیر user_data/strategies/awesomestrategy. py قرار خواهد گرفت.
این فقط یک پرونده الگوی است که به احتمال زیاد از جعبه سودآور نخواهد بود.
Freqtrade New-Strategy دارای یک پارامتر اضافی ،-الگوی است که میزان اطلاعات پیش از ساخت را که در استراتژی ایجاد شده دریافت می کنید ، کنترل می کند. برای بدست آوردن یک استراتژی خالی و بدون هیچ نمونه ای از شاخص ، یا به عنوان یک الگوی پیشرفته برای بدست آوردن یک الگوی با اکثر تماس های تعریف شده ، استفاده کنید.
آناتومی یک استراتژی
یک پرونده استراتژی شامل تمام اطلاعات مورد نیاز برای ایجاد یک استراتژی خوب است:
- شاخص ها
- قوانین استراتژی ورود
- قوانین استراتژی خروج
- حداقل ROI توصیه می شود
- Stoploss به شدت توصیه می شود
این ربات همچنین شامل یک استراتژی نمونه به نام SampleStrategy است که می توانید به روز کنید: user_data/استراتژی/sample_strategy. py. می توانید آن را با پارامتر آزمایش کنید: -SampleStrateg y-Strategy
علاوه بر این ، یک ویژگی به نام interface_version وجود دارد که نسخه رابط استراتژی را که ربات باید از آن استفاده کند ، تعریف می کند. نسخه فعلی 3 است - که همچنین پیش فرض است که به صراحت در استراتژی تنظیم نشده است.
نسخه های آینده به این تنظیم نیاز دارند.
برای بخش زیر ما از پرونده user_data/Strategies/sample_strategy. py به عنوان مرجع استفاده خواهیم کرد.
استراتژی ها و پشت پرده
برای جلوگیری از مشکلات و اختلافات غیر منتظره بین حالت های پشتی و خشک/زنده ، لطفاً توجه داشته باشید که در حین پشتکار ، محدوده تمام وقت به یکباره به روشهای جمع _*() منتقل می شود. بنابراین بهتر است از عملیات بردار شده (در کل DataFrame ، نه حلقه ها) استفاده کنید و از مراجعه به فهرست (df. iloc [-1]) خودداری کنید ، اما در عوض از df. shift () برای رسیدن به شمع قبلی استفاده کنید.
هشدار: استفاده از داده های آینده
از آنجا که Backtesting محدوده تمام وقت را به روش های جمع _*() منتقل می کند ، نویسنده استراتژی برای جلوگیری از استفاده از استراتژی از داده های آینده باید مراقبت کند. برخی از الگوهای متداول برای این کار در بخش اشتباهات رایج این سند ذکر شده است.
dataFrame¶
Freqtrade از پاندا برای ذخیره/تهیه داده های شمعدان (OHLCV) استفاده می کند. Pandas یک کتابخانه عالی است که برای پردازش مقادیر زیادی از داده ها تهیه شده است.
هر ردیف در یک DataFrame با یک شمع در یک نمودار مطابقت دارد ، با آخرین شمع همیشه آخرین در DataFrame (مرتب شده بر اساس تاریخ) است.
پاندا روشهای سریع برای محاسبه معیارها را فراهم می کند. برای بهره مندی از این سرعت ، توصیه می شود از حلقه ها استفاده نکنید ، اما به جای آن از روش های بردار استفاده کنید.
عملیات بردار محاسبات را در کل طیف وسیعی از داده ها انجام می دهد و بنابراین ، در مقایسه با حلقه در هر سطر ، هنگام محاسبه شاخص ها بسیار سریعتر است.
به عنوان یک DataFrame یک جدول است ، مقایسه های ساده پایتون مانند موارد زیر کار نمی کند
بخش فوق با ارزش حقیقت یک سریال مبهم است.[)].
در عوض این باید به روشی سازگار با پانداس نوشته شود ، بنابراین این عملیات در کل DataFrame انجام می شود.
با استفاده از این بخش ، یک ستون جدید در DataFrame خود دارید که هر زمان RSI بالاتر از 30 است ، 1 اختصاص داده شده است.
شاخص ها را سفارشی کنید
خرید و فروش سیگنال ها به شاخص ها نیاز دارند. با گسترش لیست موجود در روش population_indicators () از پرونده استراتژی خود می توانید شاخص های بیشتری را اضافه کنید.
شما فقط باید شاخص های مورد استفاده در population_entry_trend () ، population_exit_trend () را اضافه کنید ، یا برای جمع آوری یک شاخص دیگر ، در غیر این صورت ممکن است عملکرد رنج ببرد.
مهم است که همیشه DataFrame را بدون حذف/اصلاح ستون های "باز" ، "بالا" ، "کم" ، "بستن" ، "حجم" برگردانید ، در غیر این صورت این زمینه ها حاوی چیزی غیر منتظره هستند.
نمونه های شاخص بیشتری می خواهید؟
به user_data/استراتژی ها/sample_strategy. py نگاه کنید. سپس شاخص های Uncorment مورد نیاز شما.
کتابخانه های شاخص ¶
از خارج از جعبه ، Freqtrade کتابخانه های فنی زیر را نصب می کند:
کتابخانه های فنی اضافی می توانند در صورت لزوم نصب شوند ، یا شاخص های سفارشی ممکن است توسط نویسنده استراتژی نوشته و اختراع شوند.
دوره راه اندازی استراتژی ¶
اکثر اندیکاتورها دارای یک دوره راه اندازی ناپایدار هستند که در آن یا در دسترس نیستند (NaN)، یا محاسبه نادرست است. این می تواند منجر به ناسازگاری شود، زیرا Freqtrade نمی داند این دوره ناپایدار چقدر باید باشد. برای توضیح این موضوع، می توان ویژگی startup_candle_count را به استراتژی اختصاص داد. این باید روی حداکثر تعداد شمع هایی که استراتژی برای محاسبه شاخص های پایدار نیاز دارد تنظیم شود. در موردی که کاربر دارای بازههای زمانی بالاتر با جفتهای اطلاعاتی است، startup_candle_count لزوماً تغییر نمیکند. مقدار حداکثر دوره زمانی (در شمع) است که هر یک از بازه های زمانی اطلاعاتی برای محاسبه شاخص های پایدار نیاز دارد.
در این استراتژی مثال، این باید روی 100 تنظیم شود (startup_candle_count = 100)، زیرا طولانی ترین سابقه مورد نیاز 100 شمع است.
با اطلاع دادن به ربات که به چه مقدار سابقه نیاز است، معاملات بک تست می توانند در بازه زمانی مشخص شده در طول بک تست و هایپراپت شروع شوند.
استفاده از تماس های x برای دریافت OHLCV
اگر هشداری مانند WARNING - استفاده از 3 تماس برای دریافت OHLCV دریافت کردید. این می تواند منجر به کندتر شدن عملکرد ربات شود. لطفاً بررسی کنید که آیا واقعاً به 1500 شمع برای استراتژی خود نیاز دارید یا خیر - باید در نظر بگیرید که آیا واقعاً به این داده های تاریخی برای سیگنال های خود نیاز دارید یا خیر. وجود این باعث می شود که Freqtrade برای یک جفت تماس های متعددی برقرار کند، که بدیهی است که سرعت آن کمتر از یک درخواست شبکه خواهد بود. در نتیجه، Freqtrade برای تازه کردن شمع ها زمان بیشتری می برد - و بنابراین در صورت امکان باید از آن اجتناب کرد. برای جلوگیری از بارگذاری بیش از حد صرافی، یا کند کردن فرکانس، این مقدار به 5 تماس در کل محدود شده است.
startup_candle_count باید کمتر از ohlcv_candle_limit * 5 باشد (که برای اکثر مبادلات 500 * 5 است) - زیرا فقط این مقدار شمع در طول عملیات Dry-Run/Live Trade در دسترس خواهد بود.
مثال¶
بیایید سعی کنیم 1 ماه (ژانویه 2019) شمع های 5 متری را با استفاده از یک استراتژی مثال با EMA100، همانطور که در بالا ذکر شد، بک تست کنیم.
با فرض اینکه startup_candle_count روی 100 تنظیم شده است، بک تست می داند که برای تولید سیگنال خرید معتبر به 100 شمع نیاز دارد. داده ها را از 20190101 بارگیری می کند - (100 * 5 متر) - که~2018-12-31 15:30:00. اگر این داده ها در دسترس باشد، شاخص ها با این بازه زمانی طولانی محاسبه می شوند. پس از آن، دوره راه اندازی ناپایدار (تا 01-01-2019 00:00:00) قبل از شروع آزمایش برگشتی حذف خواهد شد.
اگر دادههای مربوط به دوره راهاندازی در دسترس نباشد، محدوده زمانی برای محاسبه این دوره راهاندازی تنظیم میشود - بنابراین آزمایش برگشتی در 01-01-2019 ساعت 08:30:00 شروع میشود.
قوانین سیگنال ورودی¶
روش population_entry_trend () را در پرونده استراتژی خود ویرایش کنید تا استراتژی ورود خود را به روز کنید.
مهم است که همیشه DataFrame را بدون حذف/اصلاح ستون های "باز" ، "بالا" ، "کم" ، "بستن" ، "حجم" برگردانید ، در غیر این صورت این زمینه ها حاوی چیزی غیر منتظره هستند.
این روش همچنین یک ستون جدید با عنوان "enter_long" ("enter_short" را برای شورت) تعریف می کند ، که باید 1 برای ورودی ها داشته باشد و 0 برای "بدون عمل". enter_long یک ستون اجباری است که حتی اگر استراتژی فقط کوتاه باشد باید تنظیم شود.
نمونه از user_data/استراتژی ها/sample_strategy. py:
ورودی های کوتاه را می توان با تنظیم ENTER_SHORT ایجاد کرد (برای معاملات طولانی با enter_long مطابقت دارد). ستون enter_tag یکسان است. معاملات کوتاه باید توسط تنظیمات مبادله و بازار شما پشتیبانی شود! لطفاً در صورت تمایل به کوتاه بودن ، اطمینان حاصل کنید که CAN_SHORT را به طور مناسب در استراتژی خود تنظیم کنید.
Buying requires sellers to buy from - therefore volume needs to be > 0 ( dataframe['volume'] >0) برای اطمینان از اینکه ربات در دوره های بدون فعالیت خریداری و فروش نمی کند.
از قوانین سیگنال خارج شوید
روش population_exit_trend () را در پرونده استراتژی خود ویرایش کنید تا استراتژی خروج خود را به روز کنید. سیگنال خروجی فقط برای خروج استفاده می شود اگر Use_Exit_Signal در پیکربندی درست باشد. use_exit_signal بر قوانین مربوط به برخورد سیگنال تأثیر نمی گذارد - که هنوز هم اعمال می شود و می تواند از ورودی ها جلوگیری کند.
مهم است که همیشه DataFrame را بدون حذف/اصلاح ستون های "باز" ، "بالا" ، "کم" ، "بستن" ، "حجم" برگردانید ، در غیر این صورت این زمینه ها حاوی چیزی غیر منتظره هستند.
این روش همچنین یک ستون جدید با عنوان "Exit_long" ("Exit_short" را برای شورت) تعریف می کند ، که باید برای خروج 1 باشد و 0 برای "بدون عمل".
نمونه از user_data/استراتژی ها/sample_strategy. py:
با تنظیم Exit_Short می توان با استفاده از Exits کوتاه ایجاد کرد (مطابق با EXIT_LONG). ستون EXIT_TAG یکسان است. معاملات کوتاه باید توسط تنظیمات مبادله و بازار شما پشتیبانی شود!
حداقل ROI¶
این دیکته حداقل بازده سرمایه گذاری (ROI) را که یک تجارت باید قبل از خروج ، مستقل از سیگنال خروج ، به دست آورد.
این فرمت زیر است ، با کلید DICT (سمت چپ روده بزرگ) دقایقی که از زمان باز شدن تجارت گذشت ، و مقدار (سمت راست روده بزرگ) درصد است.
بنابراین پیکربندی فوق به معنای:
- هر زمان که 4 ٪ سود حاصل می شد ، خروج کنید
- هنگام رسیدن به سود 2 ٪ (بعد از 20 دقیقه) از خروج خارج شوید.
- هنگام رسیدن به سود 1 ٪ (بعد از 30 دقیقه) از خروج خارج شوید.
- خروج از وقتی که تجارت غیر لس است (بعد از 40 دقیقه در جریان است)
این محاسبه شامل هزینه ها است.
برای غیرفعال کردن ROI به طور کامل، آن را روی یک عدد بسیار بالا تنظیم کنید:
در حالی که از نظر فنی به طور کامل غیرفعال نیست، زمانی که معامله به سود 10000% برسد، از آن خارج می شود.
برای استفاده از زمانها بر اساس مدت زمان شمع (تایم فریم)، قطعه زیر میتواند مفید باشد. این به شما امکان میدهد تا چارچوب زمانی استراتژی را تغییر دهید و زمانهای بازگشت سرمایه همچنان بهعنوان شمع تنظیم میشوند (مثلاً بعد از ۳ شمع. )
استاپلاس¶
تنظیم توقف ضرر برای محافظت از سرمایه شما در برابر حرکات قوی علیه شما بسیار توصیه می شود.
نمونه ای از تنظیم 10 درصد توقف ضرر:
برای مستندات کامل در مورد ویژگی های stoploss، به صفحه اختصاصی stoploss نگاه کنید.
دوره زمانی¶
این مجموعه شمع هایی است که ربات باید دانلود کرده و برای تجزیه و تحلیل استفاده کند. مقادیر رایج "1m"، "5m"، "15m"، "1h" هستند، با این حال، همه مقادیر پشتیبانی شده توسط تبادل شما باید کار کنند.
لطفاً توجه داشته باشید که سیگنالهای ورودی/خروجی یکسان ممکن است با یک تایم فریم به خوبی کار کنند، اما با بقیه نه.
این تنظیم در روش های استراتژی به عنوان ویژگی self. timeframe قابل دسترسی است.
می تواند کوتاه¶
برای استفاده از سیگنال های کوتاه در بازارهای آتی، باید با تنظیم can_short=True به ما اطلاع دهید که این کار را انجام دهیم. استراتژی هایی که این امکان را فراهم می کنند در بازارهای لحظه ای بارگذاری نمی شوند. غیرفعال کردن این باعث می شود که سیگنال های کوتاه نادیده گرفته شوند (همچنین در بازارهای آتی).
فراداده دیکت¶
ابرداده-dict (در دسترس برای populate_entry_trend، populate_exit_trend، populate_indicators) حاوی اطلاعات اضافی است. در حال حاضر این جفت است که با استفاده از فراداده['pair'] قابل دسترسی است - و یک جفت را در قالب XRP/BTC برمی گرداند.
Metadata-dict نباید اصلاح شود و اطلاعات را در چندین تماس حفظ نمی کند. در عوض، نگاهی به بخش اطلاعات ذخیره سازی بیندازید.
بارگذاری فایل استراتژی¶
بهطور پیشفرض، freqtrade تلاش میکند تا استراتژیها را از همه فایلهای . py در user_data/strategies بارگیری کند.
با فرض اینکه استراتژی شما AwesomeStrategy نامیده می شود که در فایل user_data/strategies/AwesomeStrategy. py ذخیره می شود، سپس می توانید freqtrade را با freqtrade trade --strategy AwesomeStrategy شروع کنید. توجه داشته باشید که ما از نام کلاس استفاده می کنیم، نه نام فایل.
میتوانید از freqtrade list-strategies استفاده کنید تا فهرستی از همه استراتژیهایی را که Freqtrade قادر به بارگذاری آن است (همه استراتژیها در پوشه صحیح) مشاهده کنید. همچنین شامل یک قسمت "وضعیت" است که مشکلات احتمالی را برجسته می کند.
دایرکتوری استراتژی را سفارشی کنید
با استفاده از --strategy-path user_data/otherPath می توانید از دایرکتوری دیگری استفاده کنید. این پارامتر برای تمام دستوراتی که نیاز به استراتژی دارند در دسترس است.
جفت های آموزنده
دریافت داده برای جفتهای غیرقابل تجارت¶
داده های مربوط به جفت های آموزنده اضافی (جفت مرجع) می تواند برای برخی از استراتژی ها مفید باشد. داده های OHLCV برای این جفت ها به عنوان بخشی از فرآیند تازه سازی Whitelist بارگیری می شوند و از طریق DataProvider دقیقاً مانند سایر جفت ها در دسترس است (به تصویر زیر مراجعه کنید). این قطعات معامله نمی شوند مگر اینکه در لیست سفید پوستان نیز مشخص شوند ، یا توسط لیست سفید پویا انتخاب شده اند.
این زوج ها باید به عنوان Tuples در قالب ("جفت" ، "بازه زمانی") مشخص شوند ، با جفت به عنوان اولین و بازه زمانی به عنوان آرگومان دوم.
از آنجا که این جفت ها به عنوان بخشی از تازه سازی ویتلیست معمولی تازه می شوند ، بهتر است این لیست را کوتاه نگه دارید. تمام بازه های زمانی و همه جفت ها را می توان تا زمانی که در دسترس (و فعال) در مبادله استفاده شده باشد مشخص کرد. با این حال بهتر است هر زمان که ممکن باشد از تغییر شکل مجدد در بازه های زمانی طولانی تر استفاده کنید تا از چکش زدن مبادله با درخواست های بیش از حد جلوگیری کنید و خطر مسدود شدن آن را داشته باشید.
Amporative_Pairs همچنین می تواند یک عنصر Tuple 3 Rd را ارائه دهد که نوع شمع را به صراحت تعریف می کند. در دسترس بودن انواع شمع های جایگزین به حالت معاملاتی و مبادله بستگی دارد. به طور کلی ، از جفت های نقطه ای در بازارهای آتی استفاده نمی شود ، و شمع های آتی نمی توانند به عنوان جفت آموزنده برای ربات های نقطه ای استفاده شوند. در صورت انجام این کار ، جزئیات مربوط به این امر ممکن است متفاوت باشد ، این امر می تواند در اسناد مبادله یافت شود.
دکوراتور جفت های آموزنده (informative ())
در بیشتر موارد متداول می توان با استفاده از دکوراتور ، جفت های آموزنده را به راحتی تعریف کرد. تمام روشهای تزئین شده population_indicators_* به صورت انزوا ، دسترسی به داده های دیگر از جفت های آموزنده ، در پایان تمام داده های آموزنده آموزنده ادغام شده و به روش اصلی population_indicators () ادغام می شوند. در هنگام بیش از حد ، استفاده از پارامتر هایپروپ قابل استفاده. ویژگی Value پشتیبانی نمی شود. لطفا از ویژگی . range استفاده کنید. برای اطلاعات بیشتر به بهینه سازی یک پارامتر شاخص مراجعه کنید.
بیشتر اوقات ما نیازی به قدرت و انعطاف پذیری ارائه شده توسط merge_informative_pair () نداریم ، بنابراین می توانیم از یک دکوراتور برای تعریف سریع جفت های آموزنده استفاده کنیم.
در صورت نیاز به استفاده از داده های یک جفت آموزنده هنگام تولید یک جفت آموزنده دیگر ، از دکوراتور informative استفاده نکنید. در عوض ، جفت های آموزنده را به صورت دستی تعریف کنید همانطور که در بخش DataProvider شرح داده شده است.
هنگام دسترسی به داده های آموزنده جفت های دیگر ، از قالب بندی رشته استفاده کنید. این امکان را به شما می دهد تا بدون نیاز به تنظیم کد استراتژی ، ارز سهام را در پیکربندی تغییر دهید.
از طرف دیگر تغییر نام ستون برای حذف ارز سهام از نام ستون ها استفاده می شود: informative ('1H' ، 'BTC/' ، fmt = '__').
نام های روش تکراری
روشهای برچسب خورده با informative () دکوراتور باید همیشه نامهای منحصر به فردی داشته باشند! استفاده مجدد از همان نام (به عنوان مثال هنگامی که روش آموزنده ای که قبلاً تعریف شده است) روش قبلی تعریف شده را رونویسی می کند و به دلیل محدودیت زبان برنامه نویسی پایتون هیچ گونه خطایی ایجاد نمی کند. در چنین مواردی خواهید فهمید که شاخص های ایجاد شده در روشهای تعریف شده قبلی در DataFrame در دسترس نیستند. نام های روش را با دقت مرور کنید و مطمئن شوید که آنها بی نظیر هستند!
داده های اضافی (DataProvider)
این استراتژی دسترسی به DataProvider را فراهم می کند. این به شما امکان می دهد داده های اضافی را برای استفاده در استراتژی خود بدست آورید.
همه روشها در صورت عدم موفقیت هیچ یک را برمی گردانند (استثنا را مطرح نکنید).
لطفاً همیشه حالت عملکرد را بررسی کنید تا روش صحیح دریافت داده را انتخاب کنید (نمونه ها را در زیر مشاهده کنید).
DataProvider در طول HyperOpt در دسترس است ، اما فقط در یک استراتژی می توان از آن در population_indicators () استفاده کرد. در صورت قرار دادن این روش در پرونده HyperOpt ، در روش های population_buy () و population_sell () و نه در population_indicators () در دسترس نیست.
گزینه های ممکن برای dataprovider¶
-
- خاصیت با Tuples لیست جفت های ذخیره شده با بازه زمانی خود (جفت ، بازه زمانی).- لیست فعلی از جفت های لیست سفید را برمی گرداند. برای دسترسی به سفیدپوستان پویا (به عنوان مثال VolumePairlist) مفید است-این یک روش جهانی است ، که داده های تاریخی (برای پشتی) یا داده های زنده ذخیره شده (برای حالت های خشک و زنده) را برمی گرداند.- DataFrame تجزیه و تحلیل شده (پس از فراخوانی population_indicators () ، population_buy () ، population_sell ()) و زمان آخرین تجزیه و تحلیل را برمی گرداند.
- Historic_OHLCV (جفت ، بازه زمانی) - داده های تاریخی ذخیره شده بر روی دیسک را برمی گرداند.
- بازار (جفت) - داده های بازار را برای این جفت باز می گرداند: هزینه ها ، محدودیت ها ، دقت ، پرچم فعالیت و غیره. برای اطلاعات بیشتر در مورد ساختار داده های بازار ، به اسناد CCXT مراجعه کنید.
- OHLCV (جفت ، بازه زمانی) - در حال حاضر داده های شمع ذخیره شده (OHLCV) برای این جفت ، DataFrame یا DataFrame خالی را برمی گرداند.- آخرین داده های کتاب سفارش را برای این جفت باز می گرداند ، یک دیکتات با پیشنهادات/سؤال با کل حداکثر ورودی.- داده های کنونی کنونی را برای این جفت باز می گرداند. برای اطلاعات بیشتر در مورد ساختار داده Ticker ، به مستندات CCXT مراجعه کنید.
- RunMode - خاصیت حاوی RunMode فعلی.
موارد استفاده
در دسترس_رهای موجود
فعلی_هویتلیست ()
تصور کنید که شما یک استراتژی ایجاد کرده اید که بازه زمانی 5M را با استفاده از سیگنال های تولید شده از یک بازه زمانی 1D در 10 جفت جلد برتر با حجم معامله می کند.
استراتژی ممکن است چیزی شبیه به این باشد:
با استفاده از حجم VolumePairlist هر 5 دقیقه یک بار از 10 جفت برتر را اسکن کنید و از RSI 14 روزه برای خرید و فروش استفاده کنید.
با توجه به داده های موجود در دسترس ، نمونه برداری از شمع های 5 متر در شمع های روزانه برای استفاده در RSI 14 روزه بسیار دشوار است. بیشتر مبادلات ما را فقط به 500-1000 شمع محدود می کنند که به طور مؤثر حدود 1. 74 شمع روزانه به ما می دهد. ما حداقل 14 روز زمان نیاز داریم!
از آنجا که ما نمی توانیم داده ها را دوباره نمونه برداری کنیم ، باید از یک جفت آموزنده استفاده کنیم. و از آنجا که لیست سفید پویا خواهد بود ، ما نمی دانیم از کدام جفت (ها) استفاده کنیم.
اینجاست که فراخوانی self. dp. current_whitelist () مفید است.
لیست لیست های فعلی برای Dataframe Plot پشتیبانی نمی شود ، زیرا این دستور معمولاً با ارائه یک لیست جفت صریح مورد استفاده قرار می گیرد - و بنابراین مقادیر بازگشت این روش را گمراه کننده می کند.
get_pair_dataframe (جفت ، بازه زمانی)
هشدار در مورد پشتی
در پشتی ، dp. get_pair_dataframe () رفتار بسته به جایی که نامیده می شود متفاوت است. در روش های جمع _*() ، dp. get_pair_dataframe () تایمر کامل را برمی گرداند. لطفاً حتماً "به آینده نگاه نکنید" برای جلوگیری از شگفتی هنگام اجرای در حالت خشک/زنده. در تماس های برگشتی ، تایمر کامل را تا شمع فعلی (شبیه سازی شده) دریافت خواهید کرد.
get_analyzed_dataframe (جفت ، بازه زمانی)
این روش توسط FreqTrade در داخل برای تعیین آخرین سیگنال استفاده می شود. همچنین می تواند در تماس های خاص برای دریافت سیگنالی که باعث عمل شده است استفاده شود (برای اطلاعات بیشتر در مورد تماس های موجود ، به اسناد استراتژی پیشرفته مراجعه کنید).
اطلاعاتی موجود نیست
اگر جفت درخواست شده ذخیره نشود ، یک DataFrame خالی را برمی گرداند. می توانید این کار را با این کار بررسی کنید اگر dataframe. empty: و بر این اساس این پرونده را انجام دهید. این نباید هنگام استفاده از جفت های لیست سفید اتفاق بیفتد.
OrderBook (جفت ، حداکثر)
ساختار کتاب سفارش با ساختار سفارش از CCXT تراز شده است ، بنابراین نتیجه به شرح زیر خواهد بود:
بنابراین ، استفاده از OB ['پیشنهادات'] [0] [0] همانطور که در بالا نشان داده شد ، منجر به استفاده از بهترین قیمت پیشنهاد می شود. ob ['پیشنهادات'] [0] [1] به مبلغ این موقعیت دفترچه سفارش می پردازد.
هشدار در مورد پشتی
کتاب سفارش بخشی از داده های تاریخی نیست که به این معنی است که در صورت استفاده از این روش به درستی کار نمی کند ، زیرا این روش مقادیر Uptodate را برمی گرداند.
تیک (جفت)
اگرچه ساختار دادههای ticker بخشی از واسط یکپارچه ccxt است، مقادیر بازگردانده شده توسط این روش میتواند برای تبادلهای مختلف متفاوت باشد. به عنوان مثال، بسیاری از صرافیها مقادیر vwap را بر نمیگردانند، برخی از صرافیها همیشه آخرین فیلد را پر نمیکنند (بنابراین میتواند None باشد) و غیره. بنابراین باید دادههای تیک برگشتی از صرافی را به دقت بررسی کنید و مدیریت خطای مناسب را اضافه کنید /پیش فرض ها
هشدار در مورد پشتی
این روش همیشه مقادیر بهروز را برمیگرداند - بنابراین استفاده در حین تست بکآست/هیپراپت بدون بررسیهای حالت اجرا منجر به نتایج اشتباه میشود.
ارسال اعلان¶
تابع dataprovider . send_msg() به شما امکان می دهد اعلان های سفارشی را از استراتژی خود ارسال کنید. اعلانهای یکسان فقط یک بار برای هر کندل ارسال میشوند، مگر اینکه آرگومان دوم ( always_send ) روی True تنظیم شده باشد.
اعلانها فقط در حالتهای معاملاتی (Live/Dry-run) ارسال میشوند - بنابراین این روش را میتوان بدون هیچ شرایطی برای تست برگشت فراخوانی کرد.
با تنظیم همیشه_send=True در این روش میتوانید به خوبی خود را اسپم کنید. از این با احتیاط زیاد استفاده کنید و فقط در شرایطی که می دانید در طول یک شمع اتفاق نمی افتد تا از ارسال پیام هر 5 ثانیه یک بار جلوگیری کنید.
نمونه کامل ارائه دهنده داده¶
توابع کمکی¶
merge_informative_pair() ¶
این روش به شما کمک میکند یک جفت اطلاعاتی را در یک دیتافریم معمولی بدون سوگیری پیشبینی ادغام کنید. این برای کمک به شما در ادغام چارچوب داده به روشی ایمن و سازگار وجود دارد.
- نام ستون ها را برای شما تغییر دهید تا ستون های منحصر به فرد ایجاد کنید
- چارچوب داده را بدون تعصب پیش بینی ادغام کنید
- پر کردن جلو (اختیاری)
برای نمونه کامل، لطفاً به مثال ارائه دهنده داده کامل زیر مراجعه کنید.
تمام ستونهای قاب داده اطلاعاتی به شکلی تغییر نام داده شده در قاب داده بازگشتی در دسترس خواهند بود:
با فرض inf_tf = '1d' ستون های حاصل به صورت زیر خواهند بود:
با فرض inf_tf = '1h' ستون های حاصل به صورت زیر خواهند بود:
پیاده سازی سفارشی برای این امکان پذیر است و می تواند به صورت زیر انجام شود:
استفاده از تایم فریم های اطلاعاتی کوچکتر از تایم فریم داده با این روش توصیه نمی شود، زیرا از هیچ یک از اطلاعات اضافی که ارائه می دهد استفاده نمی کند. برای استفاده صحیح از اطلاعات دقیق تر، باید از روش های پیشرفته تری استفاده شود (که برای مستندات تجارت فرکانس خارج است، زیرا به نیاز مربوطه بستگی دارد).
stoploss_from_open() ¶
مقادیر متوقف شده از Custom_Stoploss باید نسبت به فعلی_Rate درصد را مشخص کند ، اما گاهی اوقات ممکن است بخواهید به جای آن یک ایستگاه متوقف را نسبت به قیمت باز مشخص کنید. stoploss_from_open () یک تابع یاور برای محاسبه یک مقدار متوقف است که می تواند از custom_stoploss برگردانده شود که معادل درصد مورد نظر بالاتر از قیمت باز باشد.
بازگرداندن یک ایستگاه نسبت به قیمت باز از عملکرد Suply Stoploss
بگویید قیمت باز 100 دلار بود و فعلی_پریس 121 دلار است (فعلی_پروفیت 0. 21 خواهد بود).
اگر بخواهیم قیمت توقف را با 7 ٪ بالاتر از قیمت باز بخواهیم ، می توانیم با stamploss_from_open تماس بگیریم (0. 07 ، فعلی_پروفیت ، نادرست) که 0. 1157024793 باز می گردد. 11. 57 ٪ زیر 121 دلار 107 دلار است که همان 7 ٪ بالاتر از 100 دلار است.
نمونه های کامل را می توان در بخش Custom Stoploss مستندات یافت.
ارائه ورودی نامعتبر به stoploss_from_open () ممکن است هشدارهای "CustomStoploss" را تولید کند. این ممکن است اتفاق بیفتد اگر پارامتر فعلی_Profit زیر Open_Relative_Stop مشخص شده باشد. چنین شرایطی ممکن است هنگام بسته شدن تجارت با روش تأیید_Trade_Exit () انجام شود. هشدارها را می توان با مسدود کردن ضرر متوقف با بررسی Exit_Reason در تأیید_trade_exit () ، یا با استفاده از بازگشت stoploss_from_open (.) یا 1 اصطلاح حل کرد ، که درخواست می کند در صورت فعلی_پروفیت تغییر نکند.< open_relative_stop .
stoploss_from_absolute ()
در برخی شرایط ممکن است مقابله با توقف نسبت به نرخ فعلی گیج کننده باشد. درعوض ، شما ممکن است با استفاده از قیمت مطلق ، سطح stoploss را تعریف کنید.
بازگشت یک ایستگاه با استفاده از قیمت مطلق از عملکرد SUPTLOSS سفارشی
اگر بخواهیم قیمت توقف را با 2xATR زیر قیمت فعلی دنبال کنیم ، می توانیم با stamploss_from_absolute (فعلی_rate - (شمع ['Atr'] * 2) ، فعلی_Rate ، is_short = trade. is_short) تماس بگیریم.
داده های اضافی (کیف پول)
این استراتژی دسترسی به شیء کیف پول را فراهم می کند. این شامل مانده های فعلی در بورس است.
کیف پول در هنگام پشتی / Hyperopt در دسترس نیست.
لطفاً همیشه بررسی کنید که آیا کیف پول در دسترس است تا از خرابی در هنگام پس زمینه جلوگیری شود.
گزینه های احتمالی برای کیف پول
- get_free (دارایی) - در حال حاضر مانده موجود در تجارت
- get_used (دارایی) - در حال حاضر مانده تعادل (سفارشات باز)
- get_total (دارایی) - کل موجود در دسترس - جمع 2 مورد فوق
داده های اضافی (معاملات)
با پرس و جو از پایگاه داده ، می توان سابقه معاملات را در این استراتژی بازیابی کرد.
در بالای پرونده ، تجارت واردات.
مثال زیر برای جفت فعلی جستوجو میکند و از امروز معامله میکند، با این حال فیلترهای دیگری را میتوان به راحتی اضافه کرد.
دریافت مقدار stake_currency که در حال حاضر در معاملات سرمایه گذاری شده است:
بازیابی عملکرد در هر جفتفهرستی از دیکته ها در هر جفت را برمی گرداند.
ارزش بازگشتی نمونه: ETH/BTC دارای 5 معامله بود که سود کل آن 1. 5٪ (نسبت 0. 015) بود.
تاریخچه تجارت در حین بک تست یا هایپراپت در دسترس نیست.
جلوگیری از وقوع معاملات برای یک جفت خاص¶
Freqtrade جفتها را بهطور خودکار برای شمع فعلی قفل میکند (تا زمانی که آن شمع تمام شود) هنگام فروخته شدن یک جفت، از خرید مجدد فوری آن جفت جلوگیری میکند.
جفت های قفل شده پیام جفت در حال حاضر قفل است را نشان می دهد..
قفل کردن جفت ها از درون استراتژی¶
گاهی اوقات ممکن است بخواهد یک جفت را پس از وقوع رویدادهای خاص قفل کنید (مثلاً چندین معامله بازنده پشت سر هم).
Freqtrade با فراخوانی self. lock_pair (pair, while, [reason]) روش آسانی برای انجام این کار از درون استراتژی دارد. تا در آینده باید یک شی datetime باشد، پس از آن معاملات برای آن جفت مجددا فعال می شود، در حالی که عقل یک رشته اختیاری است که دلیل قفل شدن جفت را توضیح می دهد.
قفل ها را می توان به صورت دستی با فراخوانی self. unlock_pair(pair) یا self. unlock_reason() - با ارائه دلیل قفل شدن جفت برداشت.()self. unlock_reason تمام جفت هایی را که در حال حاضر با دلیل ارائه شده قفل شده اند باز می کند.
برای تأیید اینکه آیا یک جفت در حال حاضر قفل است، از self. is_pair_locked(pair) استفاده کنید.
جفت های قفل شده همیشه تا شمع بعدی گرد می شوند. بنابراین با فرض یک بازه زمانی 5 متری، یک قفل با تنظیم تا 10:18 جفت را قفل می کند تا زمانی که شمع از ساعت 10:15 تا 10:20 تمام شود.
قفل کردن دستی جفتها در طول تست بک تست در دسترس نیست، فقط قفل کردن از طریق Protections مجاز است.
مثال قفل جفت¶
چاپ دیتافریم ایجاد شده¶
برای بازرسی دیتافریم ایجاد شده، میتوانید یک بیانیه چاپی در ()populate_entry_trend یا populate_exit_trend() صادر کنید. همچنین ممکن است بخواهید جفت را چاپ کنید تا مشخص شود چه دادههایی در حال حاضر نشان داده میشوند.
چاپ بیش از چند ردیف نیز امکان پذیر است (به سادگی از print(dataframe) به جای print(dataframe. tail()) استفاده کنید، اما توصیه نمی شود، زیرا بسیار پرمخاطب خواهد بود (~500 خط در هر جفت هر 5 ثانیه).
اشتباهات رایج در تدوین استراتژیها
نگاهی به آینده در حین آزمایش پشت سر هم
Backtesting به دلایل عملکرد ، کل زمان را به طور همزمان تجزیه و تحلیل می کند. به همین دلیل ، نویسندگان استراتژی باید اطمینان حاصل کنند که استراتژی ها به آینده نگاه نمی کنند. این یک نقطه درد رایج است ، که می تواند تفاوت های زیادی بین روش های پشتی و خشک/زنده اجرا ایجاد کند ، زیرا همه آنها از داده هایی استفاده می کنند که در طول اجرای خشک/زنده در دسترس نیست ، بنابراین این استراتژی ها در حین پشتی خوب عمل می کنند ، اما شکست می خورند/در شرایط واقعی عملکرد بدی داشته باشید.
در زیر برخی از الگوهای مشترک که باید از آنها جلوگیری شود برای جلوگیری از سرخوردگی جلوگیری می کند:
- از Shift (-1) استفاده نکنید. این از داده های آینده استفاده می کند ، که در دسترس نیست.
- از . Iloc [-1] یا هر موقعیت مطلق دیگری در DataFrame استفاده نکنید ، این بین خشک و پشتی متفاوت خواهد بود.
- از DataFrame ['Volume'] استفاده نکنید. معنی (). این از DataFrame کامل برای Backtesting ، از جمله داده های آینده استفاده می کند. به جای آن از dataframe ['Volume']. Rolling (). میانگین ()
- از نمونه ("1H") استفاده نکنید. این از مرز سمت چپ فاصله استفاده می کند ، بنابراین داده ها را از یک ساعت به شروع ساعت منتقل می کند. به جای آن از . resample ('1H' ، label = 'Right') استفاده کنید.
برخورد سیگنال ها
هنگامی که سیگنال های متناقض با هم برخورد می کنند (به عنوان مثال هر دو "enter_long" و "Exit_long" 1 هستند) ، Freqtrade هیچ کاری نمی کند و سیگنال ورود را نادیده می گیرد. این کار از معاملات وارد شده جلوگیری می کند و بلافاصله از آن خارج می شود. بدیهی است ، این به طور بالقوه می تواند منجر به ورودی های از دست رفته شود.
قوانین زیر اعمال می شود و در صورت تنظیم بیش از یکی از 3 سیگنال ، سیگنال های ورود نادیده گرفته می شوند:
- enter_long ->Exit_long ، enter_short
- enter_short ->Exit_short ، enter_long
ایده های بیشتر استراتژی ایده
برای به دست آوردن ایده های اضافی برای استراتژی ها ، به مخزن استراتژی بروید. احساس راحتی کنید که از آنها استفاده کنید - اما نتایج به وضعیت فعلی بازار ، جفت های مورد استفاده و غیره بستگی دارد - بنابراین لطفاً ابتدا استراتژی را برای جفت های مبادله/مورد نظر خود پشت سر بگذارید ، ابتدا با دقت ارزیابی کنید ، از خطر خود استفاده کنید. احساس راحتی کنید که از هر یک از آنها به عنوان الهام بخش برای استراتژی های خود استفاده کنید. ما خوشحالیم که درخواست های کشش حاوی استراتژی های جدید را برای آن repo پذیرفتیم.
گام بعدی¶
اکنون شما یک استراتژی عالی دارید که احتمالاً می خواهید آن را پشت سر بگذارید. قدم بعدی شما یادگیری نحوه استفاده از پشتی است.