پردازش جامع داده ها به ابزارهای گسترده ای نیاز دارد و اغلب فراتر از جعبه شنی یک برنامه واحد است. زبان های برنامه نویسی تخصصی برای پردازش و تجزیه و تحلیل داده ها، آمار و یادگیری ماشین استفاده می شود. یکی از زبان های برنامه نویسی پیشرو برای پردازش داده ها پایتون است. یک راه حل بسیار موثر استفاده از قدرت زبان و کتابخانه های گنجانده شده برای توسعه سیستم های تجاری است.
راه حل های مختلفی برای اجرای تعامل دو یا چند برنامه وجود دارد. سوکت ها یکی از سریع ترین و انعطاف پذیرترین راه حل ها هستند.
سوکت شبکه نقطه پایانی ارتباط بین فرآیندی بر روی یک شبکه کامپیوتری است. کتابخانه استاندارد MQL5 شامل گروهی از توابع سوکت است که یک رابط سطح پایین برای کار بر روی اینترنت فراهم می کند. این یک رابط مشترک برای زبان های برنامه نویسی مختلف است، زیرا از تماس های سیستمی در سطح سیستم عامل استفاده می کند.
تبادل داده بین قیمت ها از طریق TCP/IP (پروتکل کنترل انتقال/پروتکل اینترنت) اجرا می شود. بنابراین، فرآیندها می توانند در یک کامپیوتر واحد و از طریق یک شبکه محلی یا اینترنت تعامل داشته باشند.
برای ایجاد یک اتصال، لازم است یک سرور TCP ایجاد و مقداردهی اولیه شود که فرآیند مشتری به آن متصل شود. پس از اتمام تعامل فرآیندها، اتصال باید به زور بسته شود. داده ها در تبادل TCP جریانی از بایت ها هستند.
هنگام ایجاد یک سرور، باید یک سوکت را با یک یا چند میزبان (آدرس IP) و یک پورت استفاده نشده مرتبط کنیم. اگر لیست هاست ها تنظیم نشده باشد یا به عنوان "0. 0. 0. 0" مشخص شده باشد، سوکت به همه هاست ها گوش می دهد. اگر "127. 0. 0. 1" یا "localhost" را مشخص کنید، اتصال فقط در "حلقه داخلی" امکان پذیر خواهد بود، یعنی فقط در یک کامپیوتر.
از آنجایی که فقط مشتری در MQL5 در دسترس است، ما یک سرور در پایتون ایجاد خواهیم کرد.
ایجاد سوکت سرور در پایتون
هدف مقاله آموزش اصول برنامه نویسی پایتون نیست. بنابراین فرض بر این است که خواننده با این زبان آشنا است.
ما از نسخه 3. 7. 2 و بسته سوکت داخلی استفاده خواهیم کرد. لطفا اسناد مربوطه را برای جزئیات بیشتر بخوانید.
ما یک برنامه ساده خواهیم نوشت که یک سرور سوکت ایجاد می کند و اطلاعات لازم را از مشتری (برنامه MQL5) دریافت می کند ، آن را اداره می کند و نتیجه را ارسال می کند. به نظر می رسد این کارآمدترین روش تعامل است. فرض کنید ما باید از یک کتابخانه یادگیری ماشین استفاده کنیم ، مانند مثال Scikit Lea ، که رگرسیون خطی را با استفاده از قیمت ها و مختصات بازگشت محاسبه می کند ، که براساس آن می توان یک خط را در ترمینال Metatrader 5 ترسیم کرد. این مثال اساسی است. با این حال ، چنین تعامل می تواند برای آموزش یک شبکه عصبی ، برای ارسال داده های IT از ترمینال (نقل قول ها) ، یادگیری و بازگشت نتیجه به ترمینال استفاده شود.
بگذارید برنامه SocketServer. py را ایجاد کنیم و کتابخانه های توضیح داده شده در بالا را وارد کنیم:
اکنون می توانیم به ایجاد یک کلاس مسئول دستکاری سوکت ادامه دهیم:
هنگام ایجاد یک شیء کلاس ، سازنده نام میزبان (آدرس IP) و شماره پورت را دریافت می کند. سپس شیء جوراب ایجاد می شود که با آدرس و پورت جوراب همراه است. bind ().
روش recvmsg برای جوراب اتصال ورودی (1) گوش می دهد. هنگامی که یک اتصال مشتری دریافتی وارد می شود ، سرور آن را به خودی خود می پذیرد. sock. accept ().
سپس سرور در یک حلقه نامحدود برای یک پیام مشتری ورودی منتظر می ماند ، که به عنوان جریان بایت وارد می شود. از آنجا که طول پیام از قبل مشخص نشده است ، سرور این پیام را در قسمت ها دریافت می کند ، می گویند 1 kbytes به طور همزمان ، تا زمانی که کل پیام خود خوانده شود. co. recv (10000). قطعه داده دریافت شده به داده های رشته ای تبدیل می شود. DECODE ("UTF-8") و به بقیه Summdata String اضافه می شود.
پس از دریافت تمام داده ها (اگر داده ای نباشد :) ، سرور رشته ای را برای مشتری حاوی راست و چپ ترین مختصات خط رگرسیون محاسبه شده به مشتری می فرستد. رشته اولیه به یک آرایه بایت تبدیل شده است.
در پایان ، این روش رشته دریافت شده از مشتری را برمی گرداند. از جمله دیگر می توان از آن برای تجسم نقل قول های دریافت شده استفاده کرد.
پس از اتمام اجرای برنامه Python ، یک ویرانگر سوکت را می بندد.
لطفاً توجه داشته باشید که این تنها اجرای ممکن کلاس نیست. از طرف دیگر ، می توانید روش های دریافت و ارسال پیام را جدا کرده و از آن به روش های مختلف در نقاط مختلف در زمان استفاده کنید. من فقط فناوری اصلی را برای ایجاد یک اتصال شرح داده ام. شما می توانید راه حل های خود را پیاده سازی کنید.
بگذارید با جزئیات بیشتری روش یادگیری رگرسیون خطی را در اجرای فعلی در نظر بگیریم:
جریان بایت دریافت شده به یک رشته UTF-8 تبدیل می شود ، که سپس با روش Carcregr (MSG = '') پذیرفته می شود. از آنجا که رشته شامل دنباله ای از قیمت های جدا شده توسط فضاها (همانطور که در مشتری اجرا می شود) ، آن را به یک آرایه numpy از نوع float تبدیل می کند. پس از آن آرایه قیمت به یک ستون تبدیل می شود (قالب دریافت داده Sclea است) y = np. array (ChartData) . reshape (-1،1). پیش بینی کننده مدل زمان خطی (دنباله ای از مقادیر ؛ اندازه آن برابر با طول نمونه آموزش است) x = np. array (np. arange (len (ChartData))). تغییر شکل (-1،1)
این به دنبال آموزش و پیش بینی مدل است ، در حالی که اولین و آخرین مقادیر خط (لبه های بخش) به متغیر "P" نوشته شده است ، به یک رشته تبدیل شده و به شکل بایت به مشتری منتقل می شود.
حال ، ما فقط باید شیء کلاس را ایجاد کنیم و روش recvmsg () را در یک حلقه فراخوانی کنیم:
ایجاد یک مشتری سوکت در MQL5
بگذارید یک مشاور کارشناس ساده ایجاد کنیم ، که می تواند به سرور وصل شود ، تعداد مشخصی از قیمت های نزدیک اخیر را منتقل کنید ، مختصات خط رگرسیون را برگردانید و آن را در نمودار ترسیم کنید.
عملکرد SOCKSEND () داده ها را به سرور منتقل می کند:
این رشته را دریافت می کند ، به یک آرایه بایت تبدیل می شود و به یک سرور می فرستد.
عملکرد Socketreceive () در پورت گوش می دهد. پس از دریافت پاسخ سرور ، عملکرد آن را به عنوان یک رشته برمی گرداند:
آخرین تابع drawlr () رشته ای را دریافت می کند ، که در آن مختصات خط چپ و راست نوشته شده است ، سپس رشته را به یک آرایه رشته تجزیه می کند و خط رگرسیون خطی را روی یک نمودار ترسیم می کند:
این عملکرد در کنترل کننده ONTICK () اجرا می شود.
آزمایش برنامه مشتری MQL5-Python-Server
برای اجرای برنامه ، باید مفسر پایتون را نصب کنید. می توانید آن را از وب سایت رسمی بارگیری کنید.
سپس برنامه سرور SocketServer. py را اجرا کنید. این یک سوکت ایجاد می کند و برای اتصالات جدید از برنامه MQL5 Socketclientea. mq5 گوش می دهد.
پس از یک اتصال موفق ، فرآیند اتصال و قیمت خط رگرسیون در پنجره برنامه نمایش داده می شود. قیمت ها به مشتری ارسال می شوند:

