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: 4973
Beiträge: 43253
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

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

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 28.11.17
Gesperrter Benutzer
 
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, 19x aufgerufen)
Angehängte Dateien
Dateityp: mq4 EA_AH_SandboxOrderFunctions.mq4 (29,3 KB, 10x 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 +1. Es ist jetzt 19:40 Uhr.





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