From c6e5a526cf2eea934230c36a6bea66fddb232675 Mon Sep 17 00:00:00 2001 From: biohazardxxx Date: Thu, 22 May 2025 09:39:01 +0200 Subject: [PATCH] feat: implement magicnumber and symbold filter (unbelivable such sophisticated code is missing that!) --- include/Expert/Trading Panel.mq5 | Bin 4194 -> 2447 bytes include/TradingAgent.mqh | Bin 24966 -> 12299 bytes include/TradingHelper.mqh | Bin 33164 -> 17814 bytes include/TradingPanel.mqh | 1012 +++++++++++++++--------------- include/TrailingStop.mqh | Bin 26218 -> 12961 bytes 5 files changed, 506 insertions(+), 506 deletions(-) diff --git a/include/Expert/Trading Panel.mq5 b/include/Expert/Trading Panel.mq5 index f134805298d9e70dc1f9112192e660e2ed8c73d2..9a2c3eb71504bc730c452ab1bc31585d7843f593 100644 GIT binary patch literal 2447 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 literal 24966 zcmeHPZF3v95yt1v^gl4lw3TheZ)w_$6MIH4j;+>~J)-Qy`J%BUI#wb|sz~L{Nq>6V z=fQHd3moovN0W-%YB&^6B(PX4_SrY!?%)5q5pINQ;iLE9buIip{0`jQ2)~5h!e2Y# zG`tM^;UFA^Z^A0x16+;6^)L+o2yZa{FRl1l569so`~+$Tpz#J2df|4s8E%D7!wRnd zj!{PV{tVYIa6QEPXS}~dd;Y!}4)N-R?eqSl_}>7%2B7*q{_caTw)}LL9C;pN4x?}< zO5ZsCD`s&Muj`oE0orgDukhai=Ir@-pY-QL%;Yq#38gp2%JjlsVU3nT`;}XYnoy!V z!U$aXJ$zDo`Th|9AK{xrNNXRf*9)Hq(Y6D8C;HY$d+Lp9+r9JN)WS1pNiW2-z z{*O^FkE4{xcTS5mA3I zxerOF(lyzLq`CTIV4dqu6x&SJK!bBwpHQeuS7~u3uRvoIwah4Nfx=_(AROef)ZY9g z1+KWP&Jk!0!HuWHl~zh0qetC~l=h=kDO*}P+RqX6_z+a95+(-7IW1b9y}g6qPNH2Q zHulb2Rh$gct3yX*Ml3?cW}dbPKlq zXE$I#CMcY8HvJ06XgQEdx4=3P|S~kX;`mzfwzQpG~WFc1TF0@`Pjp3RjnKsqwPWAg&808qWdl=;mqaK4g zwQ2+zac#~pThgY+(eDsLJ%@$exJJ^RK1wiDrP>GGA25S`P<_)#n>z6_+C%o?YRfv; zbCA=fzpV01Ef~S$--YI^%p@z(qF#(1euM=~S85d2AfcZk#~giH>pmpOsDm@SGO>t$ zeGEVUti|mzA`?MbiGr=dCNzjTwS3OiOCX6J`79!13!lR%vr9x?G$L)4E)nSUpV!kc zG+)HoN~}kltKM<|+%(}VwM^`L2yCsvh7EB29sCOOhogyom=7(r9HQ&bsRL@+>XeS-ckVVkB&xzu|-dLQO!ZAbnZZJC*L@7Y!x7@zgv9W?5o zzhDH)n0g-`DEHDfFYB`fiLh7OSy@kB9f#KwYp=9R-a&u!yjFc$cMhnT%w>t)Z!q7s z6r`Wcq-{U1L2Y~68k|IVQTv!ZGC!zBvSx)=3tm%l8E?5#A38)_FRNK?X%S~Rb{#rB zdK~p

