//+------------------------------------------------------------------+
//|                                          SimpleTargetChanger.mq4 |
//|                                      Copyright 2017, nicholishen |
//|                         https://www.forexfactory.com/nicholishen |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, nicholishen"
#property link      "https://www.forexfactory.com/nicholishen"
#property version   "1.00"
#property strict

input int Stop = 100; //SL in Points
input int Take = 100; //TP in Points

#include <Arrays\List.mqh>

class ChangeOrder : public CObject
{
protected:
   int            m_ticket;
   bool           m_changed;
public:
   ChangeOrder(int ticket,int stop,int take,bool changed=false):  m_ticket(ticket),
                                                                  m_changed(changed)
   {
      if(!changed && OrderSelect(m_ticket,SELECT_BY_TICKET))
      {
         if(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP)
         {
            if(!OrderModify(m_ticket,OrderOpenPrice(),OrderOpenPrice()-Stop*_Point,OrderOpenPrice()+Take*_Point,0))
               Print(__FUNCTION__," OrderModifyError: ",GetLastError());
         }
         else
         if(OrderType()==OP_SELL|| OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
         {
            if(!OrderModify(m_ticket,OrderOpenPrice(),OrderOpenPrice()+Stop*_Point,OrderOpenPrice()-Take*_Point,0))
               Print(__FUNCTION__," OrderModifyError: ",GetLastError());
         }
      }
   }
   int Ticket() { return m_ticket;}               
};

class OrderList : public CList
{
protected:
   int         m_last_count;
public:
   void OnInit()
   {
      m_last_count = OrdersTotal();
      for(int i=m_last_count-1;OrderSelect(i,SELECT_BY_POS);i--)
      {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==0) 
            Add(new ChangeOrder(OrderTicket(),Stop,Take,true));
      }      
   }
   void OnTimer()
   {
      int total = OrdersTotal();
      if(total==m_last_count)
         return; 
      m_last_count=total;
      for(int i=total-1;OrderSelect(i,SELECT_BY_POS);i--)
      {
         bool found = false;
         for(ChangeOrder *j=GetFirstNode();j!=NULL;j=j.Next())
         {
            if(OrderTicket() == j.Ticket())
            {
               found = true;
               break;
            }
         }
         if(!found)
         {
            if(OrderSymbol()==_Symbol&&OrderMagicNumber()==0)
               Add(new ChangeOrder(OrderTicket(),Stop,Take));
         }
      }
   }
};


OrderList expert;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(100);
   expert.OnInit();  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   expert.OnTimer();
  }
//+------------------------------------------------------------------+
