Problem mit EA-Code 2 (SL-Manager)

 

Hallo,

Nochmals vielen Dank für Ihre Hilfe, während ich MQL lerne.

Hier ist mein nächstes Problem.... Ich bin SOOOO nah dran an diesem.... Ich habe es tun alles, was ich will es zu ... Allerdings ist es die SLs auf JEDEN TICK ändern, wenn die GAP über dieses Kriterium ist, anstatt nur EXECUTING ONCE...

Es ist ein sehr einfacher Code, und ein sehr einfaches Problem, das ich nicht in der Lage bin, in diesem Stadium zu arbeiten, und jede Hilfe würde mein Lernen unterstützen...

Dies ist nur die BUY SIDE atm, aber ich habe Zulagen für die IFGAP für OP_SELL Seite für später geschrieben.


Die Funktion dieses EA ist zu:

1. einen Kaufhandel zu initiieren, wenn es keinen gibt.

2. bei TP-Level 1, SL nach oben verschieben.... bei TP-Level 2, SL wieder nach oben verschieben.... bei TP-Level 3, SL noch einmal nach oben verschieben letztes Mal. Schön und einfach wirklich..


Die noob Problem, das ich bin mit ist:

1. Es führt meine OrderModify EVERYTICK wenn über GAP... Ich kann nicht denken, wie man die Logik zu ändern, aber sobald ich gezeigt werden, werde ich für die Zukunft wissen...


Vielen Dank im Voraus.

Mit freundlichen Grüßen und frohe Pips an alle.


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

Das Anfängerproblem, das ich habe, ist folgendes:

1. Es führt meine OrderModify EVERYTICK aus, wenn über GAP... Ich kann nicht denken, wie die Logik zu ändern, aber sobald ich gezeigt werden, werde ich für die Zukunft wissen...

Wenn Sie es nicht für jeden Tick ausführen wollen, wann wollen Sie es dann ausführen? meinen Sie jeden Tick, aber nur einmal? um das zu tun, überprüfen Sie einfach, ob der SL & TP bereits angepasst wurden...

Eine weitere Bemerkung . . . IfGap_Level_1() durchläuft alle offenen Orders auf der Suche nach denen, die mit dem Symbol und der magischen Zahl übereinstimmen, und prüft dann, ob die Order einen bestimmten Betrag im Gewinn ist, usw . . . wenn ja, ruft sie BuyOrderModifyLevel_1() auf, diese Funktion durchläuft alle offenen Orders auf der Suche nach denen, die mit dem Symbol und der magischen Zahl übereinstimmen und ein Buy sind . . sehen Sie hier eine kleine Wiederholung ? warum übergeben Sie nicht einfach die Ticket-Nummer von IfGap_Level_1() an BuyOrderModifyLevel_1() ?

 
Funky:

Hallo,

Nochmals vielen Dank für Ihre Hilfe, während ich MQL lerne.

Hier ist mein nächstes Problem.... Ich bin SOOOO nah dran an diesem.... Ich habe es tun alles, was ich will es zu ... Allerdings ist es die SLs auf JEDEN TICK ändern, wenn die GAP über dieses Kriterium ist, anstatt nur EXECUTING ONCE...

Es ist ein sehr einfacher Code, und ein sehr einfaches Problem, das ich nicht in der Lage bin, in diesem Stadium zu arbeiten, und jede Hilfe würde mein Lernen unterstützen...

Dies ist nur die BUY SIDE atm, aber ich habe Zulagen für die IFGAP für OP_SELL Seite für später geschrieben.


Die Funktion dieses EA ist zu:

1. einen Kaufhandel zu initiieren, wenn es keinen gibt.

2. bei TP-Level 1, SL nach oben bewegen.... bei TP-Level 2, SL wieder nach oben bewegen.... bei TP-Level 3, SL noch einmal nach oben bewegen. Schön und einfach wirklich..


Das Noob-Problem, das ich habe, ist:

1. Es führt meine OrderModify EVERYTICK aus, wenn über GAP... Ich kann nicht denken, wie man die Logik zu ändern, aber sobald ich gezeigt werden, werde ich für die Zukunft wissen...


Vielen Dank im Voraus.

Freundliche Grüße und glückliche Pips an alle.


Sie sind kein NOOB. Wenn man von der eleganten Fähigkeit ausgeht, Funktionen zu schreiben und dann aufzurufen, so wie Sie es getan haben. Sie sollten in der Lage sein, selbst zu sehen, dass Ihre Funktionsaufrufe (Tiefe der Logik, etc.) vielleicht auf 1-2 Funktionen vereinfacht werden können.

