//+------------------------------------------------------------------+ //| TradePanel.mq5 | //| Copyright 2015, DNG | //| https://forex-start.ucoz.ua | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, DNG" #property link "https://forex-start.ucoz.ua" #property version "1.00" #include #include #include #include #include #include //+------------------------------------------------------------------+ //| Resources | //+------------------------------------------------------------------+ #resource "\\Include\\Controls\\res\\RadioButtonOn.bmp" #resource "\\Include\\Controls\\res\\RadioButtonOff.bmp" #resource "\\Include\\Controls\\res\\CheckBoxOn.bmp" #resource "\\Include\\Controls\\res\\CheckBoxOff.bmp" #resource "\\Include\\Controls\\res\\SpinInc.bmp" #resource "\\Include\\Controls\\res\\SpinDec.bmp" class CEdit_new : public CEdit { public: CEdit_new(void){}; ~CEdit_new(void){}; virtual bool Save(const int file_handle) { if(file_handle==INVALID_HANDLE) { return false; } string text=Text(); FileWriteInteger(file_handle,StringLen(text)); return(FileWriteString(file_handle,text)>0); } virtual bool Load(const int file_handle) { if(file_handle==INVALID_HANDLE) { return false; } int size=FileReadInteger(file_handle); string text=FileReadString(file_handle,size); return(Text(text)); } }; class CBmpButton_new : public CBmpButton { public: CBmpButton_new(void){}; ~CBmpButton_new(void){}; virtual bool Save(const int file_handle) { if(file_handle==INVALID_HANDLE) { return false; } return(FileWriteInteger(file_handle,Pressed())); } virtual bool Load(const int file_handle) { if(file_handle==INVALID_HANDLE) { return false; } return(Pressed((bool)FileReadInteger(file_handle))); } }; class CTradePanel : public CAppDialog { private: #define Y_STEP (int)(ClientAreaHeight()/18/4) // height step betwine elements #define Y_WIDTH (int)(ClientAreaHeight()/18) // height of element #define BORDER (int)(ClientAreaHeight()/24) // distance betwine boder and elements #define SL_Line_color clrRed // Stop Loss lines color #define TP_Line_color clrGreen // Take Profit lines color enum label_align { left=-1, right=1, center=0 }; CLabel ASK, BID; // Display Ask and Bid prices CLabel Balance_label; // Display label "Account Balance" CLabel Balance_value; // Display Account balance CLabel Equity_label; // Display label "Account Equity" CLabel Equity_value; // Display Account Equity CLabel PIPs; // Display label "Pips" CLabel Currency; // Display Account currency CLabel ShowLevels; // Display label "Show" CLabel StopLoss; // Display label "Stop Loss" CLabel TakeProfit; // Display label "TakeProfit" CLabel Risk; // Display label "Risk" CLabel Equity; // Display label "% to Equity" CLabel Currency2; // Display Account currency CLabel Orders; // Display label "Opened Orders" CLabel Buy_Lots_label; // Display label "Buy Lots" CLabel Buy_Lots_value; // Display Buy Lots value CLabel Sell_Lots_label; // Display label "Sell Lots" CLabel Sell_Lots_value; // Display Sell Lots value CLabel Buy_profit_label; // Display label "Buy Profit" CLabel Buy_profit_value; // Display Buy Profit value CLabel Sell_profit_label; // Display label "Sell Profit" CLabel Sell_profit_value; // Display Sell profit value CEdit_new Lots; // Display volume of next order CEdit_new StopLoss_pips; // Display Stop loss in pips CEdit_new StopLoss_money; // Display Stop loss in accaunt currency CEdit_new TakeProfit_pips; // Display Take profit in pips CEdit_new TakeProfit_money; // Display Take profit in account currency CEdit_new Risk_percent; // Display Risk percent to equity CEdit_new Risk_money; // Display Risk in account currency CBmpButton_new StopLoss_line; // Check to display StopLoss Line CBmpButton_new TakeProfit_line; // Check to display TakeProfit Line CBmpButton_new StopLoss_pips_b; // Select Stop loss in pips CBmpButton_new StopLoss_money_b; // Select Stop loss in accaunt currency CBmpButton_new TakeProfit_pips_b; // Select Take profit in pips CBmpButton_new TakeProfit_money_b; // Select Take profit in account currency CBmpButton_new Risk_percent_b; // Select Risk percent to equity CBmpButton_new Risk_money_b; // Select Risk in account currency CBmpButton Increase,Decrease; // Increase and Decrease buttons CButton SELL,BUY; // Sell and Buy Buttons CButton CloseSell,CloseBuy,CloseAll; // Close buttons CChartObjectHLine BuySL, SellSL, BuyTP, SellTP; // Stop Loss and Take Profit Lines //--- CAccountInfo AccountInfo; // Class to get account info CTrade Trade; // Class of trade operations //--- variables of current values double cur_lot; // Lot of next order int cur_sl_pips; // Stop Loss in pips double cur_sl_money; // Stop Loss in money int cur_tp_pips; // Take Profit in pips double cur_tp_money; // Take Profit in money double cur_risk_percent; // Risk in percent double cur_risk_money; // Risk in money bool RiskByValue; // Flag: Risk by Value or Value by Risk //--- Create Label object bool CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align); //--- Create Button bool CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size); //--- Cleate Edit object bool CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size); //--- Create BMP Button bool CreateBmpButton(const long chart,const int subwindow,CBmpButton &object,const uint x,const uint y,string BmpON,string BmpOFF,bool lock); //--- Create Horizontal line bool CreateHLine(long chart, int subwindow,CChartObjectHLine &object,color clr, string comment); //--- On Event functions void LotsEndEdit(void); // Edit Lot size void SLPipsEndEdit(); // Edit Stop Loss in pips void TPPipsEndEdit(); // Edit Take Profit in pips void SLMoneyEndEdit(); // Edit Stop Loss in money void TPMoneyEndEdit(); // Edit Take Profit in money void RiskPercentEndEdit(); // Edit Risk in percent void RiskMoneyEndEdit(); // Edit Risk in money void SLPipsClick(); // Click Stop Loss in pips void TPPipsClick(); // Click Take Profit in pips void SLMoneyClick(); // Click Stop Loss in money void TPMoneyClick(); // Click Take Profit in money void RiskPercentClick(); // Click Risk in percent void RiskMoneyClick(); // Click Risk in money void IncreaseLotClick(); // Click Increase Lot void DecreaseLotClick(); // Click Decrease Lot void StopLossLineClick(); // Click StopLoss Line void TakeProfitLineClick(); // Click TakeProfit Line void BuyClick(); // Click BUY button void SellClick(); // Click SELL button void CloseBuyClick(); // Click CLOSE BUY button void CloseSellClick(); // Click CLOSE SELL button void CloseClick(); // Click CLOSE ALL button //--- Correction value functions double NormalizeLots(double lots); // Normalize lot's size void StopLossPipsByMoney(void); // Correct Stop Loss pips value by money risk void TakeProfitPipsByMoney(void); // Correct Take Profit pips value by money profit void StopLossMoneyByPips(void); // Correct Stop Loss money risk by pips value void TakeProfitMoneyByPips(void); // Correct Take Profit money profit by pips value void UpdateSLLines(void); // Calculate SL prices and modify lines void UpdateTPLines(void); // Calculate TP prices and modify lines public: CTradePanel(void); ~CTradePanel(void){}; //--- Create function virtual bool Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420); virtual void OnTick(void); virtual bool OnEvent(const int id,const long &lparam, const double &dparam, const string &sparam); virtual bool Run(void); virtual bool DragLine(string name); virtual void Destroy(const int reason); }; CTradePanel TradePanel; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- // Creat Trade Panel if(!TradePanel.Create(ChartID(),"Trade Panel")) { return (INIT_FAILED); } // Run Trade Panel TradePanel.Run(); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- TradePanel.Destroy(reason); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- TradePanel.OnTick(); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id==CHARTEVENT_OBJECT_DRAG) { if(TradePanel.DragLine(sparam)) { ChartRedraw(); } } if(TradePanel.OnEvent(id, lparam, dparam, sparam)) ChartRedraw(); } //+------------------------------------------------------------------+ //| Class initialization function | //+------------------------------------------------------------------+ CTradePanel::CTradePanel(void) { Trade.SetExpertMagicNumber(0); Trade.SetDeviationInPoints(5); int fill=(int)SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE); Trade.SetTypeFilling((ENUM_ORDER_TYPE_FILLING)(fill==0 ? 2 : fill-1)); return; } //+------------------------------------------------------------------+ //| Creat Trade Panel function | //+------------------------------------------------------------------+ bool CTradePanel::Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420) { // At first call creat function of parents class if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) { return false; } // Calculate coofrdinates and size of BID object // Coordinates calculate in dialog box, not in chart int l_x_left=BORDER; int l_y=BORDER; int y_width=Y_WIDTH; int y_sptep=Y_STEP; // Creat object if(!CreateLabel(chart,subwin,BID,DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits),l_x_left,l_y,left)) { return false; } // Adjust font size for object if(!BID.FontSize(Y_WIDTH)) { return false; } // Repeat same functions for other objects int l_x_right=ClientAreaWidth()-20; if(!CreateLabel(chart,subwin,ASK,DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits),l_x_right,l_y,right)) { return false; } if(!ASK.FontSize(Y_WIDTH)) { return false; } l_y+=2*Y_WIDTH; int x_size=(int)((ClientAreaWidth()-40)/3-5); if(!CreateButton(chart,subwin,SELL,"SELL",BORDER,l_y,x_size,Y_WIDTH)) { return false; } if(!CreateButton(chart,subwin,BUY,"BUY",(l_x_right-x_size),l_y,x_size,Y_WIDTH)) { return false; } l_x_left=(int)((ClientAreaWidth()-x_size)/2); cur_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); if(!CreateEdit(chart,subwin,Lots,DoubleToString(cur_lot,2),l_x_left,l_y,(int)(x_size-CONTROLS_BUTTON_SIZE),Y_WIDTH)) { return false; } l_x_left+=x_size; if(!CreateBmpButton(chart,subwin,Increase,l_x_left,(int)(l_y-Y_WIDTH/4),"::Include\\Controls\\res\\SpinInc.bmp","::Include\\Controls\\res\\SpinInc.bmp",false)) { return false; } if(!CreateBmpButton(chart,subwin,Decrease,l_x_left,(int)(l_y+Y_WIDTH/4),"::Include\\Controls\\res\\SpinDec.bmp","::Include\\Controls\\res\\SpinDec.bmp",false)) { return false; } Increase.PropFlags(WND_PROP_FLAG_CLICKS_BY_PRESS); Decrease.PropFlags(WND_PROP_FLAG_CLICKS_BY_PRESS); l_y+=Y_WIDTH+Y_STEP; if(!CreateButton(chart,subwin,CloseSell,"CLOSE SELL",BORDER,l_y,x_size,Y_WIDTH)) { return false; } if(!CreateButton(chart,subwin,CloseAll,"CLOSE ALL",(int)((ClientAreaWidth()-x_size)/2),l_y,x_size,Y_WIDTH)) { return false; } CloseAll.ColorBackground(clrRed); if(!CreateButton(chart,subwin,CloseBuy,"CLOSE BUY",(l_x_right-x_size),l_y,x_size,Y_WIDTH)) { return false; } l_y+=Y_WIDTH+Y_STEP; l_x_left=(int)(ClientAreaWidth()/2); if(!CreateLabel(chart,subwin,PIPs,"Pips",l_x_left,l_y,right)) { return false; } if(!CreateLabel(chart,subwin,Currency,AccountInfoString(ACCOUNT_CURRENCY),(int)(l_x_left+x_size),l_y,right)) { return false; } if(!CreateLabel(chart,subwin,ShowLevels,"Show",(int)(l_x_right-CONTROLS_BUTTON_SIZE/2),l_y,center)) { return false; } l_y+=(int)(Y_WIDTH/2+Y_STEP); if(!CreateLabel(chart,subwin,StopLoss,"Stop Loss",BORDER,l_y,left)) { return false; } l_x_left=(int)((ClientAreaWidth()-x_size)/2); if(!CreateBmpButton(chart,subwin,StopLoss_pips_b,l_x_left,l_y,"::Include\\Controls\\res\\RadioButtonOn.bmp","::Include\\Controls\\res\\RadioButtonOff.bmp",true)) { return false; } if(!CreateEdit(chart,subwin,StopLoss_pips," ",l_x_left,l_y,(int)(x_size*0.75),Y_WIDTH)) { return false; } cur_sl_pips=0; l_x_left+=x_size; if(!CreateBmpButton(chart,subwin,StopLoss_money_b,l_x_left,l_y,"::Include\\Controls\\res\\RadioButtonOn.bmp","::Include\\Controls\\res\\RadioButtonOff.bmp",true)) { return false; } if(!CreateEdit(chart,subwin,StopLoss_money," ",l_x_left,l_y,(int)(x_size*0.75),Y_WIDTH)) { return false; } cur_sl_money=0; if(!CreateBmpButton(chart,subwin,StopLoss_line,l_x_right,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) { return false; } l_y+=Y_WIDTH+Y_STEP; if(!CreateLabel(chart,subwin,TakeProfit,"TakeProfit",BORDER,l_y,left)) { return false; } l_x_left=(int)((ClientAreaWidth()-x_size)/2); if(!CreateBmpButton(chart,subwin,TakeProfit_pips_b,l_x_left,l_y,"::Include\\Controls\\res\\RadioButtonOn.bmp","::Include\\Controls\\res\\RadioButtonOff.bmp",true)) { return false; } if(!CreateEdit(chart,subwin,TakeProfit_pips," ",l_x_left,l_y,(int)(x_size*0.75),Y_WIDTH)) { return false; } cur_tp_pips=0; l_x_left+=x_size; if(!CreateBmpButton(chart,subwin,TakeProfit_money_b,l_x_left,l_y,"::Include\\Controls\\res\\RadioButtonOn.bmp","::Include\\Controls\\res\\RadioButtonOff.bmp",true)) { return false; } if(!CreateEdit(chart,subwin,TakeProfit_money," ",l_x_left,l_y,(int)(x_size*0.75),Y_WIDTH)) { return false; } cur_tp_money=0; if(!CreateBmpButton(chart,subwin,TakeProfit_line,l_x_right,l_y,"::Include\\Controls\\res\\CheckBoxOn.bmp","::Include\\Controls\\res\\CheckBoxOff.bmp",true)) { return false; } l_y+=Y_WIDTH+Y_STEP; l_x_left=(int)(ClientAreaWidth()/2); if(!CreateLabel(chart,subwin,Equity,"% to Equity",(int)(l_x_left-CONTROLS_BUTTON_SIZE/2),l_y,center)) { return false; } if(!CreateLabel(chart,subwin,Currency2,AccountInfoString(ACCOUNT_CURRENCY),(int)(l_x_right-x_size/2),l_y,center)) { return false; } l_y+=(int)(Y_WIDTH/2+Y_STEP); if(!CreateLabel(chart,subwin,Risk,"Risk",BORDER,l_y,left)) { return false; } l_x_left=(int)((ClientAreaWidth()-x_size)/2); if(!CreateBmpButton(chart,subwin,Risk_percent_b,l_x_left,l_y,"::Include\\Controls\\res\\RadioButtonOn.bmp","::Include\\Controls\\res\\RadioButtonOff.bmp",true)) { return false; } if(!CreateEdit(chart,subwin,Risk_percent," ",l_x_left,l_y,(int)(x_size*0.9),Y_WIDTH)) { return false; } cur_risk_percent=0; if(!CreateBmpButton(chart,subwin,Risk_money_b,(int)(l_x_right-x_size*0.9),l_y,"::Include\\Controls\\res\\RadioButtonOn.bmp","::Include\\Controls\\res\\RadioButtonOff.bmp",true)) { return false; } if(!CreateEdit(chart,subwin,Risk_money," ",(int)(l_x_right-x_size*0.9),l_y,(int)(x_size*0.9),Y_WIDTH)) { return false; } cur_risk_money=0; l_y+=Y_WIDTH+Y_STEP; if(!CreateLabel(chart,subwin,Balance_label,"Account balance",BORDER,l_y,left)) { return false; } if(!CreateLabel(chart,subwin,Balance_value,DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)+" "+AccountInfoString(ACCOUNT_CURRENCY),l_x_right,l_y,right)) { return false; } l_y+=(int)(Y_WIDTH*0.7+Y_STEP); if(!CreateLabel(chart,subwin,Equity_label,"Account Equity",BORDER,l_y,left)) { return false; } if(!CreateLabel(chart,subwin,Equity_value,DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY),2)+" "+AccountInfoString(ACCOUNT_CURRENCY),l_x_right,l_y,right)) { return false; } l_y+=(int)(Y_WIDTH*0.7+2*Y_STEP); if(!CreateLabel(chart,subwin,Orders,"Opened Orders",BORDER,l_y,left)) { return false; } l_x_left=(int)(BORDER+x_size/2); l_y+=(int)(Y_WIDTH*0.7+Y_STEP); if(!CreateLabel(chart,subwin,Buy_Lots_label,"Buy Lots",l_x_left,l_y,left)) { return false; } if(!CreateLabel(chart,subwin,Buy_Lots_value,DoubleToString(0,2),l_x_right-28,l_y,right)) { return false; } l_y+=(int)(Y_WIDTH*0.7+Y_STEP); if(!CreateLabel(chart,subwin,Sell_Lots_label,"Sell Lots",l_x_left,l_y,left)) { return false; } if(!CreateLabel(chart,subwin,Sell_Lots_value,DoubleToString(0,2),l_x_right-28,l_y,right)) { return false; } l_y+=(int)(Y_WIDTH*0.7+Y_STEP); if(!CreateLabel(chart,subwin,Buy_profit_label,"Buy Profit",l_x_left,l_y,left)) { return false; } if(!CreateLabel(chart,subwin,Buy_profit_value,DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY),l_x_right,l_y,right)) { return false; } l_y+=(int)(Y_WIDTH*0.7+Y_STEP); if(!CreateLabel(chart,subwin,Sell_profit_label,"Sell Profit",l_x_left,l_y,left)) { return false; } if(!CreateLabel(chart,subwin,Sell_profit_value,DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY),l_x_right,l_y,right)) { return false; } //--- Create horizontal lines of SL & TP if(!CreateHLine(chart,subwin,BuySL,SL_Line_color,"Buy Stop Loss")) { return false; } if(!CreateHLine(chart,subwin,SellSL,SL_Line_color,"Sell Stop Loss")) { return false; } if(!CreateHLine(chart,subwin,BuyTP,TP_Line_color,"Buy Take Profit")) { return false; } if(!CreateHLine(chart,subwin,SellTP,TP_Line_color,"Sell Take Profit")) { return false; } return true; } //+------------------------------------------------------------------+ //| Create Label Object | //+------------------------------------------------------------------+ bool CTradePanel::CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align) { // All objects mast to have separate name string name=m_name+"Label"+(string)ObjectsTotal(chart,-1,OBJ_LABEL); //--- Call Create function if(!object.Create(chart,name,subwindow,x,y,0,0)) { return false; } //--- Addjust text if(!object.Text(text)) { return false; } //--- Aling text to Dialog box's grid ObjectSetInteger(chart,object.Name(),OBJPROP_ANCHOR,(align==left ? ANCHOR_LEFT_UPPER : (align==right ? ANCHOR_RIGHT_UPPER : ANCHOR_UPPER))); //--- Add object to controls if(!Add(object)) { return false; } return true; } //+------------------------------------------------------------------+ //| Create Button | //+------------------------------------------------------------------+ bool CTradePanel::CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size) { // All objects must to have separate name string name=m_name+"Button"+(string)ObjectsTotal(chart,-1,OBJ_BUTTON); //--- Call Create function if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size)) { return false; } //--- Addjust text if(!object.Text(text)) { return false; } //--- set button flag to unlock object.Locking(false); //--- set button flag to unpressed if(!object.Pressed(false)) { return false; } //--- Add object to controls if(!Add(object)) { return false; } return true; } //+------------------------------------------------------------------+ //| Create Edit Object | //+------------------------------------------------------------------+ bool CTradePanel::CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size) { // All objects must to have separate name string name=m_name+"Edit"+(string)ObjectsTotal(chart,-1,OBJ_EDIT); //--- Call Create function if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size)) { return false; } //--- Addjust text if(!object.Text(text)) { return false; } //--- Align text in Edit box if(!object.TextAlign(ALIGN_CENTER)) { return false; } //--- set Read only flag to false if(!object.ReadOnly(false)) { return false; } //--- Add object to controls if(!Add(object)) { return false; } return true; } //+------------------------------------------------------------------+ //| Create BMP Button | //+------------------------------------------------------------------+ bool CTradePanel::CreateBmpButton(const long chart,const int subwindow,CBmpButton &object,const uint x,const uint y,string BmpON,string BmpOFF,bool lock) { // All objects must to have separate name string name=m_name+"BmpButton"+(string)ObjectsTotal(chart,-1,OBJ_BITMAP_LABEL); //--- Calculate coordinates uint y1=(uint)(y-(Y_STEP-CONTROLS_BUTTON_SIZE)/2); uint y2=y1+CONTROLS_BUTTON_SIZE; //--- Call Create function if(!object.Create(m_chart_id,name,m_subwin,x-CONTROLS_BUTTON_SIZE,y1,x,y2)) return(false); //--- Assign BMP pictuers to button status if(!object.BmpNames(BmpOFF,BmpON)) return(false); //--- Add object to controls if(!Add(object)) return(false); //--- set Lock flag to true object.Locking(lock); //--- succeeded return(true); } //+------------------------------------------------------------------+ //| Event "New Tick | //+------------------------------------------------------------------+ void CTradePanel::OnTick(void) { //--- Change Ask and Bid prices on panel ASK.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS))); BID.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS))); //--- Check and change (if necessary) equity if(Equity_value.Text()!=DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)) { Equity_value.Text(DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); } //--- Check and change (if necessary) balance if(Balance_value.Text()!=DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)) { Balance_value.Text(DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); } //--- Check and change (if necessary) Buy and Sell lots and profit value. if(PositionSelect(_Symbol)) { switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)) { case POSITION_TYPE_BUY: Buy_profit_value.Text(DoubleToString(PositionGetDouble(POSITION_PROFIT),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); if(Buy_Lots_value.Text()!=DoubleToString(PositionGetDouble(POSITION_VOLUME),2)) { Buy_Lots_value.Text(DoubleToString(PositionGetDouble(POSITION_VOLUME),2)); } if(Sell_profit_value.Text()!=DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)) { Sell_profit_value.Text(DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); } if(Sell_Lots_value.Text()!=DoubleToString(0,2)) { Sell_Lots_value.Text(DoubleToString(0,2)); } break; case POSITION_TYPE_SELL: Sell_profit_value.Text(DoubleToString(PositionGetDouble(POSITION_PROFIT),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); if(Sell_Lots_value.Text()!=DoubleToString(PositionGetDouble(POSITION_VOLUME),2)) { Sell_Lots_value.Text(DoubleToString(PositionGetDouble(POSITION_VOLUME),2)); } if(Buy_profit_value.Text()!=DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)) { Buy_profit_value.Text(DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); } if(Buy_Lots_value.Text()!=DoubleToString(0,2)) { Buy_Lots_value.Text(DoubleToString(0,2)); } break; } } else { if(Buy_Lots_value.Text()!=DoubleToString(0,2)) { Buy_Lots_value.Text(DoubleToString(0,2)); } if(Sell_Lots_value.Text()!=DoubleToString(0,2)) { Sell_Lots_value.Text(DoubleToString(0,2)); } if(Buy_profit_value.Text()!=DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)) { Buy_profit_value.Text(DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); } if(Sell_profit_value.Text()!=DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)) { Sell_profit_value.Text(DoubleToString(0,2)+" "+AccountInfoString(ACCOUNT_CURRENCY)); } } //--- Move SL and TP lines if necessary if(StopLoss_line.Pressed()) { UpdateSLLines(); } if(TakeProfit_line.Pressed()) { UpdateTPLines(); } ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Event Handling | //+------------------------------------------------------------------+ EVENT_MAP_BEGIN(CTradePanel) ON_EVENT(ON_END_EDIT,Lots,LotsEndEdit) ON_EVENT(ON_END_EDIT,StopLoss_pips,SLPipsEndEdit) ON_EVENT(ON_END_EDIT,TakeProfit_pips,TPPipsEndEdit) ON_EVENT(ON_END_EDIT,StopLoss_money,SLMoneyEndEdit) ON_EVENT(ON_END_EDIT,TakeProfit_money,TPMoneyEndEdit) ON_EVENT(ON_END_EDIT,Risk_percent,RiskPercentEndEdit) ON_EVENT(ON_END_EDIT,Risk_money,RiskMoneyEndEdit) ON_EVENT(ON_CLICK,StopLoss_pips_b,SLPipsClick) ON_EVENT(ON_CLICK,TakeProfit_pips_b,TPPipsClick) ON_EVENT(ON_CLICK,StopLoss_money_b,SLMoneyClick) ON_EVENT(ON_CLICK,TakeProfit_money_b,TPMoneyClick) ON_EVENT(ON_CLICK,Risk_percent_b,RiskPercentClick) ON_EVENT(ON_CLICK,Risk_money_b,RiskMoneyClick) ON_EVENT(ON_CLICK,Increase,IncreaseLotClick) ON_EVENT(ON_CLICK,Decrease,DecreaseLotClick) ON_EVENT(ON_CLICK,StopLoss_line,StopLossLineClick) ON_EVENT(ON_CLICK,TakeProfit_line,TakeProfitLineClick) ON_EVENT(ON_CLICK,BUY,BuyClick) ON_EVENT(ON_CLICK,SELL,SellClick) ON_EVENT(ON_CLICK,CloseBuy,CloseBuyClick) ON_EVENT(ON_CLICK,CloseSell,CloseSellClick) ON_EVENT(ON_CLICK,CloseAll,CloseClick) EVENT_MAP_END(CAppDialog) //+------------------------------------------------------------------+ //| Read lots value after edit | //+------------------------------------------------------------------+ void CTradePanel::LotsEndEdit(void) { //--- Read and normalize lot value cur_lot=NormalizeLots(StringToDouble(Lots.Text())); //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); //--- Check and modify value of other labels if(StopLoss_money_b.Pressed()) { StopLossPipsByMoney(); } if(TakeProfit_money_b.Pressed()) { TakeProfitPipsByMoney(); } if(StopLoss_pips_b.Pressed()) { StopLossMoneyByPips(); } if(TakeProfit_pips_b.Pressed()) { TakeProfitMoneyByPips(); } RiskByValue=true; ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Normalization of order volume | //+------------------------------------------------------------------+ double CTradePanel::NormalizeLots(double lots) { double result=0; double minLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); double maxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX); double stepLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); if (lots>0) { lots=MathMax(minLot,lots); lots=minLot+NormalizeDouble((lots-minLot)/stepLot,0)*stepLot; result=MathMin(maxLot,lots); } else result=minLot; double Buy_FreeMargin=AccountInfo.FreeMarginCheck(_Symbol,ORDER_TYPE_BUY,result,SymbolInfoDouble(_Symbol,SYMBOL_ASK)); double Sell_FreeMargin=AccountInfo.FreeMarginCheck(_Symbol,ORDER_TYPE_SELL,result,SymbolInfoDouble(_Symbol,SYMBOL_BID)); if(Buy_FreeMargin<0 || Sell_FreeMargin<0) { if(result>minLot) { result=result*AccountInfo.FreeMargin()/(AccountInfo.FreeMargin()-MathMin(Buy_FreeMargin,Sell_FreeMargin)); result=NormalizeLots(result); } else { result=0; } } return (NormalizeDouble(result,2)); } //+------------------------------------------------------------------+ //| Modify SL pips by Order lot and SL money | //+------------------------------------------------------------------+ void CTradePanel::StopLossPipsByMoney(void) { //--- Read and normalize lot value cur_lot=NormalizeLots(StringToDouble(Lots.Text())); //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); double tick_value=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE); cur_sl_pips=(int)MathFloor(cur_sl_money/(tick_value*cur_lot)*(tick_size/_Point)); StopLoss_pips.Text(IntegerToString(cur_sl_pips)); if(StopLoss_line.Pressed()) { UpdateSLLines(); } return; } //+------------------------------------------------------------------+ //| Modify TP pips by Order lot and TP money | //+------------------------------------------------------------------+ void CTradePanel::TakeProfitPipsByMoney(void) { //--- Read and normalize lot value cur_lot=NormalizeLots(StringToDouble(Lots.Text())); //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); double tick_value=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE); cur_tp_pips=(int)MathFloor(cur_tp_money/(tick_value*cur_lot)*(tick_size/_Point)); TakeProfit_pips.Text(IntegerToString(cur_tp_pips)); if(TakeProfit_line.Pressed()) { UpdateTPLines(); } return; } //+------------------------------------------------------------------+ //| Modify SL money by Order lot and SL pips | //+------------------------------------------------------------------+ void CTradePanel::StopLossMoneyByPips(void) { //--- Read and normalize lot value double tick_value=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE); if(!RiskByValue) { cur_sl_money=StringToDouble(StopLoss_money.Text()); cur_lot=NormalizeLots(cur_sl_money/(tick_value*(tick_size/_Point)*cur_sl_pips)); } else { cur_lot=NormalizeLots(StringToDouble(Lots.Text())); } //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); cur_sl_money=NormalizeDouble(tick_value*cur_lot*(tick_size/_Point)*cur_sl_pips,2); StopLoss_money.Text(DoubleToString(cur_sl_money,2)); cur_risk_money=cur_sl_money; Risk_money.Text(DoubleToString(cur_risk_money,2)); cur_risk_percent=NormalizeDouble(cur_risk_money/AccountInfoDouble(ACCOUNT_EQUITY)*100,2); Risk_percent.Text(DoubleToString(cur_risk_percent,2)); if(TakeProfit_money_b.Pressed()) { TakeProfitPipsByMoney(); } else { TakeProfitMoneyByPips(); } return; } //+------------------------------------------------------------------+ //| Modify TP money by Order lot and TP pips | //+------------------------------------------------------------------+ void CTradePanel::TakeProfitMoneyByPips(void) { //--- Read and normalize lot value cur_lot=NormalizeLots(StringToDouble(Lots.Text())); //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); double tick_value=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE); cur_tp_money=NormalizeDouble(tick_value*cur_lot*(tick_size/_Point)*cur_tp_pips,2); TakeProfit_money.Text(DoubleToString(cur_tp_money,2)); return; } //+------------------------------------------------------------------+ //| Update Stop Loss Lines | //+------------------------------------------------------------------+ void CTradePanel::UpdateSLLines(void) { if(cur_sl_pips<=0) { return; } double price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-cur_sl_pips*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)); BuySL.Price(0,price); price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID)+cur_sl_pips*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)); SellSL.Price(0,price); return; } //+------------------------------------------------------------------+ //| Update Take Profit Lines | //+------------------------------------------------------------------+ void CTradePanel::UpdateTPLines(void) { if(cur_tp_pips<=0) { return; } double price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)+cur_tp_pips*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)); BuyTP.Price(0,price); price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID)-cur_tp_pips*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)); SellTP.Price(0,price); return; } //+------------------------------------------------------------------+ //| StopLoss in pips end edit | //+------------------------------------------------------------------+ void CTradePanel::SLPipsEndEdit(void) { cur_sl_pips=(int)StringToInteger(StopLoss_pips.Text()); if(cur_sl_pips<=0) { cur_sl_pips=0; } else { cur_sl_pips=(int)fmax(cur_sl_pips,SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); } StopLoss_pips.Text(IntegerToString(cur_sl_pips)); SLPipsClick(); StopLossMoneyByPips(); UpdateSLLines(); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Take Profit in pips end edit | //+------------------------------------------------------------------+ void CTradePanel::TPPipsEndEdit(void) { cur_tp_pips=(int)StringToInteger(TakeProfit_pips.Text()); if(cur_tp_pips<=0) { cur_tp_pips=0; } else { cur_tp_pips=(int)fmax(cur_tp_pips,SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); } TakeProfit_pips.Text(IntegerToString(cur_tp_pips)); TPPipsClick(); TakeProfitMoneyByPips(); UpdateTPLines(); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| StopLoss in money end edit | //+------------------------------------------------------------------+ void CTradePanel::SLMoneyEndEdit(void) { cur_sl_money=NormalizeDouble(StringToDouble(StopLoss_money.Text()),2); if(cur_sl_money<=0) { cur_sl_money=0; } else { cur_sl_money=(int)fmin(cur_sl_money,AccountInfoDouble(ACCOUNT_MARGIN_SO_SO)* (AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE)==ACCOUNT_STOPOUT_MODE_PERCENT ? AccountInfoDouble(ACCOUNT_BALANCE)/100 : 1)); } cur_risk_money=cur_sl_money; cur_risk_percent=NormalizeDouble(cur_risk_money/AccountInfoDouble(ACCOUNT_BALANCE)*100,2); Risk_percent.Text(DoubleToString(cur_risk_percent,2)); StopLoss_money.Text(DoubleToString(cur_sl_money,2)); Risk_money.Text(DoubleToString(cur_risk_money,2)); SLMoneyClick(); StopLossPipsByMoney(); if(cur_sl_pips>0 && cur_sl_pips<(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))) { cur_sl_pips=(int)(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); StopLoss_pips.Text(IntegerToString(cur_sl_pips)); StopLossMoneyByPips(); } ChartRedraw(); return; } //+------------------------------------------------------------------+ //| TakeProfit in money end edit | //+------------------------------------------------------------------+ void CTradePanel::TPMoneyEndEdit(void) { cur_tp_money=NormalizeDouble(StringToDouble(TakeProfit_money.Text()),2); if(cur_tp_money<=0) { cur_tp_money=0; } TakeProfit_money.Text(DoubleToString(cur_tp_money,2)); TPMoneyClick(); TakeProfitPipsByMoney(); if(cur_tp_pips>0 && cur_tp_pips<(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))) { cur_tp_pips=(int)(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); TakeProfit_pips.Text(IntegerToString(cur_tp_pips)); TakeProfitMoneyByPips(); } ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Risk in money end edit | //+------------------------------------------------------------------+ void CTradePanel::RiskMoneyEndEdit(void) { cur_risk_money=NormalizeDouble(StringToDouble(Risk_money.Text()),2); if(cur_risk_money<=0) { cur_risk_money=0; } else { cur_risk_money=(int)fmin(cur_risk_money,AccountInfoDouble(ACCOUNT_MARGIN_SO_SO)* (AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE)==ACCOUNT_STOPOUT_MODE_PERCENT ? AccountInfoDouble(ACCOUNT_BALANCE)/100 : 1)); } cur_sl_money=cur_risk_money; cur_risk_percent=NormalizeDouble(cur_risk_money/AccountInfoDouble(ACCOUNT_EQUITY)*100,2); Risk_percent.Text(DoubleToString(cur_risk_percent,2)); StopLoss_money.Text(DoubleToString(cur_sl_money,2)); Risk_money.Text(DoubleToString(cur_risk_money,2)); RiskMoneyClick(); StopLossPipsByMoney(); if(cur_sl_pips>0 && cur_sl_pips<(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))) { cur_sl_pips=(int)(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); StopLoss_pips.Text(IntegerToString(cur_sl_pips)); StopLossMoneyByPips(); } RiskByValue=false; ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Risk in percent end edit | //+------------------------------------------------------------------+ void CTradePanel::RiskPercentEndEdit(void) { cur_risk_percent=NormalizeDouble(StringToDouble(Risk_percent.Text()),2); if(cur_risk_percent<=0) { cur_risk_percent=0; } else { cur_risk_percent=NormalizeDouble(fmin(cur_risk_percent,AccountInfoDouble(ACCOUNT_MARGIN_SO_SO)* (AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE)==ACCOUNT_STOPOUT_MODE_PERCENT ? 1 : 100/AccountInfoDouble(ACCOUNT_BALANCE))),2); } cur_sl_money=cur_risk_money=NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY)*cur_risk_percent/100,2); StopLoss_money.Text(DoubleToString(cur_sl_money,2)); Risk_money.Text(DoubleToString(cur_risk_money,2)); Risk_percent.Text(DoubleToString(cur_risk_percent,2)); RiskPercentClick(); StopLossPipsByMoney(); if(cur_sl_pips>0 && cur_sl_pips<(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))) { cur_sl_pips=(int)(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); StopLoss_pips.Text(IntegerToString(cur_sl_pips)); StopLossMoneyByPips(); } RiskByValue=false; ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Click Stop Loss in pips | //+------------------------------------------------------------------+ void CTradePanel::SLPipsClick(void) { StopLoss_pips_b.Pressed(cur_sl_pips>0); StopLoss_money_b.Pressed(false); Risk_money_b.Pressed(false); Risk_percent_b.Pressed(false); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Click Take Profit in pips | //+------------------------------------------------------------------+ void CTradePanel::TPPipsClick(void) { TakeProfit_pips_b.Pressed(cur_tp_pips>0); TakeProfit_money_b.Pressed(false); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Click Stop Loss in money | //+------------------------------------------------------------------+ void CTradePanel::SLMoneyClick(void) { StopLoss_pips_b.Pressed(false); StopLoss_money_b.Pressed(cur_sl_money>0); Risk_money_b.Pressed(cur_risk_money>0); Risk_percent_b.Pressed(false); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Click Take Profit in money | //+------------------------------------------------------------------+ void CTradePanel::TPMoneyClick(void) { TakeProfit_pips_b.Pressed(false); TakeProfit_money_b.Pressed(cur_tp_money>0); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Click Risk in money | //+------------------------------------------------------------------+ void CTradePanel::RiskMoneyClick(void) { StopLoss_pips_b.Pressed(false); StopLoss_money_b.Pressed(cur_sl_money>0); Risk_money_b.Pressed(cur_risk_money>0); Risk_percent_b.Pressed(false); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Click Risk in percent | //+------------------------------------------------------------------+ void CTradePanel::RiskPercentClick(void) { StopLoss_pips_b.Pressed(false); StopLoss_money_b.Pressed(cur_sl_money>0); Risk_money_b.Pressed(false); Risk_percent_b.Pressed(cur_risk_percent>0); ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Create horizontal line | //+------------------------------------------------------------------+ bool CTradePanel::CreateHLine(long chart, int subwindow,CChartObjectHLine &object,color clr, string comment) { // All objects must to have separate name string name="HLine"+(string)ObjectsTotal(chart,-1,OBJ_HLINE); //--- Create horizontal line if(!object.Create(chart,name,subwindow,0)) return false; //--- Set color of line if(!object.Color(clr)) return false; //--- Set dash style to line if(!object.Style(STYLE_DASH)) return false; //--- Add comment to line if(!object.Tooltip(comment)) return false; //--- Hide line if(!object.Timeframes(OBJ_NO_PERIODS)) return false; //--- Move line to background if(!object.Background(true)) return false; if(!object.Selectable(true)) return false; return true; } //+------------------------------------------------------------------+ //| Show and Hide Stop Loss Lines | //+------------------------------------------------------------------+ void CTradePanel::StopLossLineClick() { if(StopLoss_line.Pressed()) // Button pressed { if(BuySL.Price(0)<=0) { UpdateSLLines(); } BuySL.Timeframes(OBJ_ALL_PERIODS); SellSL.Timeframes(OBJ_ALL_PERIODS); } else // Button unpressed { BuySL.Timeframes(OBJ_NO_PERIODS); SellSL.Timeframes(OBJ_NO_PERIODS); } ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Show and Hide Take Profit Lines | //+------------------------------------------------------------------+ void CTradePanel::TakeProfitLineClick(void) { if(TakeProfit_line.Pressed()) { if(BuyTP.Price(0)<=0) { UpdateTPLines(); } BuyTP.Timeframes(OBJ_ALL_PERIODS); SellTP.Timeframes(OBJ_ALL_PERIODS); } else { BuyTP.Timeframes(OBJ_NO_PERIODS); SellTP.Timeframes(OBJ_NO_PERIODS); } ChartRedraw(); return; } //+------------------------------------------------------------------+ //| Increase Lot Click | //+------------------------------------------------------------------+ void CTradePanel::IncreaseLotClick(void) { //--- Read and normalize lot value cur_lot=NormalizeLots(StringToDouble(Lots.Text())+SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)); //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); //--- Call end edit lot function LotsEndEdit(); return; } //+------------------------------------------------------------------+ //| Decrease Lot Click | //+------------------------------------------------------------------+ void CTradePanel::DecreaseLotClick(void) { //--- Read and normalize lot value cur_lot=NormalizeLots(StringToDouble(Lots.Text())-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)); //--- Output lot value to panel Lots.Text(DoubleToString(cur_lot,2)); LotsEndEdit(); } //+------------------------------------------------------------------+ //| Click BUY button | //+------------------------------------------------------------------+ void CTradePanel::BuyClick(void) { cur_lot=NormalizeLots(StringToDouble(Lots.Text())); Lots.Text(DoubleToString(cur_lot,2)); double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double SL=(cur_sl_pips>0 ? NormalizeDouble(price-cur_sl_pips*_Point,_Digits) : 0); double TP=(cur_tp_pips>0 ? NormalizeDouble(price+cur_tp_pips*_Point,_Digits) : 0); if(!Trade.Buy(NormalizeLots(cur_lot),_Symbol,price,SL,TP,"Trade Panel")) MessageBox("Error of open BUY ORDER "+Trade.ResultComment(),"Trade Panel Error",MB_ICONERROR|MB_OK);; return; } //+------------------------------------------------------------------+ //| Click SELL button | //+------------------------------------------------------------------+ void CTradePanel::SellClick(void) { cur_lot=NormalizeLots(StringToDouble(Lots.Text())); Lots.Text(DoubleToString(cur_lot,2)); double price=SymbolInfoDouble(_Symbol,SYMBOL_BID); double SL=(cur_sl_pips>0 ? NormalizeDouble(price+cur_sl_pips*_Point,_Digits) : 0); double TP=(cur_tp_pips>0 ? NormalizeDouble(price-cur_tp_pips*_Point,_Digits) : 0); if(!Trade.Sell(NormalizeLots(cur_lot),_Symbol,price,SL,TP,"Trade Panel")) MessageBox("Error of open BUY ORDER "+Trade.ResultComment(),"Trade Panel Error",MB_ICONERROR|MB_OK);; return; } //+------------------------------------------------------------------+ //| Click CLOSE BUY button | //+------------------------------------------------------------------+ void CTradePanel::CloseBuyClick(void) { if(!PositionSelect(_Symbol) || PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_BUY) { return; } if(!Trade.PositionClose(_Symbol)) MessageBox("Error of Close position "+Trade.ResultComment(),"Trade Panel Error",MB_ICONERROR|MB_OK);; return; } //+------------------------------------------------------------------+ //| Click CLOSE SELL button | //+------------------------------------------------------------------+ void CTradePanel::CloseSellClick(void) { if(!PositionSelect(_Symbol) || PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_SELL) { return; } if(!Trade.PositionClose(_Symbol)) MessageBox("Error of Close position "+Trade.ResultComment(),"Trade Panel Error",MB_ICONERROR|MB_OK);; return; } //+------------------------------------------------------------------+ //| Click CLOSE BUY button | //+------------------------------------------------------------------+ void CTradePanel::CloseClick(void) { if(!PositionSelect(_Symbol)) { return; } if(!Trade.PositionClose(_Symbol)) MessageBox("Error of Close position "+Trade.ResultComment(),"Trade Panel Error",MB_ICONERROR|MB_OK);; return; } //+------------------------------------------------------------------+ //| Run of Trade Panel | //+------------------------------------------------------------------+ bool CTradePanel::Run(void) { IniFileLoad(); cur_lot=StringToDouble(Lots.Text()); cur_sl_pips=(int)StringToInteger(StopLoss_pips.Text()); // Stop Loss in pips cur_sl_money=StringToDouble(StopLoss_money.Text()); // Stop Loss in money cur_tp_pips=(int)StringToInteger(TakeProfit_pips.Text()); // Take Profit in pips cur_tp_money=StringToDouble(TakeProfit_money.Text()); // Take Profit in money cur_risk_percent=StringToDouble(Risk_percent.Text()); // Risk in percent cur_risk_money=StringToDouble(Risk_money.Text()); // Risk in money RiskByValue=true; StopLossLineClick(); TakeProfitLineClick(); return(CAppDialog::Run()); } //+------------------------------------------------------------------+ //| Function of moving horizontal lines | //+------------------------------------------------------------------+ bool CTradePanel::DragLine(string name) { if(name==BuySL.Name()) { StopLoss_pips.Text(DoubleToString(MathAbs(BuySL.Price(0)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point,0)); SLPipsEndEdit(); BuySL.Selected(false); return true; } if(name==SellSL.Name()) { StopLoss_pips.Text(DoubleToString(MathAbs(SellSL.Price(0)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/_Point,0)); SLPipsEndEdit(); SellSL.Selected(false); return true; } if(name==BuyTP.Name()) { TakeProfit_pips.Text(DoubleToString(MathAbs(BuyTP.Price(0)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point,0)); TPPipsEndEdit(); BuyTP.Selected(false); return true; } if(name==SellTP.Name()) { TakeProfit_pips.Text(DoubleToString(MathAbs(SellTP.Price(0)-SymbolInfoDouble(_Symbol,SYMBOL_BID))/_Point,0)); TPPipsEndEdit(); SellTP.Selected(false); return true; } return false; } //+------------------------------------------------------------------+ //| Application deinitialization function | //+------------------------------------------------------------------+ void CTradePanel::Destroy(const int reason) { BuySL.Delete(); SellSL.Delete(); BuyTP.Delete(); SellTP.Delete(); CAppDialog::Destroy(reason); return; }