//+------------------------------------------------------------------+
//| TradePlotter.mq5 |
//| Copyright 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Agianto Simanullang"
#property indicator_chart_window
#property indicator_plots 0
input double HistoryInMonths = 3.00;
int count_current_ordes_flaq, count_history_orders_flaq;
string VariableIn[][8];
string VariableOut[][8];
/*
0. Ticket, 1. Symbol, 2. Order Type, 3. Time, 4. Price, 5. Profit, 6. Volume, 7. Position Id
*/
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() { OnDeinit(1); return (INIT_SUCCEEDED); }
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[])
{
int i, count_current_ordes, count_history_orders;
string obj_name = "", str_order_type;
// Curent orders
count_current_ordes = PositionsTotal();
if(count_current_ordes_flaq != count_current_ordes)
{
for(i = count_current_ordes - 1; i >= 0; i--)
{
if(PositionGetTicket(i) > 0)
{
if(PositionGetString(POSITION_SYMBOL) == Symbol() && PositionGetInteger(POSITION_TYPE) <= 1)
{
str_order_type = PositionGetInteger(POSITION_TYPE) == ENUM_POSITION_TYPE(POSITION_TYPE_BUY) ? "buy" : "sell";
obj_name = "#" + IntegerToString(PositionGetInteger(POSITION_TICKET)) + " " + str_order_type + " " + DoubleToString(PositionGetDouble(POSITION_VOLUME), 2) + " " + PositionGetString(POSITION_SYMBOL) + " at " + DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN), _Digits) + ", " + PositionGetString(POSITION_SYMBOL) + "";
if(PositionGetInteger(POSITION_TYPE) == ENUM_POSITION_TYPE(POSITION_TYPE_BUY))
{
ObjectCreate(0, obj_name, OBJ_ARROW_BUY, 0, PositionGetInteger(POSITION_TIME), PositionGetDouble(POSITION_PRICE_OPEN));
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, clrBlue);
}
else
{
ObjectCreate(0, obj_name, OBJ_ARROW_SELL, 0, PositionGetInteger(POSITION_TIME), PositionGetDouble(POSITION_PRICE_OPEN));
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, clrRed);
}
}
}
}
count_current_ordes_flaq = count_current_ordes;
ChartRedraw(0);
}
// History orders
HistorySelect((datetime)(TimeCurrent() - PeriodSeconds(PERIOD_MN1) * HistoryInMonths), TimeCurrent());
count_history_orders = HistoryDealsTotal();
if(count_history_orders_flaq != count_history_orders)
{
ArrayFree(VariableIn);
ArrayFree(VariableOut);
ArrayResize(VariableIn, count_history_orders);
ArrayResize(VariableOut, count_history_orders);
obj_name = "";
ulong ticket = 0;
int x = 0, y = 0;
for(i = count_history_orders - 1; i >= 0; i--)
{
ticket = HistoryDealGetTicket(i);
if(ticket > 0)
{
/*
0. Ticket, 1. Symbol, 2. Order Type, 3. Time, 4. Price, 5. Profit, 6. Volume, 7. Position Id
*/
if(HistoryDealGetString(ticket, DEAL_SYMBOL) == Symbol() && HistoryDealGetInteger(ticket, DEAL_TYPE) <= 1)
{
if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == ENUM_DEAL_ENTRY(DEAL_ENTRY_IN))
{
VariableIn[x][0] = IntegerToString(HistoryDealGetInteger(ticket, DEAL_TICKET));
VariableIn[x][1] = HistoryDealGetString(ticket, DEAL_SYMBOL);
VariableIn[x][2] = IntegerToString(HistoryDealGetInteger(ticket, DEAL_TYPE));
VariableIn[x][3] = TimeToString((datetime)HistoryDealGetInteger(ticket, DEAL_TIME), TIME_DATE | TIME_MINUTES);
VariableIn[x][4] = DoubleToString(HistoryDealGetDouble(ticket, DEAL_PRICE), _Digits);
VariableIn[x][5] = DoubleToString(HistoryDealGetDouble(ticket, DEAL_PROFIT), 2);
VariableIn[x][6] = DoubleToString(HistoryDealGetDouble(ticket, DEAL_VOLUME), 2);
VariableIn[x][7] = IntegerToString(HistoryDealGetInteger(ticket, DEAL_POSITION_ID));
x++;
}
if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == ENUM_DEAL_ENTRY(DEAL_ENTRY_OUT))
{
VariableOut[y][0] = IntegerToString(HistoryDealGetInteger(ticket, DEAL_TICKET));
VariableOut[y][1] = HistoryDealGetString(ticket, DEAL_SYMBOL);
VariableOut[y][2] = IntegerToString(HistoryDealGetInteger(ticket, DEAL_TYPE));
VariableOut[y][3] = TimeToString((datetime)HistoryDealGetInteger(ticket, DEAL_TIME), TIME_DATE | TIME_MINUTES);
VariableOut[y][4] = DoubleToString(HistoryDealGetDouble(ticket, DEAL_PRICE), _Digits);
VariableOut[y][5] = DoubleToString(HistoryDealGetDouble(ticket, DEAL_PROFIT), 2);
VariableOut[y][6] = DoubleToString(HistoryDealGetDouble(ticket, DEAL_VOLUME), 2);
VariableOut[y][7] = IntegerToString(HistoryDealGetInteger(ticket, DEAL_POSITION_ID));
y++;
}
}
}
}
count_history_orders_flaq = count_history_orders;
double profit_in = 0, profit_out = 0, price_in = 0, price_out = 0;
double volume_in = 0, volume_out = 0;
string symbol_in = "", symbol_out = "";
ulong ticket_in = 0, ticket_out = 0;
datetime time_in = 0, time_out = 0;
ulong order_type_in = -1, order_type_out = -1;
int j = 0;
/*
0. Ticket, 1. Symbol, 2. Order Type, 3. Time, 4. Price, 5. Profit, 6. Volume, 7. Position Id
*/
for(i = 0; i < count_history_orders; i++)
{
if((ulong)VariableOut[i][0] == NULL || (ulong)VariableOut[i][0] == 0)
{
continue;
}
ticket_out = StringToInteger(VariableOut[i][0]);
symbol_out = VariableOut[i][1];
order_type_out = StringToInteger(VariableOut[i][2]);
time_out = (datetime)VariableOut[i][3];
price_out = StringToDouble(VariableOut[i][4]);
profit_out = StringToDouble(VariableOut[i][5]);
volume_out = StringToDouble(VariableOut[i][6]);
obj_name = "#" + IntegerToString(ticket_out) + " " + (order_type_out == 0 ? "buy" : "sell") + " " + DoubleToString(volume_out, 2) + " " + symbol_out + " at " + DoubleToString(price_out, _Digits) + ", profit " + DoubleToString(profit_out, 2) + "";
if(order_type_out == 0)
{
if(ObjectFind(0, obj_name) < 0)
{
ObjectCreate(0, obj_name, OBJ_ARROW_BUY, 0, time_out, price_out);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, C'3,95,172');
}
}
else
{
if(ObjectFind(0, obj_name) < 0)
{
ObjectCreate(0, obj_name, OBJ_ARROW_SELL, 0, time_out, price_out);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, C'225,68,29');
}
}
}
for(j = 0; j < count_history_orders; j++)
{
if((ulong)VariableIn[j][0] == NULL || (ulong)VariableIn[j][0] == 0)
{
continue;
}
ticket_in = StringToInteger(VariableIn[j][0]);
symbol_in = VariableIn[j][1];
order_type_in = StringToInteger(VariableIn[j][2]);
time_in = (datetime)VariableIn[j][3];
price_in = StringToDouble(VariableIn[j][4]);
profit_in = StringToDouble(VariableIn[j][5]);
volume_in = StringToDouble(VariableIn[j][6]);
obj_name = "#" + IntegerToString(ticket_in) + " " + (order_type_in == 0 ? "buy" : "sell") + " " + DoubleToString(volume_in, 2) + " " + symbol_in + " at " + DoubleToString(price_in, _Digits) + ", " + symbol_in + "";
if(order_type_in == 0)
{
if(ObjectFind(0, obj_name) < 0)
{
ObjectCreate(0, obj_name, OBJ_ARROW_BUY, 0, time_in, price_in);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, C'3,95,172');
}
}
else
{
if(ObjectFind(0, obj_name) < 0)
{
ObjectCreate(0, obj_name, OBJ_ARROW_SELL, 0, time_in, price_in);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, C'225,68,29');
}
}
}
/*
0. Ticket, 1. Symbol, 2. Order Type, 3. Time, 4. Price, 5. Profit, 6. Volume, 7. Position Id
*/
for(i = 0; i < count_history_orders; i++)
{
if((ulong)VariableOut[i][0] == NULL || (ulong)VariableOut[i][0] == 0)
{
continue;
}
for(j = 0; j < count_history_orders; j++)
{
if((ulong)VariableIn[j][0] == NULL || (ulong)VariableIn[j][0] == 0)
{
continue;
}
if(VariableOut[i][7] == VariableIn[j][7])
{
obj_name = "#" + VariableIn[j][0] + " -> #" + VariableOut[i][0] + ", profit " + DoubleToString((double)VariableOut[i][5], 2) + ", " + VariableOut[i][1];
if(ObjectFind(0, obj_name) < 0)
{
ObjectCreate(0, obj_name, OBJ_TREND, 0, StringToTime(VariableIn[j][3]), StringToDouble(VariableIn[j][4]), StringToTime(VariableOut[i][3]), StringToDouble(VariableOut[i][4]));
ObjectSetInteger(0, obj_name, OBJPROP_STYLE, STYLE_DOT);
ObjectSetInteger(0, obj_name, OBJPROP_WIDTH, 1);
ObjectSetInteger(0, obj_name, OBJPROP_RAY_RIGHT, false);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, StringToInteger(VariableIn[j][2]) == 0 ? C'3,95,172' : C'225,68,29');
}
}
}
}
ArrayFree(VariableIn);
ArrayFree(VariableOut);
ChartRedraw(0);
}
return (rates_total);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
int ObjTotal = ObjectsTotal(0);
for(int i = ObjTotal; i >= 0; i--)
{
if(StringSubstr(ObjectName(0, i), 0, 2) == "#")
{
ObjectDelete(0, ObjectName(0, i));
}
}
}
//+------------------------------------------------------------------+
Comments