Problem mit EA-Code 2 (SL-Manager) - Seite 3

 

Dieser Link hier ist in diesem Stadium "weit" über mir, aber ich kann sehen, wie ich eine coole Bibliotheksdatei erstellen könnte, um meine Probleme zu lösen... https://www.mql5.com/en/articles/1390. Ich bin ein bisschen nervös Gebäude Ticket Arrays atm und bin in der Hoffnung, ich kann um es für jetzt bekommen.. da, wenn ich ändern, es ist nur alle, dass Pair und Magie usw..

Ich habe alles richtig gemacht, bevor es zum Abschnitt Ändern kommt. Die Auswahl nach Ticket ist korrekt, und dann geht es weiter zum Abschnitt "Ändern"... dieser Teil ist großartig.

Ich kann nur nicht erkennen, ob die Dinge in diesem Abschnitt "Ändern" stecken bleiben oder ob ich in Schwierigkeiten bin, weil er "diese Abschnitte durchlaufen muss, um den nächsten Auftrag zu erhalten".

Ich hatte gehofft, ich könnte es an den Modifizierungsblock schicken und es dazu bringen, alle Aufträge dieser magischen Zahl und dieses Symbols zu ändern. Deshalb habe ich einen kleinen True- oder False-Schalter ausprobiert.

Wenn diese Abschnitte bei jedem Ticken durchlaufen werden müssen, um die nächste Bestellung auszuwählen, könnte ich Probleme bekommen.

Vielleicht könnte ich die Tickets, die geändert werden müssen, einfach manuell benennen, aber ich glaube nicht, dass dies das Problem ist, da es sie korrekt abruft, es zykliert nur jeden Tick, und ich bin ein Noob, um zu wissen, warum...

Wäre dies eine weitere Option?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

Wäre ein continue;, return(), oder break; irgendwo nützlich?

 

Ah, ich sah einen Fehler in einem meiner vorherigen Beispiele...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Ich denke, das sollte es sein:

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

Das sollte es in diesem Abschnitt isolieren... ist 5 Uhr morgens, also noch zu testen... (eine Stunde verloren, verdammte Sommerzeit haha)

Wenn ich es durch zu diesem Abschnitt einen Weg, es spams Auftrag ändert bei jedem Tick mit dem neuesten Auftrag... und wenn ich es durch den anderen Weg es scrollt Aufträge richtig, aber es immer noch modifiziert den Auftrag-Cache bei jedem Tick...

Ich kann die Aufträge rückwärts 5,4,3,2,1 oder vorwärts 1,2,3,4,5 durchlaufen lassen, aber mir fällt kein Weg ein, sie durchzulassen, um alle Aufträge zu ändern, ohne sie zu spammen.

Ich frage mich: 1) Muss ich ihn einmal durchlassen, um alle durchlaufenden Aufträge zu ändern, oder 2) muss er jedes Mal durchgelassen werden, wenn er einen neuen Auftrag auswählen muss?

Ich lerne immer noch, das ist alles. Wenn mich niemand in die richtige Richtung lenken kann, werde ich diese Zeile oben ausprobieren, mit einem Break und dem Ende und sehen, ob das endet.... es muss etwas einfaches sein...

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

Sie haben KEINEN Fehler gemacht. Die erste ist GUT zu gehen...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


Ich hatte schon einmal ein ähnliches Problem, wenn ich das alles richtig gelesen habe. Ich habe versucht, meine eigenen "modifizieren Stop/Limit Orders durch die minimale MODE_STOP Ebene, wenn Bid/Ask bewegt sich x Pips weg..."

Ist Ihr Fall ähnlich?

 
diostar:

Sie haben KEINEN Fehler gemacht. Die erste ist GUT zu gehen...


Ich hatte schon einmal ein ähnliches Problem, wenn ich das alles richtig gelesen habe. Ich habe versucht, meinen eigenen "modifiziere Stop/Limit Orders um das minimale MODE_STOP Level, wenn Bid/Ask sich um x Pips entfernt..." zu erstellen.

Ist Ihr Fall ähnlich?



Danke Diostar, ich versuche, eine Art Haufen mit Pending Orders zu machen, und dann, wenn es zur nächsten erfolgreichen Pending Order kommt, die alten Stops zu holen.

Ich werde es dann noch einmal mit dem ! versuchen... so viele Kombinationen, die man ausprobieren kann... und ich sehe, ich hätte "false" für den booleschen Wert statt FALSE verwenden sollen... ja, es hat kompiliert und funktioniert immer noch gut, aber dasselbe Problem. Vielleicht finde ich diesen Entwurf noch einmal und versuche es mit "false"... In diesem Beispiel 2 blätterte es nicht durch die Aufträge und änderte sich bei jedem Tick, also werde ich es noch einmal mit dieser geänderten Variable versuchen.

