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.

Gaydon 28.02.21 11:25

Vielen Dank für deine Antwort Indikator-Trading.

Da war der klassische Anfängerfehler wieder.
Also Buy Positons sind Bid Preise und Short Positonen sind Ask Preise.

Ich weiß nicht warum aber mein Programm mit
Code:

if(Ausstieg_5Ml>(Bid+Takeprofit_Abstand))
nicht zu recht kam, daher habe ich
Code:

if(Bid>(Ausstieg_5Ml-Takeprofit_Abstand))
was ja nichts anderes ist (für mich, aber Okey) und nun funktioniert es. Ausser im Tester da kommt immer noch eine Fehler Meldung aber im live Test nicht.?

Aber nun zurück zur Ursprungsfrage, kontrolliere ob ein TakeProfit gesetzt ist.
Nun nochmal mein jetziges Programm was funktioniert.
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((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++) 
                          {
                          Ausstieg_5Ml=iOpen(_Symbol,PERIOD_M5,l);
                              {
                              if(Bid>(Ausstieg_5Ml-Takeprofit_Abstand))
                                {
                                OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ausstieg_5Ml,0,0);
                                SendNotification("OrderModified");
                                Print("OrderModified", Ausstieg_5Ml);
              }}}}}}}}}}}

Aber warum bekomme ich Unendlich viele Benachrichtigungen, wenn der TakeProfit gesetzt wurde?
Nach meinem Verständnis ist doch das Programm mit der Änderung des TakeProfit einmal durchgelaufen und damit TakeProfit!=0 somit dürfte doch nicht nochmal eine Benachrichtigung geschickt werden oder irgendetwas gemacht werden (das Passiert ja auch nicht, es kommen nur Benachrichtigungen).
Andere Frage ist, das kann ich aber auch selber Testen, ich benötige doch eigentlich keine Schleife oder?
Und kann ich also mit OrderModify den TakeProfit wieder auf 0 setzen, mit TakeProfit()=0, an der richtigen stelle?

wieder mal vielen Dank für eure Antworten

Noch eine Frage, das Programm läuft ja unter OnTick, wenn ich nun den TakeProfit wieder händisch auf 0 setzt müsste doch das Programm wieder anfangen zu Kontrollieren, was es aber nicht machte. Gib es dafür einen Grund?


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