//+------------------------------------------------------------------+
//|                                    UniversalTradeScreenShots.mq4 |
//|                                                      nicholishen |
//|                            http://www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link      "http://www.reddit.com/u/nicholishenFX"
#property version   "1.00"
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
#include <Arrays\ArrayInt.mqh>
#include <ChartObjects\ChartObjectsLines.mqh>

class ScreenShot
{
private:
   CArrayInt      m_list;
   bool           m_init;
   int            m_magic;
   //string         m_folder;
   //int            m_orders_total;
   int            m_period;
public:
   ScreenShot(int magic_number,int period): m_init(false),
                                 m_magic(magic_number),
                                 //m_folder("screenshots\\"+Symbol()+"\\"),
                                 //m_orders_total(-1),
                                 m_period(period)
                                 {}
   void  OnInit()
   {
      m_list.Clear();
      m_init = false;
   }
  
   void  Refresh()
   {
      if(!m_init)
      {
         Init();
         return;
      }
      // check for new entries
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS)&& OrderType() < 2 &&(m_magic==0|| m_magic==OrderMagicNumber()))
         {
            if(m_list.SearchLinear(OrderTicket()) < 0)
            {
               m_list.Add(OrderTicket());
               string folder = "screenshots\\"+OrderSymbol()+"\\";
               string name = folder+OrderSymbol()+"_"+string(OrderTicket())+"_ENTRY.gif";
               long chart = ChartOpen(OrderSymbol(),m_period);
               CChartObjectHLine line;
               line.Create(chart,"__templine__",0,OrderOpenPrice());
               line.Style(STYLE_DASHDOTDOT);
               line.Description("ENTRY");
               line.Color(clrGreen);
               ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,true);
               ChartScreenShot(chart,name,1280,720);
               ChartClose(chart);
            } 
         }
      }
      // check for new exits
      for(int i=m_list.Total()-1;i>=0;i--)
      {
         bool found = false;
         for(int j=0;j<OrdersTotal();j++)
         {
            if(OrderSelect(j,SELECT_BY_POS) && OrderTicket() == m_list[i])
            {
               found = true;
               break;
            }
         }
         if(!found)
         {
            string folder = "screenshots\\";
            CChartObjectHLine entry,exit;
            long chart = 0;
            if(OrderSelect(m_list[i],SELECT_BY_TICKET) && OrderType() <2)
            { 
               string type = OrderType() == OP_BUY ? "BUY" : "SELL";
               chart = ChartOpen(OrderSymbol(),m_period);
               folder = "screenshots\\"+OrderSymbol()+"\\";
               exit.Create(chart,"__templine__",0,OrderClosePrice());
               exit.Style(STYLE_DASHDOTDOT);
               exit.Description(type+" EXIT");
               entry.Create(chart,"__entrytempline__",0,OrderOpenPrice());
               entry.Style(STYLE_DASHDOTDOT);
               entry.Description(type+" ENTRY");
               entry.Color(clrGreen);
               ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,true);
               string name = folder+OrderSymbol()+"_"+string(m_list[i])+"_EXIT.gif";
               ChartScreenShot(chart,name,1280,720);
               ChartClose(chart);
            }
            m_list.Delete(i);
         }
      }
   }
   protected: void  Init()
   {
      m_init=true;
      m_list.Clear();
      for(int i=0;i<OrdersTotal();i++)
         if(OrderSelect(i,SELECT_BY_POS) && (m_magic==0|| m_magic==OrderMagicNumber()))
            m_list.Add(OrderTicket());
   }
};
//+------------------------------------------------------------------+
//--- global vars
input int               magic          = 0;
input ENUM_TIMEFRAMES   chart_period   = PERIOD_M15;
ScreenShot screen_shot(magic,chart_period);
//---
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(1);
   screen_shot.OnInit();
   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[])
{
   screen_shot.Refresh();
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   screen_shot.OnInit();
   EventKillTimer();
}

void OnTimer()
{
   screen_shot.Refresh();
}
