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)
-   -   Aufzählfunktion (http://www.expert-advisor.com/forum/showthread.php?t=1954)

Mast83 18.02.12 15:16

Aufzählfunktion
 
Hallo Zusammen,

ich habe einen EA geschrieben und dieser ist soweit auch fertig bis auf eine Detailsfrage.
Der EA soll im 1 Stunden Chart handeln und hat einen engen SL als auch TP. Leider eröffnet dieser sofort eine neue Order nachdem die alte geschlossen wurde. Eigentlich soll stattdessen gewartet werden bis die laufende Stunde vorbei ist und dann in der darauf folgenden Stunde erneut gehandelt werden.

Hier ein Teil des Codes:
Code:

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
opensell = 0;
openbuy = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  //==> select also on magicnumber and symbol
      {
      if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;}
      if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;}
      if((OrderOpenTime()+3600) < TimeCurrent() && OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol())
        {
          if (OrderType() == OP_BUY)         
              {
              bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);         
              openbuy = openbuy-1;    //openbuy--;
              }
          if (OrderType() == OP_SELL)         
              {
              Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); 
              opensell = opensell-1;  //opensell--;
              }             
          }
      }
    }

//BuyOrder
if ((TradeHour1==Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,Bid + TakeProfit * Point,"Kompensation buy",MagicNumber,0,Green);
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour1==Hour()) && opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,Ask - TakeProfit * Point,"Kompensation sell",MagicNumber,0,Red);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}

//----
return(0);
}

Ich gehe davon aus, das der Fehler in dem Dickmarkierten Bereich liegt...kann mir jemand den Lichtblick geben, damit ich hier weiter komme?

Vielen lieben Dank

Marc

Mast83 18.02.12 15:52

Aktuell schaut es so aus, aber es hilft noch nichts :(

Code:

opensell = 0;
openbuy = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  //==> select also on magicnumber and symbol
      {
      if(OrderMagicNumber()== BuyMagicNumber && (OrderOpenTime()+3600)< TimeCurrent() && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;}
      if(OrderMagicNumber()== SellMagicNumber && (OrderOpenTime()+3600)< TimeCurrent() && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;}
        {
          if (OrderType() == OP_BUY)         
              {
              bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);         
              openbuy = openbuy-1;    //openbuy--;
              }
          if (OrderType() == OP_SELL)         
              {
              Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); 
              opensell = opensell-1;  //opensell--;
              }             
          }
      }
    }


Bobs 19.02.12 22:31

Aufzählfunktion
 
Es scheint mir, dass der Fehler hier ist:
if (TradeHour1==Hour() ...)

Mast83 20.02.12 09:31

Zitat:

Zitat von Bobs (Beitrag 10041)
Es scheint mir, dass der Fehler hier ist:
if (TradeHour1==Hour() ...)

Hmm ich weiß nicht...der EA soll ja eigentlich so arbeiten, dass er bei Tradehour 1 = 1 Uhr Nachts den Trade beim ersten Tick eröffnet...
Die Tradehour habe ich borher ja schon deklariert und diese greift er nun ab...
da, glaube ich, kann der Fehler nicht unbedingt liegen...

naranjoe 20.02.12 12:28

Da steckt der Fehler nicht drin.
Du solltest mal den ganzen Code posten, sonst kann man das nicht nachvollziehen.

Gruß
naranjoe

sandmann23 20.02.12 12:34

Hi,
Zitat:

Zitat von Mast83 (Beitrag 9995)
ich habe einen EA geschrieben und dieser ist soweit auch fertig bis auf eine Detailsfrage.

Dir fehlt noch ein komplettes OrdermanagementSystem, aktuell ist der Code sehr gefährlich. Multiple Orders können eröffnet werden, wenn auf der Seite des Brokers Fehler passieren.

Zitat:

Der EA soll im 1 Stunden Chart handeln und hat einen engen SL als auch TP. Leider eröffnet dieser sofort eine neue Order nachdem die alte geschlossen wurde. Eigentlich soll stattdessen gewartet werden bis die laufende Stunde vorbei ist und dann in der darauf folgenden Stunde erneut gehandelt werden.
Hier ein Teil des Codes:
Code:

opensell = 0;
openbuy = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  //==> select also on magicnumber and symbol


SELECT_BY_POS vermeiden, da nicht sichergestellt ist, das alle offenen Orders auch angezeigt werden.
Die tickets besser selber verwalten und dann über die ticketnummer und die OrderClosetime nachschauen, ob der trade noch offen ist. Durch ein OrderClose() innerhalb der for Schleife veränderst du auch die Reihenfolge der Trades.
Code:

      {
      if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;}
      if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;}
      if((OrderOpenTime()+3600) < TimeCurrent() && OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol())
        {
          if (OrderType() == OP_BUY)         
              {
              bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);

es hat einen Sinn, das OrderClose ein true/false zurück liefert. Das musst du auswerten. Was passiert, wenn die Order nicht geschlossen wurde?
Code:

              openbuy = openbuy-1;    //openbuy--;
              }
          if (OrderType() == OP_SELL)         
              {
              Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); 
              opensell = opensell-1;  //opensell--;
              }             
          }
      }
    }

