TradePlotter

Author: Copyright 2022, MetaQuotes Ltd.
0 Views
0 Downloads
0 Favorites
TradePlotter
//+------------------------------------------------------------------+
//|                                                 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