Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 471

 
Vadim Novikov:

Guten Tag an alle, die es interessiert!


Ich bin ein fortgeschrittener Benutzer, aber ich schreibe nicht so oft. Deshalb kann ich mit einigen Neuerungen nicht Schritt halten. Und manchmal vergesse ich Dinge einfach.


Bitte helfen Sie mir bei einer Frage, ich kann mich an eine Sache nicht erinnern.


Hier ist die Situation: Ich habe externe Variablen definiert, und zwar viele, nämlich 20.Sie werden im Eingabemenü des Programms angezeigt, wenn Sie dieses Programm mit dem Diagramm verbinden.


Hier ist die Frage. Ich kann mich nicht erinnern. Wie trenne ich Blöcke dieser Variablen mit Kommentaren? Im Eingabemenü. Zum Beispiel:


Dies ist ein Block zur Änderung von MA-Variablen (Kommentar)

Zeitraum MA

Einstellungsmethode MA

Preis MA

Dies ist ein Block zum Ändern von MACD-Variablen (Kommentar)

..........................

...........................

...........................

Dies ist ein Block zum Ändern von BB-Variablen (Kommentar)

.........................

..............................

...........................


Es scheint, dass ich früher solche Kommentare mit der Code-Kommentarfunktion eingegeben habe.Das heißt, ich habe // oder /* */ geschrieben. Aber jetzt funktioniert etwas nicht.

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

Wie diese

 
OrderStopLoss() gibt zwei Dezimalstellen aus. Kann ich die Ausgabe von drei Dezimalstellen erzwingen?
 
Alekseu Fedotov:

Zum Beispiel so.

Danke, das erinnert mich daran!!!

 
Igor Golieniev:

Versuchen Sie es so:

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

Damit werden alle signifikanten Ziffern des Kurses angezeigt. Wenn eine andere Anzahl von Ziffern benötigt wird, ersetzen Sie Digits() durch eine bestimmte Zahl.

 
Guten Abend, bitte um Tipps. In der Funktion OnInit werden zwei horizontale Linien erzeugt, in OnTick zwei Funktionen, eine sendet Push- und Mail-Benachrichtigung, wenn Bid > erste Linie, die zweite, wenn Bid < zweite Linie. Bid=line hat dies nicht getan, um Lücken zu vermeiden. Natürlich habe ich auch mit der Tatsache konfrontiert, dass, wenn die Bedingung erfüllt ist, die Benachrichtigung mit jedem Häkchen kommt, was schlecht ist. Wie lässt sich dieses Problem lösen? In den Einstellungen für Standardwarnungen können Sie das Zeitlimit oder die Anzahl der Benachrichtigungen festlegen.
 
Ihor Herasko:

Versuchen Sie es so:

Damit werden alle signifikanten Ziffern des Kurses angezeigt. Wenn Sie eine andere Anzahl von Ziffern benötigen, ersetzen Sie Digits() durch eine bestimmte Zahl.

Jetzt druckt er korrekt 15,155, aber - ungültiger Stoploss für OrderModify-Funktion

Dieses Problem tritt nur bei Silver in OrderModify auf.

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

Druckt jetzt korrekt 15,155 in Print, aber - ungültiger Stoploss für OrderModify-Funktion

Dieses Problem tritt nur bei Silver in OrderModify auf.

Es gibt zwei Fehler in diesem Code:

  1. Fehlende Überprüfung der minimal zulässigen Stoppgröße (sie wird als Stopplevel bezeichnet).
  2. Falscher Vergleich von reellen Zahlen.

Um das erste Problem zu lösen, müssen wir den aktuellen Stop Level ermitteln:

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

Wenn fStopLevel Null ist und der Kontotyp nicht ECN ist, dann sollte fStopLevel gezwungen werden, gleich drei Spreads zu sein.

Bevor Sie Stops setzen (sowohl Stop Loss als auch Take Profit), überprüfen Sie, ob das neue Niveau auf oder über dem Stop Level des Orderschlusskurses liegt. Um den Stopp für einen Kaufauftrag zu überprüfen, gehen Sie wie folgt vor:

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

Für einen Verkaufsauftrag Stop:

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


Die Lösung des zweiten Problems: Vergleichen Sie reelle Werte mit einer gewissen Genauigkeit, da die Gleichheit der reellen Zahlen nicht immer und überall erreicht werden kann. Ein Beispiel für einen Vergleich habe ich bereits oben im Code für die Validierung der Haltestellenebene gegeben.

 
Ihor Herasko:

In diesem Code sind zwei Fehler auffällig:

  1. Fehlende Kontrolle der zulässigen Mindestgröße des Stopps (genannt Stop Level).
  2. Falscher Vergleich von reellen Zahlen.

Um das erste Problem zu lösen, müssen wir den aktuellen Stop Level ermitteln:

Wenn fStopLevel Null ist und der Kontotyp nicht ECN ist, dann sollte fStopLevel gezwungen werden, gleich drei Spreads zu sein.

Bevor Sie Stops setzen (sowohl Stop Loss als auch Take Profit), überprüfen Sie, ob das neue Niveau auf oder über dem Stop Level des Orderschlusskurses liegt. Um den Stopp für einen Kaufauftrag zu überprüfen, gehen Sie wie folgt vor:

Für einen Verkaufsauftrag Stop:


Die Lösung des zweiten Problems: Vergleichen Sie reelle Werte mit einer gewissen Genauigkeit, da die Gleichheit der reellen Zahlen nicht immer und überall erreicht werden kann. Ein Vergleichsbeispiel habe ich bereits oben im Code für die Validierung der Haltestellenebene gegeben.

Ich danke Ihnen.

Die Frage ist jedoch nicht abgeschlossen. OrderModify wird sofort ausgelöst, wenn ein Auftrag eröffnet wird. Wo liegt der Fehler? (Ich wiederhole - bei allen Währungen/Futures funktioniert es, bei Silber nicht)

 
Igor Golieniev:

Ich danke Ihnen.

Die Frage ist jedoch nicht abgeschlossen. OrderModify wird sofort ausgelöst, wenn ein Auftrag eröffnet wird. Wo liegt der Fehler? (Ich wiederhole - bei allen Währungen/Futures funktioniert es, bei Silber nicht)

1. Richtlinie

#property strict

benutzen Sie?

2) Passiert dies bei Verkaufen und Kaufen oder nur bei Verkaufen?

3. Wird der Stop-Loss bei Positionseröffnung gesetzt oder sollte der Händler ihn nach Möglichkeit setzen?

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Golieniev:

Ich danke Ihnen.

Die Angelegenheit ist jedoch noch nicht abgeschlossen. OrderModify beginnt sofort zu arbeiten, wenn ein Auftrag eröffnet wird. Wo liegt der Fehler? (Ich wiederhole - es funktioniert mit allen Währungen/Futures, nicht mit Silber)

Zeigen Sie den Protokollausschnitt an (wenn online, die Registerkarte Experten), in dem Sie die Eröffnung und Änderung der Marktorder sehen und angeben können, welche TrailingStop- und TrailingStep-Werte verwendet wurden.

Grund der Beschwerde: