Questions des débutants MQL5 MT5 MetaTrader 5 - page 245

 
forexman77:

Dans le script, j'ai fait ça :

temps=0

SymbolInfoTick le lundi.

Vous pouvez le vérifier avec ce code :

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

Mais vous avez besoin de ticks par symbole.

 
Fleder:

Vous pouvez le vérifier avec ce code :

Mais vous avez besoin de ticks par symbole.

Oui,"SymbolInfoTick", pas de vérification aujourd'hui.

J'ai essayé, ça ne marche pas tant que les tiques ne sont pas là.

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:

Oui, SymbolInfoTick, pas de vérification aujourd'hui.

J'ai essayé, jusqu'à ce que les tics s'éteignent, rien ne fonctionne.

iask=0

Cette fonction est trop rapide.

Pour mesurer les performances, vous devez appliquer plusieurs appels dans une boucle avec un grand nombre d'itérations et mesurer le temps d'exécution total.

 
barabashkakvn:
D'autant plus intéressant, il y a un exemple de code. Nous attendons le résultat.
 
forexman77:
Merci. Il sera utile.
 

Pour vérifier une nouvelle barre dans l'EA j'ai utilisé des fonctions basées sur "CopyTime", "CopyRates", que j'ai trouvé sur les forums. Je suis arrivé à la conclusion que leur calcul prend beaucoup de temps.

Voici les données de contrôle (il est intéressant de noter que l'appel de l'indicateur prend 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");
  }

Et là, j'ai eu l'idée que si j'essaie quelque chose d'autre. Par exemple, "TimeCurrent".

J'ai modifié le code suivant pour l'optimiser :

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

A fait le code suivant pour l'optimisation dans 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)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

Résultat en exécution unique sans vérification d'une nouvelle barre, lorsque les valeurs des indicateurs sont reçues à chaque tick : 817,196 ms

Avec contrôle d'une nouvelle barre : 735 904 ms

La différence n'est pas particulièrement impressionnante, il y a une certaine amélioration, mais ce n'est pas suffisant.

J'obtiens l'indicateur suivant :

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];
}
}

J'ai essayé de mettre le code avec les appels de handles dans le bloc où la vérification de la nouvelle barre a lieu, mais l'erreur apparaît si je

if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}

Je mets return ne renvoie rien, pas d'erreur, mais l'EA ne fonctionne pas.

Je suppose que l'appel hendle, si c'est possible, et en général tout le code principal, à l'exception de la variable statique, devrait être placé dans l'instruction conditionnelle vérifiant la présence d'une nouvelle barre.

Si je ne me trompe pas, j'ai lu quelque part que même si on appelle un handle mais qu'on ne demande pas d'indicateur dans les buffers, il est quand même calculé.

 
Quelqu'un peut-il me conseiller sur la façon de créer un indicateur pour sortir les résultats de la formule buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 ;
 
rus-lot:
Qui peut suggérer comment faire un indicateur qui affiche les résultats d'une seule formule tampon[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 ;

Vous devez écrire un indicateur personnalisé. Pour faciliter le processus, prenez l'un des indicateurs les plus simples -iMa- et réécrivez-le un peu. Voici un autre sujet, où il est question de MarketInfo. Ecrivez le code, demandez, si quelque chose ne fonctionne pas.

 
Qu'est-il arrivé aux variables statiques? J'ai mis à jour l'ancien build du terminal aujourd'hui et maintenant il y a des erreurs lors de la compilation :

unresolved static variable
 
sgreen:
Qu'est-il arrivé aux variables statiques? J'ai mis à jour l'ancien build du terminal aujourd'hui et maintenant il y a des erreurs lors de la compilation :

unresolved static variable

Les membres-données statiques de la classe doivent maintenant être placés:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
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;