Ich kann ihn dazu bringen, an den Modifizierungsblock weiterzuleiten und die Aufträge entweder vorwärts oder rückwärts zu drehen, aber er modifiziert jeden Tick, und wenn ich nach dem Modifizieren einen true- oder false-Filter einfüge, modifiziert er nur den ersten Auftrag im Cache....

Für mich deutet dies darauf hin, dass der EA bei jedem Tick zu diesem Block gelangen muss, um die nächste Order zu erhalten (ich war mir nicht sicher, ob ich, wenn er zu diesem Block gelangt, ihn einfach hier versiegeln und ihn dazu bringen könnte, einmal durch die Orders zu rotieren)...

Dies stellt mich vor ein Problem, da alle wahr oder falsch Fragen sind nicht durchlassen...

Ich denke, wenn ich lernen würde, wie man einen Auftrags-Cache einrichtet und sie auswählt, hätte ich immer noch das gleiche Problem... Ich hatte alle Kombinationen, aber nicht alle zur gleichen Zeit. Ich habe es dazu gebracht, einmal zu ändern und dann weiterzumachen, aber es hat nur die erste Bestellung bekommen und dann aufgehört... also frage ich mich, ob ich das mit einem Schalter verwenden sollte, bei dem jedes Orderticket tatsächlich angegeben wird... Ich war mir nicht sicher, ob mein bool OrderTicket(), um meine Fehlermeldung zu melden, auch die Deklaration eines Pending_OrderTicket_XX durcheinander gebracht hat... Es muss etwas einfaches sein...

Wie haben Sie dieses Problem bei Ihnen gelöst?

 
void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Unabhängig davon, wie ich in globalen Variablen deklariere...

bool IfGap_SELLLevel_00AlreadyExe;

...es scheint einmal zu ändern, ABER nur eine der Bestellungen, ich nehme an, die letzte Bestellung mit der Art, wie ich scrollen Bestellungen.

Ich habe das ret00 vor dem Auftragsticket vorsichtshalber auch rausgenommen...

Zumindest ist es nicht jeder Tick, ich könnte dieses Beispiel verwenden, WENN es immer noch durch meine Aufträge scrollen würde, wenn die Bedingungen für die erste Forumula wahr sind (aber nicht bei jedem Tick "spamming modifies" nach dem Scrollen ok, wie mein erfolgreichster Versuch tut...)

Auch dieser Versuch hat nicht funktioniert:

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

Ich zeige klarer, was ich versuche, sowieso zu tun, ich wünschte, das oben würde funktionieren, ich würde von getan werden, wenn so...

Ich hoffe, dass ich trotzdem auf dem richtigen Weg bin... Ich verstehe immer noch nicht, warum mein Beispiel 1 vorhin falsch war, das dumme Ding macht genau das, was ich will, aber jedes Tick... Ich kann es nicht einmal zum Laufen bringen, wenn ich die Aufträge einprogrammiere, also bin ich wieder total verloren...

Hat jemand einen Tipp?


