Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 28.09.14
PitPoke PitPoke ist offline
Mitglied
 
Registriert seit: Feb 2014
Beiträge: 32
PitPoke befindet sich auf einem aufstrebenden Ast
Standard TrailingStop in vorhanden Code einsetzen.

Hallo,

da ich mich jetzt so nach und nach mit mql4 beschäftigen möchte, habe ich mir verschieden frei erhältliche Codes angesehen.
Sehr interessiert hat mich da der TimeTrader mit dessen Code ich anfangen möchte zu lernen.
Ziel ist es, in diesen vorhanden Code einen Trailing-Stop einzubauen.
Ich habe mir auch schon einige hier gepostete Codes für einen BE oder TrailingStop angesehen. Auch wenn ich die Meinung vertrete, dass das Lernen und studieren von vorhandenen Codes besser ist, als etliche Bücher zu wälzen... Ich bekomme aber im Moment einfach nicht hintereinander, wie die Codeschnippsel harmonieren könnten.

Hier der Code um den es geht:

Code:
//+------------------------------------------------------------------+
//|                                                  time trader.mq4 |
//|                            Copyright © 2012, www.FxAutomated.com |
//|                                       http://www.FxAutomated.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, www.FxAutomated.com"
#property link      "http://www.FxAutomated.com"
//---- input parameters
extern string   time_trader_v2="visit www.FxAutomated.com for more!!!";
extern double   Lots=0.4;
extern int      TakeProfit=5;
extern int      StopLoss=10;
extern int      TrailingStop=3; // <<<<<<<<<<<<<<<<<<
extern int      Slip=5;
extern string   TradeSettings="Mt4 time(min-max): hours 0-23, minutes 0-59, seconds 0-59";
extern bool     AddBuy=true;   // Namen geändert <<<<<
extern bool     AddSell=true;   // Namen geändert <<<<<
extern int      TradeHour=10;
extern int      TradeMinutes=0;
extern string   MagicNumbers="Aendern bei Problemen mit anderen EAs"; //<<
extern int      BuyMagicNumber =10001;
extern int      SellMagicNumber =10002;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  // Alert("Visit www.FxAutomated.com for more goodies!"); <<<<<< anpassen
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert starts                                  |
//+------------------------------------------------------------------+

int start()
  {
//----
int StopMultd,Sleeper=1;



int digits=MarketInfo("EURUSD",MODE_DIGITS);
StopMultd=1; // 10
double TP=NormalizeDouble(TakeProfit*StopMultd,Digits);
double SL=NormalizeDouble(StopLoss*StopMultd,Digits);
double BE=NormalizeDouble(TrailingStop*StopMultd,Digits);  // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
int Slippage=Slip*StopMultd;

// Calculate stop loss
double slb=NormalizeDouble(Ask-SL*Point,Digits);
double sls=NormalizeDouble(Bid+SL*Point,Digits);

// Calculate take profit
double tpb=NormalizeDouble(Ask+TP*Point,Digits);
double tps=NormalizeDouble(Bid-TP*Point,Digits);

//-------------------------------------------------------------------+
//Check open orders
//-------------------------------------------------------------------+
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
        {
          if(OrderMagicNumber()==BuyMagicNumber) {int halt1=1;}
          if(OrderMagicNumber()==SellMagicNumber) {int halt2=1;}
        }
     }
}
//-------------------------------------------------------------------+
// Kauf- und Verkauf-Signale und Ausführung                          +
//-------------------------------------------------------------------+

if((halt1!=1)&&(AddBuy==true)){// halt1

// Kaufen, wenn...
if ((TradeHour==Hour())&&(TradeMinutes==Minute())) //Kauf Signal
 {
   int openbuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"time trader buy order ",BuyMagicNumber,0,Blue);
   if(openbuy<1){int buyfail=1;}
 }
 
}// halt1
 
if((halt2!=1)&&(AddSell==true)){// halt2
RefreshRates();
 // Verkaufen, wenn...
 if ((TradeHour==Hour())&&(TradeMinutes==Minute())) //Verkauf Signal
 {
   int opensell=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"time trader sell order ",SellMagicNumber,0,Green);
   if(opensell<1){int sellfail=1;}
 }
 
}// halt2

//-----------------------------------------------------------------------------------------------------
// Hier muss der Trailing Stop untergebracht werden: <<<<<<<<<<<<<<<<

if(OrdersTotal()>0){
  for(i=1; i<=OrdersTotal(); i++){          // Offene Orders suchen
  
      if (OrderSelect(i-1,SELECT_BY_POS)==true){ // If the next is available
        
          if((OrderMagicNumber()==BuyMagicNumber)&&(OrderTakeProfit()==0||OrderStopLoss()==0)) { OrderModify(OrderTicket(),0,slb,tpb,0,CLR_NONE); }
          if((OrderMagicNumber()==SellMagicNumber)&&(OrderTakeProfit()==0||OrderStopLoss()==0)) { OrderModify(OrderTicket(),0,sls,tps,0,CLR_NONE); }

        }
     }
}
//-------------------------------------------------------------------+
// Fehlerausgabe, wenn
//-------------------------------------------------------------------+
if(buyfail==1||sellfail==1){
int Error=GetLastError();
  if(Error==130){Alert("Wrong stops. Retrying."); RefreshRates();}
  if(Error==133){Alert("Trading prohibited.");}
  if(Error==2){Alert("Common error.");}
  if(Error==146){Alert("Trading subsystem is busy. Retrying."); Sleep(500); RefreshRates();}

}


//-------------------------------------------------------------------
   return(0);
  }
//+-----------------------------------
Und das ist der Code von einem hier aus dem Forum für einen Trailing-Stop, den ich leider nicht für mich verständlich unterbringen kann:

Code:
void UpdateTS()
{
  for(int i = OrdersTotal() - 1; i >= 0; i--)
	{
	 if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  	   {
  	    if(OrderType() == OP_BUY && NormalizeDouble(Bid - OrderStopLoss(), Digits) > NormalizeDouble(TrailingStop * Point, Digits))
  	      {
  	       OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * Point, OrderTakeProfit(), 0);
  	       }
  	     if(OrderType() == OP_SELL && NormalizeDouble(OrderStopLoss() - Ask, Digits) > NormalizeDouble(TrailingStop * Point, Digits))
  		{
  		 OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * Point, OrderTakeProfit(), 0);
  		 }
  	     }
	 }
}
Wie gesagt... ich fange gerade erst frisch an. Ich bin der Meinung, dass ich zumindest schonmal verstehe, wo etwas wie abläuft. Ich habe daher an verschiedenen Stellen im Original Code eigene Beschreibungen hinterlegt.

Stellen die ich bereits im Original Code geändert habe,
sind mit // <<<<<<<<<<<<<<<
gekennzeichnet.

Ich wäre euch sehr dankbar, wenn ihr mir da helfen könntet, und die entsprechende Stelle (die ich im Original Code bereits gekennzeichnet habe) ändert bzw. mir den entsprechenden Code hier postet. Dann kann ich mir das selber mal ansehen und hoffentlich daraus lernen.

lg
Peter