Caratteristiche del linguaggio mql4, sottigliezze e tecniche - pagina 2

 
Sentitevi liberi di restituire GetPointer(this) dai metodi.

Almeno nei setter di metodi questo è giustificato - il codice può diventare più leggibile e compatto, si ottiene un parametro con nome

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(..)
};
Naturalmente, usate con cautela, perché non ci sono eccezioni nel linguaggio e non è previsto

e un po' interferisce con la qualificazione delle funzioni dal tipo restituito.
 
Maxim Kuznetsov:
Sentitevi liberi di restituire GetPointer(this) dai metodi.
In questo modo &questo è più conciso.
 
fxsaber:
In questo modo &questo è più conciso.
E GetPointer() può essere accuratamente sovrascritto, ad esempio per scopi di debug.
 
Un puntatore preso da GetPointer non può essere cancellato, che senso ha?
 
// После этого в 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:
Beh, lasciatemi iniziare per primo.

Per chiudere un ordine, non dobbiamo definire il tipo di ordine e il prezzo che corrisponde a questo tipo. È sufficiente scrivere "chiudere al prezzo" in OrderClosePrice()!

/********************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("***********");
       }
     }
}/********************************************************************/


Piuttosto figo! ) Grazie.

A giudicare dall'esempio, non avete nemmeno bisogno di OrderSelect()?

 
Liza_:


(Fico! ) Grazie.

A giudicare dall'esempio, anche OrderSelect() non è necessario?

Sì, è così. Alexey l'ha mancato di poco...
 
Liza_:

Bello! ) Grazie.

Sì, permette di scrivere script abbastanza concisi per il combattimento
// Закрывает позиции, описание - 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);
}
Il confronto con MQL5-analogo non è a suo favore. Mi chiedo se ci sono situazioni in cui il risultato del confronto è opposto...
 
Artyom Trishkin:
Necessario. L'ho perso per pigrizia...

Sì, beh... Davvero incasinato.

Ma prima non mi sono imbattuto in questi argomenti.

fxsaber:

Quindi potete usare OrderClosePrice solo DOPO il corrispondente OrderSelect. Poiché OrderSelect copia i dati per le funzioni Order(const)- una volta, e lo stesso RefreshRates non è in grado di aggiornarli.

Cioè se, per esempio, OrderClosePrice non riesce a chiudere, allora l'OrderSelect deve essere rifatto prima del prossimo tentativo (RefreshRates non è richiesto).

ZS Questo thread è del 2005! Ci sono argomentazioni dettagliate degli sviluppatori qui.

Quindi potete usarlo, ma con la consapevolezza che potrebbero esserci dei problemi.
 

Gli ordini aperti dovrebbero essere analizzati a partire da un numero più alto, cioè for(int nom=OrdersTotal()-1; nom>=0; nom--)
Questo è particolarmente importante quando si cancellano gli ordini.
Ma cosa succede se facciamo il contrario for(int nom=0; nom<OrdersTotal(); nom++) ?
All'inizio, l'indice è uguale a zero e il primissimo ordine con numero 0 viene cancellato.
Allora l'indice diventa uguale a 1. A questo punto gli ordini rimanenti vengono spostati e quello con il numero 1
occupa la posizione zero. L'ex numero 2 prende la posizione 1. Sarà cancellato.
Allora l'indice diventa 2. E l'ordine che era il numero 4 all'inizio sarà cancellato.
Così, gli ordini che occupano posizioni pari all'inizio vengono cancellati. Quelli dispari rimarranno. Questo può essere visto nei commenti agli ordini e ai numeri.
Allego uno script che mostra entrambe le opzioni di cancellazione e gli screenshot
Ci sono 20 ordini in sospeso

Cancellati uno per uno

File:
PROBA-ORD.mq4  3 kb