Download MetaTrader 5
To add comments, please log in or register
MQL5 Reference is available in 8 languages. Learn MQL5 in the language that suits you best!
Michael
7
Michael 2014.03.06 19:06 

Hey,

I try to combine two great EAs but I dont understand why the EA actually reduce or rise the StopLoss to Loss.

Thanks for help!

#define MAGIC 20130704

extern string TOOLS = ".............................................................................................................";

extern bool CloseAll = false;

extern bool ContinueTrading = true;

extern string TRADING = ".............................................................................................................";

extern int QueryHistory = 12;

extern int StartTrades = 6;

extern double BasketProfit = 3;

extern double OpenProfit = 1.3;

extern double TradeSpace = 1.1;

extern double RangingMarket = 0.5;

extern double Aggressive = 8;

extern double DynamicSlippage = 1;

extern double MinProfit = 0.5;

extern double TurboStart = 0.07;

extern double TrendReversal = 0.15;

extern string RISK = ".............................................................................................................";

extern int MaxTrades = 13;

extern double BaseLotSize = 0.01;

extern double RangeUsage = 0.15;

extern double TrendUsage = 0.08;

extern string INDICATOR_ATR = ".............................................................................................................";

extern int ATRTimeFrame = 0;

extern int ATRPeriod = 14;

extern int ATRShift = 0;

extern string INDICATOR_MA = ".............................................................................................................";

extern int MATimeFrame = 0;

extern int MA1Period = 5;

extern int MA2Period = 9;

extern int MA3Period = 22;

extern int MMAShift = 0;

extern int MAShift = 0;

extern string INDICATOR_ADX = ".............................................................................................................";

extern double ADXLine = 40;

extern int ADXTimeFrame = 0;

extern int ADXPeriod = 22;

extern int ADXShift = 0;

extern string INDICATOR_FRACTAL = ".............................................................................................................";

extern int FractalTimeFrame = 0;

extern int FractalShift = 1;

extern int FractalBars = 5;

double slippage, marginRequirement, lotSize, recentProfit, lastProfit, totalHistoryProfit, totalProfit, totalLoss, symbolHistory,

eATR, eATRPrev, eADX, MA1Cur, MA2Cur, MA3Cur, MA1Prev, MA2Prev, MA3Prev ;

int digits, totalTrades;

int totalHistory = 100;

double pipPoints = 0.00010;

double fractalUpPrice = 0 ;

double fractalDownPrice = 0;

bool nearLongPosition = false;

bool nearShortPosition = false;

double trendStrength = 0;

double drawdown = 0;

bool longTrendUp = false;

bool longTrendDown = false;

bool shortTrendUp = false;

bool shortTrendDown = false;

bool rangingMarket = false;

string display = "\n";

int init(){

prepare() ;

return( 0 );

}

double marginCalculate( string symbol, double volume ){

return ( MarketInfo( symbol, MODE_MARGINREQUIRED ) * volume ) ;

}

void lotSize(){

slippage = NormalizeDouble( ( eATR / pipPoints ) * DynamicSlippage, 1 );

marginRequirement = marginCalculate( Symbol(), BaseLotSize );

if( MathAbs( MA2Cur - MA3Cur ) != 0 ) trendStrength = MathAbs( MA1Cur - MA3Cur ) / MathAbs( MA2Cur - MA3Cur );

drawdown = 1 - AccountEquity() / AccountBalance();

if( rangingMarket ) lotSize = NormalizeDouble( ( AccountFreeMargin() * RangeUsage / marginRequirement ) * BaseLotSize, 2 ) ;

else lotSize = NormalizeDouble( ( AccountFreeMargin() * TrendUsage / marginRequirement ) * BaseLotSize, 2 ) ;

if( lotSize < 0.01 ) lotSize = 0.01;

}

void setPipPoint(){

digits = MarketInfo( Symbol(), MODE_DIGITS );

if( digits == 3 ) pipPoints = 0.010;

else if( digits == 5 ) pipPoints = 0.00010;

}

void closeAll( string type = "none" ){

for( int i = 0; i < OrdersTotal(); i++ ) {

if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) break;

if( OrderSymbol() == Symbol() ){

RefreshRates();

if( ( OrderStopLoss() == 0 && OrderProfit() > 0 && type == "profits" ) || type == "none" ){

if( OrderType() == OP_BUY ) OrderClose( OrderTicket(), OrderLots(), Bid, slippage );

if( OrderType() == OP_SELL ) OrderClose( OrderTicket(), OrderLots(), Ask, slippage );

}

}

}

}