فعالیت اتصال و قیمت خط رگرسیون نیز در ترمینال Metatrader 5 نمایش داده می شود. همچنین خط رگرسیون روی یک نمودار ترسیم شده و در هر کنه جدید بیشتر به روز می شود:

ما اجرای تعامل مستقیم دو برنامه را از طریق اتصال سوکت در نظر گرفته ایم. در همین زمان ، متاکووت ها یک بسته پایتون را تهیه کرده اند که امکان دریافت داده ها را مستقیماً از ترمینال فراهم می کند. برای اطلاعات بیشتر ، لطفاً به بحث انجمن مربوط به استفاده از پایتون در Metatrader مراجعه کنید (به روسی ، بنابراین از گزینه ترجمه خودکار استفاده کنید).
بگذارید یک اسکریپت ایجاد کنیم تا نحوه دریافت نقل قول از ترمینال را نشان دهیم.
دریافت و تجزیه و تحلیل نقل قول ها با استفاده از Metatrader 5 Python API
ابتدا باید ماژول Python Metatrader5 را نصب کنید (خلاصه مباحث پایتون در اینجا موجود است).
آن را به برنامه وارد کنید و اتصال به ترمینال را آغاز کنید:
پس از آن لیستی از نمادهای مورد نظر ایجاد کرده و به طور پی در پی درخواست قیمت های نزدیک برای هر جفت ارز از ترمینال به Pandas DataFrame:
اکنون می توانیم از ترمینال جدا شویم و سپس با محاسبه ماتریس همبستگی و نمایش آن بر روی صفحه ، قیمت جفت ارز را به عنوان درصد تغییرات نشان دهیم:

