E chi dice che avete un ordine pendente con un tick "0" su ogni tick? Avete controllato quanti ordini pendenti ci sono? E come fai a saperlo ....?
Con quale segno di spunta è "0"? OrderGetTicket(0) non significa che un ordine con ticket 0 è selezionato, ma restituisce un ordine con ticket dalla lista degli ordini pendenti con indice 0.
Probabilmente devi essere più specifico nel tuo compito.
Per esempio: se c'è un ordine pendente la cui magia è "1" - allora cancellalo.
In questo caso, l'implementazione sarà la seguente:
#include <Trade\Trade.mqh>
CTrade trader;
intOnInit()
{
trader.SetExpertMagicNumber(1);
return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
//---
}
voidOnTick()
{
for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current ordersif(OrderGetTicket(i)>0) // selects the pending order by index for further access to its propertiesif(OrderGetInteger(ORDER_MAGIC)==1)
trader.OrderDelete(OrderGetTicket(i));
}
Eseguire il loop di tutti gli ordini in sospeso
Se un ordine in sospeso è stato selezionato con successo (il valore restituito è il biglietto maggiore di zero)
Se il valore magico dell'ordine pendente selezionato è "1"
Con quale biglietto "0"? OrderGetTicket(0) non significa che un ordine con ticket 0 è selezionato, ma restituisce un ordine con ticket dalla lista degli ordini pendenti con indice 0.
Non è proprio questa la domanda - quanta memoria devo comprare per rendere possibile un tale test?
Ecco il risultato per un simbolo (dal log in modalità prezzo di apertura)
264 Mb memory used including 6 Mb of history data, 64 Mb of tick data
Eccone 2:
271 Mb memory used including 12 Mb of history data, 64 Mb of tick data
3:
1038 Mb memory used including 12 Mb of history data, 832 Mb of tick data
Ed eccone 4:
1450 Mb memory used including 18 Mb of history data, 1216 Mb of tick data
È andatoin modo esponenziale:) Non riesco a rintracciare la logica, dato che i ticchettii sono più o meno gli stessi:
EURUSD,H1: 21470549 ticks, 94233 bars generated. 63097850 total ticks for all symbols
EURUSD: generate 21470549 ticks in0:00:05.375, passed to tester 21470549 ticks
USDCAD: generate 20302871 ticks in0:00:05.062, passed to tester 20302871 ticks
USDJPY: generate 21324430 ticks in0:00:05.641, passed to tester 21324430 ticks
1450 Mb memory used including 18 Mb of history data, 1216 Mb of tick data
Ho visto molti rapporti di 20 o più caratteri, non credo che qualcuno usi terabyte di RAM. Forse c'è un segreto?
È possibile impostare il numero di buffer grafici nell'indicatore?
E la seconda domanda, c'è una possibilità di reinizializzazione forzata dell'indicatore usato dall'Expert Advisor per risparmiare RAM?
È possibile diminuire il numero di indicator_plots dichiarato in #property indicator_plots, l'ho fatto. Ma è difficilmente possibile aumentarlo. Ma questa diminuzione non porterà al risparmio di memoria. Dopo tutto, i buffer rimangono. Sono solo trasferiti da INDICATOR_DATA a INDICATOR_CALCULATIONS e niente di più.
Il dichiarato in #property indicator_plots può essere ridotto, l'ho fatto. Ma è improbabile che sia possibile aumentarlo. Ma questa riduzione non salverà la RAM. I buffer rimangono, dopo tutto. Sono solo trasferiti da INDICATOR_DATA a INDICATOR_CALCULATIONS e niente di più.
Grazie per la vostra risposta. Una modifica estetica del numero di buffer non è rilevante, purtroppo.
Voglio ottenere gli handle dell'indicatore MACD da tre timeframe nel blocco OnInit(). Sul grafico - funziona, ma nel tester non funziona, e il terminale si blocca! Quindi voglio ottenere i dati che non esistono? Potete per favore consigliarmi come affrontarlo?
//+------------------------------------------------------------------+//| Test.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//--- Количество периодов торгуемых символов#define NUMBER_OF_PERIODS 3ENUM_TIMEFRAMES Periods[NUMBER_OF_PERIODS]={PERIOD_M1,PERIOD_M2,PERIOD_M3};
int handles[NUMBER_OF_PERIODS];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---ArrayInitialize(handles,INVALID_HANDLE);
for(int p=0; p<NUMBER_OF_PERIODS; p++)
{
if(handles[p]==INVALID_HANDLE)
{
handles[p]=iCustom(NULL,Periods[p],"Examples\\MACD");
Print(handles[p]);
if(handles[p]==INVALID_HANDLE) Print("Не удалось получить хэндл индикатора для символа !");
}
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
}
//+------------------------------------------------------------------+
Il punto non cambia - stai cercando di cancellare un ordine pendente con un ticket "0" su ogni tick.
E chi dice che avete un ordine pendente con un tick "0" su ogni tick? Avete controllato quanti ordini pendenti ci sono? E come fai a saperlo ....?
Con quale segno di spunta è "0"? OrderGetTicket(0) non significa che un ordine con ticket 0 è selezionato, ma restituisce un ordine con ticket dalla lista degli ordini pendenti con indice 0.
Probabilmente devi essere più specifico nel tuo compito.
Per esempio: se c'è un ordine pendente la cui magia è "1" - allora cancellalo.
In questo caso, l'implementazione sarà la seguente:
Eseguire il loop di tutti gli ordini in sospeso
Se un ordine in sospeso è stato selezionato con successo (il valore restituito è il biglietto maggiore di zero)
Se il valore magico dell'ordine pendente selezionato è "1"
Cancellare
Con quale biglietto "0"? OrderGetTicket(0) non significa che un ordine con ticket 0 è selezionato, ma restituisce un ordine con ticket dalla lista degli ordini pendenti con indice 0.
Sì, proprio così.
Potete dirmi quanta RAM è necessaria per far funzionare il tester per 30 caratteri dal 2004 a oggi?
Il tester dice che non ce n'è abbastanza, ma non dice quanto è necessario.
Potete dirmi quanta RAM è necessaria per far funzionare il tester per 30 caratteri dal 2004 a oggi?
Il tester dice che non ce n'è abbastanza, ma non dice quanto.
Eseguire due caratteri, cinque caratteri ...
Eseguire due caratteri, cinque caratteri ...
Non è proprio questa la domanda - quanta memoria devo comprare per rendere possibile un tale test?
Ecco il risultato per un simbolo (dal log in modalità prezzo di apertura)
Eccone 2:
3:
Ed eccone 4:
È andatoin modo esponenziale:) Non riesco a rintracciare la logica, dato che i ticchettii sono più o meno gli stessi:
Ho visto molti rapporti di 20 o più caratteri, non credo che qualcuno usi terabyte di RAM. Forse c'è un segreto?
È possibile impostare il numero di buffer grafici nell'indicatore?
E la seconda domanda, c'è una possibilità di reinizializzazione forzata dell'indicatore usato dall'Expert Advisor per risparmiare RAM?
È possibile impostare il numero di buffer grafici nell'indicatore?
E la seconda domanda, c'è una possibilità di reinizializzazione forzata dell'indicatore usato dall'Expert Advisor per risparmiare RAM?
È possibile diminuire il numero di indicator_plots dichiarato in #property indicator_plots, l'ho fatto. Ma è difficilmente possibile aumentarlo. Ma questa diminuzione non porterà al risparmio di memoria. Dopo tutto, i buffer rimangono. Sono solo trasferiti da INDICATOR_DATA a INDICATOR_CALCULATIONS e niente di più.
Il dichiarato in #property indicator_plots può essere ridotto, l'ho fatto. Ma è improbabile che sia possibile aumentarlo. Ma questa riduzione non salverà la RAM. I buffer rimangono, dopo tutto. Sono solo trasferiti da INDICATOR_DATA a INDICATOR_CALCULATIONS e niente di più.
Grazie per la vostra risposta. Una modifica estetica del numero di buffer non è rilevante, purtroppo.
Voglio ottenere gli handle dell'indicatore MACD da tre timeframe nel blocco OnInit(). Sul grafico - funziona, ma nel tester non funziona, e il terminale si blocca! Quindi voglio ottenere i dati che non esistono? Potete per favore consigliarmi come affrontarlo?