Console_2002_EA





//=============================================================================
//           Console_2002_EA
//=============================================================================

#include <stdlib.mqh>
//+---------------------------------------------------+
//|Money Management                                   |
//+---------------------------------------------------+
extern double Lots = 0.01;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;

//---- input parameters
extern int BrokerSpread = 2;
extern int TakeProfit = 60; // 0 deactivates Take Profit
extern int VolumeTime = 8;
extern int VolumeValue = 260;
extern int ATRperiod = 100;
extern double ATRlevel = 0.5;
extern int LCDEMAPeriod = 34; //Period EMA
extern int LCDLSMAPeriod = 25; // Period LSMA
extern int LCDFromZero = 3; // Distance from the zero level
extern bool OnlyLCDChange = true;
extern int Slippage = 3;

#define MAGIC 20070516

int init()
{
Comment("Waiting for the first tick...");
return(0);
}

int deinit()
{
Comment(WindowExpertName()," finished.");
return(0);
}

int start()
{
if(Bars<100)
{
Comment("Waiting for bars...");
return(0);
}

return(_LCDEA( Symbol(), Period(), MAGIC, LotsOptimized(), TakeProfit, Slippage,
BrokerSpread, VolumeTime, VolumeValue, LCDEMAPeriod, 
LCDLSMAPeriod, LCDFromZero,
OnlyLCDChange, ATRlevel, ATRperiod));
//return(_LCDEA( Symbol(), Period(), MAGIC, Lots, TakeProfit, Slippage,
//BrokerSpread, VolumeTime, VolumeValue, LCDEMAPeriod, 
//LCDLSMAPeriod, LCDFromZero,
//OnlyLCDChange, ATRlevel, ATRperiod));
}

int _LCDEA(string symbol, int period, int magic, double lots, int 
takeprofit, 
int slippage=3, int brokerSpread= 2, int volumeTime=2, int 
volumeValue= 10, 
int lCDEMAPeriod= 34, int lCDLSMAPeriod= 25, int 
lCDFromZero= 3,
bool onlyLCDChange= true, double atrlevel=0.3, int 
atrperiod=100)
{
// Internals
int _Digits = MarketInfo(symbol, MODE_DIGITS) ;
if(_Digits == 0) _Digits = 4;
double _Point = MarketInfo(symbol, MODE_POINT);
if(NormalizeDouble( _Point, _Digits) == 0.0) _Point = Point;
double _Bid = MarketInfo(symbol, MODE_BID);
double _Ask = MarketInfo(symbol, MODE_ASK);
string cm = "";

// Signals
static datetime bt = 0;
static bool _long = false;
static bool _short = false;
if(bt == 0) bt = iTime(symbol, period, 0);
if(bt != iTime(symbol, period, 0)){
double stoploss = 0.0;
bool trade = true;
for(int i = 1; i <= volumeTime; i++)
if(iVolume(symbol, period, i) < volumeValue) {
trade = false;
break;
}
if(trade)
{
int lcdy = iCustom(symbol, period, "LCD", lCDEMAPeriod, lCDLSMAPeriod, lCDFromZero, 0, 1);
int lcdb = iCustom(symbol, period, "LCD", lCDEMAPeriod, lCDLSMAPeriod, lCDFromZero, 1, 1);
int lcdy1 = iCustom(symbol, period, "LCD", lCDEMAPeriod, lCDLSMAPeriod, lCDFromZero, 0, 2);
int lcdb1 = iCustom(symbol, period, "LCD", lCDEMAPeriod, lCDLSMAPeriod, lCDFromZero, 1, 2);
_long = lcdb != EMPTY_VALUE && (lcdb1 == EMPTY_VALUE ||!onlyLCDChange) ;
_short = lcdy != EMPTY_VALUE && (lcdy1 == EMPTY_VALUE ||!onlyLCDChange) ;
if(_long)
for(i=0; i<Bars; i++){
double frac = iFractals(symbol, period, MODE_LOWER, i);
if(frac > _Point)
{
stoploss = NormalizeDouble( frac-iATR( symbol, period, atrperiod, 1)*atrlevel, _Digits);
break;
}
}
else if(_short)
for(i=0; i<Bars; i++){
frac = iFractals(symbol, period, MODE_UPPER, i);
if(frac > _Point)
{
stoploss = NormalizeDouble( frac+brokerSpread*_Point+ iATR(symbol, period, atrperiod, 1)*atrlevel, _Digits);
break;
}
}
}
}
// Signals

// S&R
bool _send_ok = false;
if(_long){
if(_LCDEA_IsPosition(OP_SELL, symbol, magic))
_OrderClose( OrderTicket( ), OrderLots(), OrderClosePrice( ), slippage, Red);
if(!_LCDEA_IsPosition(OP_BUY, symbol, magic))
_send_ok = _OrderSend(symbol, OP_BUY, _nv(symbol, lots), _Ask, slippage, stoploss, _tp(OP_BUY, symbol, takeprofit),WindowExpertName( ), magic, 0, Blue) > 0;
}
if(_short){
if(_LCDEA_IsPosition(OP_BUY, symbol, magic))
_OrderClose( OrderTicket( ), OrderLots(), OrderClosePrice( ), slippage, Blue);
if(!_LCDEA_IsPosition(OP_SELL, symbol, magic))
_send_ok = _OrderSend(symbol, OP_SELL, _nv(symbol, lots), _Bid, slippage, stoploss, _tp(OP_SELL, symbol, takeprofit),WindowExpertName( ), magic, 0, Red) > 0;
}
// S&R

// TrailingStop
for(i=0; i < OrdersTotal( ); i++)
if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES) ){
if(OrderSymbol( ) == symbol)
if(OrderMagicNumber () == magic)
if(OrderType( ) == OP_BUY){
for(int j=0; j<Bars; j++){
frac = iFractals(symbol, period, MODE_LOWER, j);
if(frac > _Point)
{
stoploss = NormalizeDouble( frac-iATR( symbol, period, atrperiod, 1)*atrlevel, _Digits);
break;
}
}
if(MathRound( (stoploss- OrderStopLoss( ))/_Point) != 0)
if(!OrderModify( OrderTicket( ), OrderOpenPrice( ), stoploss, OrderTakeProfit( ),OrderExpiration( ), Blue))
Print("OrderModify( OP_BUY) error - ", ErrorDescription( GetLastError( ))); 
}else if(OrderType( ) == OP_SELL){
for(j=0; j<Bars; j++){
frac = iFractals(symbol, period, MODE_UPPER, j);
if(frac > _Point)
{
stoploss = NormalizeDouble(frac+brokerSpread* _Point+iATR( symbol, period, atrperiod, 1)*atrlevel, _Digits);
break;
}
}
if((MathRound( (OrderStopLoss( )-stoploss) /_Point) != 0)||(OrderStopLoss( )<_Bid))
if(!OrderModify( OrderTicket( ), OrderOpenPrice( ), stoploss, OrderTakeProfit( ),OrderExpiration( ), Red))
Print("OrderModify( OP_SELL) error - ", ErrorDescription( GetLastError( ))); 
}
}else
Print("OrderSelect( ) error - ", ErrorDescription( GetLastError()));
// TrailingStop

bt = iTime(symbol, period, 0);
if(_send_ok) {
_long = false;
_short = false;
}
Comment(cm);
return(0);
}

bool _LCDEA_IsPosition( int type, string symbol, int magic)
{
for(int i=OrdersTotal( )-1; i >= 0; i--)
if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES) ){
if(OrderType( ) == type)
if(OrderSymbol( ) == symbol)
if(OrderMagicNumber () == magic)
return(true) ;
}else
Print("OrderSelect( ) error - ", ErrorDescription( GetLastError()));
return(false) ;
}

double _tp(int type, string symbol, int takeprofit)
{
if(type == OP_BUY)
if(takeprofit > 0)
return(MarketInfo( symbol, MODE_BID)+takeprofit*MarketInfo(symbol, MODE_POINT)) ;
else
return(0.0);
else if(type == OP_SELL)
if(takeprofit > 0)
return(MarketInfo( symbol, MODE_ASK)-takeprofit*MarketInfo(symbol, MODE_POINT)) ;
else
return(0.0);
}

double _nv(string symbol, double lots){
// Adjust trade volume to broker. Take into account minimum & maximum position size.
double step = MarketInfo(symbol, MODE_LOTSTEP) ;
double min = MarketInfo(symbol, MODE_MINLOT) ;
double max = MarketInfo(symbol, MODE_MAXLOT) ;
if(max > 0)
if(lots > max)
return(max);
if(step > 0)
double result = MathRound(lots/ step)*step;
else
result = 0;
if(result < min)
if(min>0)
return(min);
else
return(lots) ;
else if(result > 0)
return(result) ;
else
return(lots) ;
}

#include <stderror.mqh>

int _OrderSend(string symbol, int cmd, double lots, double price, int slippage, double stoploss,
                double takeprofit, string comment, int magic, datetime expiration, color cl)
{
int ticket = OrderSend(symbol, cmd, lots, price, slippage, stoploss, takeprofit, comment, magic, expiration, cl);
if(ticket < 0){
int err = GetLastError( );
Print("ERROR OrderSend #",err,": ", ErrorDescription( err));
}
return(ticket) ;
}

bool _OrderClose( int ticket, double lots, double price, int slippage, color cl=CLR_NONE)
{
bool result = OrderClose(ticket, lots, price, slippage, cl);
if(!result){
int err = GetLastError( );
Print("ERROR OrderClose #",err,": ", ErrorDescription( err));
}
return(result) ;
}

//+--------- --------- --------- --------- --------- --------- ----+
//| Calculate optimal lot size |
//+--------- --------- --------- --------- --------- --------- ----+
double LotsOptimized( )
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble (AccountFreeMargin()*MaximumRisk /1000.0,1) ;
//---- calcuulate number of losses orders without a break
if(DecreaseFactor> 0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect( i,SELECT_BY_POS,MODE_HISTORY)==false)
 { Print("Error in history!"); break; }
if(OrderSymbol( )!=Symbol( ) || OrderType()> OP_SELL) continue;
//----
if(OrderProfit( )>0) break;
if(OrderProfit( )<0) losses++;
}
if(losses>1) lot=NormalizeDouble (lot-lot*losses/DecreaseFactor,1) ;
}
//---- return lot size
if(lot<0.01) lot=0.01;
return(lot);
}






Sample





Analysis



Market Information Used:

Series array that contains tick volumes of each bar


Indicator Curves created:


Indicators Used:


Fractals
Indicator of the average true range


Custom Indicators Used:
LCD

Order Management characteristics:
It Closes Orders by itself

It automatically opens orders when conditions are reached
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy

Other Features:

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.47 Total Net Profit:-2837.67

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.44 Total Net Profit:-2586.68

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.05 Total Net Profit:-4994.23

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.53 Total Net Profit:-1406.66

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.46 Total Net Profit:-1497.27

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.64 Total Net Profit:-763.10

Request Backtest for Console_2002_EA


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: