//+------------------------------------------------------------------+ //| CustomRatesDelete.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" // наименование пользовательского символа #define CUSTOM_SYMBOL_PATH "Forex" // название группы, в которой будет создан символ #define CUSTOM_SYMBOL_ORIGIN Symbol() // наименование символа, на основе которого будет создан пользовательский #define DATARATES_COUNT 4 // количество выводимых баров в журнал //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- получаем код ошибки при создании пользовательского символа int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAME, CUSTOM_SYMBOL_PATH, CUSTOM_SYMBOL_ORIGIN); //--- если код ошибки не 0 (успешное создание символа) и не 5304 (символ уже создан) - уходим if(create!=0 && create!=5304) return; //--- получим количество баров стандартного символа int bars=Bars(CUSTOM_SYMBOL_ORIGIN, PERIOD_M1); //--- получим в массив MqlRates данные всех баров минутного таймфрейма стандартного символа MqlRates rates[]={}; ResetLastError(); if(CopyRates(CUSTOM_SYMBOL_ORIGIN, PERIOD_M1, 0, bars, rates)!=bars) { PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d", CUSTOM_SYMBOL_ORIGIN, bars, GetLastError()); return; } //--- установим скопированные данные в минутную историю пользовательского символа ResetLastError(); if(CustomRatesUpdate(CUSTOM_SYMBOL_NAME, rates)<0) { PrintFormat("CustomRatesUpdate(%s) failed. Error %d", CUSTOM_SYMBOL_NAME, GetLastError()); return; } //--- после обновления исторических данных получим количество баров пользовательского символа bars=Bars(CUSTOM_SYMBOL_NAME, PERIOD_M1); //--- получим в массив MqlRates данные всех баров минутного таймфрейма пользовательского символа ResetLastError(); if(CopyRates(CUSTOM_SYMBOL_NAME, PERIOD_M1, 0, bars, rates)!=bars) { PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d", CUSTOM_SYMBOL_NAME, bars, GetLastError()); return; } //--- распечатаем в журнале последние DATARATES_COUNT баров минутной истории пользовательского символа int digits=(int)SymbolInfoInteger(CUSTOM_SYMBOL_NAME, SYMBOL_DIGITS); PrintFormat("Last %d bars of the custom symbol's minute history:", DATARATES_COUNT); ArrayPrint(rates, digits, NULL, bars-DATARATES_COUNT, DATARATES_COUNT); //--- удалим два предпоследних бара данных в минутной истории пользовательского символа datetime time_from= rates[bars-3].time; datetime time_to = rates[bars-2].time; ResetLastError(); int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME, time_from, time_to); if(deleted<0) { PrintFormat("CustomRatesDelete(%s) failed. Error %d", CUSTOM_SYMBOL_NAME, GetLastError()); return; } //--- после удаления двух баров исторических данных, заново получим количество баров пользовательского символа bars=Bars(CUSTOM_SYMBOL_NAME, PERIOD_M1); //--- опять получим данные всех оставшихся баров минутного таймфрейма пользовательского символа ResetLastError(); if(CopyRates(CUSTOM_SYMBOL_NAME, PERIOD_M1, 0, bars, rates)!=bars) { PrintFormat("CopyRates(%s, PERIOD_M1, 0, %d) failed. Error %d", CUSTOM_SYMBOL_NAME, bars, GetLastError()); return; } //--- распечатаем в журнале последние DATARATES_COUNT баров обновлённой минутной истории пользовательского символа PrintFormat("\nLast %d bars after applying CustomRatesDelete() with %d deleted bars:", DATARATES_COUNT, deleted); ArrayPrint(rates, digits, NULL, bars-DATARATES_COUNT, DATARATES_COUNT); //--- выведем на график в комментарии подсказку о клавишах завершения работы скрипта Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit", CUSTOM_SYMBOL_NAME)); //--- в бесконечном цикле ожидаем нажатия клавиш Esc или Del для выхода while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0) { Sleep(16); //--- при нажатии Del, удаляем созданный пользовательский символ и его данные if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0) { //--- удаляем данные баров int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME, 0, LONG_MAX); if(deleted>0) PrintFormat("%d history bars of the custom symbol '%s' were successfully deleted", deleted, CUSTOM_SYMBOL_NAME); //--- удаляем тиковые данные deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME, 0, LONG_MAX); if(deleted>0) PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted", deleted, CUSTOM_SYMBOL_NAME); //--- удаляем символ if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME)) PrintFormat("Custom symbol '%s' deleted successfully", CUSTOM_SYMBOL_NAME); break; } } //--- перед выходом очистим график Comment(""); /* результат: Last 4 bars of the custom symbol's minute history: [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2024.06.18 20:53:00 1.07341 1.07347 1.07336 1.07343 38 0 0 [1] 2024.06.18 20:54:00 1.07344 1.07354 1.07344 1.07353 21 0 0 [2] 2024.06.18 20:55:00 1.07353 1.07362 1.07351 1.07356 32 0 0 [3] 2024.06.18 20:56:00 1.07356 1.07358 1.07352 1.07354 24 0 0 Last 4 bars after applying CustomRatesDelete() with 2 deleted bars: [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2024.06.18 20:51:00 1.07357 1.07358 1.07347 1.07349 25 0 0 [1] 2024.06.18 20:52:00 1.07349 1.07350 1.07336 1.07341 31 0 0 [2] 2024.06.18 20:53:00 1.07341 1.07347 1.07336 1.07343 38 0 0 [3] 2024.06.18 20:56:00 1.07356 1.07358 1.07352 1.07354 24 0 0 */ } //+------------------------------------------------------------------+ //| Создаёт пользовательский символ, возвращает код ошибки | //+------------------------------------------------------------------+ int CreateCustomSymbol(const string symbol_name, const string symbol_path, const string symbol_origin=NULL) { //--- определяем наименование символа, на основе которого будет создан пользовательский string origin=(symbol_origin==NULL ? Symbol() : symbol_origin); //--- если пользовательский символ создать не удалось, и это не ошибка 5304 - сообщаем об этом в журнале ResetLastError(); int error=0; if(!CustomSymbolCreate(symbol_name, symbol_path, origin)) { error=GetLastError(); if(error!=5304) PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d", symbol_name, symbol_path, origin, error); } //--- успешно return(error); } //+------------------------------------------------------------------+ //| Удаляет пользовательский символ | //+------------------------------------------------------------------+ bool DeleteCustomSymbol(const string symbol_name) { //--- скроем символ из окна Обзор рынка ResetLastError(); if(!SymbolSelect(symbol_name, false)) { PrintFormat("SymbolSelect(%s, false) failed. Error %d", GetLastError()); return(false); } //--- если пользовательский символ удалить не удалось - сообщаем об этом в журнале и возвращаем false ResetLastError(); if(!CustomSymbolDelete(symbol_name)) { PrintFormat("CustomSymbolDelete(%s) failed. Error %d", symbol_name, GetLastError()); return(false); } //--- успешно return(true); } |