Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 2

 
Es steht Ihnen frei, GetPointer(this) von Methoden zurückzugeben.

Zumindest bei Methodensetttern ist dies gerechtfertigt - der Code kann lesbarer und kompakter werden, man erhält a la benannte Parameter

ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой

// получается вот из подобного :
class HLine:public ChartObject {
public:
   HLine(double price);
   HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
   HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); }  // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
Natürlich mit Vorsicht zu verwenden, denn es gibt keine Exception`s in der Sprache und werden nicht erwartet

und ein wenig stört die Qualifizierung von Funktionen durch den zurückgegebenen Typ.
 
Maxim Kuznetsov:
Es steht Ihnen frei, GetPointer(this) von Methoden zurückzugeben.
Auf diese Weise ist &this prägnanter.
 
fxsaber:
Auf diese Weise ist &this prägnanter.
Und GetPointer() kann vorsichtig überschrieben werden, z.B. zu Debugging-Zwecken.
 
Ein Zeiger, der von GetPointer genommen wird, kann nicht gelöscht werden, welchen Sinn hat das?
 
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
#property strict

#ifdef __MQL4__
  #include <Math\Alglib\bitconvert.mqh>  
  
  #define  TEMP_MACROS(A) double A( double ) { return(0); }
    TEMP_MACROS(MathLog1p)
    TEMP_MACROS(MathExpm1)
    TEMP_MACROS(MathArcsinh)
    TEMP_MACROS(MathArccosh)
    TEMP_MACROS(MathArctanh)
  #undef  TEMP_MACROS
#endif
 
Alexey Viktorov:
Nun, lassen Sie mich zuerst beginnen.

Um einen Auftrag zu schließen, müssen wir nicht die Auftragsart und den Preis, der dieser Art entspricht, definieren. Es reicht aus, in OrderClosePrice() "close at price" zu schreiben!

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/


Ziemlich cool! ) Vielen Dank.

Dem Beispiel nach zu urteilen, brauchen Sie auch OrderSelect() nicht?

 
Liza_:


(Cool! ) Danke.

Nach dem Beispiel zu urteilen, ist OrderSelect() auch nicht erforderlich?

Ja, das ist sie. Alexey hat es gerade verpasst...
 
Liza_:

Schön! ) Danke.

Ja, es ermöglicht das Schreiben recht knapper Skripte für den Kampfeinsatz
// Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4;            // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10;       // Отклонение цены
sinput bool exAllSymbols = false; // false - только текущий, true - все символы

#define _CS(A) ((!IsStopped()) && (A))

bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 )
{
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) &&
        (AllSymbols ? true : (OrderSymbol() == Symbol())))
      Res &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
      
  return(Res);
}

void OnStart()
{
  for (int i = 0; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
    Sleep(SLEEPTIME * 1000);
}
Der Vergleich mit MQL5-analog fällt nicht zu seinen Gunsten aus. Ich frage mich, ob es Situationen gibt, in denen das Ergebnis des Vergleichs umgekehrt ist...
 
Artyom Trishkin:
Erforderlich. Ich habe es nur aus Faulheit verpasst...

Ja, nun... Wirklich verkorkst.

Aber vorher bin ich nicht auf diese Themen gestoßen.

fxsaber:

Sie können OrderClosePrice also erst NACH dem entsprechenden OrderSelect verwenden. Da OrderSelect die Daten für Order(const)-Funktionen einmal kopiert, kann RefreshRates sie nicht aktualisieren.

Wenn also z. B. OrderClosePrice nicht geschlossen werden kann, müssen Sie OrderSelect vor dem nächsten Versuch erneut ausführen (RefreshRates ist nicht erforderlich).

ZS Dieses Thema ist von 2005! Hier finden Sie ausführliche Argumente von den Entwicklern.

Sie können sie also nutzen, aber mit dem Wissen, dass es Probleme geben kann.
 

Offene Aufträge sollten ab einer höheren Zahl ausgewertet werden, d.h. for(int nom=OrdersTotal()-1; nom>=0; nom--)
Dies ist besonders wichtig bei der Löschung von Aufträgen.
Aber was passiert, wenn wir das Gegenteil tun? for(int nom=0; nom<OrdersTotal(); nom++) ?
Zunächst ist der Index gleich Null und der allererste Auftrag mit der Nummer 0 wird gelöscht.
Dann wird der Index gleich 1. An diesem Punkt werden die übrigen Aufträge verschoben und der Auftrag mit der Nummer 1
die Nullposition einnimmt. Die ehemalige Nummer 2 nimmt Platz 1 ein. Sie wird gelöscht.
Dann wird der Index 2. Und der Auftrag, der zu Beginn Nummer 4 war, wird gelöscht.
So werden die Aufträge, die am Anfang geradzahlige Positionen besetzen, gestrichen. Die ungeraden Zahlen bleiben erhalten. Dies geht aus den Kommentaren zu den Aufträgen und Nummern hervor.
Ich füge ein Skript bei, das beide Optionen des Löschens und Screenshots zeigt
Es gibt 20 ausstehende Aufträge

Einer nach dem anderen gestrichen

Dateien:
PROBA-ORD.mq4  3 kb
Grund der Beschwerde: