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.
// После этого в 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********************/ voidOnStart() { 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()?
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
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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(..)
};
e un po' interferisce con la qualificazione delle funzioni dal tipo restituito.
Sentitevi liberi di restituire GetPointer(this) dai metodi.
In questo modo &questo è più conciso.
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()!
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()?
(Fico! ) Grazie.
A giudicare dall'esempio, anche OrderSelect() non è necessario?
Bello! ) Grazie.
Necessario. L'ho perso per pigrizia...
Sì, beh... Davvero incasinato.
Ma prima non mi sono imbattuto in questi argomenti.
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.
Gli ordini aperti dovrebbero essere analizzati a partire da un numero più alto, cioè for(int nom=OrdersTotal()-1; nom>=0; nom--)
Ci sono 20 ordini in sospeso
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