//+------------------------------------------------------------------+
//|                                                    AutoStops.mq4 |
//|                                                      tener hades |
//|                                            tener.hades@gmail.com |
//+------------------------------------------------------------------+
#property copyright "tener hades"
#property link      "tener.hades@gmail.com"

#define MODE_INIT    3
#define MODE_DEINIT  2
#define MODE_START   1

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

extern double DefaultStoplossPips   = 20.0;
extern double DefaultTakeprofitPips = 20.0;

int init()  { return (Main(MODE_INIT));   }
int deinit(){ return (Main(MODE_DEINIT)); }
int start() { return (Main(MODE_START));  }

int Main(int mode)
{
	static double pmod;
	double sl,tp;
	bool handle_tp=false,handle_sl=false;
	int tickets[];
	
	if (mode==MODE_DEINIT)
		return (EXIT_SUCCESS);
	if (mode==MODE_INIT){
		if(Digits==5||Digits==3) pmod=Point*10;
   	else pmod=Point;
   }
	
	for (int i=0;i<OrdersTotal();i++){
		if (!OrderSelect(i,SELECT_BY_POS)){
			Print("OrderSelect() failed. E:"+GetLastError());
			return (EXIT_FAILURE);
		}
		if (OrderType()>=2) continue;          // no defaults for pendings
		if (OrderSymbol()!=Symbol()) continue; // no trades on unattached pairs
		
		sl=OrderStopLoss();
		tp=OrderTakeProfit();
		
		if ((DefaultStoplossPips>0)&&(sl==0.0)){
			handle_sl=true;
			if (OrderType()==OP_BUY) sl=OrderOpenPrice()-NormalizeDouble((DefaultStoplossPips*pmod),Digits);
			else                     sl=OrderOpenPrice()+NormalizeDouble((DefaultStoplossPips*pmod),Digits);
		}
		if ((DefaultTakeprofitPips>0)&&(tp==0.0)){
			handle_tp=true;
			if (OrderType()==OP_BUY) tp=OrderOpenPrice()+NormalizeDouble((DefaultTakeprofitPips*pmod),Digits);
			else                     tp=OrderOpenPrice()-NormalizeDouble((DefaultTakeprofitPips*pmod),Digits);
		}
		if (handle_sl||handle_tp){
			if (!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderExpiration())){
				Print("OrderModify() failed. sl="+sl+" E:"+GetLastError());
				return (EXIT_FAILURE);
			}
		}
	}
	return (EXIT_SUCCESS);
}