ما می توانیم همبستگی خوبی بین GBPUSD و GBPJPY در نقشه گرمای فوق مشاهده کنیم. سپس می توانیم با وارد کردن کتابخانه Statmodels ، ادغام را آزمایش کنیم:
رابطه بین دو جفت ارز را می توان به عنوان نمره Z نمایش داد:

تجسم داده های بازار با استفاده از کتابخانه Plotly
اغلب برای تجسم نقل قول ها به صورت مناسب لازم است. این می تواند با استفاده از کتابخانه Plotly اجرا شود ، که همچنین امکان ذخیره نمودارها را در قالب تعاملی .html فراهم می کند.
اجازه دهید نقل قول های EURUSD را بارگیری کنیم و آنها را در نمودار شمعدانی نمایش دهیم:

همچنین می توان هرگونه عمق پیشنهاد را بارگیری و نمایش داد و از تاریخ بپرسید:

نتیجه
در این مقاله ، ما گزینه هایی را برای اجرای ارتباط بین ترمینال و برنامه ای که در پایتون ، از طریق سوکت و مستقیم استفاده از کتابخانه تخصصی متاکووت ها نوشته شده است ، در نظر گرفتیم. متأسفانه ، اجرای فعلی مشتری سوکت در Metatrader 5 برای اجرای در تستر استراتژی مناسب نیست ، بنابراین هیچ آزمایش کامل و اندازه گیری عملکرد راه حل انجام نشده است. بگذارید منتظر به روزرسانی های بیشتر عملکرد سوکت باشیم.
هشدار: کلیه حقوق این مواد توسط Metaquotes Ltd. کپی یا چاپ مجدد این مواد به طور کامل یا جزئی محفوظ است.
فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید
برچسب :
نویسنده : آرش اصل زاد
بازدید : <-PostHit->
تاريخ : جمعه
11 فروردين
1402 ساعت: 15:06