void prepareFractals(){

fractalUpPrice = 0;

fractalDownPrice = 0;

for( int i = 0; i < FractalBars; i++ ){

double ifractalUp = iFractals( NULL, 0, MODE_UPPER, i );

double ifractalDown = iFractals( NULL, 0, MODE_LOWER, i );

if( ifractalUp > 0 && Open[i] > Open[0] ){

if( Open[i] > Close[i] ) fractalUpPrice = Open[i];

else fractalUpPrice = Close[i];

} else if( ifractalDown > 0 && Open[i] < Open[0] ){

if( Open[i] < Close[i] ) fractalDownPrice = Open[i];

else fractalDownPrice = Close[i];

}

}

}

void update(){

display = "";

display = display + " Trade Space: " + DoubleToStr( TradeSpace * eATR / pipPoints, 1 ) + "pips";

display = display + " Lot Size: " + DoubleToStr( lotSize, 2 );

display = display + "\n\n Trend Strength: " + DoubleToStr( trendStrength, 2 );

display = display + " Ranging: " + DoubleToStr( rangingMarket, 0 );

display = display + "\n Bull: " + DoubleToStr( longTrendUp, 0 );

display = display + " Bullish: " + DoubleToStr( shortTrendUp, 0 ) ;

display = display + " Bearish: " + DoubleToStr( shortTrendDown, 0 );

display = display + " Bear: " + DoubleToStr( longTrendDown, 0 );

display = display + "\n\n Draw Down: " + DoubleToStr( drawdown, 2 );

display = display + " Open Trades: " + DoubleToStr( totalTrades, 0 ) + " (" + DoubleToStr( MaxTrades, 0 ) + ")";

display = display + "\n Profit: " + DoubleToStr( totalProfit, 2 );

display = display + " Loss: " + DoubleToStr( totalLoss, 2 );

display = display + " History: " + DoubleToStr( totalHistoryProfit, 2 );

Comment( display );

}

void prepareHistory(){

symbolHistory = 0;

totalHistoryProfit = 0;

for( int iPos = OrdersHistoryTotal() - 1 ; iPos > ( OrdersHistoryTotal() - 1 ) - totalHistory; iPos-- ){

OrderSelect( iPos, SELECT_BY_POS, MODE_HISTORY ) ;

double QueryHistoryDouble = ( double ) QueryHistory;

if( symbolHistory >= QueryHistoryDouble ) break;

if( OrderSymbol() == Symbol() ){

totalHistoryProfit = totalHistoryProfit + OrderProfit() ;

symbolHistory = symbolHistory + 1 ;

}

}

}

void preparePositions() {

nearLongPosition = false;

nearShortPosition = false;

totalTrades = 0;

totalProfit = 0;

totalLoss = 0;

for( int i = 0 ; i < OrdersTotal() ; i++ ) {

if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) break;

if(OrderSymbol() == Symbol()){totalTrades = totalTrades + 1;}

if( OrderSymbol() == Symbol() && OrderStopLoss() == 0 ) {

if( rangingMarket && eADX < ADXLine ){

if( OrderType() == OP_BUY && MathAbs( OrderOpenPrice() - Ask ) < eATR * TradeSpace ) nearLongPosition = true ;

if( OrderType() == OP_SELL && MathAbs( OrderOpenPrice() - Bid ) < eATR * TradeSpace ) nearShortPosition = true ;

} else {

if( OrderType() == OP_BUY && MathAbs( OrderOpenPrice() - Ask ) < eATR * TradeSpace / Aggressive ) nearLongPosition = true ;

if( OrderType() == OP_SELL && MathAbs( OrderOpenPrice() - Bid ) < eATR * TradeSpace / Aggressive ) nearShortPosition = true ;

}

if( OrderProfit() > 0 ) totalProfit = totalProfit + OrderProfit();

else totalLoss = totalLoss + OrderProfit();

}

}

}

