Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 245

 
forexman77:

Nello script ho fatto così:

tempo=0

SymbolInfoTick il lunedì.

Potete controllare con questo codice:

void OnStart()
{
  double ask;
  uint start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  }
  uint time=GetTickCount()-start;
  Print("SymbolInfoDouble = ",time," ms");
  
  MqlTick tick;
  start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    SymbolInfoTick(Symbol(),tick);
  }
  time=GetTickCount()-start;
  Print("SymbolInfoTick = ",time," ms");
}

Ma hai bisogno di tick per simbolo.

 
Fleder:

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.

void OnStart()
  {
uint start=GetTickCount();
double iask=0;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if(!SymbolInfoTick(_Symbol,latest_price)){iask=latest_price.ask;}
Alert("iask=",iask);
uint time=GetTickCount()-start;
Alert("time=",time);  
  }
iask=0
 
forexman77:

Sì, SymbolInfoTick, nessun controllo oggi.

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.

 
barabashkakvn:
Tanto più interessante, c'è un codice di esempio. Stiamo aspettando il risultato.
 
forexman77:
Grazie. Sarà utile.
 

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):

datetime New_Time[];//буффер для проверки нового бара
void OnStart()
  {
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
static datetime 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");
  }

MqlRates rates[]; 
void OnStart()
  {
datetime t;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),Period(),0,1,rates);  
t=rates[0].time; 
}
uint time=GetTickCount()-start;
Print("t = ",time," ms");
  }

E qui mi è venuta l'idea che se provo qualcos'altro Per esempio, "TimeCurrent".

Fatto il seguente codice per l'ottimizzazione:

void OnStart()
  {
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:

static double ind1;//записываю значения
static double ind2;// значения
static double 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;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit()
  {
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
   return(0);
  }

void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(TSIHandle);
   ArrayFree(TSI);
  }

void OnTick()
  {
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
static double 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 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.

 
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.

 
Cosa è successo alle variabili statiche? Ho aggiornato la vecchia build del terminale oggi e ora ci sono errori durante la compilazione:

unresolved static variable
 
sgreen:
Cosa è successo alle variabili statiche? Ho aggiornato la vecchia build del terminale oggi e ora ci sono errori durante la compilazione:

unresolved static variable

Ora i membri-dati statici della classe devono essere collocati:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;