Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Просмотров:
591
Рейтинг:
(6)
Опубликован:
Обновлен:
\MQL5\Scripts\fxsaber\ \MQL5\Include\fxsaber\TicksShort\
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Данная библиотека реализовывает работу с форматом хранения тиков, у которого неплохое соотношение производительности (чтение/запись) к размеру.


Формат.

Хранятся только следующие поля оригинального 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 Show Positions on Custom Chart (or standard chart) for MT5

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

Baseline: iMA + ATR Bands Baseline: iMA + ATR Bands

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

Spread indicator MT5 Spread indicator MT5

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

Schaff Trend Cycle MT5 Schaff Trend Cycle MT5

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