//+------------------------------------------------------------------+
//|                                            ScreenShotOnTrade.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;
public:
   ScreenShot(int magic_number): m_init(false),
                                 m_magic(magic_number),
                                 m_folder("screenshots\\"+Symbol()+"\\"),
                                 m_orders_total(-1)
                                 {}
   void  OnInit()
   {
      m_list.Clear();
      m_init = false;
   }
  
   void  Refresh()
   {
      if(!m_init)
      {
         Init();
         return;
      }
      int total = OrdersTotal();
      if(m_orders_total == total)
         return;
      m_orders_total = total;
      // check for new entries
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol() == Symbol()&&OrderType()<2&&(m_magic==0|| m_magic==OrderMagicNumber()))
         {
            if(m_list.SearchLinear(OrderTicket()) < 0)
            {
               m_list.Add(OrderTicket());
               string name = m_folder+Symbol()+"_"+string(OrderTicket())+"_ENTRY.gif";
               WindowScreenShot(name,1280,720);
               
            } 
         }
      }
      // 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)
         {
            if(OrderSelect(m_list[i],SELECT_BY_TICKET)&&OrderType()<2)
            { 
               string name = m_folder+Symbol()+"_"+string(m_list[i])+"_EXIT.gif";
               CChartObjectHLine line;
               line.Create(0,"__templine__",0,OrderClosePrice());
               line.Style(STYLE_DASHDOTDOT);
               line.Description("EXIT");
               ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,true);
               WindowScreenShot(name,1280,720);
            }           
            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) && OrderSymbol() == Symbol() && (m_magic==0|| m_magic==OrderMagicNumber()))
            m_list.Add(OrderTicket());
   }
};
//+------------------------------------------------------------------+
//--- global vars
input int magic = 0;
ScreenShot screen_shot(magic);
//---
//+------------------------------------------------------------------+
int OnInit()
{
   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();
}
