| نسخه رشته = "tl bo 1. 0" ؛ |
| // متغیرهای جهانی خارجی |
| exte int ext_swings = 2 ؛// سطح نوسان ، 0 پایین ترین ، 2 متداول است |
| exte int ext_no_swing_lmt = 12 ؛// آخرین میله های X را به عنوان نقاط نوسان برای ترسیم خطوط روند در نظر نگیرید |
| exte int ext_atr = 300 ؛// ATR (x) |
| exte double ext_atr_max_slope = 0. 05 ؛// چند ATR که حداکثر شیب در نظر گرفته می شود |
| exte double ext_atr_buffer = 0. 05 ؛// چند مورد از ATR برای اضافه کردن به کم/زیاد برای اینکه "لمس" در نظر گرفته شود |
| exte int ext_null_closes = 0 ؛// تعداد بسته شدن فراتر از خط روند برای باطل کردن آن به عنوان یک خط روند معتبر |
| exte int ext_num_touches = 3 ؛// (شامل) تعداد لمس های مورد نیاز برای در نظر گرفتن یک خط روند معتبر |
| exte int ext_res_color = indianred ؛// خط مقاومت افقی http://docs. mql4. com/constants/colors |
| exte int ext_sup_color = palegreen ؛// خط پشتیبانی افقی http://docs. mql4. com/constants/colors |
| exte int ext_slope_res_color = lightsalmon ؛// خط مقاومت شیب دار http://docs. mql4. com/constants/colors |
| exte int ext_slope_sup_color = آهک ؛// خط پشتیبانی شیب دار http://docs. mql4. com/constants/colors |
| exte double ext_atr_ini_stop = 0. 1 ؛// بافر اضافی برای اضافه کردن فراتر از توقف اولیه |
| exte int ext_lookback = 3 ؛// تعداد میله ها برای یافتن بالاترین بالاترین/پایین ترین پایین |
| exte double ext_risk_minamt = 50 ؛// ارزش دلار حداقل مبلغ برای ریسک در هر تجارت |
| exte double ext_risk_divisor = 10 ؛// حساب کاربری/x = ریسک در هر تجارت |
| exte int ext_max_slip = 10 ؛// حداکثر نقاط لغزش مجاز به سفارش 10 = 1 پیپ |
| exte double ext_atr_trailstop = 2 ؛// چند برابر برای ردیابی بازار ATR (ext_atr) * x |
| exte double ext_atr_bo = 2 ؛// چند مورد از ATR برای تعیین اینکه آیا نوار BO است |
| // متغیرهای جهانی |
| DateTime Nowper ؛ |
| int gate_active ، trade_tkt ؛ |
| Double Exit_price ، trade_lots ، gate_res ، gate_sup ؛ |
| //+------------------------------------------------------------------+ |
| // |عملکرد اولیه سازی متخصص | |
| //+------------------------------------------------------------------+ |
| int init () |
| |
| //---- |
| رشته Sym = نماد () ؛ |
| int در هر دوره () ؛ |
| // بررسی کنید که آیا ارز فعال است |
| GATE_ACTION = isActive (Sym ، False) ؛ |
| // حذف تمام خطوط و توطئه های روند قبلی |
| Objectsdeleteall (0) ؛ |
| // خط مقاومت را دریافت کنید |
| GATE_RES = GetTrendline (Sym ، per ، true) ؛ |
| // خط پشتیبانی را دریافت کنید |
| GATE_SUP = GetTrendline (Sym ، per ، false) ؛ |
| //---- |
| بازگشت (0) ؛ |
| > |
| //+------------------------------------------------------------------+ |
| // |عملکرد deinitialization متخصص | |
| //+------------------------------------------------------------------+ |
| int deinit () |
| |
| //---- |
| //---- |
| بازگشت (0) ؛ |
| > |
| //+------------------------------------------------------------------+ |
| // |عملکرد شروع متخصص | |
| //+------------------------------------------------------------------+ |
| int start () |
| |
| //---- |
| رشته Sym = نماد () ؛ |
| int در هر دوره () ؛ |
| int d = رقم ؛ |
| dateTime t = itime (Sym ، per ، 0) ؛ |
| // اگر سیستم فعال نیست ، به دنبال موقعیت جدید باشید |
| if (gate_active == - 1) |
| // به دنبال شکستن |
| if ( GATE_RES>0) |
| if ( Bid> GATE_RES && GATE_RES> 0 && isBO ( sym , per , true ) && getTrend ( sym , per , true )>0) Dobuy (Sym ، per) ؛ |
| > |
| // به دنبال شکستن |
| if ( GATE_SUP>0) |
| اگر (پیشنهاد0 && isbo (Sym ، per ، false) && getTrend (Sym ، per ، false)<0 ) doSell ( sym , per ); |
| > |
| >دیگر |
| // ابتدا بررسی خواهیم کرد تا ببینیم قیمت خروج به آن رسیده است؟ |
| // معاملات طولانی |
| if ( GATE_ACTIVE == OP_BUY && EXIT_PRICE> Bid && EXIT_PRICE>0) EXITNOW (SYM ، TRADE_TKT ، TRADE_LOTS ، BID) ؛ |
| // معاملات کوتاه |
| if ( GATE_ACTIVE == OP_SELL && Ask> EXIT_PRICE && EXIT_PRICE>0) EXITNOW (SYM ، TRADE_TKT ، TRADE_LOTS ، ASK) ؛ |
| // اگر دروازه فعال است ، بیایید تجزیه و تحلیل کنیم که آیا از دست دادن توقف نیاز به اصلاح دارد |
| GATE_ACTION = isActive (سیم ، درست) ؛ |
| > |
| // فقط در تغییر هر نوار انجام دهید |
| if (t! = nowper) |
| GATE_RES = GetTrendline (Sym ، per ، true) ؛ |
| GATE_SUP = GetTrendline (Sym ، per ، false) ؛ |
| // بیایید مقادیر خط روند را بررسی کنیم تا ببینیم قیمت آنها چیست |
| نظر ("res =" + doubletoStr (gate_res ، d) + "sup =" + doubletoStr (gate_sup ، d)) ؛ |
| nowper = t ؛ |
| > |
| //---- |
| بازگشت (0) ؛ |
| > |
| //+------------------------------------------------------------------+ |
| // این عملکرد تعیین می کند که آیا نوار فعلی یک نوار برک آوت است |
| BOOL ISBO (STRING SYM ، INT PER ، BOOL ISUP) |
| // چند برابر ATR را دریافت کنید تا مشخص شود که آیا از بین رفته است |
| double bo = ext_atr_bo * iAtr (سیم ، در هر ، ext_atr ، 1) ؛ |
| // نوار فعلی را بررسی کنید تا مشخص شود آیا Breakout اتفاق افتاده است |
| if ( isUp && iClose ( sym , per , 0 ) - iOpen ( sym , per , 0 )>BO) بازگشت (درست) ؛ |
| if ( ! isUp && iOpen ( sym , per , 0 ) - iClose ( sym , per , 0 )>BO) بازگشت (درست) ؛ |
| بازگشت (نادرست) ؛ |
| > |
| // این عملکرد روند را تعیین می کند |
| int getTrend (رشته Sym ، int در هر ، BOOL ISUP) |
| // بررسی اینکه آیا قیمت بیشتر از MA است (300) |
| if ( isUp && iClose ( sym , per , 0 )>IMA (SYM ، PER ، 300 ، 0 ، MODE_SMA ، PRICE_CLOSE ، 0)) بازگشت (1) ؛ |
| // بررسی اینکه آیا قیمت کمتر از MA است (300) |
| if (! isup && iClose (سیم ، در هر ، 0) |
| بازگشت (0) ؛ |
| > |
| // قرار دادن سفارش فروش در بازار |
| int dosell (رشته سیم ، int per) |
| // بررسی کنید که آیا سیستم مجاز به تجارت است |
| int trade = CheckistrAdealLowed () ، tkt = 0 ؛ |
| if (تجارت == 0) تازه کردن () ؛ |
| if ( trade>0) |
| // نوع سفارش |
| int ord = op_sell ؛ |
| // دریافت قیمت ورود |
| ورودی مضاعف = پیشنهاد ؛ |
| // با پرداخت سفارشات فروش در خروجی خود ، گسترش پیدا کنید |
| Double Spread = MarketInfo (SYM ، MODE_SPREAD) * MARKETINFO (SYM ، MODE_POINT) ؛ |
| // از دست دادن توقف اولیه - ما از بالاترین دوره در طی دوره های X به علاوه یک بافر استفاده خواهیم کرد |
| Double Exit = n (ihigh (sym ، per ، ihighest (sym ، per ، mode_high ، ext_lookback ، 0)) + (ext_atr_ini_stop * iatr (sym ، per ، ext_atr ، 1))) ؛ |
| // اضافه کردن به مقدار از دست دادن توقف اولیه |
| خروج += گسترش ؛ |
| // بررسی کنید که آیا از دست دادن توقف فراتر از سطح توقف ارز است |
| Double Stoppt = MarketInfo (SYM ، MODE_STOPLEVEL) * MARKETINFO (SYM ، MODE_POINT) ؛ |
| // در صورت عدم اصلاح ، خروج را برای پاسخگویی به الزامات سطح توقف اصلاح کنید |
| if (mathabs (ورود - خروج) |
| // مبلغ را برای هر تجارت ریسک کنید |
| ریسک دوتایی = getRiskAmount () ؛ |
| // اکنون محاسبه کنید که مبلغ خطرناک در هر تجارت در اندازه لوط برابر است |
| Double Lott = MathMax (GetLots (Sym ، Entry ، Exit ، RiskAmt) ، MarketInfo (SYM ، MODE_LOTSTEP)) ؛ |
| // همانطور که یک فرایند سفارش در بازار داریم ، به ارزش انقضا احتیاج نداریم |
| DateTime Expy = 0 ؛ |
| // ذخیره یک مقدار برای MagicNumber می تواند ذهنی باشد ، می توانید هر کاری را که می خواهید انجام دهید ، من فقط از آن استفاده خواهم کرد |
| // ارزش () نمودار فعال () |
| int magic = per ؛ |
| // آخرین لحظه ما بررسی می کند که ما سفارش آزاد فعال این ارز نداریم |
| // اگر از این عملکرد با 0 خارج شویم |
| اگر (isactive (sym ، false)) بازگشت (0) ؛ |
| // ارسال در سفارش فروش بازار |
| tkt = ordersend (سیم ، سفارش ، تعداد زیادی ، ورودی ، ext_max_slip ، خروج ، 0 ، نسخه ، جادو ، اکسپرس ، 0) ؛ |
| if ( tkt>0) |
| // پرچم Gate_active ارز فعال را به درست تغییر دهید |
| gate_active = ord ؛ |
| // تعیین قیمت خروج جهانی |
| EXIT_PRICE = خروج ؛ |
| // سفارش ورود ما قرار داده شده است بیایید اکنون خودمان را از سفارش مطلع کنیم |
| Sendmail ("سفارش فروش جدید" + SYM ، |
| "Entry =" + D (ورودی) + " n" + |
| "Stoploss =" + D (خروج) + " n" + |
| "خطر اولیه =" + D (ریسک ، 2) + " n" + |
| "ریسک واقعی =" + D (ProfitatStop (Sym ، ورود ، خروج ، تعداد زیادی ، OP_SELL) ، 2) + " n" + |
| "LOTS =" + D (تعداد زیادی ، 2) + " n" + |
| "Expiry =" + TimeToStr (Expy) + " n" + |
| "magicnum =" + جادو + " n" + |
| "HHV =" + D (ihigh (Sym ، per ، ihighest (sym ، per ، mode_high ، ext_lookback ، 0))) + " n" + + |
| "نسخه =" + نسخه + " n" |
| ); |
| >دیگری اگر (tkt == - 1) |
| // این کاری است که ما در صورت اشتباه انجام خواهیم داد - سعی کنید تا حد ممکن جزئیات را برگردانیم |
| if ( GetLastError ()>0) |
| sendmail ("اشتباه با سفارش فروش جدید" + سیم ، |
| "Entry =" + D (ورودی) + " n" + |
| "Stoploss =" + D (خروج) + " n" + |
| "خطر اولیه =" + D (ریسک ، 2) + " n" + |
| "ریسک واقعی =" + D (ProfitatStop (Sym ، ورود ، خروج ، تعداد زیادی ، OP_SELL) ، 2) + " n" + |
| "LOTS =" + D (تعداد زیادی ، 2) + " n" + |
| "Expiry =" + TimeToStr (Expy) + " n" + |
| "magicnum =" + جادو + " n" + |
| "HHV =" + D (ihigh (Sym ، per ، ihighest (sym ، per ، mode_high ، ext_lookback ، 0))) + " n" + + |
| "نسخه =" + نسخه + " n" |
| ); |
| > |
| > |
| > |
| بازگشت (TKT) ؛ |
| > |
| int dobuy (رشته سیم ، int per) |
| int trade = CheckistrAdealLowed () ، tkt = 0 ؛ |
| if (تجارت == 0) تازه کردن () ؛ |
| if ( trade>0) |
| int ord = op_buy ؛ |
| ورودی دوگانه = بپرسید ؛// گسترش پرداخت شده در هنگام ورود |
| Double Exit = n (ilow (sym ، per ، ilowest (sym ، per ، mode_low ، ext_lookback ، 0))) - (ext_atr_ini_stop * iatr (sym ، per ، ext_atr ، 1))) ؛// قیمت مناقصه |
| Double Stoppt = MarketInfo (SYM ، MODE_STOPLEVEL) * MARKETINFO (SYM ، MODE_POINT) ؛ |
| if (mathabs (ورود - خروج) |
| ریسک دوتایی = getRiskAmount () ؛ |
| Double Lott = MathMax (GetLots (Sym ، Entry ، Exit ، RiskAmt) ، MarketInfo (SYM ، MODE_LOTSTEP)) ؛ |
| DateTime Expy = 0 ؛ |
| int magic = per ؛ |
| اگر (isactive (sym ، false)) بازگشت (0) ؛// بررسی آخرین لحظه! |
| // ارسال در سفارش ورود به بازار |
| tkt = ordersend (سیم ، سفارش ، تعداد زیادی ، ورودی ، ext_max_slip ، خروج ، 0 ، نسخه ، جادو ، اکسپرس ، 0) ؛ |
| if ( tkt>0) |
| gate_active = ord ؛ |
| EXIT_PRICE = خروج ؛ |
| sendmail ("سفارش خرید جدید برای" + Sym ، |
| "Entry =" + D (ورودی) + " n" + |
| "Stoploss =" + D (خروج) + " n" + |
| "خطر اولیه =" + D (ریسک ، 2) + " n" + |
| "ریسک واقعی =" + D (ProfitatStop (Sym ، ورود ، خروج ، تعداد زیادی ، OP_BUY) ، 2) + " n" + |
| "LOTS =" + D (تعداد زیادی ، 2) + " n" + |
| "Expiry =" + TimeToStr (Expy) + " n" + |
| "magicnum =" + جادو + " n" + |
| "llv =" + d (ilow (sym ، per ، ilowest (sym ، per ، mode_low ، ext_lookback ، 0))) + " n" + + |
| "نسخه =" + نسخه |
| ); |
| >دیگری اگر (tkt == - 1) |
| if ( GetLastError ()>0) |
| sendmail ("اشتباه با سفارش خرید جدید برای" + سیم ، |
| "Entry =" + D (ورودی) + " n" + |
| "Stoploss =" + D (خروج) + " n" + |
| "خطر اولیه =" + D (ریسک ، 2) + " n" + |
| "ریسک واقعی =" + D (ProfitatStop (Sym ، ورود ، خروج ، تعداد زیادی ، OP_BUY) ، 2) + " n" + |
| "LOTS =" + D (تعداد زیادی ، 2) + " n" + |
| "Expiry =" + TimeToStr (Expy) + " n" + |
| "magicnum =" + جادو + " n" + |
| "llv =" + d (ilow (sym ، per ، ilowest (sym ، per ، mode_low ، ext_lookback ، 0))) + " n" + + |
| "نسخه =" + نسخه |
| ); |
| > |
| > |
| > |
| بازگشت (TKT) ؛ |
| > |
| // اصلاح شده از http://articles. mql4. com/141 |
| int checkistradeallowed (uint maxwaiting_sec = 30) |
| // ابتدا بررسی کنید که آیا پایان روز فارکس است |
| // Pepperstone به ما اجازه نمی دهد بین ساعت 17:00 - 17:05 NY EST تجارت کنیم |
| if (ساعت () == 0 && دقیقه ()<5 ) |
| چاپ (" در این مدت امکان معامله وجود ندارد، بازار بسته می شود"); |
| بازگشت (- 1 ); |
| > |
| اگر ( ! IsTradeAllowed ()) |
| uint StartWaitingTime = GetTickCount (); |
| در حالی که (درست) |
| اگر (توقف شده است ()) |
| چاپ ( "کارشناس توسط کاربر خاتمه یافت!" ); |
| بازگشت (- 1 ); |
| > |
| if ( GetTickCount () - StartWaitingTime>MaxWaiting_sec * 1000) |
| چاپ ( " بیش از حد انتظار " ); |
| بازگشت (- 2 ); |
| > |
| if ( IsTradeAllowed () ) retu ( 0 ); |
| خواب ( 100 ); |
| > |
| >دیگر |
| بازگشت (1)؛ |
| > |
| بازگشت (- 1 ); |
| > |
| // مقدار پولی که برای هر معامله ریسک می شود را محاسبه می کند |
| دو برابر getRiskAmount () |
| بازگشت ( MathMax ( EXT_RISK_MINAMT , ( AccountBalance () + getStopPL () ) / EXT_RISK_DIVISOR ) ); |
| > |
| // مجموع سود/زیان همه موقعیت های باز را محاسبه می کند، به گونه ای که گویی هر معامله باز باید انجام شود |
| // بلافاصله با قیمت توقف فعلی خود خارج شوید |
| دوبار getStopPL () |
| int tot = OrdersTotal (); |
| نتیجه دو برابر = 0 ; |
| for ( int i = tot ; i>= 0 ; i -= 1) |
| if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) |
| result += profitAtStop ( OrderSymbol (), OrderOpenPrice (), OrderStopLoss (), OrderLots (), OrderType () ); |
| > |
| > |
| بازگشت (نتیجه)؛ |
| > |
| // سود/زیان معامله را در صورت ضربه زدن به استاپ محاسبه می کند |
| double profitAtStop ( رشته سیم، دو باز، دو استاپ، دو لات، نوع int) |
| نتیجه مضاعف = تعداد زیادی * MarketInfo ( sym , MODE_TICKVALUE ) / MarketInfo ( sym , MODE_TICKSIZE ); |
| اگر (نوع == OP_BUY) |
| retu (N (( توقف - باز ) * نتیجه , 2 ) ); |
| >else if (نوع == OP_SELL) |
| بازگشت (N ((باز توقف) * نتیجه، 2)); |
| > |
| بازگشت (0) ؛ |
| > |
| // تابع میانبر برای NormalizeDouble |
| دو برابر N ( دو برابر d , int dig = 0 ) |
| if ( dig == 0 ) dig = رقم ; |
| بازگشت (NormalizeDouble (d, dig)); |
| > |
| // اندازه موقعیت معامله را با توجه به ورود، ضرر اولیه و ریسک محاسبه می کند |
| دوبار getLots (سیم سیم رشته، دو ورودی، توقف دوگانه، ریسک دوگانه) |
| دو فاصله = MathAbs (ورود - توقف)، |
| نتیجه = (ریسک * MarketInfo ( sym , MODE_TICKSIZE ) ) / ( dist * MarketInfo ( sym , MODE_TICKVALUE ) ); |
| بازگشت (N (نتیجه 2)); |
| > |
| // تابع میانبر برای تبدیل دوبل به رشته |
| رشته D (d double , int dig = 0 ) |
| if ( dig == 0 ) dig = رقم ; |
| بازگشت (DoubleToStr (d, dig)); |
| > |
| // بررسی کنید که آیا نماد در حال حاضر موقعیت باز دارد یا خیر |
| int isActive ( string sym , bool checkStop ) |
| int tots = OrdersTotal (); |
| for ( int i = tots ; i>= 0 ; i -= 1) |
| if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) |
| اگر ( OrderSymbol () == Sym ) |
| // بررسی کنید که آیا ما در حال بررسی توقف انتهایی در یک سفارش فعال هستیم |
| اگر ( بررسی Stop && OrderType ()<2 ) |
| // همانطور که ما در حال بررسی استاپ ها هستیم، بیایید این یکی را بررسی کنیم |
| // در اینجا توجه کنید که چگونه وقتی OrderMagicNumber را ذخیره می کردیم از آن برای ذخیره Period استفاده می کردیم |
| // هدف از این این است که به ما کمک کند در مورد ما از چه دوره زمانی استفاده شده است |
| // از چند فریم زمانی برای این EA در یک ارز استفاده کنید |
| EXIT_PRICE = getTrailingStop ( sym , OrderOpenPrice (), OrderStopLoss (), OrderOpenTime (), OrderMagicNumber (), OrderType () ); |
| TRADE_TKT = Order Ticket (); |
| TRADE_LOTS = OrderLots (); |
| > |
| بازگشت (OderType () ); |
| > |
| > |
| > |
| بازگشت (- 1 ); |
| > |
| // این تابع به پارامترهای زیر نیاز دارد: |
| // sym = واحد پول |
| // op = قیمت افتتاحیه معامله جاری |
| // sl = قیمت توقف ضرر معامله جاری |
| // ot = تاریخ افتتاح معامله فعلی |
| // per = دوره نمودار فعال - برای محاسبه صحیح فاصله ATR |
| // type = نوع سفارش معامله جاری |
| double getTrailingStop ( string sym , double op , double sl , datetime ot , int per , int type ) |
| دمای دو برابر؛ |
| // نتیجه این تابع را در ابتدا برابر با توقف ضرر کنید |
| نتیجه مضاعف = sl ; |
| // مسافت توقف عقب را محاسبه کنید |
| مضاعف atr = iATR ( sym , per , EXT_ATR , 1 ) * EXT_ATR_TRAILSTOP ; |
| // بررسی کنید که آیا ما در نوار ورودی کار می کنیم یا خیر، اگر چنین است به نمودارهای دقیقه ای بروید تا متوجه شوید |
| // بالاترین بالا یا پایین ترین مقدار از زمان ورود (به جای استفاده از کل نوار) چقدر است |
| // همانطور که Pepperstone میله های آنها را با زمان باز شدن آن نوار مهر زمانی نشان می دهد، می توانیم قاب کنیم |
| // منطق ما با بررسی اینکه آیا نوار فعلی کمتر یا مساوی نوار فعلی است |
| // اگر چنین است، نوار فعلی *نوار ورودی است. |
| if (iTime (sym , per , 0 )<= ot ) |
| temp = getMinutePrice ( sym , ot , atr , type ); |
| if ( type == OP_BUY && temp>نتیجه ) نتیجه = دما ; |
| اگر ( == OP_SELL && temp |
| > |
| // میله های نمودار دوره های جاری را دریافت کنید |
| int b = iBars (sym, per); |
| // بیایید اکنون نوارها را حلقه بزنیم، با آخرین نوار شروع می کنیم |
| برای (int i = 0; i |
| // اگر زمان نمودار فعال کمتر از زمان باز شدن معامله باشد، پایان دهید |
| if (iTime (sym, per, i) |
| // محاسبه مسافت انتهایی ATR - با استفاده از دوره نمودار فعال |
| // و همیشه از ATR نوار قبلی به عنوان نوار فعلی استفاده می کند |
| // تشکیل |
| atr = iATR ( sym , per , EXT_ATR , i + 1 ) * EXT_ATR_TRAILSTOP ; |
| // برای معاملات طولانی |
| اگر (نوع == OP_BUY) |
| // با استفاده از نمودار اوج دقیقه فاصله ATR را کم کنید |
| temp = iHigh ( sym , per , i ) - atr ; |
| // با بهترین نتیجه فعلی مقایسه کنید و اگر بهتر است نتیجه را اصلاح کنید |
| if ( temp>نتیجه ) نتیجه = دما ; |
| // برای معاملات کوتاه مدت |
| >else if (نوع == OP_SELL) |
| // با استفاده از کمینه نمودار دقیقه فاصله ATR را اضافه کنید |
| TEMP = ILOW (SYM ، PER ، I) + ATR ؛ |
| // با بهترین نتیجه فعلی مقایسه کنید و اگر بهتر است نتیجه را اصلاح کنید |
| if (دما |
| > |
| > |
| // نتیجه را برگردانید ، دو برابر را عادی کنید |
| بازگشت (n (نتیجه)) ؛ |
| > |
| // این عملکرد بالاترین یا کمترین پایین را در نمودار دقیقه باز می گرداند |
| // پارامترهای این عملکرد: |
| // sym = نماد ارز |
| // ot = افتتاح DateTime از تجارت |
| // ATR = مقدار ATR که به عنوان فاصله دنباله دار استفاده می شود |
| // نوع = نوع سفارش تجارت |
| Double GetMinutePrice (String Sym ، DateTime OT ، Double ATR ، نوع int) |
| int per = perio_m1 ؛ |
| int b = iBars (sym, per); |
| // بهتر است با یک مقدار شروع کنید ، نه 0 |
| دو نتیجه = iClose (Sym ، per ، 0) ؛ |
| برای (int i = 0; i |
| // هنگامی که نوار فعال کمتر از زمان باز است ، ما در حال تجزیه و تحلیل هستیم |
| // میله های قبل از ورود ، بنابراین از آنجا خارج شوید |
| if (iTime (sym, per, i) |
| if ( type == OP_BUY && iHigh ( sym , per , i )>نتیجه) نتیجه = ihigh (Sym ، per ، i) ؛ |
| if (نوع == op_sell && ilow (سیم ، در هر ، i) |
| > |
| // اکنون که از زمان ورود بالاترین مقدار را پیدا کرده ایم ، فاصله ATR را کم می کنیم |
| if (نوع == op_buy) بازگشت (نتیجه - ATR) ؛ |
| // اکنون که از زمان ورود کمترین مقدار را پیدا کرده ایم بیایید فاصله ATR را اضافه کنیم |
| if (نوع == op_sell) بازگشت (نتیجه + ATR) ؛ |
| > |
| // این عملکرد در بازار خارج می شود ، اما به پارامترهای زیر نیاز دارد: |
| // Sym = نماد ارز |
| // TKT = شماره بلیط معاملات |
| // تعداد زیادی = اندازه معاملات |
| // P = قیمت برای خروج در |
| BOOL EXITNOW (STRING SYM ، INT TKT ، DOUBLE LOTS ، DOUBLE P) |
| // بررسی کنید که آیا خروج از تجارت اشکالی ندارد |
| int trade = CheckistrAdeAllowed () ؛ |
| // اگر خوب برای سفارش سفارش دهید ، تجارت کنید |
| if ( trade>0) |
| if (OrderClose (tkt ، لات ، p ، ext_max_slip ، 0)) |
| // تجارت موفق شده است |
| exit_price = 0 ؛ |
| gate_active = - 1 ؛// تنظیم مجدد |
| // بیایید اکنون از طریق معاملات تاریخی حلقه کنیم و برخی از داده ها را برای بازگشت بدست آوریم |
| int t = orderShistoryTotal () ؛ |
| for ( int i = t ; i>= 0 ; i -= 1) |
| if (orderselect (i ، select_by_pos ، mode_history)) |
| if (OrderTicket () == TKT) |
| Double OP = OrderOpenPrice () ؛ |
| dateTime ot = OrderOpentime () ؛ |
| Double SL = OrderStopLoss () ؛ |
| Double PR = OrderProfit () ؛ |
| int typ = OrderType () ؛ |
| رشته D ؛ |
| if (typ == 0) d = "طولانی" ؛ |
| if (typ == 1) d = "کوتاه" ؛ |
| دوتایی CP = OrderClosePrice () ؛ |
| dateTime ct = OrderClosetime () ؛ |
| int mag = OrderMagicNumber () ؛ |
| Double Comm = OrderCommission () ؛ |
| مبادله دوبل = سفارشات () ؛ |
| لغزش دوتایی ؛ |
| if (typ == op_buy) slip = cp - p ؛ |
| if (typ == op_sell) slip = p - cp ؛ |
| زنگ تفريح ؛ |
| > |
| > |
| > |
| // ارسال هشدارها |
| Sendmail ("خروج" + D + "برای" + SYM ، |
| "سود/ضرر =" + D (PR ، 2) + " n" + |
| "هشدار قیمت =" + D (P) + " n" + |
| "نزدیک قیمت =" + D (CP) + " n" + |
| "بستن زمان =" + timeToStr (ct) + " n" + |
| "کمیسیون شارژ شده =" + D (Comm ، 2) + " n" + |
| "مبادله های مبادله =" + D (مبادله ، 2) + " n" + |
| "slippage =" + d (لغزش) + " n" + |
| " n" + |
| "قیمت باز =" + D (op) + " n" + |
| "زمان باز =" + TimeToStr (OT) + " n" + |
| "شماره جادویی =" + جادو + " n" + |
| "Stop Loss =" + D (SL) + " n" |
| ); |
| بازگشت (درست) ؛ |
| >دیگر |
| // هشدار در عدم موفقیت در تجارت |
| Sendmail ("ERRE EXIT OF" + D + "برای" + SYM ، |
| "err =" + getLasterRor () + " n" + |
| "هشدار قیمت =" + D (P) + " n" + |
| "نزدیک قیمت =" + D (CP) + " n" + |
| "بستن زمان =" + TimeToStr (CT) + " n" |
| ); |
| > |
| > |
| بازگشت (نادرست) ؛ |
| > |
| // |
| // اسکریپت های خط روند |
| // |
| Double GetTrendline (String Sym ، Int Per ، Bool ISUP) |
| int swingarray [] ، temparray [] ؛ |
| initbarsarray (سیم ، در هر ، swingarray) ؛// آرایه اولیه با تمام میله ها |
| // آرایه را با توجه به مجموعه سطح نوسان اصلاح کنید |
| برای (int s = 0 ؛ s<= EXT_SWINGS ; s += 1 ) |
| int arrlen = arraysize (swingarray) ؛ |
| برای (int a = 2 ؛ a |
| if (isup) |
| if (ispeak (sym ، swingarray [a - 2] ، swingarray [a - 1] ، swingarray [a] ، per)) intarraypush (temparray ، swingarray [a - 1]) ؛ |
| >دیگر |
| if (istrough (sym ، swingarray [a - 2] ، swingarray [a - 1] ، swingarray [a] ، per)) intarraypush (temparray ، swingarray [a - 1]) ؛ |
| > |
| > |
| // کپی آرایه |
| Flusharray (swingarray) ؛ |
| Arraycopy (Swingarray ، Temparray) ؛ |
| Flusharray (temparray) ؛ |
| > |
| // اکنون که مجموعه ای از تمام نقاط نوسان معتبر را داریم ، هر ترکیب را آزمایش می کنیم |
| // از نقاط برای تعیین اینکه آیا آنها خطوط روند هستند که مشخصات ما را برآورده می کنند |
| نتیجه مضاعف ، Tempresult ؛ |
| int arrSize = arrySize (swingarray) ؛ |
| برای (a = 0 ؛ a |
| // ابتدا مقدار خط روند افقی این نقطه نوسان را آزمایش خواهیم کرد |
| tempresult = getLastValidPoint (Sym ، Swingarray [a] ، swingarray [a] ، per ، isup) ؛ |
| // اگر شماره ای غیر از صفر را از عملکرد نقطه معتبر خود بدست آوریم ، این خط روند را ترسیم خواهیم کرد |
| if ( tempResult>0) |
| // بیایید آخرین نقطه معتبر خط روند افقی را مقایسه کنیم تا ببینیم آیا |
| // از نتیجه فعلی ما به قیمت نزدیکتر است |
| if (نتیجه == 0) نتیجه = tempresult ؛ |
| if (isup && tempresult |
| if ( ! isUp && tempResult>نتیجه) نتیجه = tempresult ؛ |
| // خط روند ترسیم |
| if (isup) |
| ObjectCreate ("res@" + swingarray [a] ، obj_trend ، 0 ، زمان [swingarray [a]] ، high [swingarray [a]] ، زمان [0] ، tempresult) ؛ |
| ObjectSet ("res@" + swingarray [a] ، objprop_style ، style_solid) ؛ |
| ObjectSet ("res@" + swingarray [a] ، objprop_color ، ext_res_color) ؛ |
| >دیگر |
| ObjectCreate ("sup@" + swingarray [a] ، obj_trend ، 0 ، زمان [swingarray [a]] ، low [swingarray [a]] ، زمان [0] ، tempresult) ؛ |
| ObjectSet ("sup@" + swingarray [a] ، objprop_style ، style_solid) ؛ |
| ObjectSet ("sup@" + swingarray [a] ، objprop_color ، ext_sup_color) ؛ |
| > |
| > |
| // بعد خطوط روند شیب دار را آزمایش خواهیم کرد |
| برای (int b = a + 1 ؛ b |
| // آخرین نقطه معتبر خط روند شیب دار را دریافت کنید |
| tempresult = getLastValidPoint (Sym ، Swingarray [A] ، Swingarray [B] ، در هر ، ISUP) ؛ |
| if ( tempResult>0) |
| // بیایید آخرین نقطه معتبر خط روند شیب دار را مقایسه کنیم تا ببینیم آیا |
| // از نتیجه فعلی ما به قیمت نزدیکتر است |
| if (نتیجه == 0) نتیجه = tempresult ؛ |
| if (isup && tempresult |
| if ( ! isUp && tempResult>نتیجه) نتیجه = tempresult ؛ |
| // خط روند ترسیم |
| if (isup) |
| ObjectCreate ("sloperes@" + swingarray [a] ، obj_trend ، 0 ، زمان [swingarray [a]] ، high [swingarray [a]] ، زمان [0] ، tempresult) ؛ |
| ObjectSet ("sloperes@" + swingarray [a] ، objprop_style ، style_solid) ؛ |
| ObjectSet ("sloperes@" + swingarray [a] ، objprop_color ، ext_slope_res_color) ؛ |
| >دیگر |
| ObjectCreate ("slopesup@" + swingarray [a] ، obj_trend ، 0 ، زمان [swingarray [a]] ، low [swingarray [a]] ، زمان [0] ، tempresult) ؛ |
| ObjectSet ("slopesup@" + swingarray [a] ، objprop_style ، style_solid) ؛ |
| ObjectSet ("slopesup@" + swingarray [a] ، objprop_color ، ext_slope_sup_color) ؛ |
| > |
| > |
| > |
| > |
| // مقدار نزدیکترین مقدار فعلی خط روند را برگردانید |
| بازگشت (نتیجه)؛ |
| > |
| void intarraypush (int & arr [] ، int elem) |
| اندازه int = arrySize (arr) ؛ |
| ArrayResize (ARR ، اندازه + 1) ؛ |
| arr [size] = elem ؛ |
| > |
| void initbarsarray (رشته Sym ، int per ، int & arr []) |
| int b = iBars (sym, per); |
| for ( int i = b - 1 ; i>ext_no_swing_lmt ؛من -= 1) |
| intarraypush (arr ، i) ؛ |
| > |
| > |
| void flusharray (int & arr []) |
| arrayinitialize (arr ، 0) ؛ |
| ArrayResize (arr ، 0) ؛ |
| > |
| bool istrough (رشته Sym ، سمت چپ ، int mid ، int راست ، int per) |
| if ( iLow ( sym , per , left )>= ilow (سیم ، در هر ، اواسط) && ilow (سیم ، در هر ، اواسط) |
| بازگشت (نادرست) ؛ |
| > |
| BOOL ISPEAK (STRING SYM ، INT LEFT ، INT MID ، INT RIGHT ، INT PER) |
| اگر (ihigh (sym ، per ، چپ) ihigh (sym ، per ، راست)) بازگشت (درست) ؛ |
| بازگشت (نادرست) ؛ |
| > |
| Double getLastValidPoint (STRING SYM ، INT B1 ، INT B2 ، INT PER ، BOOL ISUP) |
| // ابتدا شیب خط روند را برای بررسی شیب آن به دست می آوریم |
| شیب دوتایی = getSlope (Sym ، B1 ، B2 ، Per ، ISUP) ، Pt ، Buffer ؛ |
| // ما از مضربی از ATR برای بررسی اینکه آیا خط روند خیلی واضح است یا خیر استفاده خواهیم کرد |
| // اگر باشد با مقدار 0 از آن خارج می شویم |
| if ( MathAbs ( slope )>iATR (sym , per , EXT_ATR , 0 ) * EXT_ATR_MAX_SLOPE ) retu ( 0 ); |
| // در غیر این صورت اکنون آزمایش خواهیم کرد که آیا خط روند مقدار مناسبی داشته است یا خیر |
| // بدون تجاوز از تعداد بسته های فراتر از آن لمس می کند. |
| int x = 0 , t = 0 , lastTouch ; |
| for ( int i = b1 ; i>= 0 ; i -= 1) |
| // اضافه کردن یک بافر در صورتی که قیمت به خط روند نزدیک شود اما در واقع لمس نشود |
| بافر = iATR ( sym , per , EXT_ATR , i ) * EXT_ATR_BUFFER ; |
| if (isup) |
| pt = iHigh ( sym , per , b1 ) + ( شیب * ( b1 - i ) ); |
| if ( iClose ( sym , per , i )> pt && i>0 ) x += 1 ; |
| // یک "لمس" زمانی ایجاد می شود که یک قله را تشکیل داده باشد |
| if (i == lastTouch && isPeak ( sym , i + 2 , i + 1 , i , per ) ) t += 1 ; |
| if ( iHigh ( sym , per , i ) + buffer>= pt ) lastTouch = i - 1 ; |
| >دیگر |
| pt = iLow ( sym , per , b1 ) + (slope * (b1 - i ) ); |
| if (iClose (sym, per, i)0 ) x += 1 ; |
| // یک "لمس" زمانی ایجاد می شود که یک فرورفتگی تشکیل داده باشد |
| if ( i == lastTouch && isTrough ( sym , i + 2 , i + 1 , i , per ) ) t += 1 ; |
| if ( iLow ( sym , per , i ) - buffer |
| > |
| // بررسی کنید که آیا خط روند تعداد بسته ها را شکسته است تا آن را باطل کند |
| if ( x>EXT_NULL_CLOSES ) |
| // ما می خواهیم خطوط شکسته خود را ترسیم کنیم، با این حال، فقط می خواهیم ترسیم کنیم |
| // آن خطوط روند شکسته ای که از تعداد لمس های ما فراتر رفته است |
| // بین نقاط نوسان آنها شکسته نشد |
| اگر من= EXT_NUM_TOUCHES ) |
| if (isup) |
| ObjectCreate ( " BrokenTL@ " + b1 , OBJ_TREND , 0 , Time [ b1 ] , High [ b1 ] , Time [ i ] , pt ); |
| ObjectSet (" BrokenTL@" + b1، OBJPROP_RAY، false); |
| ObjectSet ( " BrokenTL@ " + b1 , OBJPROP_STYLE , STYLE_SOLID ); |
| ObjectSet ( " BrokenTL@ " + b1 , OBJPROP_COLOR , EXT_SLOPE_RES_COLOR ); |
| >دیگر |
| ObjectCreate ( " BrokenTL@ " + b1 , OBJ_TREND , 0 , Time [ b1 ], Low [ b1 ], Time [ i ], pt ); |
| ObjectSet (" BrokenTL@" + b1، OBJPROP_RAY، false); |
| ObjectSet ( " BrokenTL@ " + b1 , OBJPROP_STYLE , STYLE_SOLID ); |
| ObjectSet ( " BrokenTL@ " + b1 , OBJPROP_COLOR , EXT_SLOPE_SUP_COLOR ); |
| > |
| > |
| بازگشت (0) ؛ |
| > |
| > |
| // اگر خط روند از تعداد لمس ها بیشتر شود، مقدار فعلی خط روند را برمی گرداند |
| if ( t>= EXT_NUM_TOUCHES ) retu ( pt ); |
| // در غیر این صورت 0 را برگردانید |
| بازگشت (0) ؛ |
| > |
| double getSlope ( string sym , int b1 , int b2 , int per , bool isUp ) |
| اگر (b1 == b2) برگرداند (0); |
| if (isup) |
| بازگشت ( ( iHigh ( sym , per , b1 ) - iHigh ( sym , per , b2 ) ) / ( b2 - b1 ) );// b2 - b1 عمدی است |
| >دیگر |
| بازگشت ( ( iLow ( sym , per , b1 ) - iLow ( sym , per , b2 ) ) / ( b2 - b1 ) );// b2 - b1 عمدی است |
| > |
| > |