ADX_System_Derk





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//=============================================================================
//                                                          ADX_System.mq4
//                                                          work_a@ukr.net
//
// 24 Nov 06: Modified by Derk Wehler
//            Formatted code to make readable
//=============================================================================
#property copyright "System" 
#property link "work_a@ukr.net" 
extern double TakeProfit = 100; 
extern double TrailingStop = 35; 
extern double StopLoss = 45; 


int start() 
{ 
	double ADXP,ADXC,ADXDIPP; 
	double ADXDIPC,ADXDIMP,ADXDIMC; 
	double Lots; 
	int cnt, ticket, total; 
	int li; 
	
	if (Bars < 100) 
	{ 
		Print("bars less than 100"); 
		return(0); 
	} 
	
	if (TakeProfit < 10) 
	{ 
		Print("TakeProfit less than 10"); 
		return(0); // check TakeProfit 
	} 
	li = 60; 

	Lots = 0.1; 
	if (AccountBalance() > 700)
		Lots = 0.2; 
 
	if (AccountBalance() > 3000)
		Lots = 1; 

	if (AccountBalance() > 6000)
		Lots = 1; 

	if (AccountBalance() > 9000)
		Lots = 1; 

	if (AccountBalance() > 10000)
		Lots = 1; 

	if (AccountBalance() > 100000)
		Lots = 10; 


	ADXP = iADX(NULL, li, 14, PRICE_CLOSE, MODE_MAIN, 2); 
	ADXC = iADX(NULL, li, 14, PRICE_CLOSE, MODE_MAIN, 1); 
	ADXDIPP = iADX(NULL, li, 14, PRICE_CLOSE, MODE_PLUSDI, 2); 
	ADXDIPC = iADX(NULL, li, 14, PRICE_CLOSE, MODE_PLUSDI, 1); 
	ADXDIMP = iADX(NULL, li, 14, PRICE_CLOSE, MODE_MINUSDI, 2); 
	ADXDIMC = iADX(NULL, li, 14, PRICE_CLOSE, MODE_MINUSDI, 1); 

	// 24Nov06 - Derk: Commented out because this prevents the EA from taking BUYs
//	if (MathAbs(ADXDIPC - ADXC) < 10) 
//		return(0); 

	total = OrdersTotal(); 
	if (total < 1) 
	{ 
		// no opened orders identified 
		if (AccountFreeMargin() < (1000*Lots)) 
		{ 
			Print("We have no money. Free Margin = ", AccountFreeMargin()); 
			return(0); 
		} 

		// check for long position (BUY) possibility 
		// TRANSLATION: 
		//		If main ADX is heading up, and the plusdi line has 
		//			just crossed the main line, heading upward
		if ((ADXP < ADXC) && (ADXDIPP < ADXP) && (ADXDIPC > ADXC)) 
		{ 
			ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 
								Bid - StopLoss * Point, Ask + TakeProfit * Point, 
								"adx sample", 16384, 0, Green); 

			if (ticket > 0) 
			{ 
				if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
					Print("BUY order opened : ", OrderOpenPrice()); 
			} 
			else 
				Print("Error opening BUY order : ", GetLastError()); 
		
			return(0); 
		} 
		
		// check for short position (SELL) possibility 
		// TRANSLATION: 
		//		If main ADX is heading up, and the minusdi line has 
		//			just crossed the main line, heading upward
		if ((ADXP < ADXC) && (ADXDIMP < ADXP) && (ADXDIMC > ADXC)) 
		{ 
			ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3,
								Ask + StopLoss * Point, Bid - TakeProfit * Point,
								"adx sample", 16384, 0, Red); 
			if (ticket > 0) 
			{ 
				if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
					Print("SELL order opened : ", OrderOpenPrice()); 
			} 
			else 
				Print("Error opening SELL order : ", GetLastError()); 
		
			return(0); 
		} 
		
		return(0); 
	}

	 
	for (cnt=0; cnt < total; cnt++) 
	{ 
		OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
		if (OrderType() <= OP_SELL && OrderSymbol() == Symbol()) // // check for opened position & symbol 
		{ 
			if (OrderType() == OP_BUY) // long position is opened 
			{ 
				if (ADXP > ADXC && ADXDIPP > ADXP && ADXDIPC < ADXC) 
				{ 
					OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // close position 
					return(0); // exit 
				} 
				
				if (TrailingStop > 0) 
				{ 
					if (Bid - OrderOpenPrice() > Point * TrailingStop) 
					{ 
						if (OrderStopLoss() < Bid-Point * TrailingStop) 
						{ 
							OrderModify(OrderTicket(), OrderOpenPrice(), 
										Bid - Point * TrailingStop, OrderTakeProfit(), 0, Green); 
							return(0); 
						} 
					} 
				} 
			} 
			else 
			{ 
				if (ADXP > ADXC && ADXDIMP > ADXP && ADXDIMC < ADXC) 
				{ 
					OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // close position 
					return(0); // exit 
				} 
				
				if (TrailingStop > 0)
				{ 
					if (OrderOpenPrice() - Ask > Point * TrailingStop) 
					{ 
						if ((OrderStopLoss() > (Ask+Point * TrailingStop)) || (OrderStopLoss() == 0)) 
						{ 
							OrderModify(OrderTicket(), OrderOpenPrice(),
										Ask+Point * TrailingStop, OrderTakeProfit(), 0, Red); 
							return(0); 
						} 
					} 
				} 
			} 
		} 
	} 
	return(0); 
} 



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:

Movement directional index


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features: