#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#define OBJ_NAME_ASK "TestObjectMoveAsk" // Name des grafischen Objekts für den Briefkurs (Ask)
#define OBJ_NAME_BID "TestObjectMoveBid" // Name des grafischen Objekts für den Geldkurs (Bid)
#define COUNT 100000000 // Anzahl der Ticks zum Laden der Historie
#define DELAY 1 // Verzögerung zwischen Ticks in ms
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion |
//+------------------------------------------------------------------+
void OnStart()
{
//--- aktuelle Chart-ID, Chart-Symbol und Symbol-Dezimalstelle
long chart_id= ChartID();
string symbol = ChartSymbol(chart_id);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
//--- Erstellen Sie zwei Preisetiketten, um den Ask-Preis und den Bid-Preis im Chart anzuzeigen
if(!CreatePriceLabel(chart_id, true) || !CreatePriceLabel(chart_id, false))
return;
//--- Array zum Empfangen von Ticks
MqlTick ticks[]={};
//--- Anzahl der nächsten sichtbaren Balken im Chart und Öffnungszeit dieses Balkens in Millisekunden abrufen
int first= (int)ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR)-1;
ulong from = GetTime(symbol, PERIOD_CURRENT, first)*1000;
//--- Lade die Tick-Historie in das Array
Print("Beginn der Tick-Erfassung...");
if(!GetTicksToArray(symbol, ticks))
return;
//--- Tick-Array zurücksetzen und Ticks aus dem sichtbaren Bereich der Balken im Chart abrufen
ZeroMemory(ticks);
if(CopyTicksRange(symbol, ticks, COPY_TICKS_INFO, from)<1)
{
PrintFormat("CopyTicksRange() vom Datum %s fehlgeschlagen. Error %d", TimeToString(GetTime(symbol, PERIOD_CURRENT, first)), GetLastError());
return;
}
Sleep(500);
PrintFormat("Tick visualization started at %s (%I64u), ticks total: %u", TimeToString(GetTime(symbol, PERIOD_CURRENT, first)), from, ticks.Size());
int count=0; // Anzahl der verarbeiteten Ticks
int changes=0; // Anzahl der verarbeiteten Preisänderungen
int total=(int)Ticks.Size(); // Größe des Tick-Arrays
//--- in einer Schleife durch das Tick-Array
for(int i=0; i<total && !IsStopped(); i++)
{
//--- einen Tick aus dem Array holen und den Tick-Zähler erhöhen
MqlTick tick=ticks[i];
count++;
//--- Überprüfen der Tick-Flags für Ask und Bid
bool ask_tick=((tick.flags &TICK_FLAG_ASK)==TICK_FLAG_ASK);
bool bid_tick=((tick.flags &TICK_FLAG_BID)==TICK_FLAG_BID);
bool done=false;
//--- wenn sich der Briefkurs (Ask) ändert
if(ask_tick)
{
if(Move(chart_id, OBJ_NAME_ASK, tick.time, tick.ask))
{
changes++;
done=true;
}
}
//--- wenn sich der Geldkurs (Bid) ändert
if(bid_tick)
{
if(Move(chart_id, OBJ_NAME_BID, tick.time, tick.bid))
{
changes++;
done=true;
}
}
//--- wenn eines (oder beide) der grafischen Objekte verschoben wurde(n), aktualisiere das Chart
if(done)
{
ChartRedraw(chart_id);
Sleep(DELAY);
}
}
//--- Am Ende der Schleife melden wir die Anzahl der verarbeiteten Ticks im Journal,
//--- warten einige Sekunden, löschen die erstellten Objekte und zeichnen das Chart neu.
PrintFormat("Total ticks completed: %u, Total price changes: %d", count, changes);
Sleep(2000);
if(ObjectsDeleteAll(chart_id, "TestObjectMove")>0)
ChartRedraw(chart_id);
/*
Als Ergebnis der Skriptausführung wird die Bewegung der Preise Ask und Bid auf dem sichtbaren Chart angezeigt,
beginnend am linken Rand des Charts bis zum Ende der historischen Daten.
Die folgenden Daten werden im Journal angezeigt:
Started collecting ticks...
AUDUSD: received 13726794 ticks in 969 ms
Tick visualization started at 2025.01.31 09:00 (1738314000000), ticks total: 44380
Total ticks completed: 44380, Total price changes: 68513
*/
}
//+------------------------------------------------------------------+
//| Erstellen Sie ein Objekt "Price label" |
//+------------------------------------------------------------------+
bool CreatePriceLabel(const long chart_id, const bool obj_ask)
{
string obj_name=(obj_ask ? OBJ_NAME_ASK : OBJ_NAME_BID);
ResetLastError();
if(!ObjectCreate(chart_id, obj_name, (obj_ask ? OBJ_ARROW_RIGHT_PRICE : OBJ_ARROW_LEFT_PRICE), 0, 0, 0))
{
PrintFormat("%s: ObjectCreate() fehlgeschlagen. Error %d",__FUNCTION__, GetLastError());
return(false);
}
return(ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, (obj_ask ? clrRed : clrBlue)));
}
//+------------------------------------------------------------------+
//| Verschieben grafischer Objekt zu angegebenen Preis-/Zeit-Werte |
//+------------------------------------------------------------------+
bool Move(const long chart_id, const string obj_name, const datetime time, const double price)
{
ResetLastError();
if(!ObjectSetInteger(chart_id, obj_name, OBJPROP_TIME, time))
{
PrintFormat("%s: ObjectSetInteger() fehlgeschlagen. Error %d",__FUNCTION__, GetLastError());
return(false);
}
if(!ObjectSetDouble(chart_id, obj_name, OBJPROP_PRICE, price))
{
PrintFormat("%s: ObjectSetDouble() fehlgeschlagen. Error %d",__FUNCTION__, GetLastError());
return(false);
}
return(true);
}
//+------------------------------------------------------------------+
//| Ticks in das Array laden |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbol, MqlTick &array[])
{
int attempts=0; // Zähler für Versuche, den Tick-Verlauf abzurufen
bool success =false; // Flag für erfolgreiches Kopieren von Ticks
//--- 3 Versuche, Ticks abzurufen
while(attempts<3)
{
//--- Startzeit vor dem Empfang der Ticks messen
uint start=GetTickCount();
//--- Anforderung der Tick-Historie seit 1970.01.01 00:00.001 (Parameter from=1 ms)
ResetLastError();
int received=CopyTicks(symbol, array, COPY_TICKS_ALL, 1, COUNT);
if(received!=-1)
{
//--- Anzeige der Daten zur Anzahl der Ticks und zur verstrichenen Zeit
PrintFormat("%s: %d Ticks in %d ms empfangen", Symbol, empfangen, GetTickCount()-start);
//--- wenn der Tick-Verlauf synchronisiert ist, ist der Fehlercode gleich Null
if(GetLastError()==0)
{
success=true;
break;
}
else
PrintFormat("%s: %s Ticks sind noch nicht synchronisiert, %d Ticks in %d ms empfangen. Error=%d",
__FUNCTION__, symbol, received, GetTickCount()-start, GetLastError());
}
//--- Versuche zählen
attempts++;
//--- eine Pause von einer Sekunde, um das Ende der Synchronisierung der Tick-Datenbank abzuwarten
Sleep(1000);
}
//--- Der Empfang der angeforderten Ticks vom Beginn der Tick-Historie ist nach drei Versuchen fehlgeschlagen.
if(!success)
{
PrintFormat("Fehler! Nach drei Versuchen konnten keine Ticks für das Symbol %s abgerufen werden", Symbol);
return(false);
}
return(true);
}
//+------------------------------------------------------------------+
//| Gibt die Zeit des Bar-Index zurück |
//+------------------------------------------------------------------+
datetime GetTime(const string symbol, const ENUM_TIMEFRAMES timeframe, const int index)
{
datetime array[1]={};
ResetLastError();
if(CopyTime(symbol, timeframe, index, 1, array)!=1)
PrintFormat("%s: CopyTime() fehlgeschlagen. Error %d",__FUNCTION__, GetLastError());
return(array[0]);
}
|