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

 
Alexander_K2:

Aber irgendetwas stimmt wirklich nicht...

Ich meine, ich mache OrderSelect einmal und dann wieder von der Funktion aus... Das ist eine Wahnsinns Sache...

  1. Sie haben einen Auftrag auf einem Ticket ausgewählt
  2. Sie gehen zu der Funktion, die die Anzahl der Aufträge überprüft. Wenn es mehr als einen Auftrag gibt, werden alle verfügbaren Aufträge nacheinander im Zyklus ausgewählt.
  3. Wenn Sie von der Funktion zurückkehren, wird der Auftrag ausgewählt, der als letzter in der Liste der Aufträge im Kundenterminal steht (es muss nicht unbedingt der Auftrag sein, den Sie in Punkt 1 ausgewählt haben).
  4. Dann überprüfen Sie den Zeitpunkt des Abschlusses eines neuen Auftrags, und Sie versuchen, den Auftrag abzuschließen, der angeblich durch das Ticket ausgewählt wurde, aber seine Auswahl ist bereits verloren gegangen.

Einfache Logik...

Achten Sie auf die Reihenfolge der Vorgänge, die Sie durchführen.

Natürlich müssen Sie zunächst die Menge überprüfen, dann den gewünschten Auftrag auswählen und anschließend die erforderlichen Vorgänge durchführen.

 
Maxim Kuznetsov:

In welcher Richtung sehen Sie das Auftragsfeld?

Wenn es bei der "Überarbeitung" zu Schließungen/Löschungen kommen kann, ist es besser, in die entgegengesetzte Richtung zu schauen. Von OrdersTotal()-1 bis einschließlich 0.

Sonst könnten Sie Ärger bekommen :-)


Fast hätte ich auf diese Weise einmal meinen persönlichen Gral entdeckt :-)

Und die Rückführung alter Aufträge aus den "Tiefen der Zeit" in die Gegenwart (hin und wieder, nicht immer) hat die Rentabilität der Tester in den Himmel gehoben :-)

 
Artyom Trishkin:
  1. Sie haben eine Bestellung per Ticket ausgewählt
  2. Sie haben die Funktion aufgerufen, um die Anzahl der Aufträge zu überprüfen. Wenn es mehr als einen Auftrag gibt, werden alle verfügbaren Aufträge nacheinander ausgewählt, um in den Zyklus aufgenommen zu werden.
  3. Wenn Sie aus der Funktion zurückkehren, wird der Auftrag ausgewählt, der als letzter in der Liste der Aufträge im Kundenterminal steht (es muss nicht unbedingt der Auftrag sein, den Sie in Punkt 1 ausgewählt haben).
  4. Dann überprüfen Sie den Zeitpunkt des Abschlusses eines neuen Auftrags, und Sie versuchen, den Auftrag abzuschließen, der angeblich durch das Ticket ausgewählt wurde, aber seine Auswahl ist bereits verloren gegangen.

Einfache Logik...

Achten Sie auf die Reihenfolge der Vorgänge, die Sie durchführen.

Es liegt auf der Hand, dass Sie zunächst die Menge überprüfen, dann den richtigen Auftrag auswählen und anschließend die erforderlichen Operationen durchführen müssen

Ich habe es auf diese Weise gemacht:

RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(OrderSelect(ticket_sell_NZDUSD, SELECT_BY_TICKET)==true)
         {
         ctm_ticket_sell_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_sell_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_SELL)
                  {
                  double AskNorm=NormalizeDouble(Ask,Digits);
                  OrderClose(ticket_sell_NZDUSD,0.01,AskNorm,0);
                  }
               }
            }
         }

Zählen Sie einfach zuerst die Aufträge und dann alles andere.

Vielen Dank, Artem. Ich verdanke ihm den Gral. Es war dieser Fehler, der mich umgebracht hat...

 

Wie berechne ich die Anzahl der Dezimalstellen?

Ich habe zum Beispiel herausgefunden, dass die Mindestmenge 0,01 beträgt.

MarketInfo("EURUSD",MODE_MINLOT)

Wie komme ich zu dem Schluss, dass die Anzahl der Nachkommastellen 2 beträgt?
um das Auftragsvolumen auf zwei Nachkommastellen zu normalisieren.

 
multiplicator:

Wie berechne ich die Anzahl der Dezimalstellen?

Ich habe zum Beispiel herausgefunden, dass die Mindestmenge 0,01 beträgt.

Wie komme ich zu dem Schluss, dass die Anzahl der Nachkommastellen 2 beträgt?
um das Auftragsvolumen später auf zwei Dezimalstellen zu normalisieren.

Versuchen Sie dies.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}
 
Alekseu Fedotov:

Versuchen Sie dies.

Warum so alte Sachen anbieten?

Multiplikator:

Wie berechnet man die Anzahl der Dezimalstellen?

Ich habe zum Beispiel gelernt, dass die Mindestmenge 0,01 beträgt.

Wie kann ich herausfinden, dass die Anzahl der Dezimalstellen 2 beträgt?
Anschließend normalisieren Sie das Auftragsvolumen auf zwei Dezimalstellen.

Hier ist eine vorgefertigte Funktion in dem Artikel.

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }

Nun muss nur noch eine Aktion hinzugefügt werden, die von dem Ergebnis dieser Funktion abhängt.

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 
Wenn ich sie öffne, normalisiert das Terminal die Reihenfolge auf die erforderliche Anzahl von Dezimalstellen.
Ich habe eine Menge so formuliert
OrderSend(Symbol(),OP_BUY,1.11111111,Ask,3,0,0);
und der Handel wird mit einem Volumen von 1,11 eröffnet.

Vielleicht müssen Sie also gar nichts normalisieren?
 
multiplicator:
Ich sehe, dass das Terminal den Auftrag auf die erforderliche Anzahl von Dezimalstellen normalisiert, wenn ich es öffne.
Vielleicht ist es nicht nötig, irgendetwas zu normalisieren?

Wenn der Redakteur dasselbe tut, ist das nicht nötig.

 
multiplicator:
Ich sehe, dass das Terminal den Auftrag beim Öffnen auf die gewünschte Anzahl von Dezimalstellen normalisiert.
Vielleicht brauchen Sie nichts zu normalisieren?

Wenn Sie einen Fehler nach dem anderen erhalten möchten, sollten Sie nicht normalisieren.

 
Artyom Trishkin:

Wenn Sie später einen Fehler nach dem anderen bekommen wollen, sollten Sie nicht normalisieren.

aus irgendeinem Grund zeigt das Terminal keine Fehler an)
Grund der Beschwerde: