CustomTicksReplace

Ersetzt die komplette Preishistorie eines nutzerdefinierten Symbols im angegebenen Zeitintervall durch die Daten aus einem Array vom Typ MqlTick.

int  CustomTicksReplace(
   const string     symbol,            // Symbolname
   long             from_msc,          // von welchem Tag
   long             to_msc,            // bis zu welchem Tag
   const MqlTick&   ticks[],           // Array mit den Tickdaten, die dem nutzerdefinierten Symbol zugewiesen werden sollen
   uint             count=WHOLE_ARRAY  // Anzahl der zu verwendenden Elemente des Arrays ticks[]
   );

Parameter

symbol

[in]  Name des nutzerdefinierten Symbols.

from_msc

[in]  Zeit des ersten Ticks in der Preishistorie aus dem angegebenen Intervall, der gelöscht werden muss. Zeit in Millisekunden ab dem 01.01.1970.

to_msc

[in]  Zeit des letzten Ticks in der Preishistorie aus dem angegebenen Intervall, der gelöscht werden muss. Zeit in Millisekunden ab dem 01.01.1970.

ticks[]

[in]   Array mit den Tickdaten vom Typ MqlTick, die nach Zeit aufsteigend geordnet wurden.

count=WHOLE_ARRAY

[in]  Anzahl der zu verwendenden Elemente des Arrays ticks[], die für das Ersetzen im angegebenen Zeitintervall verwendet werden. WHOLE_ARRAY bedeutet, es werden alle Elemente des Arrays ticks[] hinzugefügt.

Rückgabewert

Anzahl der aktualisierten Balken oder -1 im Fehlerfall.

Hinweis

Da gleichzeitig mehrere Ticks im Kurs-Feed eine und dieselbe Zeit bis auf Millisekunden haben können (die genaue Zeit eines Ticks wird im Feldtime_msc der Struktur MqlTick gespeichert), sortiert die Funktion CustomTicksReplace die Elemente des Array ticks[] nicht automatisch nach Zeit. Aus diesem Grund muss das Tick-Array zuerst nach Zeit aufsteigend geordnet werden.

Die Ersetzung von Ticks erfolgt konsequent von Tag zu Tag bis zu dem in to_msc angegebenen Zeitpunkt oder bis zum Auftreten eines Fehlers. Zuerst wird der erste Tag aus dem angegebenen Intervall verarbeitet, dann der nächste und so weiter.  Sobald es festgestellt wird, dass die Zeit ein eines Ticks nicht der aufsteigenden (nicht absteigenden) Folge entspricht, wird der Vorgang sofort am aktuellen Tag abgebrochen. Dabei werden die Ticks der vorherigen Tage erfolgreich ersetzt, und der aktuelle Tag (im Moment des Eintreffens des falschen Ticks) sowie alle restlichen Tage im angegebenen Intervall bleiben unverändert.

Wenn im Array ticks[] Tickdaten für einen Tag fehlen (gilt auch für jedes Intervall mit beliebiger Länge), entsteht nach der Anwendung von Tick-Daten mit ticks[] eine Lücke, die den fehlenden Tagen entspricht. Mit anderen Worten ist der Aufruf von CustomTicksReplace mit gelöschten Ticks für ein konkretes Intervall gleich dem Löschen eines Teils der Tick-Historie, als ob CustomTicksDelete mit dem Intervall "Lücke" aufgerufen wird.

Wenn es keine Daten für den angegebenen Zeitraum in der Datenbank von Ticks gibt, fügt CustomTicksReplace der Datenbank Ticks aus dem Array ticks[] hinzu.

Die Funktion CustomTicksReplace arbeitet direkt mit der Datenbank von Ticks.

 

Beispiel:

//+------------------------------------------------------------------+
//|                                           CustomTicksReplace.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   CUSTOM_SYMBOL_NAME     Symbol()+".C"     // Name des nutzerdefinierten Symbols
#define   CUSTOM_SYMBOL_PATH     "Forex"           // Name der Gruppe, in der das Symbol erstellt werden soll
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()          // Name des Symbols, das als Basis des nutzerdefinierten Symbols dienen soll
 
#define   DATATICKS_TO_COPY      UINT_MAX          // Anzahl der kopierten Ticks
#defineDATATICKS_TO_PRINT     20                // Anzahl der an das Log gesendeten Ticks
 
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Abrufen des Fehlercodes beim Erstellen eines nutzerdefinierten Symbols
   int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN);
   
//--- wenn der Fehlercode nicht 0 (erfolgreiche Symbolerstellung) und nicht 5304 (Symbol wurde bereits erstellt) ist - verlasse das Skript
   if(create!=0 && create!=5304)
      return;
 
//--- Abrufen der Tick-Daten des Standardsymbols in einem MqlTick-Array
   MqlTick array[]={};
   if(!GetTicksToArray(CUSTOM_SYMBOL_ORIGINDATATICKS_TO_COPYarray))
      return;
   
//--- Ausdruck der Zeit des ersten und des letzten empfangenen Ticks des Standardsymbols
   int total=(int)array.Size();
   PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
               TimeToString(array[0].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- Ausdruck von DATATICKS_TO_PRINT letzten Ticks des Standardsymbols in das Log
   PrintFormat("\nThe last %d ticks for the standard symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_ORIGIN);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Tick: %s"iGetTickDescription(array[i]));
     }
   
//--- ein nutzerdefiniertes Symbol zum Fenster der Marktübersicht hinzufügen
   ResetLastError();
   if(!SymbolSelect(CUSTOM_SYMBOL_NAMEtrue))
     {
      Print("SymbolSelect() failed. Error "GetLastError());
      return;
     }
     
//--- Hinzufügen der Daten des Tick-Arrays zur Preishistorie des nutzerdefinierten Symbols
   Print("...");
   uint start=GetTickCount();
   PrintFormat("Start of adding %u ticks to the history of the custom symbol '%s'"array.Size(), CUSTOM_SYMBOL_NAME);
   int added=CustomTicksAdd(CUSTOM_SYMBOL_NAMEarray);
   PrintFormat("Added %u ticks to the history of the custom symbol '%s' in %u ms"addedCUSTOM_SYMBOL_NAMEGetTickCount()-start);
   
//--- Abrufen der neu hinzugefügten Tick-Daten des nutzerdefinierten Symbols in das MqlTick-Array
   Print("...");
   if(!GetTicksToArray(CUSTOM_SYMBOL_NAMEarray.Size(), array))
      return;
   
//--- Ausdruck der Zeit des ersten und letzten empfangenen Ticks des nutzerdefinierten Symbols
   total=(int)array.Size();
   PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
               TimeToString(array[0].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- Ausdruck von DATATICKS_TO_PRINT letzten Ticks des nutzerdefinierten Symbols in das Log
   PrintFormat("\nThe last %d ticks for the custom symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_NAME);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Tick: %s"iGetTickDescription(array[i]));
     }
 
//--- jetzt werden die Ask- und Bid-Tickwerte im Array mit der Gleichung Ask(Symbol) = 1,0 / Ask(Symbol), Bid(Symbol) = 1,0 / Bid(Symbol)geändert
   for(int i=0i<totali++)
     {
      array[i].ask = (array[i].ask !=0 ? 1.0 / array[i].ask : array[i].ask);
      array[i].bid = (array[i].bid !=0 ? 1.0 / array[i].bid : array[i].bid);
     }
   Print("\nNow the ticks are changed");
 
//--- Ersetzen der Tick-Historie des nutzerdefinierten Symbols durch Daten aus dem geänderten Array von Ticks
   Print("...");
   start=GetTickCount();
   PrintFormat("Start replacing %u changed ticks in the history of the custom symbol '%s'"array.Size(), CUSTOM_SYMBOL_NAME);
   int replaced=CustomTicksReplace(CUSTOM_SYMBOL_NAMEarray[0].time_mscarray[total-1].time_mscarray);
   PrintFormat("Replaced %u ticks in the history of the custom symbol '%s' in %u ms"replacedCUSTOM_SYMBOL_NAMEGetTickCount()-start);
   
//--- Abrufen der neu ersetzten, nutzerdefinierten Tick-Daten des Symbols in das MqlTick-Array
   Print("...");
   if(!GetTicksToArray(CUSTOM_SYMBOL_NAMEarray.Size(), array))
      return;
   
//--- Ausdruck der Zeit des ersten und letzten empfangenen, geänderten Ticks des nutzerdefinierten Symbols
   total=(int)array.Size();
   PrintFormat("First changed tick time: %s.%03u, Last changed tick time: %s.%03u",
               TimeToString(array[0].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- Ausdruck von DATATICKS_TO_PRINT, der zuletzt geänderte Ticks des nutzerdefinierten Symbols in das Log
   PrintFormat("\nThe last %d changed ticks for the custom symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_NAME);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Changed tick: %s"iGetTickDescription(array[i]));
     }
 
//--- einen Hinweis zu den Tasten zur Beendigung des Skripts im Kommentar des Charts anzeigen
   Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit"CUSTOM_SYMBOL_NAME));
//--- warten, bis die Tasten „Esc“ oder „Entf“ gedrückt werden, um die Endlosschleife zu verlassen
   while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
     {
      Sleep(16);
      //--- beim Drücken von Entf das erstellte nutzerdefinierte Symbol und seine Daten löschen
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         //--- Balkendaten löschen
         int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history bars of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- Tickdaten löschen
         deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- Symbol löschen
         if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
            PrintFormat("Custom symbol '%s' deleted successfully"CUSTOM_SYMBOL_NAME);
         break;
        }
     }