2+aN;z&Fp2rUZWGfN@H}jI_cBMF#oTc&4L(J00snrq8z77%hrqO1**17em z_Oi8l41VgPv{`zp&8_xLJ-{&5kr-=EZ@C68C971cJiX5ju(b#3&(W9l4b=&sSF5!W z6k28N4)nY3x66F&x6jAKju=udV?u9P>#q&>O{izC)jc;eZ&5#f`4`2S#Y=s78P*(^ zV-_hD4RVxbz5K@NO{^sP?3uq#uM=DeZ(XcmUPx+HT5IvvrsQp;HNB)r*lH+gPqiuL zVWj66J@cAL+H;y8Q4UgXQ>}}nRCE6#RB|+x`^a2u&CzHHs zf4ffErK-C~ALuc;6L(D%F|=ok^<$}RD&=5eok}&$w6A7j(*Dv1n*Eme#qzRCAK2Xo ziVQ7UJU|_WabBIqa!;7M%a8E7f@{_b$H?bS;f-Xs$#OfPP472CtGw;BQJ7m2qetL} zBmELjcc@3Sm`#4Yi#>@RcHro3xns6;zCY2`uQt_Dy+wJ9(;kNyPwIfoZ(04K4CKnA zSbu$h=x7J?(Kcy~OKXbyE6*QLvXn9R0>uI-t@Y$LO2LmP>!_5j$9m;Y*qLLUZ5O** z1H2@jqTIfSyVo07^%tPyXDMq~wCYdzl^hv89i2(8uo55b+TA>lm@T#uZ~c z?(NEMp{?jLIP>jE+jGYMWtS`;{YsH*&j)$rd5T=7RULkf6%~!G&PjAh==$q!((Xgf zJHXI3w5LwuDXz*qy$c7=fa3bmf4lYWLoUkMyR3JP9Im`-&3x88U7<1XV3yBpPFiJC zU8hy^XUACK>aqvp5xQQfYAViH#m_TUuhS`Sk}vN8n|Fb-`gWQ_<*kV9Q`k1njkfAw zLWftMSNIqK0nEjSHL+c6cMY$S{Skb9P?*p4Xib=3u@=4tYs1;|yu*)?7g`26$3?El zo2`=I*jtIJyhz_HnE09xqOVD9)w_<8uhR}jJ;5wEB7IvmtJ#6Aeu}(j7qfm=W4C2) zwzA?umO+_0G}rnn1@;ZQvU{OXB6X0{L&C4I>psrs{>~YXP(> z;`f){x{AZ44Uihk|E~?`!xBhL?)Ads$1s0s1w8Wo_4{N69!>0W9p+Q-Ev@?#Yb7hp z>Y}%R;zccA))7h`w?uE6Rr~_Jf_Viiz^5*Eqqoos?hWw7li^ph3{ztkezH=^Q}v7{ zRuLDiDlLa^IY=-eA34VMN(yUaQoZ_i}w5V)m+r_U1?LA?GS#oX`fT1 znfClVi57HDsqaYRh86U90g0_)j*l?E=kb%Lx8=+>&lJ;>w&6HmZ=Ee8D`xd6ulMH8 z>uUI_HLpIZnunZZY_ILzu$;=qYms?!IVH1$723d?=a0`26KSrbyI(wyA!pE;8NY!Z zS9iYnJEJ?+Bjp^iX6jt$6xnTZ25DovKlLY^ym#m(p9C0h!J~^Dt|6V&W7oDdGAyf99ttlu_%VU>0@Y5)3mOVE1wMWavQ~y%wxp- zZ(s?kv2%VBrsNa$qCI3z!c+e{c+omNz|5=Xk3rhV>)X_}_9otFKb`t>xN#4FBsZa3H56t7DpMN+;cC zlaQPg72TRuLPn#?v!7d?oFuojYO3$kEUl)sw|wSZR^L;ZZFU+p&oaMu+VBua*#Jh~ z1u3?M(~xoqzheG`=dGyu5)D3>px`)Ge|dI8=(3)yEpr=MU2R!adMoX74^bCwX$hrL z>DHF@h?8;NUmct-*N2b@@8YC=86&cy{Xc|-G&#MWvRxDcXs=ndrqv(ESgDK`v9(=2 zU-OA*Z!772yHdA^q%QZe7CvIgSJ+y4|D2-0_m^55^B<$sm3O0|`^I&1@TXMPC!UR& zmz+*nf@hZ#z`U#N32epRV)nI)D^?m-Vy?w}i|F^(*V82qh=wufOQc&*ou`SPprXmU zR_`N|;JFSv0XFY3zQ9<_C|3{*5T&eH@@~T|eExvXZCFy)|Bl>FqFAZw{FuM^oRv~3 z$lUIk&S(+y zc~KaL_spwy%#Ie~rgRU2w}EUmzK3$gEWM@9(;s8r=dM1jiwnDEpE0KVVUwZFG*ebn2&vGGva)$RGSe?wo0n_ z)7G~f1GUrV#aS(}49tp&k=bolPRI14oyBTrt?EZ9+bYXrdf1ncd+`*#{=QiKjrB$A zquJwT#O+jT6Nv)eknT7 z$Gqu$^diya$0_40w_ZIwV^|QKRdAgM1t|6J3zJ@rBxjJwAQ|6*tSPrD`?j*k4c+)m3JL; z>DW^>|NG?9Zif2Q&w0(SY1GB;{nqW6mT@EJ6?on$#|uwI@IHbZ8G5H-Qy;G{z9ubt zWn)dpgl{_y4Psl&!tkVl%!*GUt?%#YY(TX~KtyTz^v2Wb;)~12+!IkP>ADuO3MJjuXK>fs`{}$Xjd$hB=4Vgx?#`D{;aM|z!uV{Q<^IXC wAa5<|9Yusz+6c4@K600LFY<>;M1& diff --git a/include/TradingHelper.mqh b/include/TradingHelper.mqh index 4f71b8fe11615a427633a653a8ae2a25c55c27eb..cd42a475ed20bcdde9f213084718fdf9d945d765 100644 GIT binary patch literal 17814 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 K%?B+AR(}E-#;F(p literal 33164 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 diff --git a/include/TradingPanel.mqh b/include/TradingPanel.mqh index 02a67d5..1667ead 100644 --- a/include/TradingPanel.mqh +++ b/include/TradingPanel.mqh @@ -1,506 +1,506 @@ -//+------------------------------------------------------------------+ -//| TradingPanel.mqh | -//| Copyright 2018, Kashu Yamazaki, All Rights Reserved. | -//| https://Kashu7100.github.io | -//+------------------------------------------------------------------+ -#property copyright "Copyright 2018, Kashu" -#property strict - -#include -#include -#include -#include -#include - -#resource "\\Include\\Controls\\res\\CheckBoxOn.bmp" -#resource "\\Include\\Controls\\res\\CheckBoxOff.bmp" -#resource "\\Include\\Controls\\res\\SpinInc.bmp" -#resource "\\Include\\Controls\\res\\SpinDec.bmp" - -enum ENUM_LABEL_ALIGN{ - LEFT = -1, - CENTER = 0, - RIGHT = 1 -}; - -class TradingPanel:public CAppDialog{ - public: - void TradingPanel(int accountNum,ENUM_POSITION_HANDLING position_handling=LONG_SHORT, bool autoTrailing=true, double startSL=15, - double basic_SLwidth=10, double risk=4, double SL=15, double TP=30); - void ~TradingPanel(); - bool Init(int accountNum,ENUM_POSITION_HANDLING position_handling=LONG_SHORT,bool autoTrailing=true,double startSL=15.000000, - double basic_SLwidth=10.000000,double risk=4, double SL=15, double TP=30); - - virtual bool Create(const string name, const int x1=5,const int y1=20,const int x2=320,const int y2=420); - virtual void Update(void); - void OnTime(void); - virtual bool OnEvent(const int id,const long &lparam, const double &dparam, const string &sparam); - - private: - bool CreateLabel(CLabel &object, const string text, const uint x, const uint y, ENUM_LABEL_ALIGN align); - bool CreateEdit(CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size); - bool CreateBmpButton(CBmpButton &object,const uint x,const uint y,string BmpON,string BmpOFF,bool lock); - bool CreateButton(CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size); - bool CreateComboBox(CComboBox &object,const uint x,const uint y,const uint x_size,const uint y_size); - - // On Event - void Edit_Lots(void); - void Edit_Amount(void); - void Edit_SL(void); - void Edit_TP(void); - void Click_AutoLots(void); - void Click_FixVolume(void); - void Click_SL(void); - void Click_TP(void); - void Click_Trailing(void); - void Click_IncreaseLots(void); - void Click_DecreaseLots(void); - void Click_IncreaseAmount(void); - void Click_DecreaseAmount(void); - void Click_IncreaseSL(void); - void Click_DecreaseSL(void); - void Click_IncreaseTP(void); - void Click_DecreaseTP(void); - void Click_OrderSell(void); - void Click_OrderCross(void); - void Click_OrderBuy(void); - void Click_CloseAllSell(void); - void Click_CloseAll(void); - void Click_CloseAllBuy(void); - - protected: - CLabel mAsk_value, mSpread_value, mBid_value; // Display Ask and Bid prices - CLabel mFixVolume_label, mAmount_label; // - CLabel mAutoLots_label, mLots1_label; // - CLabel mAutoSL_label, mSL_label; // - CLabel mAutoTP_label, mTP_label; // - CLabel mAllowTrailing_label, mTrailingType_label; // - CLabel mSellPositions_value, mPositions_label, mBuyPositions_value;// - CLabel mSellLots_value, mLots2_label, mBuyLots_value; // - CLabel mSellBE_value, mBE_label, mBuyBE_value; // - CLabel mSellProfit_value, mProfit_label, mBuyProfit_value; // - CLabel mEquity_label, mEquity_value; // - CLabel mMarginLevel_label, mMarginLevel_value; // - CLabel mLeverage_label, mLeverage_value; // - CComboBox mTrailingType_box; // - CEdit mAmount_input; // - CEdit mLots_input; // - CEdit mSL_input; // - CEdit mTP_input; // - CBmpButton mAutoLots_button, mFixVolume_button; // - CBmpButton mAutoSL_button, mSL_button; // - CBmpButton mAutoTP_button, mTP_button; // - CBmpButton mTrailing_button; // - CBmpButton mIncreaseAmount_button, mDecreaseAmount_button; // Increase and Decrease buttons - CBmpButton mIncreaseLots_button, mDecreaseLots_button; // Increase and Decrease buttons - CBmpButton mIncreaseSL_button, mDecreaseSL_button; // Increase and Decrease buttons - CBmpButton mIncreaseTP_button, mDecreaseTP_button; // Increase and Decrease buttons - CButton mOrderSell_button, mOrderCross_button, mOrderBuy_button; // Sell, Cross, and Buy Buttons - CButton mCloseAllSell_button, mCloseAll_button, mCloseAllBuy_button;// Close buttons - - uint mAmount; - double mLots; - bool mFixVolume; - double mSL; // [pips] - double mTP; // [pips] - bool mEnable_SL; - bool mEnable_TP; - bool mEnable_Trailing; - TradingAgent mTA; - - #define STEP (int)(ClientAreaHeight()/18/4) // height step betwine elements - #define HEIGHT (int)(ClientAreaHeight()/18) // height of element - #define BORDER (int)(ClientAreaHeight()/24) // distance betwine boder and elements -}; - -TradingPanel::TradingPanel(int accountNum,ENUM_POSITION_HANDLING position_handling=LONG_SHORT, bool autoTrailing=true, double startSL=15, - double basic_SLwidth=10, double risk=4, double sl=15, double tp=30){ - mSL = sl; - mTP = tp; - mTA.Init(accountNum, "", 12345, NONE, LONG_AND_SHORT, position_handling, true, 0.01, autoTrailing, startSL, basic_SLwidth, risk, 0, 0); -} - -TradingPanel::~TradingPanel(void){ -} - -bool TradingPanel::Init(int accountNum,ENUM_POSITION_HANDLING position_handling=LONG_SHORT,bool autoTrailing=true,double startSL=15.000000, - double basic_SLwidth=10.000000,double risk=4, double sl=15, double tp=30){ - mSL = sl; - mTP = tp; - return mTA.Init(accountNum, "", 12345, NONE, LONG_AND_SHORT, position_handling, true, 0.01, autoTrailing, startSL, basic_SLwidth, risk, 0, 0); -} - -bool TradingPanel::Create(const string name, const int x1=5,const int y1=20,const int x2=320,const int y2=420){ - if(!Create(0,name,0,x1,y1,x2,y2)) return false; - int l_x_left=BORDER; - int l_y=BORDER; - int y_width=HEIGHT; - int y_sptep=STEP; - - if(!CreateLabel(mBid_value,DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits),l_x_left,l_y,LEFT)) return false; - if(!mBid_value.FontSize(HEIGHT-3)) return false; - mBid_value.Color(clrRed); - - int l_x_right=ClientAreaWidth()-20; - - if(!CreateLabel(mSpread_value,DoubleToString((SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/_Point,0),l_x_right-137.5,l_y,CENTER)) return false; - if(!mSpread_value.FontSize(HEIGHT-4)) return false; - if(!CreateLabel(mAsk_value,DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits),l_x_right,l_y,RIGHT)) return false; - if(!mAsk_value.FontSize(HEIGHT-3)) return false; - mAsk_value.Color(clrBlue); - - l_y+=2*HEIGHT; - int x_size=(int)((ClientAreaWidth()-40)/3-5); - - // Order Send Buttons - if(!CreateButton(mOrderSell_button,"SELL",l_x_left,l_y,x_size,HEIGHT*2)) return false; - if(!CreateButton(mOrderCross_button,"CROSS",(l_x_right-l_x_left-x_size)/2+l_x_left,l_y,x_size,HEIGHT*2)) return false; - if(!CreateButton(mOrderBuy_button,"BUY",(l_x_right-x_size),l_y,x_size,HEIGHT*2)) return false; - - l_y+=2*HEIGHT+STEP; - if(!CreateBmpButton(mAutoLots_button,l_x_left+15,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; - if(!CreateLabel(mAutoLots_label,"AutoLots",l_x_left+20,l_y,LEFT)) return false; - - if(!CreateLabel(mLots1_label,"Volume [lots]",l_x_right-2.1*x_size,l_y,LEFT)) return false; - if(!CreateEdit(mLots_input,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; - if(!CreateBmpButton(mIncreaseLots_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; - if(!CreateBmpButton(mDecreaseLots_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; - - l_y+=HEIGHT+STEP; - if(!CreateBmpButton(mFixVolume_button,l_x_left+15,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; - if(!CreateLabel(mFixVolume_label,"Fix Volume",l_x_left+20,l_y,LEFT)) return false; - - if(!CreateLabel(mAmount_label,"Amount",l_x_right-1.75*x_size,l_y,LEFT)) return false; - if(!CreateEdit(mAmount_input,1,l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; - if(!CreateBmpButton(mIncreaseAmount_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; - if(!CreateBmpButton(mDecreaseAmount_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; - - l_y+=HEIGHT+STEP; - - if(!CreateBmpButton(mSL_button,l_x_right-2*x_size+6,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; - if(!CreateLabel(mSL_label,"SL [pips]",l_x_right-1.9*x_size,l_y,LEFT)) return false; - if(!CreateEdit(mSL_input,fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mSL),l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; - if(!CreateBmpButton(mIncreaseSL_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; - if(!CreateBmpButton(mDecreaseSL_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; - mSL = StringToDouble(mSL_input.Text()); - - l_y+=HEIGHT+STEP; - - if(!CreateBmpButton(mTP_button,l_x_right-2*x_size+6,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; - if(!CreateLabel(mTP_label,"TP [pips]",l_x_right-1.9*x_size,l_y,LEFT)) return false; - if(!CreateEdit(mTP_input,fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mTP),l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; - if(!CreateBmpButton(mIncreaseTP_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; - if(!CreateBmpButton(mDecreaseTP_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; - mTP = StringToDouble(mTP_input.Text()); - - l_y+=HEIGHT+STEP; - if(!CreateBmpButton(mTrailing_button,l_x_left+15,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; - if(!CreateLabel(mAllowTrailing_label,"Allow Trailing",l_x_left+20,l_y,LEFT)) return false; - - l_y+=HEIGHT+STEP; - if(!CreateButton(mCloseAllSell_button,"Close Sell",l_x_left,l_y,x_size,HEIGHT)) return false; - if(!CreateButton(mCloseAll_button,"Close All",(l_x_right-l_x_left-x_size)/2+l_x_left,l_y,x_size,HEIGHT)) return false; - if(!CreateButton(mCloseAllBuy_button,"Close Buy",(l_x_right-x_size),l_y,x_size,HEIGHT)) return false; - mCloseAll_button.ColorBackground(clrLightSalmon); - - l_y+=HEIGHT+STEP; - if(!CreateLabel(mSellPositions_value,mTA.PositionsSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mPositions_label,"Positoins",l_x_right-1.65*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mBuyPositions_value,mTA.PositionsBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; - - l_y+=HEIGHT+STEP; - if(!CreateLabel(mSellLots_value,mTA.LotsSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mLots2_label,"Lots",l_x_right-1.65*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mBuyLots_value,mTA.LotsBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; - - l_y+=HEIGHT+STEP; - if(!CreateLabel(mSellBE_value,mTA.CalcBreakEvenSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mBE_label,"BE",l_x_right-1.65*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mBuyBE_value,mTA.CalcBreakEvenBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; - - l_y+=HEIGHT+STEP; - if(!CreateLabel(mSellProfit_value,mTA.CalcProfitSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mProfit_label,"Profits",l_x_right-1.65*x_size,l_y,CENTER)) return false; - if(!CreateLabel(mBuyProfit_value,mTA.CalcProfitBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; - - l_y+=HEIGHT+STEP; - if(!CreateLabel(mEquity_label,"Equity",l_x_left+10,l_y,LEFT)) return false; - if(!CreateLabel(mEquity_value,mTA.Equity(),l_x_left+x_size,l_y,CENTER)) return false; - if(!CreateLabel(mMarginLevel_label,"Margin Level",l_x_left+1.65*x_size,l_y,LEFT)) return false; - if(!CreateLabel(mMarginLevel_value,DoubleToString(mTA.MarginLevel(),0)+"%",l_x_left+3*x_size,l_y,CENTER)) return false; - return true; -} - -void TradingPanel::Update(void){ - if(mEnable_Trailing){ - mTA.TradeUpdate(); - mTA.TradeClose(); - } - if(mTA.PositionsBuy()==0) - mTA.ResetLines("BUY"); - if(mTA.PositionsSell()==0) - mTA.ResetLines("SELL"); - - mAsk_value.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS))); - mSpread_value.Text(DoubleToString((SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/_Point,0)); - mBid_value.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS))); - if(mAutoLots_button.Pressed()) - mLots_input.Text((mTA.CalcLots()>0)? DoubleToString(mTA.CalcLots(),2):SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)); - mSL = fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mSL); - mSL_input.Text(DoubleToString(mSL,1)); - mTP = fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mTP); - mTP_input.Text(DoubleToString(mTP, 1)); - // Update Positions Info - mSellPositions_value.Text(mTA.PositionsSell()); - mBuyPositions_value.Text(mTA.PositionsBuy()); - mSellLots_value.Text(DoubleToString(mTA.LotsSell(),2)); - mBuyLots_value.Text(DoubleToString(mTA.LotsBuy(),2)); - mSellBE_value.Text(DoubleToString(mTA.CalcBreakEvenSell(),_Digits)); - mBuyBE_value.Text(DoubleToString(mTA.CalcBreakEvenBuy(),_Digits)); - mSellProfit_value.Text(DoubleToString(mTA.CalcProfitSell(),2)); - mBuyProfit_value.Text(DoubleToString(mTA.CalcProfitBuy(),2)); - // Update Account Info - mEquity_value.Text(DoubleToString(mTA.Equity(),2)); - mMarginLevel_value.Text(DoubleToString(mTA.MarginLevel(),0)+"%"); - mLeverage_value.Text(mTA.Leverage()); - ChartRedraw(); -} - -void TradingPanel::OnTime(void){ -} - -bool TradingPanel::CreateLabel(CLabel &object, const string text, const uint x, const uint y, ENUM_LABEL_ALIGN align){ - string name = m_name+"Label"+(string)ObjectsTotal(0,-1,OBJ_LABEL); - if(!object.Create(0,name,0,x,y,0,0)) return false; - if(!object.Text(text)) return false; - ObjectSetInteger(0,object.Name(),OBJPROP_ANCHOR,(align==LEFT ? ANCHOR_LEFT_UPPER : (align==RIGHT ? ANCHOR_RIGHT_UPPER : ANCHOR_UPPER))); - if(!Add(object)) return false; - return true; -} - -bool TradingPanel::CreateEdit(CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size){ - string name = m_name+"Edit"+(string)ObjectsTotal(0,-1,OBJ_EDIT); - if(!object.Create(0,name,0,x,y,x+x_size,y+y_size)) return false; - if(!object.Text(text)) return false; - if(!object.TextAlign(ALIGN_CENTER)) return false; - if(!object.ReadOnly(false)) return false; - if(!Add(object)) return false; - return true; -} - -bool TradingPanel::CreateBmpButton(CBmpButton &object,const uint x,const uint y,string BmpON,string BmpOFF,bool lock){ - string name = m_name+"BmpButton"+(string)ObjectsTotal(0,-1,OBJ_BITMAP_LABEL); - uint y1=(uint)(y-(STEP-CONTROLS_BUTTON_SIZE)/2); - uint y2=y1+CONTROLS_BUTTON_SIZE; - if(!object.Create(0,name,0,x-CONTROLS_BUTTON_SIZE,y1,x,y2)) return false; - if(!object.BmpNames(BmpOFF,BmpON)) return false; - if(!Add(object)) return false; - object.Locking(lock); - return true; -} - -bool TradingPanel::CreateButton(CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size){ - string name = m_name+"Button"+(string)ObjectsTotal(0,-1,OBJ_BUTTON); - if(!object.Create(0,name,0,x,y,x+x_size,y+y_size)) return false; - if(!object.Text(text)) return false; - object.Locking(false); - if(!object.Pressed(false)) return false; - if(!Add(object)) return false; - return true; -} - -bool TradingPanel::CreateComboBox(CComboBox &object,const uint x,const uint y,const uint x_size,const uint y_size){ - string name = m_name+"ComboBox"+(string)ObjectsTotal(0,-1,OBJ_BUTTON); - if(!object.Create(0,name,0,x,y,x+x_size,y+y_size)) return false; - if(!Add(object)) return false; - if(!object.ItemAdd("NETTING")) return false; - if(!object.ItemAdd("LONG/SHORT")) return false; - if(!object.ItemAdd("HEDGING")) return false; - return true; -} - -// OnEvent -EVENT_MAP_BEGIN(TradingPanel) - ON_EVENT(ON_END_EDIT,mLots_input, Edit_Lots) - ON_EVENT(ON_END_EDIT,mAmount_input, Edit_Amount) - ON_EVENT(ON_END_EDIT,mSL_input, Edit_SL) - ON_EVENT(ON_END_EDIT,mTP_input, Edit_TP) - ON_EVENT(ON_CLICK,mAutoLots_button, Click_AutoLots) - ON_EVENT(ON_CLICK,mFixVolume_button, Click_FixVolume) - ON_EVENT(ON_CLICK,mSL_button, Click_SL) - ON_EVENT(ON_CLICK,mTP_button, Click_TP) - ON_EVENT(ON_CLICK,mIncreaseLots_button, Click_IncreaseLots) - ON_EVENT(ON_CLICK,mDecreaseLots_button, Click_DecreaseLots) - ON_EVENT(ON_CLICK,mIncreaseAmount_button,Click_IncreaseAmount) - ON_EVENT(ON_CLICK,mDecreaseAmount_button,Click_DecreaseAmount) - ON_EVENT(ON_CLICK,mIncreaseSL_button, Click_IncreaseSL) - ON_EVENT(ON_CLICK,mDecreaseSL_button, Click_DecreaseSL) - ON_EVENT(ON_CLICK,mIncreaseTP_button, Click_IncreaseTP) - ON_EVENT(ON_CLICK,mDecreaseTP_button, Click_DecreaseTP) - ON_EVENT(ON_CLICK,mTrailing_button, Click_Trailing) - ON_EVENT(ON_CLICK,mOrderSell_button, Click_OrderSell) - ON_EVENT(ON_CLICK,mOrderCross_button, Click_OrderCross) - ON_EVENT(ON_CLICK,mOrderBuy_button, Click_OrderBuy) - ON_EVENT(ON_CLICK,mCloseAllSell_button, Click_CloseAllSell) - ON_EVENT(ON_CLICK,mCloseAll_button, Click_CloseAll) - ON_EVENT(ON_CLICK,mCloseAllBuy_button, Click_CloseAllBuy) -EVENT_MAP_END(CAppDialog) - -void TradingPanel::Edit_Lots(void){ - mLots = StringToDouble(mLots_input.Text()); - mLots_input.Text(DoubleToString(mLots,2)); - ChartRedraw(); -} - -void TradingPanel::Edit_Amount(void){ - mAmount = mAmount_input.Text(); - mAmount_input.Text(IntegerToString(mAmount,2)); - ChartRedraw(); -} - -void TradingPanel::Edit_SL(void){ - mSL = fmax(StringToDouble(mSL_input.Text()),(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10); - mSL_input.Text(DoubleToString(mSL,1)); - ChartRedraw(); -} - -void TradingPanel::Edit_TP(void){ - mTP = fmax(StringToDouble(mTP_input.Text()),(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10); - mTP_input.Text(DoubleToString(mTP,1)); - ChartRedraw(); -} - -void TradingPanel::Click_AutoLots(void){ - if(mAutoLots_button.Pressed()) - mLots_input.Text((mTA.CalcLots()>0)? DoubleToString(mTA.CalcLots(),2):SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)); - ChartRedraw(); -} - -void TradingPanel::Click_FixVolume(void){ - if(mFixVolume_button.Pressed()) - mFixVolume = true; - else - mFixVolume = false; - ChartRedraw(); -} - -void TradingPanel::Click_SL(void){ - if(mSL_button.Pressed()) - mEnable_SL = true; - else - mEnable_SL = false; - ChartRedraw(); -} - -void TradingPanel::Click_TP(void){ - if(mTP_button.Pressed()) - mEnable_TP = true; - else - mEnable_TP = false; - ChartRedraw(); -} - -void TradingPanel::Click_IncreaseLots(void){ - mLots += SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); - mLots_input.Text(DoubleToString(mLots,2)); - ChartRedraw(); -} - -void TradingPanel::Click_DecreaseLots(void){ - mLots = (mLots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)>0)?(mLots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)):(SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)); - mLots_input.Text(DoubleToString(mLots,2)); - ChartRedraw(); -} - -void TradingPanel::Click_IncreaseAmount(void){ - mAmount += 1; - mAmount_input.Text(IntegerToString(mAmount,2)); - ChartRedraw(); -} - -void TradingPanel::Click_DecreaseAmount(void){ - mAmount = (mAmount-1>0)?(mAmount-1):(1); - mAmount_input.Text(IntegerToString(mAmount,2)); - ChartRedraw(); -} - -void TradingPanel::Click_IncreaseSL(void){ - mSL += 1;//_Point; - mSL_input.Text(DoubleToString(mSL,1)); - ChartRedraw(); -} - -void TradingPanel::Click_DecreaseSL(void){ - mSL -= 1;//_Point; - mSL_input.Text(DoubleToString(mSL,1)); - ChartRedraw(); -} - -void TradingPanel::Click_IncreaseTP(void){ - mTP += 1;//_Point; - mTP_input.Text(DoubleToString(mTP,1)); - ChartRedraw(); -} - -void TradingPanel::Click_DecreaseTP(void){ - mTP -= 1;//_Point; - mTP_input.Text(DoubleToString(mTP,1)); - ChartRedraw(); -} - -void TradingPanel::Click_Trailing(void){ - if(mTrailing_button.Pressed()) - mEnable_Trailing = true; - else - mEnable_Trailing = false; - ChartRedraw(); -} - -void TradingPanel::Click_OrderBuy(void){ - mLots = StringToDouble(mLots_input.Text()); - mAmount = StringToInteger(mAmount_input.Text()); - if(mFixVolume) - mLots = NormalizeDouble(mLots/mAmount, 2); - for(uint i=0; i +#include +#include +#include +#include + +#resource "\\Include\\Controls\\res\\CheckBoxOn.bmp" +#resource "\\Include\\Controls\\res\\CheckBoxOff.bmp" +#resource "\\Include\\Controls\\res\\SpinInc.bmp" +#resource "\\Include\\Controls\\res\\SpinDec.bmp" + +enum ENUM_LABEL_ALIGN{ + LEFT = -1, + CENTER = 0, + RIGHT = 1 +}; + +class TradingPanel:public CAppDialog{ + public: + TradingPanel(long accountNum, long magic=12345, bool magicFilter=false, bool symbolFilter=false, ENUM_POSITION_HANDLING position_handling=LONG_SHORT, bool autoTrailing=true, double startSL=15, + double basic_SLwidth=10, double risk=4, double sl=15, double tp=30); + virtual ~TradingPanel(); + bool Init(long accountNum, long magic=12345, bool magicFilter=false, bool symbolFilter=false, ENUM_POSITION_HANDLING position_handling=LONG_SHORT,bool autoTrailing=true,double startSL=15.000000, + double basic_SLwidth=10.000000,double risk=4, double sl=15, double tp=30); + + virtual bool Create(const string name, const int x1=5,const int y1=20,const int x2=320,const int y2=420); + virtual void Update(void); + void OnTime(void); + virtual bool OnEvent(const int id,const long &lparam, const double &dparam, const string &sparam); + + private: + bool CreateLabel(CLabel &object, const string text, const uint x, const uint y, ENUM_LABEL_ALIGN align); + bool CreateEdit(CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size); + bool CreateBmpButton(CBmpButton &object,const uint x,const uint y,string BmpON,string BmpOFF,bool lock); + bool CreateButton(CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size); + bool CreateComboBox(CComboBox &object,const uint x,const uint y,const uint x_size,const uint y_size); + + // On Event + void Edit_Lots(void); + void Edit_Amount(void); + void Edit_SL(void); + void Edit_TP(void); + void Click_AutoLots(void); + void Click_FixVolume(void); + void Click_SL(void); + void Click_TP(void); + void Click_Trailing(void); + void Click_IncreaseLots(void); + void Click_DecreaseLots(void); + void Click_IncreaseAmount(void); + void Click_DecreaseAmount(void); + void Click_IncreaseSL(void); + void Click_DecreaseSL(void); + void Click_IncreaseTP(void); + void Click_DecreaseTP(void); + void Click_OrderSell(void); + void Click_OrderCross(void); + void Click_OrderBuy(void); + void Click_CloseAllSell(void); + void Click_CloseAll(void); + void Click_CloseAllBuy(void); + + protected: + CLabel mAsk_value, mSpread_value, mBid_value; // Display Ask and Bid prices + CLabel mFixVolume_label, mAmount_label; // + CLabel mAutoLots_label, mLots1_label; // + CLabel mAutoSL_label, mSL_label; // + CLabel mAutoTP_label, mTP_label; // + CLabel mAllowTrailing_label, mTrailingType_label; // + CLabel mSellPositions_value, mPositions_label, mBuyPositions_value;// + CLabel mSellLots_value, mLots2_label, mBuyLots_value; // + CLabel mSellBE_value, mBE_label, mBuyBE_value; // + CLabel mSellProfit_value, mProfit_label, mBuyProfit_value; // + CLabel mEquity_label, mEquity_value; // + CLabel mMarginLevel_label, mMarginLevel_value; // + CLabel mLeverage_label, mLeverage_value; // + CComboBox mTrailingType_box; // + CEdit mAmount_input; // + CEdit mLots_input; // + CEdit mSL_input; // + CEdit mTP_input; // + CBmpButton mAutoLots_button, mFixVolume_button; // + CBmpButton mAutoSL_button, mSL_button; // + CBmpButton mAutoTP_button, mTP_button; // + CBmpButton mTrailing_button; // + CBmpButton mIncreaseAmount_button, mDecreaseAmount_button; // Increase and Decrease buttons + CBmpButton mIncreaseLots_button, mDecreaseLots_button; // Increase and Decrease buttons + CBmpButton mIncreaseSL_button, mDecreaseSL_button; // Increase and Decrease buttons + CBmpButton mIncreaseTP_button, mDecreaseTP_button; // Increase and Decrease buttons + CButton mOrderSell_button, mOrderCross_button, mOrderBuy_button; // Sell, Cross, and Buy Buttons + CButton mCloseAllSell_button, mCloseAll_button, mCloseAllBuy_button;// Close buttons + + uint mAmount; + double mLots; + bool mFixVolume; + double mSL; // [pips] + double mTP; // [pips] + bool mEnable_SL; + bool mEnable_TP; + bool mEnable_Trailing; + TradingAgent mTA; + + #define STEP (int)(ClientAreaHeight()/18/4) // height step betwine elements + #define HEIGHT (int)(ClientAreaHeight()/18) // height of element + #define BORDER (int)(ClientAreaHeight()/24) // distance betwine boder and elements +}; + +TradingPanel::TradingPanel(long accountNum, long magic, bool magicFilter, bool symbolFilter, ENUM_POSITION_HANDLING position_handling, bool autoTrailing, double startSL, + double basic_SLwidth, double risk, double sl, double tp){ + mSL = sl; + mTP = tp; + mTA.Init(accountNum, "", magic, magicFilter, symbolFilter, NONE, LONG_AND_SHORT, position_handling, true, 0.01, autoTrailing, startSL, basic_SLwidth, risk, 0, 0); +} + +TradingPanel::~TradingPanel(void){ +} + +bool TradingPanel::Init(long accountNum, long magic=12345, bool magicFilter=false, bool symbolFilter=false, ENUM_POSITION_HANDLING position_handling=LONG_SHORT,bool autoTrailing=true,double startSL=15.000000, + double basic_SLwidth=10.000000,double risk=4, double sl=15, double tp=30){ + mSL = sl; + mTP = tp; + return mTA.Init(accountNum, "", magic, magicFilter, symbolFilter, NONE, LONG_AND_SHORT, position_handling, true, 0.01, autoTrailing, startSL, basic_SLwidth, risk, 0, 0); +} + +bool TradingPanel::Create(const string name, const int x1=5,const int y1=20,const int x2=320,const int y2=420){ + if(!Create(0,name,0,x1,y1,x2,y2)) return false; + int l_x_left=BORDER; + int l_y=BORDER; + int y_width=HEIGHT; + int y_sptep=STEP; + + if(!CreateLabel(mBid_value,DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits),l_x_left,l_y,LEFT)) return false; + if(!mBid_value.FontSize(HEIGHT-3)) return false; + mBid_value.Color(clrRed); + + int l_x_right=ClientAreaWidth()-20; + + if(!CreateLabel(mSpread_value,DoubleToString((SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/_Point,0),l_x_right-137.5,l_y,CENTER)) return false; + if(!mSpread_value.FontSize(HEIGHT-4)) return false; + if(!CreateLabel(mAsk_value,DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits),l_x_right,l_y,RIGHT)) return false; + if(!mAsk_value.FontSize(HEIGHT-3)) return false; + mAsk_value.Color(clrBlue); + + l_y+=2*HEIGHT; + int x_size=(int)((ClientAreaWidth()-40)/3-5); + + // Order Send Buttons + if(!CreateButton(mOrderSell_button,"SELL",l_x_left,l_y,x_size,HEIGHT*2)) return false; + if(!CreateButton(mOrderCross_button,"CROSS",(l_x_right-l_x_left-x_size)/2+l_x_left,l_y,x_size,HEIGHT*2)) return false; + if(!CreateButton(mOrderBuy_button,"BUY",(l_x_right-x_size),l_y,x_size,HEIGHT*2)) return false; + + l_y+=2*HEIGHT+STEP; + if(!CreateBmpButton(mAutoLots_button,l_x_left+15,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; + if(!CreateLabel(mAutoLots_label,"AutoLots",l_x_left+20,l_y,LEFT)) return false; + + if(!CreateLabel(mLots1_label,"Volume [lots]",l_x_right-2.1*x_size,l_y,LEFT)) return false; + if(!CreateEdit(mLots_input,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; + if(!CreateBmpButton(mIncreaseLots_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; + if(!CreateBmpButton(mDecreaseLots_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; + + l_y+=HEIGHT+STEP; + if(!CreateBmpButton(mFixVolume_button,l_x_left+15,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; + if(!CreateLabel(mFixVolume_label,"Fix Volume",l_x_left+20,l_y,LEFT)) return false; + + if(!CreateLabel(mAmount_label,"Amount",l_x_right-1.75*x_size,l_y,LEFT)) return false; + if(!CreateEdit(mAmount_input,1,l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; + if(!CreateBmpButton(mIncreaseAmount_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; + if(!CreateBmpButton(mDecreaseAmount_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; + + l_y+=HEIGHT+STEP; + + if(!CreateBmpButton(mSL_button,l_x_right-2*x_size+6,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; + if(!CreateLabel(mSL_label,"SL [pips]",l_x_right-1.9*x_size,l_y,LEFT)) return false; + if(!CreateEdit(mSL_input,fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mSL),l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; + if(!CreateBmpButton(mIncreaseSL_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; + if(!CreateBmpButton(mDecreaseSL_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; + mSL = StringToDouble(mSL_input.Text()); + + l_y+=HEIGHT+STEP; + + if(!CreateBmpButton(mTP_button,l_x_right-2*x_size+6,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; + if(!CreateLabel(mTP_label,"TP [pips]",l_x_right-1.9*x_size,l_y,LEFT)) return false; + if(!CreateEdit(mTP_input,fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mTP),l_x_right-x_size,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),HEIGHT)) return false; + if(!CreateBmpButton(mIncreaseTP_button,l_x_right,(int)(l_y-HEIGHT/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) return false; + if(!CreateBmpButton(mDecreaseTP_button,l_x_right,(int)(l_y+HEIGHT/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) return false; + mTP = StringToDouble(mTP_input.Text()); + + l_y+=HEIGHT+STEP; + if(!CreateBmpButton(mTrailing_button,l_x_left+15,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) return false; + if(!CreateLabel(mAllowTrailing_label,"Allow Trailing",l_x_left+20,l_y,LEFT)) return false; + + l_y+=HEIGHT+STEP; + if(!CreateButton(mCloseAllSell_button,"Close Sell",l_x_left,l_y,x_size,HEIGHT)) return false; + if(!CreateButton(mCloseAll_button,"Close All",(l_x_right-l_x_left-x_size)/2+l_x_left,l_y,x_size,HEIGHT)) return false; + if(!CreateButton(mCloseAllBuy_button,"Close Buy",(l_x_right-x_size),l_y,x_size,HEIGHT)) return false; + mCloseAll_button.ColorBackground(clrLightSalmon); + + l_y+=HEIGHT+STEP; + if(!CreateLabel(mSellPositions_value,mTA.PositionsSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mPositions_label,"Positoins",l_x_right-1.65*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mBuyPositions_value,mTA.PositionsBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; + + l_y+=HEIGHT+STEP; + if(!CreateLabel(mSellLots_value,mTA.LotsSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mLots2_label,"Lots",l_x_right-1.65*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mBuyLots_value,mTA.LotsBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; + + l_y+=HEIGHT+STEP; + if(!CreateLabel(mSellBE_value,mTA.CalcBreakEvenSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mBE_label,"BE",l_x_right-1.65*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mBuyBE_value,mTA.CalcBreakEvenBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; + + l_y+=HEIGHT+STEP; + if(!CreateLabel(mSellProfit_value,mTA.CalcProfitSell(),l_x_right-2.75*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mProfit_label,"Profits",l_x_right-1.65*x_size,l_y,CENTER)) return false; + if(!CreateLabel(mBuyProfit_value,mTA.CalcProfitBuy(),l_x_right-0.5*x_size,l_y,CENTER)) return false; + + l_y+=HEIGHT+STEP; + if(!CreateLabel(mEquity_label,"Equity",l_x_left+10,l_y,LEFT)) return false; + if(!CreateLabel(mEquity_value,mTA.Equity(),l_x_left+x_size,l_y,CENTER)) return false; + if(!CreateLabel(mMarginLevel_label,"Margin Level",l_x_left+1.65*x_size,l_y,LEFT)) return false; + if(!CreateLabel(mMarginLevel_value,DoubleToString(mTA.MarginLevel(),0)+"%",l_x_left+3*x_size,l_y,CENTER)) return false; + return true; +} + +void TradingPanel::Update(void){ + if(mEnable_Trailing){ + mTA.TradeUpdate(); + mTA.TradeClose(); + } + if(mTA.PositionsBuy()==0) + mTA.ResetLines("BUY"); + if(mTA.PositionsSell()==0) + mTA.ResetLines("SELL"); + + mAsk_value.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS))); + mSpread_value.Text(DoubleToString((SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/_Point,0)); + mBid_value.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS))); + if(mAutoLots_button.Pressed()) + mLots_input.Text((mTA.CalcLots()>0)? DoubleToString(mTA.CalcLots(),2):SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)); + mSL = fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mSL); + mSL_input.Text(DoubleToString(mSL,1)); + mTP = fmax((SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10, mTP); + mTP_input.Text(DoubleToString(mTP, 1)); + // Update Positions Info + mSellPositions_value.Text(mTA.PositionsSell()); + mBuyPositions_value.Text(mTA.PositionsBuy()); + mSellLots_value.Text(DoubleToString(mTA.LotsSell(),2)); + mBuyLots_value.Text(DoubleToString(mTA.LotsBuy(),2)); + mSellBE_value.Text(DoubleToString(mTA.CalcBreakEvenSell(),_Digits)); + mBuyBE_value.Text(DoubleToString(mTA.CalcBreakEvenBuy(),_Digits)); + mSellProfit_value.Text(DoubleToString(mTA.CalcProfitSell(),2)); + mBuyProfit_value.Text(DoubleToString(mTA.CalcProfitBuy(),2)); + // Update Account Info + mEquity_value.Text(DoubleToString(mTA.Equity(),2)); + mMarginLevel_value.Text(DoubleToString(mTA.MarginLevel(),0)+"%"); + mLeverage_value.Text(mTA.Leverage()); + ChartRedraw(); +} + +void TradingPanel::OnTime(void){ +} + +bool TradingPanel::CreateLabel(CLabel &object, const string text, const uint x, const uint y, ENUM_LABEL_ALIGN align){ + string name = m_name+"Label"+(string)ObjectsTotal(0,-1,OBJ_LABEL); + if(!object.Create(0,name,0,x,y,0,0)) return false; + if(!object.Text(text)) return false; + ObjectSetInteger(0,object.Name(),OBJPROP_ANCHOR,(align==LEFT ? ANCHOR_LEFT_UPPER : (align==RIGHT ? ANCHOR_RIGHT_UPPER : ANCHOR_UPPER))); + if(!Add(object)) return false; + return true; +} + +bool TradingPanel::CreateEdit(CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size){ + string name = m_name+"Edit"+(string)ObjectsTotal(0,-1,OBJ_EDIT); + if(!object.Create(0,name,0,x,y,x+x_size,y+y_size)) return false; + if(!object.Text(text)) return false; + if(!object.TextAlign(ALIGN_CENTER)) return false; + if(!object.ReadOnly(false)) return false; + if(!Add(object)) return false; + return true; +} + +bool TradingPanel::CreateBmpButton(CBmpButton &object,const uint x,const uint y,string BmpON,string BmpOFF,bool lock){ + string name = m_name+"BmpButton"+(string)ObjectsTotal(0,-1,OBJ_BITMAP_LABEL); + uint y1=(uint)(y-(STEP-CONTROLS_BUTTON_SIZE)/2); + uint y2=y1+CONTROLS_BUTTON_SIZE; + if(!object.Create(0,name,0,x-CONTROLS_BUTTON_SIZE,y1,x,y2)) return false; + if(!object.BmpNames(BmpOFF,BmpON)) return false; + if(!Add(object)) return false; + object.Locking(lock); + return true; +} + +bool TradingPanel::CreateButton(CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size){ + string name = m_name+"Button"+(string)ObjectsTotal(0,-1,OBJ_BUTTON); + if(!object.Create(0,name,0,x,y,x+x_size,y+y_size)) return false; + if(!object.Text(text)) return false; + object.Locking(false); + if(!object.Pressed(false)) return false; + if(!Add(object)) return false; + return true; +} + +bool TradingPanel::CreateComboBox(CComboBox &object,const uint x,const uint y,const uint x_size,const uint y_size){ + string name = m_name+"ComboBox"+(string)ObjectsTotal(0,-1,OBJ_BUTTON); + if(!object.Create(0,name,0,x,y,x+x_size,y+y_size)) return false; + if(!Add(object)) return false; + if(!object.ItemAdd("NETTING")) return false; + if(!object.ItemAdd("LONG/SHORT")) return false; + if(!object.ItemAdd("HEDGING")) return false; + return true; +} + +// OnEvent +EVENT_MAP_BEGIN(TradingPanel) + ON_EVENT(ON_END_EDIT,mLots_input, Edit_Lots) + ON_EVENT(ON_END_EDIT,mAmount_input, Edit_Amount) + ON_EVENT(ON_END_EDIT,mSL_input, Edit_SL) + ON_EVENT(ON_END_EDIT,mTP_input, Edit_TP) + ON_EVENT(ON_CLICK,mAutoLots_button, Click_AutoLots) + ON_EVENT(ON_CLICK,mFixVolume_button, Click_FixVolume) + ON_EVENT(ON_CLICK,mSL_button, Click_SL) + ON_EVENT(ON_CLICK,mTP_button, Click_TP) + ON_EVENT(ON_CLICK,mIncreaseLots_button, Click_IncreaseLots) + ON_EVENT(ON_CLICK,mDecreaseLots_button, Click_DecreaseLots) + ON_EVENT(ON_CLICK,mIncreaseAmount_button,Click_IncreaseAmount) + ON_EVENT(ON_CLICK,mDecreaseAmount_button,Click_DecreaseAmount) + ON_EVENT(ON_CLICK,mIncreaseSL_button, Click_IncreaseSL) + ON_EVENT(ON_CLICK,mDecreaseSL_button, Click_DecreaseSL) + ON_EVENT(ON_CLICK,mIncreaseTP_button, Click_IncreaseTP) + ON_EVENT(ON_CLICK,mDecreaseTP_button, Click_DecreaseTP) + ON_EVENT(ON_CLICK,mTrailing_button, Click_Trailing) + ON_EVENT(ON_CLICK,mOrderSell_button, Click_OrderSell) + ON_EVENT(ON_CLICK,mOrderCross_button, Click_OrderCross) + ON_EVENT(ON_CLICK,mOrderBuy_button, Click_OrderBuy) + ON_EVENT(ON_CLICK,mCloseAllSell_button, Click_CloseAllSell) + ON_EVENT(ON_CLICK,mCloseAll_button, Click_CloseAll) + ON_EVENT(ON_CLICK,mCloseAllBuy_button, Click_CloseAllBuy) +EVENT_MAP_END(CAppDialog) + +void TradingPanel::Edit_Lots(void){ + mLots = StringToDouble(mLots_input.Text()); + mLots_input.Text(DoubleToString(mLots,2)); + ChartRedraw(); +} + +void TradingPanel::Edit_Amount(void){ + mAmount = mAmount_input.Text(); + mAmount_input.Text(IntegerToString(mAmount,2)); + ChartRedraw(); +} + +void TradingPanel::Edit_SL(void){ + mSL = fmax(StringToDouble(mSL_input.Text()),(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10); + mSL_input.Text(DoubleToString(mSL,1)); + ChartRedraw(); +} + +void TradingPanel::Edit_TP(void){ + mTP = fmax(StringToDouble(mTP_input.Text()),(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))/10); + mTP_input.Text(DoubleToString(mTP,1)); + ChartRedraw(); +} + +void TradingPanel::Click_AutoLots(void){ + if(mAutoLots_button.Pressed()) + mLots_input.Text((mTA.CalcLots()>0)? DoubleToString(mTA.CalcLots(),2):SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)); + ChartRedraw(); +} + +void TradingPanel::Click_FixVolume(void){ + if(mFixVolume_button.Pressed()) + mFixVolume = true; + else + mFixVolume = false; + ChartRedraw(); +} + +void TradingPanel::Click_SL(void){ + if(mSL_button.Pressed()) + mEnable_SL = true; + else + mEnable_SL = false; + ChartRedraw(); +} + +void TradingPanel::Click_TP(void){ + if(mTP_button.Pressed()) + mEnable_TP = true; + else + mEnable_TP = false; + ChartRedraw(); +} + +void TradingPanel::Click_IncreaseLots(void){ + mLots += SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); + mLots_input.Text(DoubleToString(mLots,2)); + ChartRedraw(); +} + +void TradingPanel::Click_DecreaseLots(void){ + mLots = (mLots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)>0)?(mLots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)):(SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)); + mLots_input.Text(DoubleToString(mLots,2)); + ChartRedraw(); +} + +void TradingPanel::Click_IncreaseAmount(void){ + mAmount += 1; + mAmount_input.Text(IntegerToString(mAmount,2)); + ChartRedraw(); +} + +void TradingPanel::Click_DecreaseAmount(void){ + mAmount = (mAmount-1>0)?(mAmount-1):(1); + mAmount_input.Text(IntegerToString(mAmount,2)); + ChartRedraw(); +} + +void TradingPanel::Click_IncreaseSL(void){ + mSL += 1;//_Point; + mSL_input.Text(DoubleToString(mSL,1)); + ChartRedraw(); +} + +void TradingPanel::Click_DecreaseSL(void){ + mSL -= 1;//_Point; + mSL_input.Text(DoubleToString(mSL,1)); + ChartRedraw(); +} + +void TradingPanel::Click_IncreaseTP(void){ + mTP += 1;//_Point; + mTP_input.Text(DoubleToString(mTP,1)); + ChartRedraw(); +} + +void TradingPanel::Click_DecreaseTP(void){ + mTP -= 1;//_Point; + mTP_input.Text(DoubleToString(mTP,1)); + ChartRedraw(); +} + +void TradingPanel::Click_Trailing(void){ + if(mTrailing_button.Pressed()) + mEnable_Trailing = true; + else + mEnable_Trailing = false; + ChartRedraw(); +} + +void TradingPanel::Click_OrderBuy(void){ + mLots = StringToDouble(mLots_input.Text()); + mAmount = StringToInteger(mAmount_input.Text()); + if(mFixVolume) + mLots = NormalizeDouble(mLots/mAmount, 2); + for(uint i=0; iu=l05&y2gV$TNzWK8Sf>kEqIBC^%ktzrq5(nGE=1X@~KJX4~Mq~iJ<_iyja zzL%s#>yZOmobn;&?#}Eyelt5eWUY31wDa$8~%o|AB4gDo($4xQJwuVC0}!F z&Z5Or9NbS+a$Ilx#Uuallj)Lt_GkXD{zKrA_hCq`aXul}G@w<>B4DEGVsnGdyMmkrYK90JVSDn%DbHDRk0d3jSpi5e$?y2WtAD$cfx!r;1 zW3Te^&Scc@4K9b5y{pm1`>S){^MNtE>I{eQH)F`HS*u;qGzEbe|K8Py(cq$YJ!D(J zidwB3&F^c2X%wf#Sb5Po|G*g?dy>%wo!lcM6a>^>j#JVN=Cti6lx=P+NKngnxa%ZZ z-iDO4KYcbI2c2&B9q=NR$~g3sgq+9zBl2Us7C;h=n@A47FHtZdXEF6t>c}nM5I`k$ z8B4k3WAtVH0z_Zxpw9r%(I|adP){jQ#POVlv}jYb0h3Bf-E0=i$FxZvgLFJ~9NR)J zDo{l;xoj0^F$P;Y0u`>*9>#mOKhtq4cBp#?XoNu*EPCLPUi3;6Dqaw(bW4E(ET96tYI+hm%(7z-x>x6>DCs>@(>1T zhf5us%9$n(1fep>MmQMuxjDDMfh64t2RSAisJ$H!+MO~Wv^!e^!64ll2w5J&B0o-p zv;+x)ayulnJ6j_`lJ10r9FtA--UJF0dgm|0v`KWPc&WVPPNAYBaGz(88N%WOTID!? zXxRj>(wK-tV0{`i8J8rJyd*M!mFy_kEAnws7@C5VU^y>{#Lw#lc_j$emO11NE1dQN zir~)SWmKzmfayn7GLZA(Cr@}RNaf+iXY!UPLDP$_3}~28V(!dPRkSruV5wV&U-|we z;4~!QF<6FEQ^fVgd6j@AAUDL@*g&PmDUBCncb%ZX)jEdl(Al$XO5)CtZvVC^4Pj$< z%Qml!=HffZe&Uyhq1eHy(9L96yoyJi5muIR+VMp-ti2;gcG->sgXXdoJK9hylAhzm zWL3Osy^gCK$S<_AbApW%(j@#!ORWCDbH%vmn(LhquH|Ir-v{GXz# z32iT*3LNKxSZi4lh^=E3>jtKN}rTd*)Io1GNklSRmZ$7 z8`kWg%esazD_VtuWw#1dCXDiG4xCcW)xWcL$D$Qshr^s!SE4v3=mkRzNsC%U@r+Ga zd$W=J?ij&U(bCI+MvgMjD1gaPx|~nwzn#E!(S-1#UwW1JmRCUSgNRebtHt!NGl0chT}>YvPd^b zflk&61X>@h5vYD61Zv!Hf$BGf0x^i17wC*Y&sI1oTgWu6Jh4JOn13I_Yf0x|IHfV9 zJXZOUTS|N~3GVJ-Y(A#&oIX-Ihh#`nOgZq*3_}3(1Q-GC5>T%pExhJih!QTT;$=j> z+P1; z%7a$C-FBNsY_cG^T|SM{VEjN+NHQO2+KnD*lEMvZ$OauV0YKu@%TMd%%^Ty;kf*Dl z(+lC8)gc1f8Tr6CJTznsb7(pyYXUbrOV|te!UCkl8(*=w21SXy#>!%W*&$UX@T$a7 z*fs%M=qgm55?D9=)nP@c+jOp?c;<(}uk@UKQlM6Oqw@g12uWP-AERQtmCu`x5$o5=6037weMxE0e}^b4@{tfWjpxoiB)tF z{PqEBtNfH}@RJ`7ShN}DSRso0!zuG2t8TQaus{4hMsQj^^ep<5!)AfW_Yb~%UD ztWS1g%|tR{X%#ei*U~uCv>N|k9z*vR)!|y--P~5he_LE^|{nPFmK@dMG$FMfDm#!*LH1Ux&AovQDBdaG)eEA5HI8NrAMSJTY2cKf=@DGrf*BRKH^Qe;H~qi>D?4t7`MDwR zI9tYWEleHv2xDfv_V?GGm07 z&1_S=d5PJ?^eV%MX+v?W{Mjos+xbPW+jh+Z7~uT;Bd5@BROjN?uS7T0%^CCN$Xm$- zzQR`RS~QzJGsOb-j+lj|GObu+FDO+TZI` SzjMlMt@q{t%E4oQ`1vnIxOS-k literal 26218 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