Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 245

 
forexman77:

Im Skript habe ich dies getan:

Zeit=0

SymbolInfoTick am Montag.

Sie können dies mit diesem Code überprüfen:

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

Aber Sie brauchen Ticks pro Symbol.

 
Fleder:

Sie können dies mit diesem Code überprüfen:

Aber Sie brauchen Ticks pro Symbol.

Ja,"SymbolInfoTick", heute keine Prüfung.

Ich habe es versucht, aber es funktioniert nicht, bis die Zecken da sind.

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:

Ja, SymbolInfoTick, heute keine Prüfung.

Ich habe es versucht, aber bis die Zecken verschwunden sind, funktioniert nichts.

iask=0

Diese Funktion ist zu schnell.

Um die Leistung zu messen, müssen Sie mehrere Aufrufe in einer Schleife mit einer großen Anzahl von Iterationen durchführen und die Gesamtausführungszeit messen.

 
barabashkakvn:
Umso interessanter ist es, dass es einen Beispielcode gibt. Wir warten auf das Ergebnis.
 
forexman77:
Ich danke Ihnen. Sie wird sich als nützlich erweisen.
 

Um einen neuen Balken im EA zu überprüfen, habe ich Funktionen verwendet, die auf "CopyTime" und "CopyRates" basieren und die ich in den Foren gefunden habe. Ich bin zu dem Schluss gekommen, dass ihre Berechnung sehr viel Zeit in Anspruch nimmt.

Hier sind die Prüfdaten (interessant ist, dass der Aufruf des Indikators 171 ms dauert):

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

Und da kam mir die Idee, dass ich etwas anderes versuchen sollte. Zum Beispiel "TimeCurrent".

Ich habe den folgenden Code zur Optimierung erstellt:

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

Haben Sie den folgenden Code für die Optimierung 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)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

Ergebnis im Einzellauf ohne Prüfung auf einen neuen Balken, wenn die Indikatorwerte bei jedem Tick empfangen werden: 817,196 ms

Mit Prüfung eines neuen Balkens: 735 904 ms

Der Unterschied ist nicht besonders beeindruckend, es gibt eine gewisse Verbesserung, aber es ist nicht genug.

Ich erhalte den Indikator wie folgt:

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

Ich habe versucht, Code mit Aufrufen von Handles in den Block zu setzen, in dem die Prüfung des neuen Taktes stattfindet, aber es erscheint ein Fehler, wenn ich

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

Ich habe return gibt nichts, kein Fehler, aber EA funktioniert nicht.

Ich nehme an, dass der Hendle-Aufruf, wenn es möglich ist, und im Allgemeinen der gesamte Hauptcode mit Ausnahme der statischen Variable innerhalb des bedingten Operators platziert werden sollte, der auf einen neuen Takt prüft.

Wenn ich mich nicht irre, habe ich irgendwo gelesen, dass auch dann, wenn wir einen Handle aufrufen, aber keinen Indikator in Puffern anfordern, dieser trotzdem berechnet wird.

 
Kann mir jemand sagen, wie man einen Indikator erstellt, der die Ergebnisse der Formel buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 ausgibt;
 
rus-lot:
Wer kann vorschlagen, wie man einen Indikator erstellt, der die Ergebnisse einer einzigen Formel buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 anzeigt;

Sie müssen einen benutzerdefinierten Indikator schreiben. Um den Prozess zu vereinfachen, nehmen Sie einen der einfachsten Indikatoren -iMa- und schreiben Sie ihn ein wenig um. Hier ist ein weiteres Thema, in dem es um MarketInfo geht. Schreiben Sie den Code, fragen Sie nach, wenn etwas nicht funktioniert.

 
Was ist mit den statischen Variablen passiert? Habe heute den alten Build des Terminals aktualisiert und jetzt gibt es Fehler beim Kompilieren:

unresolved static variable
 
sgreen:
Was ist mit den statischen Variablen passiert? Habe heute den alten Build des Terminals aktualisiert und jetzt gibt es Fehler beim Kompilieren:

unresolved static variable

Die statischen Mitgliederdaten der Klasse müssen nun platziert werden:

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