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)
-   -   Ein Trade pro Richtung (http://www.expert-advisor.com/forum/showthread.php?t=5934)

Julia1994 28.11.17 01:09

Ein Trade pro Richtung
 
Hallo, ich brauch eure Hilfe, ich hab zwar schon paar Beiträge dazu gelesen aber komm noch immer nicht weiter. Ich möchte gerne 1 Trade pro Signal aber irgendwie bekomm ich es nicht hin hab es versucht mit einer "bool flag" aber da kommt bei mir nur "Senderror 130". So bald mein Takeprofit greift, öffnet sich sofort wieder ein Trade und genau das möchte ich verhindern.


Code:

extern int MagicNumber=10001;
extern double Lots =0.1;
extern double StopLoss=20;
extern double TakeProfit=50;
extern int TrailingStop=0;
extern int Slippage=3;
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+
int start()
{
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point*10;
 
  double TheStopLoss=0;
  double TheTakeProfit=0;
  if( TotalOrdersCount()==0 )
  {
    int result=0;
    if((Open[0]>iMA(NULL,0,200,0,MODE_SMMA,PRICE_CLOSE,0))&&(Close[0]>iMA(NULL,0,200,0,MODE_SMMA,PRICE_CLOSE,0))) //buy
    {
        result=OrderSend(Symbol(),OP_BUY,AdvancedMM(),Ask,Slippage,0,0,"EA",MagicNumber,0,Blue);
        if(result>0)
        {
        TheStopLoss=0;
        TheTakeProfit=0;
        if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
        if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
        OrderSelect(result,SELECT_BY_TICKET);
        OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
    }
  }
 
  for(int cnt=0;cnt<OrdersTotal();cnt++)
    {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && 
        OrderSymbol()==Symbol() &&
        OrderMagicNumber()==MagicNumber
        ) 
        {
        if(OrderType()==OP_BUY) 
          {
              if((Open[0]<iMA(NULL,0,200,0,MODE_SMMA,PRICE_CLOSE,0))&&(Close[0]>iMA(NULL,0,200,0,MODE_SMMA,PRICE_CLOSE,0))) //close
              {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0) 
              {               
              if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                {
                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                    {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                    return(0);
                    }
                }
              }
          }
        else
          {
            if(TrailingStop>0) 
              {               
              if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                {
                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                    {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                    return(0);
                    }
                }
              }
          }
        }
    }
  return(0);
}

int TotalOrdersCount()
{
  int result=0;
  for(int i=0;i<OrdersTotal();i++)
  {
    OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
    if (OrderMagicNumber()==MagicNumber) result++;

  }
  return (result);
}
double AdvancedMM()
{
 int i;
 double AdvancedMMLots = 0;
 bool profit1=false;
 int SystemHistoryOrders=0;
  for( i=0;i<OrdersHistoryTotal();i++)
  {  OrderSelect(i,SELECT_BY_POS ,MODE_HISTORY);
    if (OrderMagicNumber()==MagicNumber) SystemHistoryOrders++;
  }
 bool profit2=false;
 int LO=0;
 if(SystemHistoryOrders<2) return(Lots);
 for( i=OrdersHistoryTotal()-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS ,MODE_HISTORY))
    if (OrderMagicNumber()==MagicNumber)
    {
        if(OrderProfit()>=0 && profit1) return(Lots);
        if( LO==0)
        {  if(OrderProfit()>=0) profit1=true;
          if(OrderProfit()<0)  return(OrderLots());
          LO=1;
        }
        if(OrderProfit()>=0 && profit2) return(AdvancedMMLots);
        if(OrderProfit()>=0) profit2=true;
        if(OrderProfit()<0 )
        {  profit1=false;
            profit2=false;
            AdvancedMMLots+=OrderLots();
        }
    }
  }
 return(AdvancedMMLots);
}


mocwoc 04.12.17 15:32

Ein Trade pro Richtung
 
Hallo Julia1994,

für Dein Problem gibt es mehrere Lösungen unterschiedlicher Qualität. Im Prinzip musst Du in Deinen Code eine Abfrage einbauen, ob eine neue Periode oder ein neuer Balken begonnen hat oder nicht. Dafür lassen sich folgende Kriterien nutzen:

a) Volumen: Abfrage, ob das Volumen kleiner 2 ist. Am Anfang jeder Periode ist das Volumen 0 und steigt dann mit jedem Tick meines Wissens nach um 1.

b) Neue Kerze / neuer Balken: Abfrage über "Bars"

c) Neue Startzeit: Abfrage über Time[0] = Startzeit der neuen Periode.

Die Varianten a) und b) lassen sich auch auf nicht zeitbasierte Charts, wie z.B. Renko Charts anwenden. Alle drei Varianten haben den Nachteil, dass das Signal exakt zu Beginn der neuen Periode oder des neuen Balkens gültig sein muss, sofern man das Abfrageergebnis nicht lediglich als Eingangskriterium für weitere if-Statements verwendet, was ich jetzt nicht weiter getestet habe.

Die in meinen Augen eleganteste, aber etwas komplexere Lösung d) ist es, die OrderCloseTime() der letzten Order zu erfassen, also, wenn Dein Take Profit oder Stop Loss greift und damit zu vergleichen ob Time[0] größer oder kleiner als die letzte OrderCloseTime() ist. Diese Lösung erlaubt es, dass ein Signal erst im weiteren Verlauf der neuen Periode gültig wird.

In allen Fällen wird in der laufenden Periode kein neuer Trade eröffnet.

Ich füge hier aus meiner Sandbox einen Beispiel-EA mit einer Dummy Buy-/Sell-Logik bei. Den kann man auch noch etwas vereinfachen, aber für Test- und Schulungszwecke ist er ganz gut.

Die Anzeigen links oben helfen dabei zu identifizieren, was gerade gültig ist. Wenn eine neue Periode eröffnet wird, werden die verschiedenen Varianten beim ersten Tick kurz grün um dann wieder auf neutral weiß zu wechseln. Mit Ausnahme der Variante d). Da bleibt der Bool-Wert auf 1 bis eine offene Order geschlossen wurde und wartet dann auf den Beginn einer neuen Periode.

Just my 2 cents. No warranty.

Cheers, mocwoc. :)

mocwoc 04.12.17 15:36

Attachments
 
Liste der Anhänge anzeigen (Anzahl: 2)
... hat beim ersten Mal nicht funktioniert :mad:


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