Anstelle von:

OrderOpenPrice() 

in Ihrer Bedingung:

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

haben Sie erwogen/versucht, OrderStopLoss() zu verwenden?

 
RaptorUK:

Wenn Sie es nicht für jeden Tick ausführen wollen, wann wollen Sie es dann ausführen? meinen Sie jeden Tick, aber nur einmal? um das zu tun, überprüfen Sie einfach, ob der SL & TP bereits angepasst wurden...

Eine weitere Bemerkung . . . IfGap_Level_1() durchläuft alle offenen Orders auf der Suche nach denen, die mit dem Symbol und der magischen Zahl übereinstimmen, und prüft dann, ob die Order einen bestimmten Betrag im Gewinn ist, usw . . . wenn ja, ruft sie BuyOrderModifyLevel_1() auf, diese Funktion durchläuft alle offenen Orders auf der Suche nach denen, die mit dem Symbol und der magischen Zahl übereinstimmen und ein Buy sind . sehen Sie hier eine kleine Wiederholung ? warum übergeben Sie nicht einfach die Ticketnummer von IfGap_Level_1() an BuyOrderModifyLevel_1() ?

Hallo noch einmal Raptor, vielen Dank für Ihre Zeit. So wie ich es formuliert habe, klingt es wirklich verwirrend. Ich habe Probleme damit, all diese Komponenten richtig zusammenzufügen, denke ich. Im Moment ist das Hauptproblem, das ich habe, dass die Aufträge bei jedem Tick geändert werden, aber nach Ihren Kommentaren sehe ich jetzt auch einige andere Probleme. Wenn ich den letzten Teil Ihrer Ausführungen richtig verstehe, meinen Sie damit, dass Sie den BuyOrderModify-Code innerhalb des IfGap_Level_1 innerhalb eines {} einfügen sollten, nachdem Sie überprüft haben, ob das Gap erreicht wurde, anstatt in einem eigenen {}? Wie in diesem Beispiel unten?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Und wissen Sie, ich fühle mich wie dejavue mit meinem anderen EA in einer Art und Weise, jetzt, dass die Box Form annimmt (hier https://forum.mql4.com/42870 - nicht absichtliche Ähnlichkeit, da es ein anderer EA mit einem anderen Zweck ist, jedoch zeigt dies auf die gleichen Bereiche, die ich lernen muss, wie z. B. die Einbeziehung von zwei Funktionen zusammen, ich verspreche, ich habe nicht versucht, das Forum mit Redundanz zu füllen)...

Darf ich daher fragen, ob eine Variable IFNEWORDEREXIST = TRUE an der gleichen Stelle ein anderes Problem lösen würde. Sehen Sie, ich möchte, dass der letzte Open Trade, der in ModeTrades gemacht wurde, derjenige ist, den ich jederzeit mit dem IfGap_Level_X vergleiche (ich schätze, dieser Teil ist ähnlich wie mein anderer).


Sobald ich den Fehler mit OrderModify behoben habe, der bei JEDEM TICK auftritt, während er in diesem {} feststeckt, wenn das obige Kästchen nicht korrekt ist, und mich mit dem Latest Order Select Problem befasse, werde ich mit dem nächsten Drama konfrontiert, dass zwar IfGap_Level_3 erfüllt ist, aber auch IfGap_Level_2 und IfGap_Level_1.

Ich möchte, dass der EA als SL-Manager fungiert, und (trotz des anfänglichen einzelnen Kaufauftrags) werde ich ihn verwenden, um mehrere Trades zu verwalten. Der erste Kauf war nur so, dass ich es ok Backtest konnte. Ich möchte, dass dieser Code zu:

Wenn Order's Pips IfGap_Level_1 erreicht, möchte ich, dass es BuyOrderModifyLevel_1 aufruft, dann bestehende Aufträge ändert und diesen Teil des Codes vergisst.

Wenn IfOrder's Pips den Wert IfGap_Level_2 erreicht, möchte ich, dass er zu BuyOrderModifyLevel_2 wechselt, dann bestehende Aufträge ändert und diesen Teil des Codes vergisst.

Wenn Order's Pips den Wert IfGap_Level_3 erreicht, möchte ich, dass er zu BuyOrderModifyLevel_3 geht, dann bestehende Orders modifiziert und diesen Teil des Codes vergisst.

Ich hoffe, dass ich nicht zu weit daneben liege, am Anfang kam es mir einfach vor.

Ich hatte gehofft, ich könnte einfach ein "break;" oder etwas am Ende eines jeden Blocks einfügen und mit diesem Code davonkommen...
diostar:

Sie sind kein NOOB. Wenn man von der eleganten Fähigkeit ausgeht, Funktionen zu schreiben und dann aufzurufen, wie Sie es getan haben. Sie sollten in der Lage sein, selbst zu sehen, dass Ihre Funktionsaufrufe (Tiefe der Logik, etc.) vielleicht auf 1-2 Funktionen vereinfacht werden können.

Anstelle von:

in deinem Zustand:

Haben Sie erwogen/versucht, OrderStopLoss() zu verwenden?

Ah, danke diostar, Sie sind zu freundlich mit Ihren Kommentaren. Ich bin ganz gut darin, einfache Skripte zu schreiben, aber ich bin nicht weit von diesem Niveau entfernt, und jetzt bereitet mir das Zusammenfügen von allem Kopfschmerzen. Danke für die Ermutigung, aber die Forumformeln und andere Dinge ergeben für mich Sinn, nicht so sehr die Programmgrammatik/Syntax.

Ich glaube, du könntest Recht haben mit dem, was du sagst, indem du den Code auf 1-2 Funktionen zusammenfasst, ich bin mir nur nicht sicher, wie...

Wenn ich die Erfahrung hätte, würde ich IFGAP und MODIFY ORDER in einem Block haben, wie Sie und Raptor es vorschlagen, aber ich wollte in diesem Stadium auf Nummer sicher gehen... Ich schätze, wenn ich ein Profi wäre, würde ich die TPs in einem Array oder Schalter haben und old TP=oldTP+TPincrement_Level setzen, und könnte alles in einem Block in etwa 10 Zeilen Code haben... Schließlich werde ich dies in der allerletzten If Gap & ModifyOrder {} tun, so dass die SL-Inkrement in programmierbaren Intervallen erhöht wird, aber die ersten paar möchte ich verlassen, um manuell abhängig von den Marktbedingungen eingestellt...

Ich habe die Verwendung von OrderStopLoss() in der Formel nicht in Betracht gezogen. Ich denke, da ich die SLs ein wenig für die ersten paar Züge variieren werde, möchte ich wirklich, dass sie auf dem OrderOpenPrice und den Pips basieren, die sie seit ihrer Eröffnung gestiegen sind. Ich hatte nicht erklärt, die EA sehr gut, Entschuldigungen. Vielen Dank für Ihre Zeit zu mate, sehr geschätzt.

 
Funky:

Hallo noch einmal Raptor, vielen Dank für Ihre Zeit. So wie ich es formuliert habe, klingt es wirklich verwirrend. Ich habe Probleme damit, all diese Komponenten richtig zusammenzufügen, denke ich. Im Moment ist das Hauptproblem, das ich habe, dass die Aufträge bei jedem Tick geändert werden, aber nach Ihren Kommentaren sehe ich jetzt auch einige andere Probleme. Wenn ich den letzten Teil Ihrer Ausführungen richtig verstehe, meinen Sie damit, dass Sie den BuyOrderModify-Code innerhalb des IfGap_Level_1 innerhalb eines {} einfügen sollten, nachdem Sie überprüft haben, ob das Gap erreicht wurde, anstatt in einem eigenen {}? Wie in diesem Beispiel unten?

Das könnten Sie tun, aber das ist nicht wirklich das, was ich meinte...

Schauen Sie sich das an, um zu sehen, ob es Sinn macht...

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

Die andere Sache, die ich erwähnte, betraf die Überprüfung, ob die Order bereits geändert wurde, indem man nachschaut, was ihr SL und TP waren, mit anderen Worten, wenn Sie die Order bereits beim letzten Tick geändert haben, tun Sie es nicht noch einmal bei diesem Tick ... ist es das, was Sie tun wollten?

 
RaptorUK:

Das könnte man machen, aber das ist nicht wirklich das, was ich meinte...

Schauen Sie sich das mal an, ob es Sinn macht...

Die andere Sache, die ich erwähnte, bezog sich auf die Überprüfung, ob die Order bereits geändert wurde, indem man nachschaut, was ihr SL und TP waren, mit anderen Worten, wenn Sie die Order bereits beim letzten Tick geändert haben, tun Sie es nicht noch einmal bei diesem Tick... ist es das, was Sie tun wollten?


Das ist großartig für mein Lernen... Ich wusste gar nicht, dass man (OrderTicket()) hinter einen Funktionsnamen setzen kann, cool. Damit wird die Ticketnummer meiner letzten offenen Bestellung angegeben, cool. Das ist ein sehr praktischer Tipp für die Dinge, mit denen ich mich gerade beschäftige, danke.

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

und hier sehe ich, dass Sie die Variable Ticket erstellt haben. Ich wusste gar nicht, dass man in diesem Teil des Codes eine Variable deklarieren kann. Kann das gemacht werden, weil es im letzten Teil oben einen Wert bekommen hat? Ich verstehe, wie es funktionieren könnte, denn dann wird hier die Ticketnummer des letzten Geschäfts anstelle meines "unspezifischen" OrderTicket() verwendet. Das macht Sinn. Das ist für mich viel genauer als OrderSelect(i++... usw.).

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


Es ist fast 1 Uhr morgens, also werde ich mir das morgen genauer ansehen, vielen Dank für Ihre Zeit.... Ich habe das Gefühl, dass ich diese Logik vielleicht in den "If_Gap_Levels{}"-Block statt in den "BuyModify{}"-Block einfügen muss. Ich hatte es nicht allzu deutlich erklärt, Entschuldigung. Ich denke, dieser Tipp wird mir helfen, das letzte Ticket auf GAP zu prüfen und dann ALLE vorherigen Bestellungen mit diesem OP_BUY und BUY_Magic usw. zu MODIFYen.

Die andere Sache, die ich erwähnte, betraf die Überprüfung, ob die Order bereits geändert wurde, indem man nachschaut, wie hoch ihr SL und TP waren, mit anderen Worten, wenn Sie die Order bereits beim letzten Tick geändert haben, tun Sie es nicht noch einmal bei diesem Tick ... ist es das, was Sie tun wollten?

Ja, das ist genau der Punkt, an dem ich nicht weiterkomme... Ich bin mir nur nicht sicher, wie ich das angeben soll... Erstelle ich einen bool-Wert von NeedsModifying = false, und wandle ihn dann in True um, wenn das IfGap-Kriterium erfüllt ist? Ich kann mir die Logik vorstellen, nur nicht die Syntax, aber ich habe aus Ihren Tipps für mich in meinem letzten EA gelernt, um überhaupt in der Lage zu sein, meinen letzten Satz vorzuschlagen. Nochmals vielen Dank, Raptor.

 
Funky:

Das ist großartig für mein Lernen... Ich wusste gar nicht, dass man (OrderTicket()) hinter einen Funktionsnamen setzen kann, cool. Damit wird also mein Ticket, das die Lückenkritik erfüllt, dieser Funktion BuyOrderModifyLevel_1 zugeordnet? Das ist ein sehr praktischer Tipp für die Dinge, mit denen ich mich gerade beschäftige, vielen Dank.

und hier sehe ich, dass Sie die Variable Ticket erstellt haben. Ich wusste gar nicht, dass man in diesem Teil des Codes eine Variable deklarieren kann. Kann das gemacht werden, weil es im letzten Teil oben einen Wert bekommen hat? Ich verstehe, wie es funktionieren könnte, denn dann wird hier die Ticketnummer des letzten Geschäfts anstelle meines "unspezifischen" OrderTicket() verwendet. Das macht Sinn. Für mich ist es viel genauer als OrderSelect(i++... etc.).

Es ist Teil der Funktionsdefinition ... genau wie jede der Standardfunktionen, z.B. OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify ist eine Funktion, der Sie Variablen übergeben, mindestens 5 Variablen, die 6. ist optional. Sie können genau dasselbe mit Ihren eigenen Funktionen tun . . .

Sie sind herzlich willkommen. Nacht.

 
RaptorUK:

Sie ist Teil der Funktionsdefinition ... genau wie jede der Standardfunktionen, z.B. OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify ist eine Funktion, der Sie Variablen übergeben, mindestens 5 Variablen, die 6. ist optional. Sie können genau dasselbe mit Ihren eigenen Funktionen tun . . .

Sie sind herzlich willkommen. Nacht.


Danke Raptor.... ah Sie haben mich erwischt, als ich den letzten Satz in diesem Beitrag bearbeitet habe, denn ja, Sie hatten Recht mit dem, was ich wollte...

Danke, dass du mich wieder an dieses .doc erinnert hast... es ist lustig, dass ich dieses bestimmte .doc auf OrderMofidy so oft gelesen habe... Früher sah das Handbuch für mich chinesisch aus, aber je weiter ich komme, desto mehr fortgeschrittene Tipps fallen mir auf. Ich werde es jetzt noch einmal lesen, und ich wette, dass die von Ihnen erwähnte Funktion für mich so klar wie das Tageslicht sein wird, aber danke, dass Sie mich darauf hingewiesen haben, so dass ich wusste, dass ich danach suchen muss.

--Kopiert von oben, da ich den letzten Teil unwissentlich eingefügt hatte, während Sie schrieben....

Die andere Sache, die ich erwähnte, betraf die Überprüfung, ob die Order bereits geändert wurde, indem man nachschaut, was ihr SL und TP waren, mit anderen Worten, wenn Sie die Order bereits beim letzten Tick geändert haben, tun Sie es nicht noch einmal bei diesem Tick ... ist es das, was Sie tun wollten?

Ja, das ist genau der Punkt, an dem ich nicht weiterkomme... Ich bin mir nur nicht sicher, wie ich das festlegen soll... Erstelle ich einen boolschen Wert von NeedsModifying = false, und wandle ihn dann in True um, wenn das IfGap-Kriterium erfüllt ist? Ich kann mir die Logik vorstellen, nur nicht die Syntax, aber ich habe aus Ihren Tipps für mich in meinem letzten EA gelernt, um überhaupt in der Lage zu sein, meinen letzten Satz vorzuschlagen. Nochmals vielen Dank, Raptor.

Gute Nacht aus Downunder.

 
RaptorUK:

Sie ist Teil der Funktionsdefinition ... genau wie jede der Standardfunktionen, z.B. OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify ist eine Funktion, der Sie Variablen übergeben, mindestens 5 Variablen, die 6. ist optional. Sie können genau dasselbe mit Ihren eigenen Funktionen tun . . .

Sie sind herzlich willkommen. Nacht.


Hallo Raptor,

ich habe die Dinge ein wenig weiterentwickelt, indem ich die Ideen, die du mir gezeigt hast, verwendet habe. Mir wurde klar, dass Ihr Code mein Problem beheben würde, aber sobald die Aufträge meine zweite TP-Ebene erreichen, wird es schwer zu handhaben sein.

Mir war nicht klar, dass ich die OrderSelect i++ weglassen und einfach mein eigenes Ticket in dieser Gleichung auswählen könnte, also habe ich das ausprobiert, da es alle meine Probleme mit mehreren Trades lösen würde... würde das funktionieren?

Wenn mir jemand bestätigen kann, dass dieser Code funktioniert, wäre ich sehr erfreut... nochmals vielen Dank für die Unterstützung ;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

Es gibt ein Problem bei dem, was Sie vorschlagen....

Stellen Sie sich vor, Ihr EA läuft ... dann wird Ihr MT4 aus irgendeinem Grund unterbrochen, Stromausfall, MT4-Absturz, PC muss neu gestartet werden, usw. ... Ihr Code kann nicht dort weitermachen, wo er aufgehört hat, weil er nicht mehr den richtigen Wert für PendingOrderTicket_1 hat

 
RaptorUK:

Es gibt ein Problem bei dem, was Sie vorschlagen....

Stellen Sie sich vor, Ihr EA läuft... dann wird Ihr MT4 aus irgendeinem Grund unterbrochen, Stromausfall, MT4-Absturz, PC braucht einen Neustart, usw... Ihr Code kann nicht dort weitermachen, wo er aufgehört hat, weil er nicht mehr den richtigen Wert für PendingOrderTicket_1 hat


Hallo Raptor, nochmals vielen Dank.

Ist das das einzige Problem mit dem obigen Code??? Ich denke, im schlimmsten Fall würde das PendingOrderTicket_1 nicht geändert werden und würde an seinem SL schließen.

Ist es in Ordnung, wie ich die OrderSelect-Funktion verwendet habe?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

Das große Problem, das ich denke, ist, dass, wenn OrderTicket_1 über dem ersten Gap_Level1 ist, wird es immer noch die Bestellung JEDEN TICK ändern, dass dieses Criterea erfüllt ist.

Ist das der Fall? Wenn ja, würde der unten stehende Code das Problem lösen?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


Oder würde ich dies mit dem CheckGapLevel_1 tun, so dass es nur einmal geprüft wird? Und wenn ja, habe ich es richtig gemacht unter???? Sollte ich irgendwo ein "Break" einfügen?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Nochmals vielen Dank ;)