CustomRatesReplace

Ersetzt die komplette Preishistorie eines nutzerdefinierten Symbols im angegebenen Zeitintervall durch die Daten eines Arrays vom Typ MqlRates.

int  CustomRatesReplace(
   const string     symbol,             // Symbolname
   datetime         from,               // von
   datetime         to,                 // bis
   const MqlRates&  rates[],            // Array mit den Daten, die dem nutzerdefinierten Symbol zugewiesen werden sollen
   uint             count=WHOLE_ARRAY   // Anzahl der zu verwendenden Elemente des Arrays rates[]
   );

Parameter

symbol

[in]  Name des nutzerdefinierten Symbols.

from

[in]  Zeit des ersten Balkens in der Preishistorie aus dem angegebenen Zeitintervall, das aktualisiert werden muss.

to

[in]  Zeit des letzten Balkens in der Preishistorie aus dem angegebenen Zeitintervall, das aktualisiert werden muss.

rates[]

[in]   Array der historischen Daten vom Typ MqlRates für den Zeitrahmen M1.

count=WHOLE_ARRAY

[in]  Anzahl der zu verwendenden Elemente des Arrays rates[], die für das Ersetzen verwendet werden. WHOLE_ARRAY bedeutet, es werden alle Elemente des Arrays rates[] für das Ersetzen verwendet.

Rückgabewert

Anzahl der aktualisierten Balken oder -1 im Fehlerfall.

Hinweis

Wenn ein Balken aus dem Array rates[] das angegebene Intervall überschreitet, wird er ignoriert. Wenn ein solcher Balken in der Preishistorie bereits vorhanden ist und innerhalb des angegebenen Intervalls liegt, wird er ersetzt. Alle anderen Balken der Preishistorie außerhalb des angegebenen Intervalls bleiben unverändert. Die Daten im Array rates[] müssen den OHLC-Kursen entsprechen und die Eröffnungszeit der Balken muss dem M1-Zeitrahmen entsprechen.

 

Beispiel:

//+------------------------------------------------------------------+
//|                                           CustomRatesReplace.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   DATARATES_COUNT        4                 // Anzahl der Balken, die an das Log gesendet werden soll
 
//+------------------------------------------------------------------+
//| 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;
 
//--- Anzahl der Balken des Standardsymbols abrufen
   int bars=Bars(CUSTOM_SYMBOL_ORIGINPERIOD_M1);
      
//--- Abrufen der Daten aller Balken des Standardsymbols des Zeitrahmens 1 Minute in das MqlRates-Array
   MqlRates rates[]={};
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_ORIGINPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_ORIGINbarsGetLastError());
      return;
     }
 
//--- Setzen die kopierten Daten auf den Minuten-Historie des nutzerdefinierten Symbols
   ResetLastError();
   if(CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates)<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
     
//--- nach dem Aktualisieren der historischen Daten die Anzahl der nutzerdefinierten Balken des Symbols abrufen
   bars=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   
//--- die Daten aller Balken des nutzerdefinierten Symbols des Zeitrahmens 1 Minute in das MqlRates-Array abrufen
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_NAMEPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbarsGetLastError());
      return;
     }
 
//--- die letzten DATARATES_COUNT Balken der M1-Historie des nutzerdefinierten Symbols im Log ausdrucken
   int digits=(int)SymbolInfoInteger(CUSTOM_SYMBOL_NAMESYMBOL_DIGITS);
   PrintFormat("Last %d bars of the custom symbol's minute history:"DATARATES_COUNT);
   ArrayPrint(ratesdigitsNULLbars-DATARATES_COUNTDATARATES_COUNT);
   
//--- Änderung der beiden vorletzten Datenbalken der M1-Historie des nutzerdefinierten Symbols
   datetime time_fromrates[bars-3].time;
   datetime time_to  = rates[bars-2].time;
   
//--- alle Preise der beiden vorletzten Balken gleich den Eröffnungspreisen dieser Balken im Array „rates“ machen
   rates[bars-3].high=rates[bars-3].open;
   rates[bars-3].low=rates[bars-3].open;
   rates[bars-3].close=rates[bars-3].open;
   
   rates[bars-2].high=rates[bars-2].open;
   rates[bars-2].low=rates[bars-2].open;
   rates[bars-2].close=rates[bars-2].open;
   
//--- Ersetzen der vorhandene Balken durch Daten aus dem geänderten Array „rates“.
   ResetLastError();
   int replaced=CustomRatesUpdate(CUSTOM_SYMBOL_NAMErates);
   if(replaced<0)
     {
      PrintFormat("CustomRatesUpdate(%s) failed. Error %d"CUSTOM_SYMBOL_NAMEGetLastError());
      return;
     }
     
//--- nach dem Ändern von zwei Balken der historischen Daten wird die Anzahl der Balken des nutzerdefinierten Symbols erneut abgerufen
   bars=Bars(CUSTOM_SYMBOL_NAMEPERIOD_M1);
   
//--- die Daten aller Balken des Minutenzeitrahmens des nutzerdefinierten Symbols erneut abrufen
   ResetLastError();
   if(CopyRates(CUSTOM_SYMBOL_NAMEPERIOD_M10barsrates)!=bars)
     {
      PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d"CUSTOM_SYMBOL_NAMEbarsGetLastError());
      return;
     }
 
//--- die letzten DATARATES_COUNT Balken der aktualisierten M1-Historie des nutzerdefinierten Symbols im Log ausdrucken
   PrintFormat("\nLast %d bars after applying CustomRatesUpdate() with %d replaced bars:"DATARATES_COUNTreplaced);
   ArrayPrint(ratesdigitsNULLbars-DATARATES_COUNTDATARATES_COUNT);
     
//--- 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:
   Last 4 bars of the custom symbol's minute history:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [0] 2024.07.29 13:37:00 1.08394 1.08396 1.08388 1.08390            16        1             0
   [1] 2024.07.29 13:38:00 1.08389 1.08400 1.08389 1.08398            35        1             0
   [2] 2024.07.29 13:39:00 1.08398 1.08410 1.08394 1.08410            29        1             0
   [3] 2024.07.29 13:40:00 1.08409 1.08414 1.08408 1.08414            14        1             0
   
   Last 4 bars after applying CustomRatesUpdate() with 250820 replaced bars:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [0] 2024.07.29 13:37:00 1.08394 1.08396 1.08388 1.08390            16        1             0
   [1] 2024.07.29 13:38:00 1.08389 1.08389 1.08389 1.08389            35        1             0
   [2] 2024.07.29 13:39:00 1.08398 1.08398 1.08398 1.08398            29        1             0
   [3] 2024.07.29 13:40:00 1.08409 1.08414 1.08408 1.08414            14        1             0
   */
  }
//+------------------------------------------------------------------+
//| 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);
  }

 

Siehe auch

CustomRatesDelete, CustomRatesUpdate, CopyRates