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)
-   -   Hilfe bei BreakEven... (http://www.expert-advisor.com/forum/showthread.php?t=1538)

Bohne 23.08.11 14:14

Na das ging ja doch schneller als erwartet. Schau mal ob das funkelt. Bei mir schon. auf jedefall macht er wieder trades. ;)
musste die kommentare runterzeduzieren damit er rein passt.
Code:

#define SIGNAL_NONE 0
#define SIGNAL_BUY  1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"
extern int MagicNumber = 336699;
extern bool SignalMail = False;
extern bool EachTickMode = False;
extern double Lots = 0.1;
extern double MaximumRisk= 1;
extern int Slippage = 1;
extern bool UseStopLoss = True;
extern int StopLoss = 30;
extern bool UseTakeProfit = True;
extern int TakeProfit = 50;
extern bool UseTrailingStop = True;
extern int TrailingStop = 50;
extern int BreakEven = 30;
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
double LotsOptimized()
  {
  double lot=Lots;
//---- select lot size
  lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- return lot size
  if(lot<0.1) lot=0.1;
  if(lot>50.0) lot=50.0;
  return(lot);
  }
//+------------------------------------------------------------------+
//| expert initialization function                                  |
//+------------------------------------------------------------------+
int init() {
  BarCount = Bars;
  if (EachTickMode) Current = 0; else Current = 1;
  return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function
//+------------------------------------------------------------------+
int deinit() {return(0);}
//+------------------------------------------------------------------+
//| expert start function
//+------------------------------------------------------------------+
int start() {
  int Order = SIGNAL_NONE;
  int Total, Ticket;
  double StopLossLevel, TakeProfitLevel;
  if (EachTickMode && Bars != BarCount) TickCheck = False;
  Total = OrdersTotal();
  Order = SIGNAL_NONE;
  //+------------------------------------------------------------------+
  //| Variable Begin
  //+------------------------------------------------------------------+
double Buy1_1 = iMA(NULL, 5, 4, 0, MODE_EMA, PRICE_CLOSE,0);
double Buy1_2 = iMA(NULL, 5, 4, 0, MODE_EMA, PRICE_CLOSE,1);
double Buy1_3 = iMA(NULL, 5, 9, 0, MODE_EMA, PRICE_CLOSE,0);
double Buy2_1 = iMA(NULL, 15, 14, 0, MODE_EMA, PRICE_CLOSE,0);
double Buy2_2 = iMA(NULL, 15, 14, 0, MODE_EMA, PRICE_CLOSE,1);
  //| Variable End
  //Check position
  bool IsTrade = False;
  for (int i = 0; i < Total; i ++)
  {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol())
      {
        IsTrade = True;
        if(OrderType() == OP_BUY)
        {
            //Close
            //| Signal Begin(Exit Buy)
            //| Signal End(Exit Buy)
         
            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
              OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
              if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
              if (!EachTickMode) BarCount = Bars;
              IsTrade = False;
              continue;
            }
            //Breakeven
            if(BreakEven > 0 && OrderStopLoss() > OrderOpenPrice())
            {               
              if ( OrderOpenPrice()-Ask>Point*BreakEven )
              {
              double BuyStop = OrderOpenPrice();
              if(OrderStopLoss() > BuyStop)
              OrderModify(OrderTicket(),OrderOpenPrice(),
                                    NormalizeDouble(BuyStop,5),
                                    OrderTakeProfit(),0,Red);           
              continue;
              }   
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {               
              if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                    OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                    if (!EachTickMode) BarCount = Bars;
                    continue;
                  }
              }
            }
        } else {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)
            //+------------------------------------------------------------------+
            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))
            {
              OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
              if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
              if (!EachTickMode) BarCount = Bars;
              IsTrade = False;
              continue;
            //Breakeven
              if(BreakEven > 0 && OrderStopLoss() > OrderOpenPrice())
              {               
                  if ( OrderOpenPrice()-Ask>Point*BreakEven )
                  {
                  double SellStop = OrderOpenPrice();
                  if(OrderStopLoss() > SellStop)
                  OrderModify(OrderTicket(),OrderOpenPrice(),
                                        NormalizeDouble(SellStop,4),
                                        OrderTakeProfit(),0,Red);           
                  continue;
                  }
              }
              //Trailing stop
              if(UseTrailingStop && TrailingStop > 0)
              {               
                  if((OrderOpenPrice() - Ask) > (Point * TrailingStop))
                  {
                    if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0))
                    {
                        OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                        if (!EachTickMode) BarCount = Bars;
                        continue;
                    }
                  }
              }
            }
                 
        }
      }
  }

  //+------------------------------------------------------------------+
  //| Signal Begin(Entry)
  //+------------------------------------------------------------------+
  if (Buy1_1 > Buy1_2 && Buy1_2 > Buy1_3
      && Buy2_1 > Buy2_2)
      Order = SIGNAL_BUY;
  if (Buy1_1 < Buy1_2 && Buy1_2 < Buy1_3
      && Buy2_1 < Buy2_2)
      Order = SIGNAL_SELL;
  //+------------------------------------------------------------------+
  //| Signal End
  //+------------------------------------------------------------------+
  //Buy
  if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))
  {
      if(!IsTrade) {
        //Check free margin
        if (AccountFreeMargin() < (1000 * Lots))
        {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
        }

        if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
        if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

        Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
        if(Ticket > 0)
        {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
            {
                                Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
                        } else {
                                Print("Error opening BUY order : ", GetLastError());
                        }
        }
        if (EachTickMode) TickCheck = True;
        if (!EachTickMode) BarCount = Bars;
        return(0);
      }
  }
 
  //Sell
  if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))
  {
      if(!IsTrade)
      {
        //Check free margin
        if (AccountFreeMargin() < (1000 * Lots))
        {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
        }

        if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
        if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

        Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
        if(Ticket > 0)
        {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
            {
                                Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
                          } else
                          {
                                  Print("Error opening SELL order : ", GetLastError());
                          }
        }
        if (EachTickMode) TickCheck = True;
        if (!EachTickMode) BarCount = Bars;
        return(0);
      }
  }
  if (!EachTickMode) BarCount = Bars;
  return(0);
}


sunnyboy20 24.08.11 21:18

danke schon mal, konnte es mir leider noch nicht anschauen.
auf facebook gehen zur zeit ja wieder mal de viren rum unter anderem der bka trojaner....war nach arbeit nur bei freunden um denen den rechner zu retten :D
echt böse das ding für einen leihen, kannst nix mehr machen und das ding hat über 40 systemdateien infiziert um sicher zu stellen das er "immer" aktiv bleibt und man ihn nicht so leicht entfernen kann ;-) aber wie das halt so ist gibt es immer eine Lösung, unter XP sogar sehr leicht.

sunnyboy20 26.08.11 17:07

so hab ihn heute getestet leider geht der breakeven noch nicht :(
der trailingstop geht nur noch bei long bei short´s geht er net mehr... :(
kann denn keiner den Ea mal so fixen das er funzelt ?
oder @Bohne
kannst du mal nen beispiel EA einfügen weil hast doch gesagt mit funtkionen und verschachteln und so.
weil bin ja noch ein noob auf dem gebiet und weiß halt net was du meinst dachte immer code ist gleich code ?????

Bohne 26.08.11 17:47

erlich gesagt fehlt mir die zeit dazu...
Also folgendes ungefähr so

in start()
{
double lot = Orderlots();
}

int Orderlots()
{
double lots = 0.1;
return (lots)
}

Das ist jetzt ein ganz einfach BSP.

Die stratfunktion()
Orderlots wird zuerst als Funktion aufgerufen
springt in int Orderfunktion() rein. In dieser funktion wird eine zusaätzlich Variable deklariert und zu gleich der wert 0.1 eingesetz.
Mit return gibst du den wert zurück...

Somit hast du jetzt im start in der Varibale 0.1 drinn.
es gibt bestimmt reichlich mehr imput im netz. Wo genau keine Ahnung ;)
aber so in etwa.

das gute ist bei der funktion. Du kannst die funktionen immer wieder benutzen und leicht ändern. Alles ist sehr übersichtlicher.
Ein weitere Funktion von mit die nur die Buy order zählt.

int CountSellPositionsII() {
int l_count_0 = 0;
for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) {
OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNummerII || OrderType() != OP_SELL) continue;
l_count_0++;
}
return (l_count_0);
}


// Rückgabe wert ist die gezählten short trades.


OrdersTotal() <-- ist wieder eine utnerfunktion


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:15 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