//--- Chart vor dem Ende löschen
   Comment("");
   /*
   Ergebnis:
   Requested 4294967295 ticks to get tick history for the symbol 'EURUSD'
   The tick history for the 'EURUSDsymbol is received in the amount of 351195822 ticks in 55735 ms
   First tick time2011.12.19 00:00:08.000Last tick time2024.06.21 08:39:03.113
   
   The last 20 ticks for the standard symbol 'EURUSD':
     351195802th Tick2024.06.21 08:38:10.076 Ask=1.07194 (Info tick)
     351195803th Tick2024.06.21 08:38:13.162 Ask=1.07195 (Info tick)
     351195804th Tick2024.06.21 08:38:13.872 Bid=1.07195 (Info tick)
     351195805th Tick2024.06.21 08:38:14.866 Ask=1.07194 Bid=1.07194 (Info tick)
     351195806th Tick2024.06.21 08:38:17.374 Bid=1.07194 (Info tick)
     351195807th Tick2024.06.21 08:38:18.883 Bid=1.07194 (Info tick)
     351195808th Tick2024.06.21 08:38:19.771 Bid=1.07194 (Info tick)
     351195809th Tick2024.06.21 08:38:20.873 Ask=1.07195 Bid=1.07195 (Info tick)
     351195810th Tick2024.06.21 08:38:22.278 Ask=1.07196 Bid=1.07196 (Info tick)
     351195811th Tick2024.06.21 08:38:22.775 Bid=1.07196 (Info tick)
     351195812th Tick2024.06.21 08:38:23.477 Bid=1.07196 (Info tick)
     351195813th Tick2024.06.21 08:38:38.194 Ask=1.07197 (Info tick)
     351195814th Tick2024.06.21 08:38:38.789 Ask=1.07196 (Info tick)
     351195815th Tick2024.06.21 08:38:39.290 Ask=1.07197 (Info tick)
     351195816th Tick2024.06.21 08:38:43.695 Ask=1.07196 (Info tick)
     351195817th Tick2024.06.21 08:38:52.203 Ask=1.07195 Bid=1.07195 (Info tick)
     351195818th Tick2024.06.21 08:38:55.105 Ask=1.07196 Bid=1.07196 (Info tick)
     351195819th Tick2024.06.21 08:38:57.607 Ask=1.07195 Bid=1.07195 (Info tick)
     351195820th Tick2024.06.21 08:39:00.512 Ask=1.07196 Bid=1.07196 (Info tick)
     351195821th Tick2024.06.21 08:39:03.113 Ask=1.07195 Bid=1.07195 (Info tick)
   ...
   Start of adding 351195822 ticks to the history of the custom symbol 'EURUSD.C'
   Added 351195822 ticks to the history of the custom symbol 'EURUSD.Cin 349407 ms
   ...
   Requested 351195822 ticks to get tick history for the symbol 'EURUSD.C'
   The tick history for the 'EURUSD.Csymbol is received in the amount of 351195822 ticks in 190203 ms
   First tick time2011.12.19 00:00:08.000Last tick time2024.06.21 08:39:03.113
   
   The last 20 ticks for the custom symbol 'EURUSD.C':
     351195802th Tick2024.06.21 08:38:10.076 Ask=1.07194 Bid=1.07194 (Info tick)
     351195803th Tick2024.06.21 08:38:13.162 Ask=1.07195 Bid=1.07195 (Info tick)
     351195804th Tick2024.06.21 08:38:13.872 Ask=1.07195 Bid=1.07195 (Info tick)
     351195805th Tick2024.06.21 08:38:14.866 Ask=1.07194 Bid=1.07194 (Info tick)
     351195806th Tick2024.06.21 08:38:17.374 Ask=1.07194 Bid=1.07194 (Info tick)
     351195807th Tick2024.06.21 08:38:18.883 Ask=1.07194 Bid=1.07194 (Info tick)
     351195808th Tick2024.06.21 08:38:19.771 Ask=1.07194 Bid=1.07194 (Info tick)
     351195809th Tick2024.06.21 08:38:20.873 Ask=1.07195 Bid=1.07195 (Info tick)
     351195810th Tick2024.06.21 08:38:22.278 Ask=1.07196 Bid=1.07196 (Info tick)
     351195811th Tick2024.06.21 08:38:22.775 Ask=1.07196 Bid=1.07196 (Info tick)
     351195812th Tick2024.06.21 08:38:23.477 Ask=1.07196 Bid=1.07196 (Info tick)
     351195813th Tick2024.06.21 08:38:38.194 Ask=1.07197 Bid=1.07197 (Info tick)
     351195814th Tick2024.06.21 08:38:38.789 Ask=1.07196 Bid=1.07196 (Info tick)
     351195815th Tick2024.06.21 08:38:39.290 Ask=1.07197 Bid=1.07197 (Info tick)
     351195816th Tick2024.06.21 08:38:43.695 Ask=1.07196 Bid=1.07196 (Info tick)
     351195817th Tick2024.06.21 08:38:52.203 Ask=1.07195 Bid=1.07195 (Info tick)
     351195818th Tick2024.06.21 08:38:55.105 Ask=1.07196 Bid=1.07196 (Info tick)
     351195819th Tick2024.06.21 08:38:57.607 Ask=1.07195 Bid=1.07195 (Info tick)
     351195820th Tick2024.06.21 08:39:00.512 Ask=1.07196 Bid=1.07196 (Info tick)
     351195821th Tick2024.06.21 08:39:03.113 Ask=1.07195 Bid=1.07195 (Info tick)
   
   Now the ticks are changed
   ...
   Start replacing 351195822 changed ticks in the history of the custom symbol 'EURUSD.C'
   Replaced 351195822 ticks in the history of the custom symbol 'EURUSD.Cin 452266 ms
   ...
   Requested 351195822 ticks to get tick history for the symbol 'EURUSD.C'
   The tick history for the 'EURUSD.Csymbol is received in the amount of 351195822 ticks in 199812 ms
   First changed tick time2011.12.19 00:00:08.000Last changed tick time2024.06.21 08:39:03.113
   
   The last 20 changed ticks for the custom symbol 'EURUSD.C':
     351195802th Changed tick2024.06.21 08:38:10.076 Ask=0.93289 Bid=0.93289 (Info tick)
     351195803th Changed tick2024.06.21 08:38:13.162 Ask=0.93288 Bid=0.93288 (Info tick)
     351195804th Changed tick2024.06.21 08:38:13.872 Ask=0.93288 Bid=0.93288 (Info tick)
     351195805th Changed tick2024.06.21 08:38:14.866 Ask=0.93289 Bid=0.93289 (Info tick)
     351195806th Changed tick2024.06.21 08:38:17.374 Ask=0.93289 Bid=0.93289 (Info tick)
     351195807th Changed tick2024.06.21 08:38:18.883 Ask=0.93289 Bid=0.93289 (Info tick)
     351195808th Changed tick2024.06.21 08:38:19.771 Ask=0.93289 Bid=0.93289 (Info tick)
     351195809th Changed tick2024.06.21 08:38:20.873 Ask=0.93288 Bid=0.93288 (Info tick)
     351195810th Changed tick2024.06.21 08:38:22.278 Ask=0.93287 Bid=0.93287 (Info tick)
     351195811th Changed tick2024.06.21 08:38:22.775 Ask=0.93287 Bid=0.93287 (Info tick)
     351195812th Changed tick2024.06.21 08:38:23.477 Ask=0.93287 Bid=0.93287 (Info tick)
     351195813th Changed tick2024.06.21 08:38:38.194 Ask=0.93286 Bid=0.93286 (Info tick)
     351195814th Changed tick2024.06.21 08:38:38.789 Ask=0.93287 Bid=0.93287 (Info tick)
     351195815th Changed tick2024.06.21 08:38:39.290 Ask=0.93286 Bid=0.93286 (Info tick)
     351195816th Changed tick2024.06.21 08:38:43.695 Ask=0.93287 Bid=0.93287 (Info tick)
     351195817th Changed tick2024.06.21 08:38:52.203 Ask=0.93288 Bid=0.93288 (Info tick)
     351195818th Changed tick2024.06.21 08:38:55.105 Ask=0.93287 Bid=0.93287 (Info tick)
     351195819th Changed tick2024.06.21 08:38:57.607 Ask=0.93288 Bid=0.93288 (Info tick)
     351195820th Changed tick2024.06.21 08:39:00.512 Ask=0.93287 Bid=0.93287 (Info tick)
     351195821th Changed tick2024.06.21 08:39:03.113 Ask=0.93288 Bid=0.93288 (Info tick)
   */
  }
//+------------------------------------------------------------------+
//| Nutzerdefiniertes Symbol erstellen, Fehlercode zurückgeben       |
//+------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_nameconst string symbol_pathconst string symbol_origin=NULL)
  {
//--- Definition des Namens eines Symbols, auf dem ein nutzerdefiniertes Symbol basieren soll.
   string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
   
//--- Wenn das Erstellen eines nutzerdefinierten Symbols fehlgeschlagen ist und nicht der Fehler 5304 aufgetreten ist, wird es im Log gemeldet.
   ResetLastError();
   int error=0;
   if(!CustomSymbolCreate(symbol_namesymbol_pathorigin))
     {
      error=GetLastError();
      if(error!=5304)
         PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d"symbol_namesymbol_pathoriginerror);
     }
//--- Erfolg
   return(error);
  }
//+------------------------------------------------------------------+
//| Nutzerdefiniertes Symbol entfernen                               |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
  {
//--- das Symbol aus dem Fenster der Marktübersicht ausblenden
   ResetLastError();
   if(!SymbolSelect(symbol_namefalse))
     {
      PrintFormat("SymbolSelect(%s, false) failed. Error %d"GetLastError());
      return(false);
     }
      
//--- Wenn das Löschen eines nutzerdefinierten Symbols fehlgeschlagen ist, wird das im Log gemeldet und „false“ zurückgegeben.
   ResetLastError();
   if(!CustomSymbolDelete(symbol_name))
     {
      PrintFormat("CustomSymbolDelete(%s) failed. Error %d"symbol_nameGetLastError());
      return(false);
     }
//--- Erfolg
   return(true);
  }
//+------------------------------------------------------------------+
//| Abrufen der angegebenen Anzahl von Ticks im Array                |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolconst uint countMqlTick &array[])
  {
//--- Benachrichtigung über den Beginn des Ladens historischer Daten
   PrintFormat("Requested %u ticks to get tick history for the symbol '%s'"countsymbol);
   
//--- 3 Versuche, Ticks abzurufen
   int attempts=0;
   while(attempts<3)
     {
      //--- Startzeit vor Empfang der Ticks messen
      uint start=GetTickCount();
      
      //--- Anforderung der Tick-Historie seit 1970.01.01 00:00.001 (Parameter von=1 ms)
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1count);
      if(received!=-1)
        {
         //--- Informationen über die Anzahl der Ticks und die verwendete Zeit anzeigen 
         PrintFormat("The tick history for the '%s' symbol is received in the amount of %u ticks in %d ms"symbolreceivedGetTickCount()-start);
         
         //--- Wenn die Tick-Historie synchronisiert ist, ist der Fehlercode gleich Null - return 'true'
         if(GetLastError()==0)
            return(true);
 
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d"
                     symbolreceivedGetTickCount()-startGetLastError());
        }
      //--- Versuche zählen 
      attempts++; 
      //--- eine Pause von einer Sekunde, um auf das Ende der Synchronisierung der Tick-Datenbank zu warten 
      Sleep(1000);
     }
//--- Konnten die Ticks nach 3 Versuchen nicht kopiert werden:
   return(false);
  }
//+------------------------------------------------------------------+ 
//| gibt die String-Beschreibung eines Ticks zurück                  |
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick
  { 
   string desc=StringFormat("%s.%03u "TimeToString(tick.timeTIME_DATE|TIME_MINUTES|TIME_SECONDS),tick.time_msc%1000);
   
//--- Prüfen der Flags
   bool buy_tick   = ((tick.flags &TICK_FLAG_BUY)   == TICK_FLAG_BUY); 
   bool sell_tick  = ((tick.flags &TICK_FLAG_SELL)  == TICK_FLAG_SELL); 
   bool ask_tick   = ((tick.flags &TICK_FLAG_ASK)   == TICK_FLAG_ASK); 
   bool bid_tick   = ((tick.flags &TICK_FLAG_BID)   == TICK_FLAG_BID); 
   bool last_tick  = ((tick.flags &TICK_FLAG_LAST)  == TICK_FLAG_LAST); 
   bool volume_tick= ((tick.flags &TICK_FLAG_VOLUME)== TICK_FLAG_VOLUME); 
   
//--- zuerst den Tick auf die Handelsflags prüfen (es gibt keine für CustomTicksAdd())
   if(buy_tick || sell_tick
     { 
      //--- eine Ausgabe für einen Handelstick bilden 
      desc += (buy_tick ? StringFormat("Buy Tick: Last=%G Volume=%d "tick.lasttick.volume)  : ""); 
      desc += (sell_tickStringFormat("Sell Tick: Last=%G Volume=%d ",tick.lasttick.volume) : ""); 
      desc += (ask_tick ? StringFormat("Ask=%G "tick.ask) : ""); 
      desc += (bid_tick ? StringFormat("Bid=%G "tick.ask) : ""); 
      desc += "(Trade tick)"
     } 
   else 
     { 
      //--- die Ausgabe für einen Info-Tick etwas anders gestalten 
      desc += (ask_tick   ? StringFormat("Ask=%G ",  tick.ask)    : ""); 
      desc += (bid_tick   ? StringFormat("Bid=%G ",  tick.ask)    : ""); 
      desc += (last_tick  ? StringFormat("Last=%G "tick.last)   : ""); 
      desc += (volume_tickStringFormat("Volume=%d ",tick.volume): ""); 
      desc += "(Info tick)"
     } 
//--- Tick-Beschreibung zurückgeben
   return(desc); 
  } 

 

Siehe auch

CustomRatesDelete, CustomRatesUpdate, CustomTicksDelete, CopyTicks, CopyTicksRange