void prepareIndicators(){

eATR = iATR( NULL, ATRTimeFrame, ATRPeriod, ATRShift );

eATRPrev = iATR( NULL, ATRTimeFrame, ATRPeriod, ATRShift + 1 );

eADX = iADX( NULL, ADXTimeFrame, MA1Period, PRICE_MEDIAN, MODE_MAIN, ADXShift );

MA1Cur = iMA( NULL, MATimeFrame, MA1Period, MMAShift, MODE_SMMA, PRICE_MEDIAN, MAShift );

MA2Cur = iMA( NULL, MATimeFrame, MA2Period, MMAShift, MODE_SMMA, PRICE_MEDIAN, MAShift );

MA3Cur = iMA( NULL, MATimeFrame, MA3Period, MMAShift, MODE_SMMA, PRICE_MEDIAN, MAShift );

MA1Prev = iMA( NULL, MATimeFrame, MA1Period, MMAShift, MODE_SMMA, PRICE_MEDIAN, MAShift + 1 );

MA2Prev = iMA( NULL, MATimeFrame, MA2Period, MMAShift, MODE_SMMA, PRICE_MEDIAN, MAShift + 1 );

MA3Prev = iMA( NULL, MATimeFrame, MA3Period, MMAShift, MODE_SMMA, PRICE_MEDIAN, MAShift + 1 );

}

void prepare(){

prepareIndicators();

prepareFractals();

setPipPoint();

prepareHistory();

preparePositions();

prepareTrend();

lotSize();

update() ;

StopLossStart();

}

void openPosition(){

int type = -1;

if( eADX < ADXLine ){

if( Close[0] >= fractalUpPrice && Close[0] >= MA1Cur ) type = OP_BUY;

else if( Close[0] <= fractalDownPrice && Close[0] <= MA1Cur) type = OP_SELL;

}

if( rangingMarket && eADX < ADXLine ){

if( !nearLongPosition && type == OP_BUY ) OrderSend( Symbol(), type, lotSize, Ask, slippage, 0, 0, "default", MAGIC ) ;

else if( !nearShortPosition && type == OP_SELL ) OrderSend( Symbol(), type, lotSize, Bid, slippage, 0, 0, "default", MAGIC ) ;

} else {

if( totalTrades > 0 && eADX > ADXLine && drawdown > TurboStart ){

if( drawdown > TrendReversal ){

if( Close[0] <= MA1Cur && MA2Cur <= MA3Cur && Close[0] < Open[0] ) type = OP_SELL;

else if( Close[0] >= MA1Cur && MA2Cur >= MA3Cur && Close[0] > Open[0] ) type = OP_BUY;

} else {

if( Close[0] <= MA1Cur && MA2Cur <= MA3Cur && Close[0] < Open[0] ) type = OP_BUY;

else if( Close[0] >= MA1Cur && MA2Cur >= MA3Cur && Close[0] > Open[0] ) type = OP_SELL;

}

if( !nearLongPosition && type == OP_BUY ) OrderSend( Symbol(), type, lotSize, Ask, slippage, 0, 0, "scalp", MAGIC ) ;

else if( !nearShortPosition && type == OP_SELL ) OrderSend( Symbol(), type, lotSize, Bid, slippage, 0, 0, "scalp", MAGIC ) ;

}

}

if( totalTrades < 1 - ( StartTrades / MaxTrades ) || totalTrades == 0 ){

if( drawdown < TrendReversal ){

if( !nearLongPosition && totalTrades == 0 && type == -1 && ( ( eADX > ADXLine ) || ( eADX < ADXLine && Close[0] < Open[0] ) ) ) OrderSend( Symbol(), OP_BUY, lotSize, Ask, slippage, 0, 0, "scalp", MAGIC );

else if( !nearShortPosition && totalTrades == 0 && type == -1 && ( ( eADX > ADXLine ) ) || ( eADX < ADXLine && Close[0] > Open[0] ) ) OrderSend( Symbol(), OP_SELL, lotSize, Bid, slippage, 0, 0, "scalp", MAGIC );

} else {

if( !nearLongPosition && totalTrades == 0 && type == -1 && ( ( eADX > ADXLine ) || ( eADX < ADXLine && Close[0] < Open[0] ) ) ) OrderSend( Symbol(), OP_BUY, lotSize, Ask, slippage, 0, 0, "default", MAGIC );

else if( !nearShortPosition && totalTrades == 0 && type == -1 && ( ( eADX > ADXLine ) ) || ( eADX < ADXLine && Close[0] > Open[0] ) ) OrderSend( Symbol(), OP_SELL, lotSize, Bid, slippage, 0, 0, "default", MAGIC );

}

}

}

