Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Expert-Advisors

Expert-Advisors Expert-Advisors für Metatrader 4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3824
Beiträge: 36909
Benutzer: 6.076
Aktive Benutzer: 496
Links: 80
Wir begrüßen unseren neuesten Benutzer: Spitzmaus
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 18 Stunden
- Spitzmaus
vor 21 Stunden
- juleslesqu...
vor einem Tag
- hmf44
vor 2 Tagen
- Crossa
vor 2 Tagen
- snatshit

Onlineuser
'Wer ist online' anzeigen Benutzer: 2
Gäste: 78
Gesamt: 80
Team: 0
Team:  
Benutzer:  Domke01, juleslesquet
Freunde anzeigen

Empfehlungen

Werbung

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 2 Wochen
Neues Mitglied
 
Registriert seit: Nov 2017
Beiträge: 1
Julia1994 befindet sich auf einem aufstrebenden Ast
Question 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);
}
Mit Zitat antworten
  #2 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 2
mocwoc befindet sich auf einem aufstrebenden Ast
Wink 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.
Mit Zitat antworten
  #3 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 2
mocwoc befindet sich auf einem aufstrebenden Ast
Standard Attachments

... hat beim ersten Mal nicht funktioniert
Angehängte Grafiken
Dateityp: jpg EA_AH_SandboxOrderFunctions.jpg (27,3 KB, 7x aufgerufen)
Angehängte Dateien
Dateityp: mq4 EA_AH_SandboxOrderFunctions.mq4 (29,3 KB, 5x aufgerufen)
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
order, signal, trade


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------