314 lines
12 KiB
MQL5
314 lines
12 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| NegotiationPanel.mq5 |
|
|
//| Rafael Floriani Pinto |
|
|
//| https://www.mql5.com/pt/users/rafaelfp |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Rafael Floriani Pinto"
|
|
#property link "https://www.mql5.com/pt/users/rafaelfp"
|
|
#property version "1.00"
|
|
#include<Trade/Trade.mqh>
|
|
#include<ClassControlPanel.mqh>
|
|
CTrade Operation;
|
|
CControlPainel ObjName(0,0.25,0.75,5,5,CORNER_LEFT_UPPER);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
ObjName.CreatePanel();
|
|
ObjName.CreateText("Ask: 0.0 Bid: 0.0",clrWhite,9);
|
|
ObjName.CreateText("StopLoss Points",clrRed,10);
|
|
ObjName.CreateText("0",clrRed,10,false);
|
|
ObjName.CreateText("TakeProfit Points",clrGreen,10);
|
|
ObjName.CreateText("0",clrGreen,10,false);
|
|
ObjName.CreateText("Volume",clrWhite,10);
|
|
ObjName.CreateText("0",clrWhite,10,false);
|
|
ObjName.CreateButton("Buy at market",clrBlack,clrGreen);
|
|
ObjName.CreateButton("Sell at market",clrBlack,clrRed);
|
|
ObjName.CreateText("Poits to open order",clrWhite,10);
|
|
ObjName.CreateText("0",clrWhite,10,false);
|
|
ObjName.CreateButton("Buy limit",clrBlack,clrGreen);
|
|
ObjName.CreateButton("Sell limit",clrBlack,clrRed);
|
|
ObjName.CreateButton("Buy stop",clrBlack,clrGreen);
|
|
ObjName.CreateButton("Sell stop",clrBlack,clrRed);
|
|
ObjName.CreateButton("Close All",clrBlack,clrBlue);
|
|
ObjName.CreateText("Position result: 0.0",clrWhite);
|
|
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
ObjName.DeletePanel();
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void OnTick()
|
|
{
|
|
double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
|
|
double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
|
|
string AskS=DoubleToString(Ask,_Digits);
|
|
string BidS=DoubleToString(Bid,_Digits);
|
|
ObjName.TextModifyString(1,TEXT_TEXTSHOW,"Ask: "+AskS+" Bid: "+BidS);
|
|
|
|
|
|
double Result=GetPositionResult();
|
|
string SResult=DoubleToString(Result,2);
|
|
ObjName.TextModifyString(10,TEXT_TEXTSHOW,"Position result: "+SResult);
|
|
if(Result>0)
|
|
{
|
|
ObjName.TextModifyInteger(10,TEXT_FONTCOLOR,clrGreen);
|
|
return;
|
|
}
|
|
if(Result<0)
|
|
{
|
|
ObjName.TextModifyInteger(10,TEXT_FONTCOLOR,clrRed);
|
|
}
|
|
else
|
|
{
|
|
ObjName.TextModifyInteger(10,TEXT_FONTCOLOR,clrWhite);
|
|
}
|
|
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void OnChartEvent(const int id,
|
|
const long& lparam,
|
|
const double& dparam,
|
|
const string& sparam
|
|
)
|
|
{
|
|
|
|
if(id==CHARTEVENT_OBJECT_CLICK)
|
|
{
|
|
if(ObjName.ButtonGetState(1))
|
|
{
|
|
string TP=ObjName.TextGetString(3);
|
|
string SL=ObjName.TextGetString(5);
|
|
string Vol=ObjName.TextGetString(7);
|
|
int PointsTP=(int)StringToInteger(TP);
|
|
int PointsSL=(int)StringToInteger(SL);
|
|
double Volume=(double)StringToDouble(Vol);
|
|
BuyAtMarket(Volume,PointsTP,PointsSL);
|
|
ObjName.ButtonSetState(1,false);
|
|
}
|
|
|
|
if(ObjName.ButtonGetState(2))
|
|
{
|
|
string TP=ObjName.TextGetString(3);
|
|
string SL=ObjName.TextGetString(5);
|
|
string Vol=ObjName.TextGetString(7);
|
|
int PointsTP=(int)StringToInteger(TP);
|
|
int PointsSL=(int)StringToInteger(SL);
|
|
double Volume=(double)StringToDouble(Vol);
|
|
SellAtMarket(Volume,PointsTP,PointsSL);
|
|
ObjName.ButtonSetState(2,false);
|
|
}
|
|
if(ObjName.ButtonGetState(3))
|
|
{
|
|
string TP=ObjName.TextGetString(3);
|
|
string SL=ObjName.TextGetString(5);
|
|
string Vol=ObjName.TextGetString(7);
|
|
string Alv=ObjName.TextGetString(9);
|
|
int PointsTP=(int)StringToInteger(TP);
|
|
int PointsSL=(int)StringToInteger(SL);
|
|
int AlvI=(int)StringToInteger(Alv);
|
|
double Volume=(double)StringToDouble(Vol);
|
|
BuyLimit(AlvI,Volume,PointsTP,PointsSL);
|
|
ObjName.ButtonSetState(3,false);
|
|
}
|
|
if(ObjName.ButtonGetState(4))
|
|
{
|
|
string TP=ObjName.TextGetString(3);
|
|
string SL=ObjName.TextGetString(5);
|
|
string Vol=ObjName.TextGetString(7);
|
|
string Alv=ObjName.TextGetString(9);
|
|
int PointsTP=(int)StringToInteger(TP);
|
|
int PointsSL=(int)StringToInteger(SL);
|
|
int AlvI=(int)StringToInteger(Alv);
|
|
double Volume=(double)StringToDouble(Vol);
|
|
SellLimit(AlvI,Volume,PointsTP,PointsSL);
|
|
ObjName.ButtonSetState(4,false);
|
|
}
|
|
if(ObjName.ButtonGetState(5))
|
|
{
|
|
string TP=ObjName.TextGetString(3);
|
|
string SL=ObjName.TextGetString(5);
|
|
string Vol=ObjName.TextGetString(7);
|
|
string Alv=ObjName.TextGetString(9);
|
|
int PointsTP=(int)StringToInteger(TP);
|
|
int PointsSL=(int)StringToInteger(SL);
|
|
int AlvI=(int)StringToInteger(Alv);
|
|
double Volume=(double)StringToDouble(Vol);
|
|
BuyStop(AlvI,Volume,PointsTP,PointsSL);
|
|
ObjName.ButtonSetState(5,false);
|
|
}
|
|
if(ObjName.ButtonGetState(6))
|
|
{
|
|
string TP=ObjName.TextGetString(3);
|
|
string SL=ObjName.TextGetString(5);
|
|
string Vol=ObjName.TextGetString(7);
|
|
string Alv=ObjName.TextGetString(9);
|
|
int PointsTP=(int)StringToInteger(TP);
|
|
int PointsSL=(int)StringToInteger(SL);
|
|
int AlvI=(int)StringToInteger(Alv);
|
|
double Volume=(double)StringToDouble(Vol);
|
|
SellStop(AlvI,Volume,PointsTP,PointsSL);
|
|
ObjName.ButtonSetState(6,false);
|
|
}
|
|
|
|
if(ObjName.ButtonGetState(7))
|
|
{
|
|
CancelAllOrdersAndPositions();
|
|
ObjName.ButtonSetState(7,false);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void BuyAtMarket(double Volume,int TPPoints,int SLPoints)
|
|
{
|
|
if(Volume<=0 || TPPoints<=0 || SLPoints<=0)
|
|
return;
|
|
double TP=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double SL=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double Price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
|
|
TP=NormalizeDouble(Price+TP,_Digits);
|
|
SL=NormalizeDouble(Price-SL,_Digits);
|
|
Operation.Buy(Volume,_Symbol,Price,SL,TP);
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void SellAtMarket(double Volume,int TPPoints,int SLPoints)
|
|
{
|
|
if(Volume<=0 || TPPoints<=0 || SLPoints<=0)
|
|
return;
|
|
double TP=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double SL=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double Price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
|
|
TP=NormalizeDouble(Price-TP,_Digits);
|
|
SL=NormalizeDouble(Price+SL,_Digits);
|
|
Operation.Sell(Volume,_Symbol,Price,SL,TP);
|
|
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void BuyLimit(int Into,double Volume,int TPPoints,int SLPoints)
|
|
{
|
|
if(Volume<=0 || TPPoints<=0 || SLPoints<=0 || Into<=0)
|
|
return;
|
|
double TP=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double SL=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double Alv=Into*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);;
|
|
double Price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
|
|
Price=NormalizeDouble(Price-Alv,_Digits);
|
|
TP=NormalizeDouble(Price+TP,_Digits);
|
|
SL=NormalizeDouble(Price-SL,_Digits);
|
|
Operation.BuyLimit(Volume,Price,_Symbol,SL,TP);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void SellLimit(int Into,double Volume,int TPPoints,int SLPoints)
|
|
{
|
|
if(Volume<=0 || TPPoints<=0 || SLPoints<=0 || Into<=0)
|
|
return;
|
|
double TP=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double SL=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double Alv=Into*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);;
|
|
double Price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
|
|
Price=NormalizeDouble(Price+Alv,_Digits);
|
|
TP=NormalizeDouble(Price-TP,_Digits);
|
|
SL=NormalizeDouble(Price+SL,_Digits);
|
|
Operation.SellLimit(Volume,Price,_Symbol,SL,TP);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void BuyStop(int Into,double Volume,int TPPoints,int SLPoints)
|
|
{
|
|
if(Volume<=0 || TPPoints<=0 || SLPoints<=0 || Into<=0)
|
|
return;
|
|
double TP=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double SL=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double Alv=Into*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);;
|
|
double Price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
|
|
Price=NormalizeDouble(Price+Alv,_Digits);
|
|
TP=NormalizeDouble(Price+TP,_Digits);
|
|
SL=NormalizeDouble(Price-SL,_Digits);
|
|
Operation.BuyStop(Volume,Price,_Symbol,SL,TP);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void SellStop(int Into,double Volume,int TPPoints,int SLPoints)
|
|
{
|
|
if(Volume<=0 || TPPoints<=0 || SLPoints<=0 || Into<=0)
|
|
return;
|
|
double TP=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double SL=TPPoints*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
|
|
double Alv=Into*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);;
|
|
double Price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
|
|
Price=NormalizeDouble(Price-Alv,_Digits);
|
|
TP=NormalizeDouble(Price-TP,_Digits);
|
|
SL=NormalizeDouble(Price+SL,_Digits);
|
|
Operation.SellStop(Volume,Price,_Symbol,SL,TP);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CancelAllOrdersAndPositions()
|
|
{
|
|
int N=PositionsTotal();
|
|
ulong Ticket;
|
|
for(int i=N-1; i>=0; i--)
|
|
{
|
|
Ticket=PositionGetTicket(i);
|
|
Operation.PositionClose(Ticket);
|
|
}
|
|
N=OrdersTotal();
|
|
for(int i=N-1; i>=0; i--)
|
|
{
|
|
Ticket=OrderGetTicket(i);
|
|
Operation.OrderDelete(Ticket);
|
|
}
|
|
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
double GetPositionResult()
|
|
{
|
|
double temp=0;
|
|
int N=PositionsTotal();
|
|
ulong Ticket;
|
|
for(int i=N-1; i>=0; i--)
|
|
{
|
|
Ticket=PositionGetTicket(i);
|
|
temp+=PositionGetDouble(POSITION_PROFIT);
|
|
}
|
|
return temp;
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|