Code:

//BuyOrder
wenn sl oder tp erreicht wurde, wird innerhalb der Stunde sofort eine neue Order eröffnet.
Du brauchst eine Funktion, die nur zum HourCandle-Close/open ausgeführt wird.
Code:

/**
* liefert beim ersten mal true, danach nur noch stündlich
*/
bool Time60M(){
  static datetime PrevTime60;
  if(PrevTime60 < iTime(NULL, PERIOD_H1, 0))
  {
          PrevTime60 = iTime(NULL, PERIOD_H1, 0);
          return(true);
  } else {
          return(false);
  }
}

Die for Schleife von oben wird ja nur ausgeführt, wenn ein trade offen ist, also bleibt opensell/-buy = 0
Sicher das du dich auf die Uhrzeit des Brokers verlassen willst? TimeHour() mit TimeLocal() dürfte besser sein.
Sommerzeitumstellung kommt ja bald.
Code:

if ((TradeHour1==Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,Bid + TakeProfit * Point,"Kompensation buy",MagicNumber,0,Green);
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour1==Hour()) && opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,Ask - TakeProfit * Point,"Kompensation sell",MagicNumber,0,Red);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}

//----
return(0);
}

Gruss
sandmann23

Mast83 20.02.12 23:52

Hallo Sandmann...morgen poste ich den kompletten Code mal. Ich kam da heute nicht mehr zu. Ich versuche Deiner Logik mal zu folgen udn deine Vorschläge mal zu integrieren. Inzwischen hatte ich überlegt über die Schiene mit den Bars zu gehen und dem Prog zu sagen, dass pro Bar ein Trade nach oben und nach unten gemacht werden darf...also long und short...so das ich auf max 2 Trades komme bzw...je nach MagicNumber dann einen pro bar habe...

Mast83 21.02.12 20:22

Hallo Zusammen hier ist der Code um den es geht:

Code:

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber=1;
extern int TradeHour0=0;
extern int TradeHour1=1;
extern int TradeHour2=2;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour5=5;
extern int TradeHour6=6;
extern int TradeHour7=7;
extern int TradeHour8=8;
extern int TradeHour9=9;
extern int TradeHour10=10;
extern int TradeHour11=11;
extern int TradeHour12=12;
extern int TradeHour13=13;
extern int TradeHour14=14;
extern int TradeHour15=15;
extern int TradeHour16=16;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour19=19;
extern int TradeHour20=20;
extern int TradeHour21=21;
extern int TradeHour22=22;
extern int TradeHour23=23;
extern int StopLoss=100;
extern int TakeProfit=20;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
opensell = 0;
openbuy = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  //==> select also on magicnumber and symbol
      {
      if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;}
      if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;}
      if((OrderOpenTime()+3600) < TimeCurrent() && OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol())
        {
          if (OrderType() == OP_BUY)         
              {
              bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);         
              openbuy = openbuy-1;    //openbuy--;
              }
          if (OrderType() == OP_SELL)         
              {
              Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red); 
              opensell = opensell-1;  //opensell--;
              }             
          }
      }
    }
//BuyOrder
if ((TradeHour1==Hour())||(TradeHour2==Hour())||(TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour5==Hour())||(TradeHour6==Hour())||(TradeHour7==Hour())||(TradeHour8==Hour())||(TradeHour9==Hour())||(TradeHour10==Hour())||(TradeHour11==Hour())||(TradeHour12==Hour())||(TradeHour13==Hour())||(TradeHour14==Hour())||(TradeHour15==Hour())||(TradeHour16==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour19==Hour())||(TradeHour20==Hour())||(TradeHour21==Hour())||(TradeHour22==Hour())||(TradeHour23==Hour())||(TradeHour0==Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,Bid + TakeProfit * Point,"Kompensation buy",MagicNumber,0,Green);
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour1==Hour())||(TradeHour2==Hour())||(TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour5==Hour())||(TradeHour6==Hour())||(TradeHour7==Hour())||(TradeHour8==Hour())||(TradeHour9==Hour())||(TradeHour10==Hour())||(TradeHour11==Hour())||(TradeHour12==Hour())||(TradeHour13==Hour())||(TradeHour14==Hour())||(TradeHour15==Hour())||(TradeHour16==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour19==Hour())||(TradeHour20==Hour())||(TradeHour21==Hour())||(TradeHour22==Hour())||(TradeHour23==Hour())||(TradeHour0==Hour()) && opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,Ask - TakeProfit * Point,"Kompensation sell",MagicNumber,0,Red);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}


Bobs 21.02.12 20:50

Und wo die Funktion Hour ()?

naranjoe 21.02.12 21:40

Wie Sandmann schon geschrieben hat, ist wohl dein Problem, das eine Order die TP oder SL erreicht von deinem Code nicht erfasst wird, und somit sofort eine neue Order geöffnet wird.
Eine Möglichkeit wäre, TP und SL mit dem EA zu überwachen und die Order bei erreichen per OrderClose zu schliessen.
Das könntest du komfortabel in der OrderSelect Schleife unterbringen.

Gruß
naranjoe


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