دکمه های خرید ، فروش و هر چیزی را در Ninjatrader خریداری کنید.
برای معامله گر نیمه اختیاری ، یک ویژگی فاقد Ninjatrader وجود دارد که به راحتی با کمی کد C# اصلاح می شود: دکمه های قابل تنظیم برای ایجاد استراتژی ها.
اگر نمودارهایی را برای شروع یک تصمیم معاملاتی تماشا می کنید اما از روش ورود پیچیده ، موقعیت یابی و توقف استفاده می کنید ، قادر به ایجاد یک استراتژی به صورت دستی ممکن است از کاربرد بسیار خوبی برخوردار باشد.
به عنوان مثال ، می توانید دو دکمه گره خورده با یک استراتژی پویا ایجاد کنید که یک کنه را بالاتر از بالا خریداری می کند یا یک کنه را در زیر کمترین نوار بسته می فروشد. قبل از ارسال سفارش ، می توانید اندازه را به صورت پویا با توجه به بازار ، قدرت خرید و/یا اندازه نوار سیگنال محاسبه کنید:
در Ninjatrader-Speak ، در مورد بذر و شلیک یک استراتژی به صورت پویا در کلیک یک دکمه است. این دومین پست در سری من در مورد نینجاترادر و پیشرفت هایی است که می توان با کمی گریس آرنج و مقداری C# انجام داد (اولین پست را در اینجا ببینید). توجه داشته باشید ، این تنها نگاهی دقیق به موضوع است و فرض می کند که می دانید یا به زودی می دانید چگونه چگونه Ninjascriptts را ویرایش کنید و با C#آشنایی داشته باشید. همچنین به خاطر Brevity ، من بسیاری از توابع ، رسیدگی به خطا و پاکسازی شی را از دست می دهم. این فقط در مورد نشان دادن امکانات است و نه یک سیستم کامل. خودکار سازی هرگونه تجارت بسیار پرخطر است و به فکر ، کار و آزمایش زیادی نیاز دارد. گفته می شود ، این باید برای علاقه مندان کافی باشد.
این پروژه مستلزم ساخت و فوری فرم های ویندوز بسیار ساده (WinForms) در یک اسکریپت استراتژی است. هر بار که استراتژی فعال شود ، فرم ایجاد و نشان داده می شود. این پست مبتنی بر ایجاد یک ابزار بسیار ساده مبتنی بر دکمه برای خرید یک تیک بالای نوار در یک توقف و فروش یک تیک زیر نوار همانطور که در بالا نشان داده شده است. اندازه بسته به مقدار دلار که مایل به ریسک کردن است ، اندازه آن در نزدیکی هر نوار محاسبه می شود. از دست دادن توقف بر اساس اندازه نوار سیگنال اما در جهت مخالف تجارت خواهد بود. هدف سود 1. 5 برابر اندازه نوار سیگنال خواهد بود:
سود = بالا [نوار ورود] + ((نوار سیگنال] - کم [نوار سیگنال]) * 1. 5)
از دست دادن توقف = پایین [نوار ورودی] - (بالا [نوار سیگنال] - کم [نوار سیگنال])
سود = پایین [نوار ورود] - ((نوار سیگنال] - کم [نوار سیگنال]) * 1. 5)
از دست دادن توقف = بالا [نوار ورودی] + (بالا [نوار سیگنال] - کم [نوار سیگنال])
// این فقط روی قیمت های مبتنی بر اعشاری کار خواهد کرد
size = dollarstorisk / (بالا [نوار سیگنال] - کم [نوار سیگنال])
ایجاد فرم معامله گر دکمه
اکنون برای گوشت این پست ، ایجاد یک فرم جداگانه از Ninjascript. مرحله اول ایجاد یک اسکریپت استراتژی جدید (ابزارها-Ninjascript جدید-استراتژی) و اضافه کردن یک عملکرد برای ساخت فرم نگهدارنده دکمه ما:
فرم frmbuttontrader = null ؛
سیستم خصوصی. windows. forms. button button_long ؛
سیستم خصوصی. windows. forms. button button_short ؛
void private buildbuttontradingform ()
this. button_long = سیستم جدید. windows. forms. button () ؛
this. button_short = سیستم جدید. windows. forms. button () ؛
this. button_long. location = سیستم جدید. drawing. point (5 ، 31) ؛
this. button_long. size = سیستم جدید. drawing. size (189 ، 37) ؛
this. button_long. click += System New. eventhandler (this. button_long_click) ؛
this. button_short. location = سیستم جدید. drawing. point (5 ، 74) ؛
this. button_short. size = سیستم جدید. drawing. size (189 ، 37) ؛
this. button_short. click += new System. eventhandler (this. button_short_click) ؛
frmbuttontrader = فرم جدید () ؛
frmbuttontrader. size = جدید System. Drawing. Size (220 ، 185) ؛
این تابع یک فرم جدید ایجاد می کند، آن را با دو دکمه لباس می پوشاند و نمایش می دهد. این تنها زمانی می تواند فراخوانی شود که اسکریپت استراتژی به طور کامل مقداردهی اولیه را به پایان رسانده باشد اما قبل از شروع به گوش دادن به رویدادهای بازار. بنابراین رویداد OnStartUp باید اضافه شود:
باطل محافظت شده OnStartUp()
اضافه کردن مقداری منطق
قبل از امتحان کد بالا، باید بازار خود را مدیریت کنیم، کلیک کنیم و رویدادها را تشکیل دهیم. در اینجا یک نگاه جزئی است:
در هر رویداد OnBarUpdate، قیمتهای توقف جدید و اندازه معامله را محاسبه میکنیم («CalculateOnBarClose» باید روی true تنظیم شود):
int dynamicTradeSize = 0;
لغو محافظت شده باطل OnBarUpdate()
//فقط بر اساس قیمت های اعشاری کار می کند و حداکثر 50 دلار در هر معامله را فرض می کند
dynamicTradeSize = (int) Math. Round(50 / (High[0] – Low[0]), 0);
//به روز رسانی متن روی دکمه ها
button_LONG. Text = String. Format("Buy @", dynamicTradeSize، High[0] + TickSize);
button_SHORT. Text = String. Format("Sell @", dynamicTradeSize، Low[0] - TickSize);
در مدیریت هر رویداد دکمه، باید دستور توقف خود را به همراه هدف سود و توقف ضرر اجرا کنیم. در اینجا اصل کار طولانی است:
SetStopLoss("Entry_" + Time[0]. ToString()، CalculationMode. Price، Low[0] – (High[0] – Low[0]) , false);
CalculationMode. Price، High[0] + ((High[0] – Low[0]) * 1. 5));
Entry = EnterLongStop (sizeWithDollarsAtRisk، High[0] + TickSize، "Entry_" + Time[0]. ToString());
بقیه منطق و رویدادها دقیقاً مانند استراتژی های معمولی است. شما باید تمام ویژگی های تجارت استراتژی را مطابق میل خود تنظیم کنید و رویدادهای OnOrderUpdate (در انتظار تغییر، رد شدن، و غیره) و OnExecution (پر شده، در حال کار و غیره) را مدیریت کنید. بدیهی است که راهنمای راهنما NinjaTrader مکانی برای شروع راهبردهای ساختن است.
آخرین اخطار، برای فعال کردن استراتژی دکمه خود، باید آن را به نمودار اضافه کنید و قبل از نمایش آن در بخش خصوصیات فعال کنید. وقتی برای اولین بار این مورد را آزمایش می کنید، از اینکه هر چقدر هم سریع کلیک کنید، هیچ معامله ای در نمودار شما ظاهر نمی شود، شگفت زده خواهید شد. اگر می خواهید موقعیت ورودی معامله خود را در نمودار ببینید (همانطور که در تصویر اول نشان داده شده است) باید نمودار دیگری اضافه کنید. به این دلیل که شکلی که استراتژی را نگه میدارد، فرض میکند که یک استراتژی در حال اجرای نمایش است. بنابراین، نمودار اضافی که به هیچ استراتژی مرتبط نیست، معامله معلق را نشان می دهد.
کلمات پایانی
مطمئنا، این راه حل یک آشفتگی است. من این پست را برای NinjaTrader ارسال میکنم به این امید که آنها این مشکل را برطرف کنند و دکمههای Chart Trader و استراتژیهای خود را بهروزرسانی کنند تا کاملاً قابل شخصیسازی و از طریق NinjaScripts در دسترس باشند.
امیدوارم این معرفی کوتاه اشتهای شما را خیس کند و امکانات جدیدی را باز کند. نمیتوانم دقیقاً به یاد بیاورم که این ایده را از کجا به دست آوردم، اما تقریباً مطمئن هستم که این ایده از طرف همه افراد خوبی است که سؤالات و پاسخهایی را در انجمن NinjaTrader ارسال کردهاند.