Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Scalping EA (http://www.expert-advisor.com/forum/showthread.php?t=3532)

ollek26 06.03.14 23:35

Scalping EA
 
Hallo,

ich weiß nicht ob dieser EA schon bekannt ist, allerdings fand ich ihn sehr interessant. Was mir allerdings fehlt ist ein Stop Loss. Ich habe daher versucht einen Stop Loss zu integrieren allerdings schiebt er mir den Stop Loss ins Minus.

Weiß einer von euch was ich hier verkehrt mache?

Danke für die Hilfe im voraus!!!

Code:

#property copyright "Fracture"
#property link "Fracture"
#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() ;
 
 
}

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() ; 
  StopLossStart();
  if( CloseAll ) closeAll() ;
  else {
      if( ( ContinueTrading || ( !ContinueTrading && totalTrades > 0 ) ) && ( totalTrades < MaxTrades || MaxTrades == 0 ) ) openPosition() ;
      managePositions() ;
  }
  return( 0 ) ;
}


fxdaytrader 07.03.14 19:12

Habe das nur grob überflogen und mir ist aufgefallen daß hier keine Anpassung für x-digit broker stattfindet.

Nutzt Dein broker bspw. für EURUSD 5 Digits (bspw. 1.12345) dann kannst Du nicht einfach mit stoplosspips*Point rechnen sondern mußt Point anpassen.

Wie man das macht steht hier im Forum (mindestens die EAs die ich hier modifiziert habe sollten diese Anpassung beinhalten), oder mal googlen.

Oder die mql4-Datei hier ranhängen ... :)

traderdoc 07.03.14 19:16

Auszug aus dem Code:

Code:

void setPipPoint(){
  digits = MarketInfo( Symbol(), MODE_DIGITS );
  if( digits == 3 ) pipPoints = 0.010;
      else if( digits == 5 ) pipPoints = 0.00010;
}


ollek26 07.03.14 20:50

Liste der Anhänge anzeigen (Anzahl: 2)
Hey,

danke schon mal im vorraus für eure Hilfe!

Ja meine Programmierkenntnisse stecken noch etwas in den Kinderschuhen.

Anbei die Dateien.

Ich bin aktuell bei einem 5 Digits Brocker.

Was ich versuche ist das der Scapling EA in Ruhe walten kann, außer das Trades die massivst ins Minus laufen gestoppt werden, also so bei -100 bis -200 Pips im Lost.

Ich habe schon einige Zeit mit dem EA verbracht und ich finde ihn sehr viel versprechend bis halt auf dieses eine Manko.

Viele Grüße

fxdaytrader 07.03.14 21:16

Liste der Anhänge anzeigen (Anzahl: 2)
auf die Schnelle, glaube das funktioniert.

"scalping EA" ist gut, früher oder später ist "geldverbrennungsmaschine" wohl treffender, nur meine persönliche Meinung :D

edit: bitte neu runterladen den EA

ollek26 07.03.14 21:25

Wieso Geldverbrennungsmaschine?

Kann man ihn noch weiter verbessern?

fxdaytrader 07.03.14 21:36

Bitte neu runterladen, wenn SL/TP = 0 dann kam es zu Fehlern ...

Ob man den EA noch verbessern kann weiß ich nicht, ist mir ehrlich gesagt auch egal :)

ollek26 07.03.14 21:45

Das schaut nicht schlecht aus, aber leider nicht ganz was ich dachte.

Wäre es möglich das der EA normal weiter arbeitet aber nur bei Verlust dagegen arbeiten. Also sagen wir mal man hat einen Trade offen und dieser läuft 200 pips ins Minus das er ihn dann schließt.

Aber sonst normal wie in der Ursprungsversion Trades öffnet bzw. schließt?

fxdaytrader 07.03.14 21:48

Zitat:

Zitat von ollek26 (Beitrag 25534)
Also sagen wir mal man hat einen Trade offen und dieser läuft 200 pips ins Minus das er ihn dann schließt.

Na ja, wenn Du Stoplosspips auf 200 setzt wäre es doch was Du möchtest oder sehe ich das falsch?

ollek26 07.03.14 21:49

Vom Prinzip her ja, nur schließt er nicht mehr selbstständig ohne TP.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:29 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum