Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 591
- Рейтинг:
- Опубликован:
- Обновлен:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Данная библиотека реализовывает работу с форматом хранения тиков, у которого неплохое соотношение производительности (чтение/запись) к размеру.
Формат.
Хранятся только следующие поля оригинального 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 миллионов тиков в секунду.
Альтернативы.

Этот индикатор представляет собой утилиту, которая показывает маркированные торговые уровни на любом графике. Если вы хотите заменить родные торговые уровни на родном графике, то отключите "Показывать торговые уровни" в Свойствах графика F8 и прикрепите этот индикатор. Если же вы хотите показывать торговые уровни на пользовательском графике (на котором нельзя показывать родные торговые уровни), то просто прикрепите этот индикатор. BaseSymbol - укажите символ, из которого будут браться данные о торговых уровнях - удобно для уникальных пользовательских символов. TextBarsBack - укажите количество баров назад в истории от текущего бара, на котором будут рисоваться метки уровней. Примечание: Хотя магическое число упоминается в коде, в настоящее время оно не включено в торговые линии. Если вы запускаете несколько советников на одном и том же символе, вы можете изменить код, чтобы показать магические числа, а затем запустить несколько экземпляров индикатора на одном графике. Вы также можете изменить размер шрифта и расстояние между текстами в свойствах объекта, если это необходимо для разных разрешений дисплея.

Сочетает скользящую среднюю с верхней и нижней полосами на основе ATR, выступая в качестве фильтра тренда и канала волатильности.

Индикатор Spread MetaTrader - отображает текущий спред в главном окне графика. Вы можете изменять параметры шрифта, положение индикатора и нормализацию значения спреда. Спред перерисовывается после каждого тика, обеспечивая наиболее актуальное и активное значение спреда. Это может быть полезно для брокеров с переменными спредами или с часто расширяющимися спредами. Вы также можете включить отображение метки спреда рядом с текущей линией Bid. Индикатор доступен как для MT4, так и для MT5.

Schaff Trend Cycle (индикатор MetaTrader) - циклический осциллятор, созданный путем вычисления стохастика над стохастиком над линией MACD с использованием циклов. В результате получилась улучшенная версия осциллятора, который не прерывается во время трендов и очень быстро реагирует на изменения. Он был разработан Дагом Шаффом, который предположил, что валютные тренды ускоряются и замедляются в циклах. Его алгоритм был обнародован в 2008 году. Schaff Trend Cycle пытается объединить два различных метода определения смены направления тренда - MACD и сглаженный стохастический осциллятор. Значение индикатора колеблется между 0 и 100. Используются два уровня срабатывания - 25 и 75. Имеются дополнительные оповещения. Вы можете скачать этот индикатор для MT4, MT5