SonnyPanel/EA/SonnyPanel4.mq5
super.admin cfd1ba1ff5 convert
2025-05-30 16:25:20 +02:00

849 lines
28 KiB
MQL5

//+------------------------------------------------------------------+
//| SonnyPanel2.mq5 |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include "..\includes\CalculateBreakeven.mqh"
#include "..\includes\OrderManager.mqh"
#include"..\\Includes\\BreakEvenResult.mqh"
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\CheckBox.mqh>
CTrade trade;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
#define BTN_BUY_NAME "Btn Buy"
#define BTN_SELL_NAME "Btn Sell"
#define BTN_CLOSEALL_NAME "Btn CloseAll"
#define EDIT_VOLUME "Edit Volume"
datetime Last_Candle_Open_Time=0;
CButton btnBuy;
CButton btnSell;
CButton btnCloseAll;
CEdit CEditMagic;
CButton btnMagicUp;
CButton btnMagicDown;
CButton TrailStartDown;
CButton TrailStartUp;
CButton TrailStepDown;
CButton TrailStepUp;
CEdit CEditLotsize;
CButton btnLotsizeDown;
CButton btnLotsizeUp;
CButton btnHedge;
CButton btnCloseMagic;
CEdit CEditProfit;
CButton btnProfitUp;
CButton btnProfitDown;
CEdit TrailStart;
CEdit TrailStep;
CEdit CEditLotsizeToClose;
CButton btnLotsizeToCloseUp;
CButton btnLotsizeToCloseDown;
CButton btnMoveUpDown;
CCheckBox CheckStopForToday;
CCheckBox CheckRecover;
OrderManager orderManager;
long Magic=1;
input bool iUseIndicator=true;
int autolot=700;
double buyat=-2;
double closeat=40;
input double iLotsizeToClose=0.01;// lotsize toclose/0.01
input double iprofitTarget=0.17;// profitargeet 0.07
input double iTrailStop=0.1;//trailstop 0.02
input double iTrailStep=0.03;//trailstep0.007
input double iLotsize=0.01;//0.01
input double iStopOut=3000;
input double iTotalLossProfit=30;
input double iLossProfit=-3;
input double iLossProfit1=-0.5;
input bool iSlave =false;
double LossProfit;
double TotalLossProfit;
double Lotsize;
double ProfitTaget;
double LotsizeToClose;
bool PanelUp=true;
int MA_handle;
int MA_handle1;
int MA_handle2;
int MA_handle3;
int MA_handle4;
int x=20;
bool process=true;
int w=50;
int h=20;
int d=30;
ulong TicketList[100] = {0};
double Step[100] = {0};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
datetime lasthedge;
MqlDateTime SDateTime,SToday;
long oldmagic=1;
double start;
double step;
int factor=0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
Magic=1;
start=iTrailStop;
step=iTrailStep;
Lotsize=iLotsize;
ProfitTaget=iprofitTarget;
LotsizeToClose=iLotsizeToClose;
TotalLossProfit=iTotalLossProfit;
LossProfit=iLossProfit;
if(iUseIndicator)
{
MA_handle=iCustom(NULL,0,"..\\indicators\\shared projects\\sonnypanel\\ea\\average_price_total",true,true);
MA_handle2=iCustom(NULL,0,"..\\indicators\\shared projects\\sonnypanel\\ea\\average_price_totalBuy",true,false);
MA_handle3=iCustom(NULL,0,"..\\indicators\\shared projects\\sonnypanel\\ea\\average_price_totalSell",false,true);
MA_handle4=iCustom(NULL,0,"..\\indicators\\shared projects\\sonnypanel\\ea\\average_price_totalMagic",Magic,LotsizeToClose,ProfitTaget);
MA_handle1=iCustom(NULL,0,"..\\indicators\\shared projects\\sonnypanel\\ea\\candlecountdown");
}
ObjectsDeleteAll(0,0,-1);
//---
TimeToStruct(TimeCurrent(),SDateTime);
SDateTime.hour=0;
SDateTime.min=0;
SDateTime.sec=0;
datetime from_date=StructToTime(SDateTime); // From date
SDateTime.hour=23;
SDateTime.min=59;
SDateTime.sec=59;
datetime to_date=StructToTime(SDateTime); // To date
lasthedge=TimeCurrent()-60*60*23*2;
btnBuy.Create(0,BTN_BUY_NAME,0,x+w,h,x+2*w,h+d);
btnBuy.Text("Buy");
btnBuy.Color(clrWhite);
btnBuy.ColorBackground(clrGreen);
btnSell.Create(0,BTN_SELL_NAME,0,x,h,x+w,h+d);
btnSell.Text("Sell");
btnSell.Color(clrWhite);
btnSell.ColorBackground(clrRed);
btnCloseAll.Create(0,BTN_CLOSEALL_NAME,0,x+2*w,h,x+3*w,h+d);
btnCloseAll.Text("CloseAll");
btnCloseAll.Color(clrWhite);
btnCloseAll.ColorBackground(clrPurple);
CEditMagic.Create(0,"Edit Magic",0,x+10,h+d,x+40,h+2*d);
CEditMagic.Text("1");
btnMagicUp.Create(0,"Magic Up",0,x,h+d,x+10,h+2*d);
btnMagicUp.Text("+");
btnMagicDown.Create(0,"Magic down",0,x+40,h+d,x+50,h+2*d);
btnMagicDown.Text("-");
CEditLotsize.Create(0,"Edit Lotsize",0,x+w+10,h+d,x+w+40,h+2*d);
CEditLotsize.Text(Lotsize);
btnLotsizeUp.Create(0,"Lotsize Up",0,x+w,h+d,x+w+10,h+2*d);
btnLotsizeUp.Text("+");
btnLotsizeDown.Create(0,"Lotsize Down",0,x+w+40,h+d,x+w+50,h+2*d);
btnLotsizeDown.Text("-");
CEditProfit.Create(0,"Profit",0,x+2*w+10,h+d,x+2*w+40,h+2*d);
CEditProfit.Text(ProfitTaget);
CEditProfit.ColorBackground(clrLightGreen);
CEditProfit.ReadOnly();
btnProfitUp.Create(0,"Profit Up",0,x+2*w,h+d,x+2*w+10,h+2*d);
btnProfitUp.Text("+");
btnProfitDown.Create(0,"Profit Down",0,x+2*w+40,h+d,x+2*w+50,h+2*d);
btnProfitDown.Text("-");
btnHedge.Create(0,"Hedge",0,x,h+2*d,x+w,h+3*d);
btnHedge.Text("Hedge");
btnHedge.Color(clrWhite);
btnHedge.ColorBackground(clrRed);
btnCloseMagic.Create(0,"Close Magic",0,x+w,h+2*d,x+2*w,h+3*d);
btnCloseMagic.Text("ClsMagic");
btnCloseMagic.Color(clrWhite);
btnCloseMagic.ColorBackground(clrPurple);
CEditLotsizeToClose.Create(0,"Edit LotsizeToClose",0,x+2*w+10,h+2*d,x+2*w+40,h+3*d);
CEditLotsizeToClose.Text(LotsizeToClose);
btnLotsizeToCloseUp.Create(0,"LotsizeToClose Up",0,x+2*w,h+2*d,x+2*w+10,h+3*d);
btnLotsizeToCloseDown.Text("-");
btnLotsizeToCloseDown.Create(0,"LotsizeToClose Down",0,x+2*w+40,h+2*d,x+2*w+50,h+3*d);
btnLotsizeToCloseUp.Text("+");
TrailStartUp.Create(0,"TrailUp",0,x,h+3*d,x+10,h+4*d);
TrailStartUp.Text("+");
TrailStart.Create(0,"TrailStart",0,x+10,h+3*d,x+40,h+4*d);
TrailStart.Text(start);
TrailStartDown.Create(0,"TrailDown",0,x+40,h+3*d,x+50,h+4*d);
TrailStartDown.Text("-");
TrailStep.Create(0,"TrailStep",0,x+w+10,h+3*d,x+w+40,h+4*d);
TrailStep.Text(step);
TrailStepUp.Create(0,"StepUp",0,x+w,h+3*d,x+w+10,h+4*d);
TrailStepUp.Text("+");
TrailStepDown.Create(0,"StepDown",0,x+w+40,h+3*d,x+w+50,h+4*d);
TrailStepDown.Text("-");
btnMoveUpDown.Create(0,"Move Panel",0,x+2*w,h+3*d,x+3*w,h+4*d);
btnMoveUpDown.Text("--");
CheckRecover.Create(0,"CRecover",0,x,h+4*d,x+w,h+5*d);
CheckRecover.Text("Recover");
CheckStopForToday.Create(0,"CStop",0,x+w, h+4*d,x+2*w,h+5*d);
CheckStopForToday.Text("StopToday");
//--- create application dialog
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void MovePanelUp()
{
ObjectSetInteger(0, BTN_BUY_NAME, OBJPROP_YDISTANCE, x);
ObjectSetInteger(0, BTN_SELL_NAME, OBJPROP_YDISTANCE, x);
ObjectSetInteger(0,BTN_CLOSEALL_NAME,OBJPROP_YDISTANCE,x);
ObjectSetInteger(0,"Edit Magic",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Magic Up",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Magic down",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Profit",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Profit Up",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Profit Down",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Edit Lotsize",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Lotsize Up",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Lotsize Down",OBJPROP_YDISTANCE,x+d);
ObjectSetInteger(0,"Hedge",OBJPROP_YDISTANCE,x+2*d);
ObjectSetInteger(0,"Close Magic",OBJPROP_YDISTANCE,x+2*d);
ObjectSetInteger(0,"Edit LotsizeToClose",OBJPROP_YDISTANCE,x+2*d);
ObjectSetInteger(0,"LotsizeToClose Up",OBJPROP_YDISTANCE,x+2*d);
ObjectSetInteger(0,"LotsizeToClose Down",OBJPROP_YDISTANCE,x+2*d);
ObjectSetInteger(0,"Move Panel",OBJPROP_YDISTANCE,x+3*d);
ObjectSetInteger(0,"TrailUp",OBJPROP_YDISTANCE,h+3*d);
ObjectSetInteger(0,"TrailStart",OBJPROP_YDISTANCE,h+3*d);
ObjectSetInteger(0,"TrailDown",OBJPROP_YDISTANCE,h+3*d);
ObjectSetInteger(0,"TrailStep",OBJPROP_YDISTANCE,h+3*d);
ObjectSetInteger(0,"StepUp",OBJPROP_YDISTANCE,h+3*d);
ObjectSetInteger(0,"StepDown",OBJPROP_YDISTANCE,h+3*d);
}
void MovePanelDown()
{
long result1=0;
int dis=120;
ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,result1);
ObjectSetInteger(0, BTN_BUY_NAME, OBJPROP_YDISTANCE, result1-dis);
ObjectSetInteger(0, BTN_SELL_NAME, OBJPROP_YDISTANCE, result1-dis);
ObjectSetInteger(0,BTN_CLOSEALL_NAME,OBJPROP_YDISTANCE,result1-dis);
ObjectSetInteger(0,"Edit Magic",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Magic Up",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Magic down",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Profit",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Profit Up",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Profit Down",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Edit Lotsize",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Lotsize Up",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Lotsize Down",OBJPROP_YDISTANCE,result1-dis+d);
ObjectSetInteger(0,"Hedge",OBJPROP_YDISTANCE,result1-dis+2*d);
ObjectSetInteger(0,"Close Magic",OBJPROP_YDISTANCE,result1-dis+2*d);
ObjectSetInteger(0,"Edit LotsizeToClose",OBJPROP_YDISTANCE,result1-dis+2*d);
ObjectSetInteger(0,"LotsizeToClose Up",OBJPROP_YDISTANCE,result1-dis+2*d);
ObjectSetInteger(0,"LotsizeToClose Down",OBJPROP_YDISTANCE,result1-dis+2*d);
ObjectSetInteger(0,"Move Panel",OBJPROP_YDISTANCE,result1-dis+3*d);
ObjectSetInteger(0,"TrailUp",OBJPROP_YDISTANCE,result1-dis+3*d);
ObjectSetInteger(0,"TrailStart",OBJPROP_YDISTANCE,result1-dis+3*d);
ObjectSetInteger(0,"TrailDown",OBJPROP_YDISTANCE,result1-dis+3*d);
ObjectSetInteger(0,"TrailStep",OBJPROP_YDISTANCE,result1-dis+3*d);
ObjectSetInteger(0,"StepUp",OBJPROP_YDISTANCE,result1-dis+3*d);
ObjectSetInteger(0,"StepDown",OBJPROP_YDISTANCE,result1-dis+3*d);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectsDeleteAll(0,0,-1);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if(!MQLInfoInteger(MQL_TESTER))
{
ButtonHandler();
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ReadParameters()
{
Magic=StringToInteger(ObjectGetString(0,"Edit Magic",OBJPROP_TEXT));
Lotsize=StringToDouble(ObjectGetString(0,"Edit Lotsize",OBJPROP_TEXT));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
static datetime dtBarCurrent = WRONG_VALUE;
datetime dtBarPrevious = dtBarCurrent;
dtBarCurrent = iTime(_Symbol,PERIOD_M1, 0);
bool bNewBarEvent = (dtBarCurrent != dtBarPrevious);
if(MQLInfoInteger(MQL_TESTER))
{
ButtonHandler();
ObjectSetInteger(0, "Edit Magic", OBJPROP_READONLY, 1);
ObjectSetInteger(0, "Edit Lotsize", OBJPROP_READONLY, 1);
ObjectSetInteger(0, "Edit LotsizeToClose", OBJPROP_READONLY, 1);
}
// SetAutolot();
//OrderList();
// CheckForTrail();
//trailing stop
// MqlDateTime rightNow;
// TimeCurrent(rightNow);
if(bNewBarEvent)
{
// Detect if this is the first tick received and handle it.
/* For example, when it is first attached to a chart and
the bar is somewhere in the middle of its progress and
it's not actually the start of a new bar. */
if(dtBarPrevious == WRONG_VALUE)
{
// Do something on first tick or middle of bar ...
}
else
{
if(orderManager.PositionTotalOnThis()==0 )//&& GetSpread(_Symbol)<1.6)
{
//&& rightNow.hour>8 && rightNow.hour<22)&& !CheckStopForToday.Checked()
//CheckRecover.Checked(false);
Magic=1;
start=iTrailStop;
step=iTrailStep;
Lotsize=iLotsize;
ProfitTaget=iprofitTarget;
LotsizeToClose=iLotsizeToClose;
TotalLossProfit=iTotalLossProfit;
LossProfit=iLossProfit;
oldmagic=1;
orderManager.recoveryOrdersBuy=0;
orderManager.recoveryOrdersSell=0;
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(iLotsize));
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(Magic));
ObjectSetString(0, "Edit LotsizeToClose",OBJPROP_TEXT, DoubleToString(iLotsizeToClose));
orderManager.FirstOrder(Magic,Lotsize);
}
orderManager.TrailTrades(Magic,true,true,ProfitTaget,LotsizeToClose,ProfitTaget,step,start);
if(AccountInfoDouble(ACCOUNT_PROFIT)<-iStopOut)
{
orderManager.CloseAll();
Magic=1;
start=iTrailStop;
step=iTrailStep;
Lotsize=iLotsize;
ProfitTaget=iprofitTarget;
LotsizeToClose=iLotsizeToClose;
TotalLossProfit=iTotalLossProfit;
LossProfit=iLossProfit;
oldmagic=1;
orderManager.recoveryOrdersBuy=0;
orderManager.recoveryOrdersSell=0;
lasthedge=TimeCurrent()-60*60*24;
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(iLotsize));
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(Magic));
ObjectSetString(0, "Edit LotsizeToClose",OBJPROP_TEXT, DoubleToString(iLotsizeToClose));
//
}
//NormalizeDouble(iLossProfit*Lotsize/0.01,3)
if(orderManager.RelativeProfitOnMagic2(Magic,Lotsize,LossProfit,LotsizeToClose,lasthedge,false,false)<-(Magic==1?TotalLossProfit/2:TotalLossProfit))
{
if(AccountInfoDouble(ACCOUNT_PROFIT)<-40)
{
int y;
y=1;
}
//ckStopForToday.Checked(true);
// CheckRecover.Checked(false);
int direction;
double result;
// result=orderManager.RelativeProfitOnMagic2(Magic,Lotsize,NormalizeDouble(iLossProfit*Lotsize/0.01,3),LotsizeToClose,lasthedge,false,false);
direction= orderManager.HedgePositions(Magic);
Magic=Magic+1;
TotalLossProfit=(Magic<20 ? Magic: 20)*iTotalLossProfit;
LossProfit=(Magic<20? Magic: 20)*iLossProfit;
Lotsize=(Magic<20? Magic: 20)*iLotsize;// NormalizeDouble(Lotsize*1.6,2);;
LotsizeToClose=NormalizeDouble(iLotsizeToClose*(Magic<20? Magic: 20),2);
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(Magic));
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(Lotsize));
ObjectSetString(0,"Edit LotsizeToClose",OBJPROP_TEXT,DoubleToString(LotsizeToClose));
TimeToStruct(TimeCurrent(),SToday);
TimeToStruct(lasthedge,SDateTime);
if (Magic==2)
process=true;
if (Magic>2 && ((lasthedge+60*60*24) <TimeCurrent()))
process=true;
if(process)
{
lasthedge=TimeCurrent();
if(direction==1)
{
orderManager.PlaceOrder(POSITION_TYPE_BUY,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_BUY,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_BUY,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_BUY,Lotsize,Magic,Magic);
}
if(direction==0)
{
orderManager.PlaceOrder(POSITION_TYPE_SELL,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_SELL,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_SELL,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_SELL,Lotsize,Magic,Magic);
}
}
}
if ((lasthedge+60*60*24)<TimeCurrent()) process=true;
if ((lasthedge+60*60*24)>TimeCurrent()) process=false;
orderManager.RelativeProfitOnMagic(Magic,Lotsize,LossProfit,LotsizeToClose,lasthedge,process,true);
}}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void SetAutolot()
{
double balance=AccountInfoDouble(ACCOUNT_BALANCE);
int intfactor;
intfactor=(int)MathFloor(NormalizeDouble(balance/autolot,1));
if(intfactor==0)
intfactor=1;
if(intfactor>SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)/SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN))
intfactor=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)/SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(intfactor>=factor)
factor=intfactor;
ProfitTaget=iprofitTarget*factor;
start=factor*iTrailStop;
step=factor*iTrailStep;
Lotsize=factor*0.1;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DetectConfig()
{
int magicHigh=orderManager.GetHighestMagic();
TotalLossProfit=(magicHigh<20 ? magicHigh: 20)*iTotalLossProfit;
LossProfit=(magicHigh<20? magicHigh: 20)*iLossProfit;
Lotsize=(magicHigh<20? magicHigh: 20)*iLotsize;// NormalizeDouble(Lotsize*1.6,2);;
LotsizeToClose=NormalizeDouble(iLotsizeToClose*(magicHigh<20? magicHigh: 20),2);
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(magicHigh));
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(Lotsize));
ObjectSetString(0,"Edit LotsizeToClose",OBJPROP_TEXT,DoubleToString(LotsizeToClose));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ButtonHandler()
{
double oldprofittarge=ProfitTaget;
double oldlotstoclose=LotsizeToClose;
if(TrailStartUp.Pressed())
{
start=start+iTrailStop;
ObjectSetString(0,"TrailStart",OBJPROP_TEXT,DoubleToString(start,1));
TrailStartUp.Pressed(false);
}
if(TrailStartDown.Pressed())
{
if(start > 0)
start=start-iTrailStop;
ObjectSetString(0,"TrailStart",OBJPROP_TEXT,DoubleToString(start,1));
TrailStartDown.Pressed(false);
}
if(TrailStepUp.Pressed())
{
step=step+iTrailStep;
ObjectSetString(0,"TrailStep",OBJPROP_TEXT,DoubleToString(step,1));
TrailStepUp.Pressed(false);
}
if(TrailStepDown.Pressed())
{
if(step > 0)
step=step-iTrailStep;
ObjectSetString(0,"TrailStep",OBJPROP_TEXT,DoubleToString(step,1));
TrailStepDown.Pressed(false);
}
if(btnMagicUp.Pressed())
{
oldmagic=Magic;
Magic=Magic+1;
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(Magic));
btnMagicUp.Pressed(false);
}
if(btnMagicDown.Pressed())
{
Magic=Magic-1;
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(Magic));
btnMagicDown.Pressed(false);
}
if(btnBuy.Pressed())
{
orderManager.PlaceOrder(POSITION_TYPE_BUY, Lotsize, Magic,NULL);
btnBuy.Pressed(false);
}
if(btnSell.Pressed())
{
orderManager.PlaceOrder(POSITION_TYPE_SELL, Lotsize, Magic,NULL);
btnSell.Pressed(false);
}
if(btnCloseAll.Pressed())
{
orderManager.CloseTrades(0,true,true,0);
btnCloseAll.Pressed(false);
}
if(btnLotsizeDown.Pressed())
{
Lotsize=Lotsize-iLotsize;
if(Lotsize<DoubleToString(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)))
Lotsize=DoubleToString(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN));
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(Lotsize));
btnLotsizeDown.Pressed(false);
}
if(btnLotsizeUp.Pressed())
{
Lotsize=Lotsize+iLotsize;
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(Lotsize));
btnLotsizeUp.Pressed(false);
}
if(btnLotsizeToCloseDown.Pressed())
{
LotsizeToClose=LotsizeToClose-iLotsizeToClose;
if(LotsizeToClose<DoubleToString(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)))
LotsizeToClose=DoubleToString(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN));
ObjectSetString(0,"Edit LotsizeToClose",OBJPROP_TEXT,DoubleToString(LotsizeToClose));
btnLotsizeToCloseDown.Pressed(false);
}
if(btnLotsizeToCloseUp.Pressed())
{
LotsizeToClose=LotsizeToClose+iLotsizeToClose;
ObjectSetString(0,"Edit LotsizeToClose",OBJPROP_TEXT,DoubleToString(LotsizeToClose));
btnLotsizeToCloseUp.Pressed(false);
}
if(btnProfitUp.Pressed())
{
ProfitTaget=ProfitTaget+iprofitTarget;
ObjectSetString(0,"Profit",OBJPROP_TEXT,DoubleToString(ProfitTaget));
btnProfitUp.Pressed(false);
}
if(btnProfitDown.Pressed())
{
ProfitTaget=ProfitTaget-iprofitTarget;
ObjectSetString(0,"Profit",OBJPROP_TEXT,DoubleToString(ProfitTaget));
btnProfitDown.Pressed(false);
}
if(btnCloseMagic.Pressed())
{
orderManager.CloseTrades(Magic,true,true,0,LotsizeToClose);
btnCloseMagic.Pressed(false);
}
if(btnHedge.Pressed())
{
{
//ckStopForToday.Checked(true);
// CheckRecover.Checked(false);
int direction;
double result;
// result=orderManager.RelativeProfitOnMagic2(Magic,Lotsize,NormalizeDouble(iLossProfit*Lotsize/0.01,3),LotsizeToClose,lasthedge,false,false);
direction= orderManager.HedgePositions(Magic);
Magic=Magic+1;
TotalLossProfit=(Magic<20 ? Magic: 20)*iTotalLossProfit;
LossProfit=(Magic<20? Magic: 20)*iLossProfit;
Lotsize=(Magic<20? Magic: 20)*iLotsize;// NormalizeDouble(Lotsize*1.6,2);;
LotsizeToClose=NormalizeDouble(iLotsizeToClose*(Magic<20? Magic: 20),2);
ObjectSetString(0,"Edit Magic",OBJPROP_TEXT,IntegerToString(Magic));
ObjectSetString(0,"Edit Lotsize",OBJPROP_TEXT,DoubleToString(Lotsize));
ObjectSetString(0,"Edit LotsizeToClose",OBJPROP_TEXT,DoubleToString(LotsizeToClose));
if(direction==1)
{
orderManager.PlaceOrder(POSITION_TYPE_BUY,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_BUY,Lotsize,Magic,Magic);
}
if(direction==0)
{
orderManager.PlaceOrder(POSITION_TYPE_SELL,Lotsize,Magic,Magic);
orderManager.PlaceOrder(POSITION_TYPE_SELL,Lotsize,Magic,Magic);
}
lasthedge=TimeCurrent();
}
}
if(Magic==0)
{
IndicatorRelease(MA_handle4);
}
if(((oldlotstoclose!=LotsizeToClose)||(oldmagic!=Magic)|| (oldprofittarge!=ProfitTaget)) && Magic!=0)
{
if(iUseIndicator)
{
IndicatorRelease(MA_handle4);
MA_handle4=iCustom(NULL,0,"..\\indicators\\shared projects\\sonnypanel\\ea\\average_price_totalMagic",Magic,LotsizeToClose,ProfitTaget);
}
oldmagic=Magic;
}
if(btnMoveUpDown.Pressed())
{
if(PanelUp==true)
{
MovePanelDown();
PanelUp=false;
}
else
{
MovePanelUp();
PanelUp=true;
}
btnMoveUpDown.Pressed(false);
}
ChartRedraw(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double GetSpread(string symbol)
{
// Get the Ask price
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
// Get the Bid price
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
// Calculate the spread
double spread = ask - bid;
return spread;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OrderList()
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
ulong PositionTicket = PositionGetTicket(i);
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
if(!InArray(PositionTicket))
Save(PositionTicket);
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Save(ulong t)
{
for(int i=0;i<ArraySize(TicketList);i++)
{
if(TicketList[i] == 0)
{
TicketList[i] = t;
break;
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool InArray(ulong t)
{
for(int i=0;i<ArraySize(TicketList);i++)
{
if(TicketList[i] == t)
return true;
}
return false;
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CheckForTrail()
{
double p = 0;
for(int i=0;i<ArraySize(TicketList);i++)
{
if(TicketList[i] != 0)
{
if(PositionSelectByTicket(TicketList[i]))
{
p = PositionGetDouble(POSITION_PROFIT);
if(p >= start && p-step > Step[i])
Step[i] = p-step;
else
{
if(Step[i] != 0 && p <= Step[i])
trade.PositionClose(TicketList[i]);
}
}
else
{
Step[i] = 0;
TicketList[i] = 0;
}
}
}
}
//+------------------------------------------------------------------+