Provato, finché i tic non si spengono non funziona nulla.
iask=0
Questa funzione è troppo veloce.
Per misurare le prestazioni, è necessario applicare più chiamate in un ciclo con un gran numero di iterazioni e misurare il tempo di esecuzione totale.
Per controllare una nuova barra nell'EA ho usato funzioni basate su "CopyTime", "CopyRates", che ho trovato sui forum. Sono giunto alla conclusione che il loro calcolo richiede molto tempo.
datetime New_Time[];//буффер для проверки нового бараvoidOnStart()
{
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
staticdatetime t;//записываем старое время ArraySetAsSeries(New_Time,true);//направление индексацииCopyTime(_Symbol,_Period,0,1,New_Time);//копируем время нового бара
t=New_Time[0];
}
uint time=GetTickCount()-start;
Print("New_Time = ",time," ms");
}
E qui mi è venuta l'idea che se provo qualcos'altro Per esempio, "TimeCurrent".
Fatto il seguente codice per l'ottimizzazione:
voidOnStart()
{
int t;
int s;
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
MqlDateTime m;
TimeCurrent(m);
t=m.min;
s=m.sec;
}
uint time=GetTickCount()-start;
Print("time = ",time," ms");
}
Ha fatto il seguente codice per l'ottimizzazione in Expert Advisor:
staticdouble ind1;//записываю значенияstaticdouble ind2;// значенияstaticdouble indsmall;//индикаторовMqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
if (MIN==0 && SEC==0)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}
Risultato in esecuzione singola senza controllo di una nuova barra, quando i valori dell'indicatore sono ricevuti ad ogni tick: 817,196 ms
Con controllo di una nuova barra: 735 904 ms
La differenza non è particolarmente impressionante, c'è qualche miglioramento, ma non è abbastanza.
Ottengo l'indicatore come segue:
int TSIHandle; // хэндл индикатора TSIdouble TSI[]; // динамические массивы для хранения численных значений TSIintOnInit()
{
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
return(0);
}
voidOnDeinit(constint reason)
{
//--- освобождаем хэндлы индикаторовIndicatorRelease(TSIHandle);
ArrayFree(TSI);
}
voidOnTick()
{
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
staticdouble tsismall;
if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферовif(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
{
Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
return;
}
tsismall=TSI[1];
}
}
Ho provato a mettere il codice con le chiamate di maniglie nel blocco in cui avviene il controllo della nuova barra, ma l'errore appare se
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
Ho messo returnnon restituisce nulla, nessun errore, ma l'EA non funziona.
Suppongo che la chiamata hendle, se è possibile, e in generale tutto il codice principale, tranne la variabile statica, dovrebbero essere messi dentro la dichiarazione condizionale che controlla la presenza di una nuova barra.
Se non mi sbaglio, ho letto da qualche parte che anche se chiamiamo un handle ma non richiediamo un indicatore nei buffer, viene comunque calcolato.
Qualcuno può per favore consigliare come fare un indicatore per emettere i risultati della formula buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID))*10000;
rus-lot: Chi può suggerire come fare un indicatore che visualizza i risultati di una singola formula buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID))*10000;
Dovete scrivere un indicatore personalizzato. Per rendere il processo più facile - prendete uno degli indicatori più semplici -iMa e riscrivete un po'. Qui c'è un altro argomento, dove si parla di MarketInfo. Scrivere il codice, chiedere, se qualcosa non funziona.
Nello script ho fatto così:
tempo=0
SymbolInfoTick il lunedì.
Potete controllare con questo codice:
Ma hai bisogno di tick per simbolo.
Potete controllare con questo codice:
Ma hai bisogno di tick per simbolo.
Sì,"SymbolInfoTick", nessun controllo oggi.
Provato, non funziona finché non arrivano le zecche.
iask=0Sì, SymbolInfoTick, nessun controllo oggi.
Provato, finché i tic non si spengono non funziona nulla.
iask=0Questa funzione è troppo veloce.
Per misurare le prestazioni, è necessario applicare più chiamate in un ciclo con un gran numero di iterazioni e misurare il tempo di esecuzione totale.
Tanto più interessante, c'è un codice di esempio. Stiamo aspettando il risultato.
Per controllare una nuova barra nell'EA ho usato funzioni basate su "CopyTime", "CopyRates", che ho trovato sui forum. Sono giunto alla conclusione che il loro calcolo richiede molto tempo.
Ecco i dati di controllo (è interessante che la chiamata dell'indicatore richiede 171 ms):
E qui mi è venuta l'idea che se provo qualcos'altro Per esempio, "TimeCurrent".
Fatto il seguente codice per l'ottimizzazione:
Ha fatto il seguente codice per l'ottimizzazione in Expert Advisor:
Risultato in esecuzione singola senza controllo di una nuova barra, quando i valori dell'indicatore sono ricevuti ad ogni tick: 817,196 ms
Con controllo di una nuova barra: 735 904 ms
La differenza non è particolarmente impressionante, c'è qualche miglioramento, ma non è abbastanza.
Ottengo l'indicatore come segue:
Ho provato a mettere il codice con le chiamate di maniglie nel blocco in cui avviene il controllo della nuova barra, ma l'errore appare se
Ho messo return non restituisce nulla, nessun errore, ma l'EA non funziona.
Suppongo che la chiamata hendle, se è possibile, e in generale tutto il codice principale, tranne la variabile statica, dovrebbero essere messi dentro la dichiarazione condizionale che controlla la presenza di una nuova barra.
Se non mi sbaglio, ho letto da qualche parte che anche se chiamiamo un handle ma non richiediamo un indicatore nei buffer, viene comunque calcolato.
Chi può suggerire come fare un indicatore che visualizza i risultati di una singola formula buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID))*10000;
Dovete scrivere un indicatore personalizzato. Per rendere il processo più facile - prendete uno degli indicatori più semplici -iMa e riscrivete un po'. Qui c'è un altro argomento, dove si parla di MarketInfo. Scrivere il codice, chiedere, se qualcosa non funziona.
Cosa è successo alle variabili statiche? Ho aggiornato la vecchia build del terminale oggi e ora ci sono errori durante la compilazione:
Ora i membri-dati statici della classe devono essere collocati: