//+------------------------------------------------------------------+
//| OrderManager.mq4 |
//| |
//| when-money-makes-money.com |
//+------------------------------------------------------------------+
#property copyright "when-money-makes-money.com"
#property link "when-money-makes-money.com"
extern color StoplossColor=Red;
extern color TakeprofitColor=Green;
extern color OpenPriceColor=Magenta;
#define MODE_INIT 3
#define MODE_DEINIT 2
#define MODE_NORMAL 1
double pmod;
void DeleteGFX(int tickets[]){
for(int i=ArraySize(tickets)-1;i>=0;i--){
ObjectDelete(tickets[i]+"-sl");
ObjectDelete(tickets[i]+"-open");
ObjectDelete(tickets[i]+"-tp");
ObjectDelete(tickets[i]+"-sl_l");
ObjectDelete(tickets[i]+"-tp_l");
}
}
void UpdateGFX(int tickets[]){
for(int i=ArraySize(tickets)-1;i>=0;i--){
OrderSelect(tickets[i],SELECT_BY_TICKET);
ObjectCreate(tickets[i]+"-sl",OBJ_HLINE,0,0,OrderStopLoss());
ObjectSet(tickets[i]+"-sl",OBJPROP_PRICE1,OrderStopLoss());
ObjectSet(tickets[i]+"-sl",OBJPROP_COLOR,StoplossColor);
ObjectCreate(tickets[i]+"-sl_l",OBJ_TEXT,0,OrderOpenTime(),OrderStopLoss());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_TIME1,OrderOpenTime());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_PRICE1,OrderStopLoss());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_COLOR,StoplossColor);
ObjectSetText(tickets[i]+"-sl_l","[SL]"+OrderTicket()+" for "+DoubleToStr(MathAbs(OrderOpenPrice()-OrderStopLoss())/pmod,1)+" pips");
ObjectCreate(tickets[i]+"-tp",OBJ_HLINE,0,0,OrderTakeProfit());
ObjectSet(tickets[i]+"-tp",OBJPROP_COLOR,TakeprofitColor);
ObjectSet(tickets[i]+"-tp",OBJPROP_PRICE1,OrderTakeProfit());
ObjectCreate(tickets[i]+"-tp_l",OBJ_TEXT,0,OrderOpenTime(),OrderTakeProfit());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_TIME1,OrderOpenTime());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_PRICE1,OrderTakeProfit());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_COLOR,TakeprofitColor);
ObjectSetText(tickets[i]+"-tp_l","[TP]"+OrderTicket()+" for "+DoubleToStr(MathAbs(OrderOpenPrice()-OrderTakeProfit())/pmod,1)+" pips");
ObjectCreate(tickets[i]+"-open",OBJ_HLINE,0,0,OrderOpenPrice());
ObjectSet(tickets[i]+"-open",OBJPROP_COLOR,OpenPriceColor);
ObjectSet(tickets[i]+"-open",OBJPROP_PRICE1,OrderOpenPrice());
}
}
void RecalcByGFX(int &tickets[],double &sl[], double &tp[]){
for(int i=ArraySize(tickets)-1;i>=0;i--){
OrderSelect(tickets[i],SELECT_BY_TICKET);
double gfx.tp,gfx.sl;
gfx.tp=NormalizeDouble(ObjectGet(tickets[i]+"-tp",OBJPROP_PRICE1),Digits);
if(gfx.tp!=OrderTakeProfit()){
if(gfx.tp!=tp[i]){
if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(gfx.tp,Digits),0,CLR_NONE)){
tp[i]=gfx.tp;
ObjectSet(tickets[i]+"-tp_l",OBJPROP_TIME1,OrderOpenTime());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_PRICE1,gfx.tp);
ObjectSet(tickets[i]+"-tp_l",OBJPROP_COLOR,TakeprofitColor);
ObjectSetText(tickets[i]+"-tp_l","[TP]"+OrderTicket()+" for "+DoubleToStr(MathAbs(OrderOpenPrice()-gfx.tp)/pmod,1)+" pips");
}
}else{
ObjectSet(tickets[i]+"-tp",OBJPROP_PRICE1,OrderTakeProfit());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_TIME1,OrderOpenTime());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_PRICE1,OrderTakeProfit());
ObjectSet(tickets[i]+"-tp_l",OBJPROP_COLOR,TakeprofitColor);
ObjectSetText(tickets[i]+"-tp_l","[TP]"+OrderTicket()+" for "+DoubleToStr(MathAbs(OrderOpenPrice()-OrderTakeProfit())/pmod,1)+" pips");
tp[i]=gfx.tp;
}
}
gfx.sl=NormalizeDouble(ObjectGet(tickets[i]+"-sl",OBJPROP_PRICE1),Digits);
if(gfx.sl!=OrderStopLoss()){
if(gfx.sl!=sl[i]){
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(gfx.sl,Digits),OrderTakeProfit(),0,CLR_NONE)){
sl[i]=gfx.sl;
ObjectSet(tickets[i]+"-sl_l",OBJPROP_TIME1,OrderOpenTime());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_PRICE1,gfx.sl);
ObjectSet(tickets[i]+"-sl_l",OBJPROP_COLOR,StoplossColor);
ObjectSetText(tickets[i]+"-sl_l","[SL]"+OrderTicket()+" for "+DoubleToStr(MathAbs(OrderOpenPrice()-gfx.sl)/pmod,1)+" pips");
}
}else{
ObjectSet(tickets[i]+"-sl",OBJPROP_PRICE1,OrderStopLoss());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_TIME1,OrderOpenTime());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_PRICE1,OrderStopLoss());
ObjectSet(tickets[i]+"-sl_l",OBJPROP_COLOR,StoplossColor);
ObjectSetText(tickets[i]+"-sl_l","[SL]"+OrderTicket()+" for "+DoubleToStr(MathAbs(OrderOpenPrice()-OrderStopLoss())/pmod,1)+" pips");
sl[i]=gfx.sl;
}
}
}
}
void OrderManager(int mode){
static int tickets[];
static double tp[];
static double sl[];
string prefix="";
if(IsTesting()) prefix="";
if(GlobalVariableCheck(prefix+"NewTrade")){
int nt_mode=(GlobalVariableGet(prefix+"NewTrade_mode"));
double nt_lot=(GlobalVariableGet(prefix+"NewTrade_lot"));
int nt_tp=(GlobalVariableGet(prefix+"NewTrade_tp"));
int nt_sl=(GlobalVariableGet(prefix+"NewTrade_sl"));
double pmod=1;
if(Digits==5 || Digits==3) pmod=10;
double nt_slippage=0;
double nt_stoploss=0;
double nt_takeprofit=0;
double nt_op;
switch(nt_mode){
case OP_BUY:{
nt_op=Ask;
nt_stoploss=nt_op-(nt_sl*Point*pmod);
nt_takeprofit=nt_op+(nt_tp*Point*pmod);
break;
}
case OP_SELL:{
nt_op=Bid;
nt_stoploss=nt_op+(nt_sl*Point*pmod);
nt_takeprofit=nt_op-(nt_tp*Point*pmod);
break;
}
}
Print(nt_lot);
int err=OrderSend(Symbol(),nt_mode,NormalizeDouble(nt_lot,2),nt_op,nt_slippage,NormalizeDouble(nt_stoploss,Digits),NormalizeDouble(nt_takeprofit,Digits),"when-money-makes-money.com",0,0,CLR_NONE);
/*if(err>=0)*/ GlobalVariableDel(prefix+"NewTrade");
}
if(mode==MODE_DEINIT){
DeleteGFX(tickets);
}else{
if(mode==MODE_INIT){
ArrayResize(tickets,0);
}
int i=0;
int OpenOrdersOnSymbol=0;
for(i=OrdersTotal()-1;i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()){
OpenOrdersOnSymbol++;
}
}
if(OpenOrdersOnSymbol!=ArraySize(tickets)){
DeleteGFX(tickets);
ArrayResize(tickets,OpenOrdersOnSymbol);
ArrayResize(tp,OpenOrdersOnSymbol);
ArrayResize(sl,OpenOrdersOnSymbol);
int j=0;
for(i=OrdersTotal()-1;i>=0;i--){
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol()==Symbol()){
tickets[j]=OrderTicket();
sl[j]=OrderStopLoss();
tp[j]=OrderStopLoss();
j++;
}
}
UpdateGFX(tickets);
}else{
RecalcByGFX(tickets,tp,sl);
}
}
Comment("NR of orders: "+ArraySize(tickets)+"\nwww.when-money-makes-money.com");
}
int init(){
ObjectCreate("logo",OBJ_LABEL,0,0,0);
ObjectSetText("logo","when-money-makes-money.com",20);
ObjectSet("logo",OBJPROP_XDISTANCE,0);
ObjectSet("logo",OBJPROP_YDISTANCE,30);
if(Digits==5||Digits==3){
pmod=Point*10;
}else{
pmod=Point;
}
OrderManager(MODE_INIT);
GlobalVariableDel("NewTrade");
GlobalVariableDel("NewTrade_mode");
GlobalVariableDel("NewTrade_lot");
GlobalVariableDel("NewTrade_tp");
GlobalVariableDel("NewTrade_sl");
return(0);
}
color lc[]={Yellow,Gold,Orange,DarkOrange,OrangeRed,Red,OrangeRed,DarkOrange,Orange,Gold};
int currc=0;
int start()
{
if(IsTesting()){
OrderManager(MODE_NORMAL);
}
ObjectSet("logo",OBJPROP_COLOR,lc[currc]);
currc++;
if(currc>=ArraySize(lc))currc=0;
return(0);
}
int deinit(){
OrderManager(MODE_DEINIT);
GlobalVariableDel("NewTrade");
GlobalVariableDel("NewTrade_mode");
GlobalVariableDel("NewTrade_lot");
GlobalVariableDel("NewTrade_tp");
GlobalVariableDel("NewTrade_sl");
return(0);
}
//+------------------------------------------------------------------+
Comments