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

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 3990
Beiträge: 38004
Benutzer: 6.303
Aktive Benutzer: 353
Links: 80
Wir begrüßen unseren neuesten Benutzer: Donani
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 6 Stunden
- Donani
vor einem Tag
- dularus
vor 3 Tagen
- beeo
vor 5 Tagen
- mkraibache...
vor 6 Tagen
- fob

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 54
Gesamt: 54
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 28.11.17
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);
}
  #2 (permalink)  
Alt 04.12.17
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 6
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.
  #3 (permalink)  
Alt 04.12.17
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 6
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, 17x aufgerufen)
Angehängte Dateien
Dateityp: mq4 EA_AH_SandboxOrderFunctions.mq4 (29,3 KB, 9x aufgerufen)
Thema geschlossen

Lesezeichen

Stichworte
ein trade, order, programmierung, programmierung metatrader, programmierung mql4, signal, signal trade, 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 +2. Es ist jetzt 03:39 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2018 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.
-----------------------------------------------------------------------------------------------------------------------------