EDIT: Ich bin wirklich erschöpft, aber ich habe gerade daran gedacht, aber ich werde es später versuchen müssen, da mir die Zeit ausgegangen ist...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              for (int i=OrdersTotal()-1; i >= 0; i--)
              if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
                      { 
                       double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

Handelt es sich um einen gebrochenen Punkt?

 
diostar:

Handelt es sich um einen gebrochenen Punkt?


Ich denke, ich verdoppelt die SL und TP-Wert, wenn das ist, was Sie meinen, so dass es den Preis zugewiesen bekommt, um die SL und TP zu setzen. Ich hoffe, ich war nicht falsch hier tun dies.

Ich brauche nur MT4, um zu diesem Block zu bekommen, und dann vergessen Sie es.... Ich habe das Gefühl, dass der Ausdruck für MT4 zu kompliziert sein wird, aber ich werde es weiter versuchen...

 
Funky:


Ich glaube, ich habe den SL- und TP-Wert verdoppelt, wenn es das ist, was Sie meinen, so dass es den Preis zugewiesen bekommt, um den SL und TP zu setzen. Ich hoffe, ich war nicht falsch hier tun dies.

Ich brauche nur MT4, um zu diesem Block zu bekommen, und dann vergessen Sie es.... Ich habe das Gefühl, dass der Ausdruck für MT4 zu kompliziert sein wird, aber ich werde es weiter versuchen...

Nein, was ich meine, ist, sind Sie Umgang 4/5 Ziffern - 0,0001, oder 0,00001 Punkt?
 
diostar:
Nein, was ich meine, ist, dass Sie mit 4/5 Stellen handeln - 0,0001 oder 0,00001 Punkt?


Ah, 5 Ziffern... Ich benutze diese früher...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



Und ich war früher denken, ich könnte versuchen, diese Detect Digits als meine erste Bibliothek einfügen, hehe, aber ein Schritt zu einer Zeit, muss ich lernen, zuerst zu kriechen, hehe.

Ich erhalte keine Fehlermeldungen 130 Preis zu schließen oder irgendetwas.... Ich wünschte, es wäre etwas Einfaches wie das.

Letzte Seite hatte ich Beispiel 1 arbeiten, und viele andere ähnliche Beispiele, ich wünschte nur, ich könnte es einmal pro Tick ändern lassen...

Anstatt zu versuchen, alle meine früheren SELL-Aufträge auf einmal zu erhalten, frage ich mich, ob ich einfach ein neues Feld für jeden von ihnen machen sollte... ja, ich bin wirklich verloren, wie ich durch alle meine alten SELLs in einem meiner Versuche durchlaufen und sie einmal ändern kann.


&& (OrderStopLoss() < Stoploss_Level_00)

anstelle von

!IfGap_SELLLevel_00AlreadyExe

Weißt du, du hast vorhin einen Vorschlag gemacht, der mich zum Nachdenken gebracht hat...

Ich frage mich, ob eine !IfGap_SELLLevel_00AlreadyExe-Idee nicht funktionieren wird (wenn es nicht geht, um alle Aufträge zu greifen und sie im selben Durchgang zu ändern, bevor ich diesen Block sperre), ich frage mich, wenn ich Ihre Idee vor verwenden, und setzen Sie eine Frage wie diese in dort... Ich werde mich melden, wenn es funktioniert.

Wenn ich auf der falschen Fährte bin, lassen Sie es mich bitte wissen, Prost ;)

 
Funky:


Ah, 5 Ziffern... Ich benutze diese früher...



Und ich dachte vorhin, ich könnte versuchen, diese Detect Digits als meine erste Bibliothek einfügen, hehe, aber ein Schritt zu einer Zeit, muss ich lernen, zuerst zu kriechen, hehe. <-- kluger Schachzug. Du krabbelst schon. Mit Bibliotheken wirst du am Ende laufen.

Ich bekomme keine Fehlermeldungen 130 Preis zu schließen oder irgendwas.... Ich wünschte, es wäre etwas Einfaches wie das.

Auf der letzten Seite hatte ich Beispiel 1 am Laufen, und viele andere ähnliche Beispiele, ich wünschte nur, ich könnte es einmal pro Tick ändern lassen... <--- siehe unten

Anstatt zu versuchen, alle meine früheren SELL-Aufträge auf einmal zu erhalten, frage ich mich, ob ich nicht einfach eine neue Box für jeden von ihnen erstellen sollte... ja, ich bin wirklich ratlos, wie ich alle meine alten SELLs in einem meiner Versuche durchgehen und sie einmal ändern kann<--- siehe unten


Ich hoffe, dass dies eine gewisse Hilfe sein kann.

Ursprünglich war meine Symbole 4 Ziffern, alle Trailing-Stops, Stop / Limit Aufträge ändern, ging genau wie erwartet. Dann mein Broker beschlossen, fraktionierte gehen. Ich habe die notwendigen Änderungen und sah meine Pips ging wie -3,4, -4,5, 0,1, 4,6, 7,3, etc, etc. Ich dachte, das sei in Ordnung, aber eigentlich nicht: Angenommen, ich setze mein Limit=7, und sagen wir, neue Ticks 1, Ticks 2, Ticks 3 passieren nacheinander:

1) 7.3>Limit, dann wird die Order geändert... Broker füllt 1 Slippage aus...

2) 7.5>Limit, dann wird der Auftrag geändert....Broker füllt 0 Slippage...

3) 7.1>Limit, dann wird die Order geändert...Broker füllt 2 Slippage aus...

Alles in allem werden meine Orders also 3 Mal für alle 3 Ticks modifiziert. Nachdem mir das klar geworden ist, habe ich beschlossen, MathRound() zu verwenden, um diese auf die nächste Ganzzahl zu runden, so dass aus 1,2,3 wird

1) mathround(7.3) =7 >limit, NOT TRUE, nicht geändert

2) mathround(7.5)=8 >limit, TRUE, Reihenfolge wird geändert

3) mathround(7.1)=7>Grenzwert, NICHT WAHR, nicht geändert

Im Moment arbeite ich noch daran, wie man die oben genannten Methoden verbessern kann... bis jetzt funktionieren sie gut, aber ich denke, es muss bessere Methoden geben als meine.

Grund der Beschwerde: