Ich lerne gerade, einen Ratgeber zu schreiben... - Seite 5

 


Wie verwendet man die Funktion RefreshRates() richtig?

 int ticket;
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"комментарий эксперта",255,0,CLR_NONE);
      if( ticket<=0)
        {
         ......
         RefreshRates();
        }
      else
        {
         .....
        }
     }

Lesen Sie auch im Forum "ERROR: code=138 - requote".

Ich habe "OrderSend error 138", der im Tester mehrmals pro Sekunde generiert wird... ist es ein Requote? Wenn ja, wie kann man sie bekämpfen?)

 

Nachdem ich 20 Threads über Requotes gelesen habe... Ich habe endlich herausgefunden, was mein Fehler war)

Ich hatte eine "Pseudo"-Neubewertung. Der Grund dafür war die Einstiegsbedingung, die ausgelöst wurde, und daher wurde der Preis an . In Wirklichkeit war der tatsächliche Preis niedriger oder höher als der in der Pressemitteilung angekündigte. Jedes Mal, wenn OrderSend versuchte, eine Bestellung zu öffnen, gab es natürlich den Fehler 138.

Die Lösung bestand darin, vor OrderSend zu prüfen, ob der tatsächliche Preis mit dem durch das Signal übergebenen Preis übereinstimmt)

RefreshRates();
      if (Bid == ( цена переданная сигналом на продажу))
         OrderSend (....); //продажа

Was noch zu tun bleibt, ist die Fehlerprüfung für OrderModify-Aufträge, denn das könnte schlimme Folgen haben - no stop!

Ich denke, wir brauchen keine Prüfung für OrderSend, lassen Sie es seinen Puls zu dem Preis durch das Signal gegeben schlagen) Wenn requotes kommen, wird es keine Rolle - ich werde Zeit zu kaufen oder zu verkaufen haben. Die Hauptsache ist, dass alles wie geplant funktioniert)

 
ALex2008 писал(а) >>

Nachdem ich 20 Threads über Requotes gelesen habe... Ich habe endlich herausgefunden, was mein Fehler war)

Ich hatte eine "Pseudo"-Neubewertung. Der Grund dafür war die Einstiegsbedingung, die ausgelöst wurde, und daher wurde der Preis an OrderSend übergeben. Und in Wirklichkeit war der tatsächliche Preis niedriger oder höher als der, den ich in OrderSend eingegeben hatte. Jedes Mal, wenn OrderSend versuchte, eine Bestellung zu öffnen, gab es die Fehlermeldung 138.

Die Lösung bestand darin, vor dem OrderSend den tatsächlichen Preis zu prüfen, ob er mit dem durch das Signal übermittelten Preis übereinstimmt).

Es bleibt zu prüfen, ob die OrderModify-Aufträge fehlerhaft sind, denn das kann schlimme Folgen haben - no stop!

Ich denke, es besteht keine Notwendigkeit, OrderSend zu überprüfen, lassen Sie es seinen Puls zu dem Preis schlagen, den das Signal festlegt) Wenn Requotes kommen, wird es keine Rolle spielen - ich werde Zeit haben, zu kaufen oder zu verkaufen. Die Hauptsache ist, dass alles wie geplant funktioniert)

RefreshRates();
nützlich vor dem Zugriff auf Ask Bid

Wenn Sie alle Sell- oder Buy-Limit-Werte vor dem Block, der den Stop-Take und den Einstiegskurs berechnet, überprüfen möchten - schwebende Long-Range-Orders sind möglicherweise nicht betroffen, wenn sie nicht auf der Grundlage des aktuellen Kurses berechnet werden

 
YuraZ >> :

RefreshRates();
ist es sinnvoll, dies vor dem Zugriff auf Ask Bid zu tun

Ist es nicht das, was ich getan habe... vor dem Bid

if (Bid == (цена переданная сигналом на продажу))

vor dem Block, der den Stop-Take und den Einstiegskurs berechnet - Fernaufträge sind möglicherweise nicht betroffen, wenn sie nicht zum aktuellen Kurs berechnet werden

Erklären Sie mir... Also, in meinem Fall, ist es hier nicht erforderlich, weil es nicht zählt, aber vergleicht? Verstehe ich das richtig?
 
ALex2008 писал(а) >>

Ist es nicht das, was ich getan habe, bevor ich mich an Bid wandte?


>>Bitte erklären. In meinem Fall ist es also nicht nötig, weil es nicht um das Zählen, sondern um das Vergleichen geht? Verstehe ich das richtig?

Sie haben das Richtige getan :-)

Dort ist es kein Problem!

Der Block, in dem Sie auf die Preise zugreifen, sollte sich vorzugsweise an einem Ort befinden.

ist es besser, diesen Befehl vor der Anwendung zu haben

Sie richten sich nach dem Bid Ask und nach der Berechnung aller Stops müssen Sie ohne große Verzögerung in den Markt einsteigen.

---

Fügen Sie dem Code Folgendes hinzu

vereinfacht ausgedrückt

1 - Signal empfangen - Flagge zur Ausführung setzen.

2refresh() berechnet Mitnahmestopps

3-in

4-Server abgelehnt

5-Decodierungsfehler

6-Signal ist noch aktiv - Ausführungsflagge gesetzt?

7- weiter auf Seite 1

und es ist notwendig, diesen Kreislauf zu durchbrechen

weil er ziemlich lang werden kann

aber wir müssen

1-Entscheidung über Fehler

2 - Versuchen Sie, den Händler nicht so lange zu bumsen, wie der Zyklus es erfordert

2.1 Du könntest zum Beispiel zählen, wie oft du zuschlägst

2.2 Sie können ein Zeitquantum machen

2.3 Sie MÜSSEN sich vor der Ausgabe von Ausführungsbefehlen vergewissern, ob ein Signal vorliegt!

oder Sie wollen es vielleicht abbrechen!

 
YuraZ >> :

...es ist nur so, dass Sie den Block, in dem Sie auf die Preise zugreifen, möglichst an einem Ort haben sollten

und es ist besser, diesen Befehl zu haben, bevor Sie die

Sie gehen zum Bid Ask und berechnen alle Stops, um ohne große Verzögerung in den Markt einzusteigen...

An einem Ort... Ich verstehe das nicht ganz... Ich arbeite schon lange an dem Indikator, aber ich kann die Schleife nicht abschließen).

Bei mir sieht es so aus:

-Der Einstiegskurs wird durch die Funktionen UpTrend() und DownTrend() bestimmt, die auf das Signal prüfen

-Prüfung (falls) auf Preisgleichheit mit dem Preis aus dem Signal

-Der einzugebende Preis und die Preise werden von OrderSend verarbeitet

-der Stoppkurs wird in der Funktion ModifyPos() verarbeitet, die auf OrderSend folgt


1- Signal empfangen - Flagge zur Ausführung gesetzt //die Funktion zur Überprüfung des Signals übergibt die Funktion zum Setzen der Reihenfolge
2-refresh() takeoffs berechnen //auf Konsistenz mit dem Preis prüfen - Preis des Signals (wenn es noch aktiv ist)
3-Eingabe //Die Berechnung der Abzüge ist statisch in der Funktion OrderSend und stoppt in der Funktion OrderModify
4-Server abgelehnt //wenn der Auftrag nicht erteilt wird und ein Signal vorliegt, dann erfolgt der Wiedereinstieg zum Preis des Signals (wenn es noch gültig ist)
5-decodieren Sie den Fehler //Sie brauchen ihn für sich selbst, falls ein neues Problem auftaucht
6-Signal ist noch aktiv - Flagge zum Ausführen ? //Bedingung für die Preisübereinstimmung - Preis aus dem Signal (wenn es noch gültig ist).
7-gehen Sie zu Schritt 1 //zu Schritt 3

und wir müssen diesen Kreislauf durchbrechen.
es kann ziemlich lang werden //so lange der Preis = der Preis des Signals ist, glaube ich nicht, aber es kann häufig sein)
aber wir müssen

1 - Bestimmen Sie den Fehler //Ich denke, ich werde heute daran arbeiten.
2-Versuch, den Händler nicht so lange zu knallen, wie es sein sollte //der Preis==der Preis des Signals
2.1 zum Beispiel können Sie einen Zähler für die Anzahl der Male, die Sie brauchen, um lange zu gehen // haben, um darüber nachzudenken, überprüfen Sie Ihre Geschichte in der Tester
2.2 Sie können es in einem Zeitquantum tun //verpassen vielleicht den Preis==den Preis des Signals (wenn es noch aktiv ist)
2.3 Sie MÜSSEN prüfen, ob es ein Signal gibt, bevor Sie Aufträge zur Ausführung jeder Serie erteilen!
es könnte an der Zeit sein, das Signal aufzuheben //die Funktion zur Überprüfung des Signals übergibt die Funktion zur Einstellung des Auftrags


 

Jetzt verstehe ich nicht, wie man OrderModify korrekt implementiert? Ohne sie kann ich keinen Stopp einstellen... DC-Limit beim Öffnen...

- kann einen Fehler von 130 erhalten, wenn sich der Preis nach dem Öffnen ändert und er näher kommt

-Es ist möglich, dass ein Requote-Fehler 138 auftritt und der Preis steigt, so dass der Stopp überhaupt nicht gesetzt wird.

-Es ist möglich, eine 138er-Notierung zu erhalten, und der Preis wird sinken, was nicht kritisch ist, da der Stopp später gesetzt wird.

Also...

сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
{
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);
}

Die Nachteile dieser Variante sind

-Wenn der Kurs unter den Eröffnungskurs fällt, wird der Stopp nie gesetzt.

Wenn der Kurs unter den Eröffnungskurs fällt, wird der Stopp niemals gesetzt, sondern es wird immer versucht, den Auftrag zu ändern. Oder doch nicht?


oder so...


сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);

Nachteile dieser Variante

-Es wird eine Menge Fehler geben, wenn sich der Kurs gegen


 

Im Moment ziehe ich diese Option für die Haltestelle in Betracht, bis sie eingerichtet ist)

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0; ModifyB==true; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 ModifyB;
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0; ModifyS==true; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 ModifyS;
                              }                                                   
            }      
   }

Aber es gibt Fehler in Zeilen mit ModifyB; ModifyB;

- ';' - Variable bereits definiert

- ';' - Variable bereits definiert




 

Eine andere Möglichkeit, aber auch mit Fehlern (

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0 ;; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                                    if ( ModifyB==true)
                                       continue; 
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0 ;; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                                    if ( ModifyS==true)
                                       continue; 
                              }                                                   
            }      
   }
 
ALex2008 писал(а) >>

Eine andere Möglichkeit, aber auch mit Fehlern (

ticket=OrderSend( symb, bs, lot, op, slippage,0,0, comm, magic);
      if( ticket==-1) {
Print("Не получилось открыть ордер, ошибка ",GetLastError());
      }
      if( ticket>0) {
         OrderSelect( ticket, SELECT_BY_TICKET);
         if(OrderType()==OP_BUY) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         if(OrderType()==OP_SELL) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         ... Проверка стопов на стоплевел
            if(!OrderModify( ticket, OrderOpenPrice(), sl, tp, 0, CLR_NONE)) {
               Print("Не получилось модифицировать ордер, ошибка ",GetLastError());
           }
Versuchen Sie es auf diese Weise.
Grund der Beschwerde: