Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 1770
- Рейтинг:
- Опубликован:
- Обновлен:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Данная библиотека реализовывает работу с форматом хранения тиков, у которого неплохое соотношение производительности (чтение/запись) к размеру.
Формат.
Хранятся только следующие поля оригинального MqlTick:
struct MqlTick { datetime time; // Время последнего обновления цен double bid; // Текущая цена Bid double ask; // Текущая цена Ask double last; // Текущая цена последней сделки (Last) ulong volume; // Объем для текущей цены Last long time_msc; // Время последнего обновления цен в миллисекундах uint flags; // Флаги тиков double volume_real; // Объем для текущей цены Last c повышенной точностью };
Примеры.
Увидеть методы библиотеки можно в MetaEditor по горячей клавише ALT+M. Ниже будут несколько примеров их использования.
Запись/Чтение через файл.
#property script_show_inputs input datetime inFrom = D'2024.12.01'; #include <fxsaber\TicksShort\TicksShort.mqh> // Короткий формат хранения тиков. void OnStart() { MqlTick Ticks[]; // Для исходных тиков. if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL,(ulong)inFrom * 1000) > 0) { FileSave("Ticks.bin", Ticks); // Сохранили обычные тики, чтобы можно было сравнить размеры файлов. TICKS_SHORT::Save("TicksShort.bin", Ticks); // Сохранили тики в сжатом формате. MqlTick Ticks2[]; // Для разжатых тиков. TICKS_SHORT::Load("TicksShort.bin", Ticks2); // Загрузили тики из сжатого формата. Print("Ratio = " + DoubleToString((double)FileGetInteger("Ticks.bin", FILE_SIZE) / FileGetInteger("TicksShort.bin", FILE_SIZE), 3)); Print("Correct = " + (string)TICKS_SHORT::IsEqual(Ticks, Ticks2)); // Сравнили. } }
Скрипт выше сохраняет тики в файл нового формата и загружает их из файла.
Результат.
TicksShort_SaveLoad (EURUSD,M1) Ratio = 10.000 TicksShort_SaveLoad (EURUSD,M1) Correct = true
Вывод в журнал показывает, что степень сжатия в 10 раз. И при разжатии тики совпадают с исходными.
Производительность.
#property script_show_inputs input datetime inFrom = D'2024.12.01'; #include <fxsaber\TicksShort\TicksShort.mqh> // Короткий формат хранения тиков. // Возвращает размер массива в байтах. template <typename T> ulong GetSize( const T &Array[] ) { return((ulong)sizeof(T) * ArraySize(Array)); } // Критерий эффективности работы формата сжатия. template <typename T1, typename T2> double Criterion( const T1 &Decompression[], const T2 &Compression[], const ulong Interval ) { const double Performance = (double)ArraySize(Decompression) / Interval; return(Performance * ((double)GetSize(Decompression) / GetSize(Compression))); } void OnStart() { MqlTick Ticks[]; // Для исходных тиков. if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL,(ulong)inFrom * 1000) > 0) { TICK_SHORT Ticks2[]; // Для сжатых тиков. ulong Interval = GetMicrosecondCount(); TICKS_SHORT::Compress(Ticks, Ticks2); // Сжали. Interval = GetMicrosecondCount() - Interval; const double Performance = (double)ArraySize(Ticks) / Interval; Print("Compress performance: " + DoubleToString(Performance, 1) + " Ticks (millions)/sec."); Print("Compress performance criterion: " + DoubleToString(Criterion(Ticks, Ticks2, Interval), 1)); MqlTick Ticks3[]; // Для разжатых тиков. ulong Interval2 = GetMicrosecondCount(); TICKS_SHORT::Decompress(Ticks2, Ticks3); // Разжали. Interval2 = GetMicrosecondCount() - Interval2; const double Performance2 = (double)ArraySize(Ticks3) / Interval2; Print("Decompress performance: " + DoubleToString((double)ArraySize(Ticks3) / Interval2, 1) + " Ticks (millions)/sec."); Print("Decompress performance criterion: " + DoubleToString(Criterion(Ticks3, Ticks2, Interval2), 1)); Print("Correct = " + (string)TICKS_SHORT::IsEqual(Ticks, Ticks3)); // Сравнили. } }
Данный скрипт преобразует исходный массив тиков в сжатый массив и обратно. Выводятся данные производительности/эффективности.
Результат.
TicksShort_Performance (EURUSD,M1) Compress performance: 67.7 Ticks (millions)/sec. TicksShort_Performance (EURUSD,M1) Compress performance criterion: 677.1 TicksShort_Performance (EURUSD,M1) Decompress performance: 42.1 Ticks (millions)/sec. TicksShort_Performance (EURUSD,M1) Decompress performance criterion: 420.9 TicksShort_Performance (EURUSD,M1) Correct = true
Запись и чтение происходят с сохранением исходной информации со скоростью выше 40 миллионов тиков в секунду.
Альтернативы.
https://www.mql5.com/en/code/30791

Show Positions on Custom Chart (or standard chart) for MT5
Этот индикатор представляет собой утилиту, которая показывает маркированные торговые уровни на любом графике. Если вы хотите заменить родные торговые уровни на родном графике, то отключите "Показывать торговые уровни" в Свойствах графика F8 и прикрепите этот индикатор. Если же вы хотите показывать торговые уровни на пользовательском графике (на котором нельзя показывать родные торговые уровни), то просто прикрепите этот индикатор. BaseSymbol - укажите символ, из которого будут браться данные о торговых уровнях - удобно для уникальных пользовательских символов. TextBarsBack - укажите количество баров назад в истории от текущего бара, на котором будут рисоваться метки уровней. Примечание: Хотя магическое число упоминается в коде, в настоящее время оно не включено в торговые линии. Если вы запускаете несколько советников на одном и том же символе, вы можете изменить код, чтобы показать магические числа, а затем запустить несколько экземпляров индикатора на одном графике. Вы также можете изменить размер шрифта и расстояние между текстами в свойствах объекта, если это необходимо для разных разрешений дисплея.
Baseline: iMA + ATR Bands
Сочетает скользящую среднюю с верхней и нижней полосами на основе ATR, выступая в качестве фильтра тренда и канала волатильности.
Spread indicator MT5
Индикатор Spread MetaTrader - отображает текущий спред в главном окне графика. Вы можете изменять параметры шрифта, положение индикатора и нормализацию значения спреда. Спред перерисовывается после каждого тика, обеспечивая наиболее актуальное и активное значение спреда. Это может быть полезно для брокеров с переменными спредами или с часто расширяющимися спредами. Вы также можете включить отображение метки спреда рядом с текущей линией Bid. Индикатор доступен как для MT4, так и для MT5.
Schaff Trend Cycle MT5
Schaff Trend Cycle (индикатор MetaTrader) - циклический осциллятор, созданный путем вычисления стохастика над стохастиком над линией MACD с использованием циклов. В результате получилась улучшенная версия осциллятора, который не прерывается во время трендов и очень быстро реагирует на изменения. Он был разработан Дагом Шаффом, который предположил, что валютные тренды ускоряются и замедляются в циклах. Его алгоритм был обнародован в 2008 году. Schaff Trend Cycle пытается объединить два различных метода определения смены направления тренда - MACD и сглаженный стохастический осциллятор. Значение индикатора колеблется между 0 и 100. Используются два уровня срабатывания - 25 и 75. Имеются дополнительные оповещения. Вы можете скачать этот индикатор для MT4, MT5