void prepareTrend(){

if( MathAbs( MA2Cur - MA3Cur ) < eATR * RangingMarket ) {

rangingMarket = true ;

shortTrendUp = false ;

shortTrendDown = false ;

longTrendUp = false ;

longTrendDown = false ;

} else {

if( MA1Cur > MA2Cur && MA1Cur > MA1Prev && MA2Cur > MA2Prev ) shortTrendUp = true ;

else shortTrendUp = false ;

if( MA1Cur < MA2Cur && MA1Cur < MA1Prev && MA2Cur < MA2Prev ) shortTrendDown = true ;

else shortTrendDown = false ;

if( MA2Cur > MA3Cur && MA2Cur > MA2Prev && MA3Cur > MA3Prev ) longTrendUp = true ;

else longTrendUp = false ;

if( MA2Cur < MA3Cur && MA2Cur < MA2Prev && MA3Cur < MA3Prev ) longTrendDown = true ;

else longTrendDown = false ;

if( shortTrendUp || shortTrendDown || longTrendUp || longTrendDown ) rangingMarket = false ;

else rangingMarket = true ;

}

}

void managePositions(){

if( ( totalHistoryProfit < 0 || totalTrades == 1 ) && MathAbs( totalHistoryProfit ) < totalProfit * BasketProfit ) closeAll( "profits" );

else if( totalTrades > 1 && totalProfit > MathAbs( totalLoss ) * OpenProfit ) closeAll();

else {

for( int i = 0 ; i < OrdersTotal() ; i++ ) {

if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) break;

if( OrderSymbol() == Symbol() && OrderComment() == "scalp" ) {

if( OrderType() == OP_BUY && Bid > OrderOpenPrice() && MathAbs( Bid - OrderOpenPrice() ) > MinProfit * eATR )

OrderClose( OrderTicket(), OrderLots(), Bid, slippage );

else if( OrderType() == OP_SELL && Ask < OrderOpenPrice() && MathAbs( OrderOpenPrice() - Ask ) > MinProfit * eATR )

OrderClose( OrderTicket(), OrderLots(), Ask, slippage );

}

}

}

}


// Eigener Code

extern string AboutAutostop="Automatically sets take profit and stop loss calcul with inital cost on all trades multisymbol";

extern bool MonitorTakeProfit=true;

extern bool MonitorStopLoss=true;

extern double TakeProfit=15;

extern double StopLoss=20;

void StopLossStart()

{

int digits=MarketInfo("EURUSD",MODE_DIGITS);

if(digits==5){int StopMultd=10;} else{StopMultd=1;}

double TP=NormalizeDouble(TakeProfit*StopMultd,Digits);

double SL=NormalizeDouble(StopLoss*StopMultd,Digits);

double slb=0;

double sls=0;

double tpb=0;

double tps=0;

if(OrdersTotal()>0){

for(int i=1; i<=OrdersTotal(); i++) // Cycle searching in orders

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available

{

TP=NormalizeDouble(TakeProfit*StopMultd,Digits);

SL=NormalizeDouble(StopLoss*StopMultd,Digits);

if((OrderType()==OP_BUY)&&((OrderTakeProfit()==0)))

{

slb=NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);

tpb=NormalizeDouble(OrderOpenPrice()+TP*Point,Digits);

OrderModify(OrderTicket(),0,slb,tpb,0,CLR_NONE);

}

if((OrderType()==OP_SELL)&&(OrderTakeProfit()==0))

{

sls=NormalizeDouble(OrderOpenPrice()+SL*Point,Digits);

tps=NormalizeDouble(OrderOpenPrice()-TP*Point,Digits);

OrderModify(OrderTicket(),0,sls,tps,0,CLR_NONE);

}

}

}

}

}

// Eigener Code Ende


int start() {

prepare() ;

if( CloseAll ) closeAll() ;

else {

if( ( ContinueTrading || ( !ContinueTrading && totalTrades > 0 ) ) && ( totalTrades < MaxTrades || MaxTrades == 0 ) ) openPosition() ;

managePositions() ;

}

return( 0 ) ;

} 
Alain Verleyen
Moderator
28522
Alain Verleyen 2014.03.06 19:32  

Hello,

Please use the SRC button when you post code. Thank you.


This time, I edited it for you.

Michael
7
Michael 2014.03.06 22:28  
Oh ok, thanks.
/
To add comments, please log in or register