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)
-   -   Kontrolliere ob ein TakeProfit gesetz ist (http://www.expert-advisor.com/forum/showthread.php?t=6895)

Gaydon 24.01.21 17:24

Kontrolliere ob ein TakeProfit gesetz ist
 
Ich kann leider keinen Code zur Verfügung stellen, habe aber folgendes Problem.
Mein Programm erstellt eine Order OHNE TakeProfit, setzt aber unter bestimmt Voraussetzungen ein TakeProfit und danach kommt Modify error 1, weil er Tausende OrderModify macht.

meine Überlegung war eine Wahr/Falsch abfrage um das zu Stoppen.

if(OrderTakeProfit()>0)

weil ich dachte es existiert ja nicht und wenn er gesetzt wird, ist er ja erst größer 0.
Aber darauf reagiert das Programm nicht, wenn ein TakeProfit gesetzt wird.
Es erkennt das TakeProfit nicht da ist macht aber auch nichts, wenn es da ist.

traderdoc 24.01.21 19:01

Zitat:

Zitat von Gaydon (Beitrag 45017)
Ich kann leider keinen Code zur Verfügung stellen, habe aber folgendes Problem.
Mein Programm erstellt eine Order OHNE TakeProfit, setzt aber unter bestimmt Voraussetzungen ein TakeProfit und danach kommt Modify error 1, weil er Tausende OrderModify macht.

meine Überlegung war eine Wahr/Falsch abfrage um das zu Stoppen.

if(OrderTakeProfit()>0)

weil ich dachte es existiert ja nicht und wenn er gesetzt wird, ist er ja erst größer 0.
Aber darauf reagiert das Programm nicht, wenn ein TakeProfit gesetzt wird.
Es erkennt das TakeProfit nicht da ist macht aber auch nichts, wenn es da ist.

Siehst Du und genau das ist der Grund, warum wir hier den Code brauchen.
Wer oder was hindert Dich denn daran, den Code wenigstens in Teilen zu posten?

traderdoc

Gaydon 11.02.21 21:54

So nun der Code, weil ich jetzt erst einen habe.
Im Tester funktioniert das Ganze aber ich bekomme immer OrderModify error 130, obwohl er im Tester den TakeProfit setzt und wenn der TakeProfit da ist kommt der Fehler weiter. Er ändert auch laufend den TakeProfit, obwohl er ja eindeutig definiert ist, denke ich.
Wenn Ich direkt ein TakeProfit setzte, passiert nichts also keine error Meldung.
Mir kommt aber auch die Frage, warum nimmt er den OpenPrice nicht nachdem der MACD das macht was er machen soll, sondern einfach direkt den letzten den er findet und ignoriert den MACD?

Code:

      for (int b=OrdersTotal()-1;b>=0;b--)
        {
        if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
            {
            if(OrderSymbol()==Symbol())
              {
              if(OrderType()==OP_BUY)
                  {
                  if((Bid>OrderStopLoss())&&(OrderTakeProfit()==0))
                    {                 
                    if((iOpen(_Symbol,PERIOD_M5,0)>SMA_21)&&(MACD_15M<=MACD_15M1));
                        {
                        double Ausstieg_5Ml=0;
                        int l=0;
                        for(l=0;(iLow(_Symbol,PERIOD_M5,l)<SMA_21);l++) 
                          {
                          NormalizeDouble ((Ausstieg_5Ml=iOpen(_Symbol,PERIOD_M5,l)),4);
                          if(Ausstieg_5Ml-Takeprofit_Abstand)
                              {
                              OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ausstieg_5Ml,0,0);
                              SendNotification("OrderModified");
                              Print("OrderModified", Ausstieg_5Ml);


Indikator-Trading 12.02.21 15:52

Ok, leider sind hier einige Teile in deinem Code nicht logisch, bzw. falsch

Die If-Abfrage wird nie etwas bewirken, da du da ein Semicolon am Ende gesetzt hast:
Code:

if((iOpen(_Symbol,PERIOD_M5,0)>SMA_21)&&(MACD_15M<=MACD_15M1));
NormalizeDouble hat keinen Einfluss, da der Rückgabewert nicht gespeichert wird, auch beschreibst du innerhalb der NormalizeDouble Funktion die Variable Ausstieg_5MI, was eine sehr unleserliche Art und Weise ist:
Code:

NormalizeDouble ((Ausstieg_5Ml=iOpen(_Symbol,PERIOD_M5,l)),4);
Das hier ist keine sinngebende If-Abfrage:
Code:

if(Ausstieg_5Ml-Takeprofit_Abstand)

Indikator-Trading 12.02.21 15:55

Da du erst jetzt einen Code hast, gehe ich mal davon aus, dass du den von jemanden anderes hast programmieren lassen. Verlange besser dein Geld zurück, falls du was dafür bezahlt haben solltest!

Gruß und weiterhin viel Erfolg!
Timo

traderdoc 12.02.21 17:18

Der Code als solcher und dessen Ursprung wirft in der Tat einige Fragen auf.

Arbeiten kann man damit auf jeden Fall nicht.

traderdoc

Gaydon 13.02.21 12:15

Danke für eure Antworten.

Das Semikolon habe ich übersehen, komischer weiße tat das Programm dennoch was es machen sollte.
NormalizeDouble hatte ich einfach nur schnell reingeworfen, das aber anscheinend auch noch falsch. Wie geht das den Richtig?
Stimmt die letzte if abfrage macht so keinen Sinn.

Nochmal kurz zum Programm.
Das Programm soll bei einer LongPosition einen Ausstieg erstellen, über den TakeProfit. Indem er guckt wann ist der Openprice über dem Gleitendendurchschnitt von 21 und das Low dieser Kerze unter dem 21iger Durchschnitt. Um dann den OpenPrice dieser Kerze als TakeProfit zu setzten bei noch anderen Indikatioren.
Ich hoffe das war verständlich.

So nun wo klemmt das Ganze?

Die Auswahl der Order funktioniert anscheinend.

Die "Laufzeit" und Kontrolle der Ausführung
Code:

if((Bid>OrderStopLoss())&&(OrderTakeProfit()==0))
hier ist für mich schon die Frage, warum modifziert er weiter wenn doch ein TakeProfit automatisch gesetzt ist? Aber wenn ich ihn manuell setzt hört er auf genau wie er soll?

Auswahl des TakeProfit
Code:

double Ausstieg_5Ml=0;
int l=0;
for(l=0;(iLow(_Symbol,PERIOD_M5,l)<SMA_21);l++) 
  {
    Ausstieg_5Ml=iOpen(_Symbol,PERIOD_M5,l);

Das funktioniert, der Preis steht fest und wird richtig "berechnet".
Nun die Frage warum ändert er dennoch laufend den Preis um 5 Pips hoch und dann wieder runter? Der Preis ist doch fest und der TakeProfit ist doch gesetzt darum müsste er doch bei "Laufzeit und Kontrolle" sagen ist falsch, weil TakeProfit gesetzt ist und damit TakeProfit !=0 oder was ist falsch?

OrderModify wird natürlich so gestartet, denke ich.
Code:

if((Ausstieg_5Ml-Takeprofit_Abstand)<Ask)
also vielen Dank für eure Hilfe schonmal.

MA-EA 13.02.21 17:38

Zitat:

Zitat von Gaydon (Beitrag 45083)
Das Programm soll bei einer LongPosition einen Ausstieg erstellen, über den TakeProfit. Indem er guckt wann ist der Openprice über dem Gleitendendurchschnitt von 21 und das Low dieser Kerze unter dem 21iger Durchschnitt. Um dann den OpenPrice dieser Kerze als TakeProfit zu setzten bei noch anderen Indikatioren.
Ich hoffe das war verständlich.

Poste mal das ganze Programm.

Gaydon 14.02.21 11:41

hier ist mein Ausstiegscode.
Code:

void Ausstieg()
{
  double Ausstieg_Indikator_long = iLow(_Symbol,PERIOD_M5,0);
  double Takeprofit_Abstand = MarketInfo(_Symbol,MODE_STOPLEVEL);
  double SMA_21 = iMA(_Symbol,PERIOD_M5,21,0,MODE_SMA,PRICE_CLOSE,0);
  double MACD_15M = iMACD(_Symbol,PERIOD_M15,12,26,9,PRICE_CLOSE,0,0);
  double MACD_15M1 = iMACD(_Symbol,PERIOD_M15,12,26,9,PRICE_CLOSE,0,1);
      {
      for (int b=OrdersTotal()-1;b>=0;b--)
        {
        if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
            {
            if(OrderSymbol()==Symbol())
              {
              if(OrderType()==OP_BUY)
                  {
                  if((Ask>OrderStopLoss())&&(OrderTakeProfit()==0))
                    {                 
                    if((iOpen(_Symbol,PERIOD_M5,0)>SMA_21)&&(MACD_15M<=MACD_15M1))
                        {
                        double Ausstieg_5Ml=0;
                        int l=0;
                        for(l=0;(iLow(_Symbol,PERIOD_M5,l)<SMA_21);l++) 
                          {
                          Ausstieg_5Ml=iOpen(_Symbol,PERIOD_M5,l);
                          if((Ausstieg_5Ml-Takeprofit_Abstand)<Ask)
                              {
                              OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ausstieg_5Ml,0,0);
                              }                           
                          } 
                        } 
                    }
                  }
              }
            }
        }
      }

ich vermute er hat ein Problem mit der Schleife aber ich habe keine andere Lösung für die Schleife, vielleicht ist sie ja auch unnütz aber er soll jetzt nicht immer den TakeProfit setzten wenn er unter den 21iger Durchschnitt kommt.

Indikator-Trading 14.02.21 12:58

Ich sehe hier ein Problem mit dieser if-Abfrage:
Code:

if((Ausstieg_5Ml-Takeprofit_Abstand)<Ask)
Dein TP darf nie kleiner als dein Ask sein, wenn du wie in deinem Code den TP für deine Buy-Order setzten willst.
Außerdem wird deine Buy-Order über den Bid-Preis geschlossen!

Du müsstest also abfragen, ob der neue TP hochgenug ist, damit er akzeptiert wird:
Code:

if(Ausstieg_5Ml>(Bid+Takeprofit_Abstand))
Bei meinem Broker kam übrigens bei MarketInfo(_Symbol,MODE_STOPLEVEL);
für Forex Märkte 0 zurück, vielleicht liegt das jetzt aber auch nur daran, dass die Märkte gerade geschlossen haben.


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