Скрипты: ThirdPartyTicks

 

ThirdPartyTicks:

Исторически сложилось, что для MetaTrader 4 пользуются популярностью сторонние приложения, позволяющие получать тиковую историю из различных источников. Как правило, ее используют в Тестере Стратегий как полигон для проверки советников, а также для исследований (машинное обучение и т.д.). Некоторые источники котировок в обсуждениях стали почти стандартом при поиске "грааля".


Критерий

В представленной MQL5-библиотеке нет какого-либо критерия сравнения тиков. Не описаны причины выбора предложенного источника тикового архива. Но этот архив абсолютно свежий и, соответственно, точно не изученный. Поэтому для выработки собственного критерия ценности/полезности каждому предлагается совершить простое действие - запустить в режиме "Каждый тик на основе реальных тиков" свой советник на встроенном в MetaTrader 5 символе и на создаваемом скриптом пользовательском символе (со сторонней реальной тиковой историей), сравнив полученные результаты. Для этого не потребуется выхода за рамки Терминала и глубоких его знаний.


Скрипт

Скрипт вытягивает тиковую историю из встроенного источника и создает на ее основе соответствующие пользовательские символы.

Комментарии в исходнике частично раскрывают принцип действия.

// https://www.mql5.com/ru/code/20225
#property script_show_inputs

#include <fxsaber\ThirdPartyTicks\ThirdPartyTicks.mqh>

sinput bool   Sync = true; // Synchronization
sinput string symbol = ""; // Symbol (NULL - current, "AllSymbols" - All)

THIRDPARTYTICKS ThirdPartyTicks; // Подключились к локальному архиву котировок

// Один символ
void CreateSymbol()
{
  // Определились с символом для работы
  const string Symb = (symbol == "") ? StringSubstr(_Symbol, 0, 6) : symbol;

  if (Sync)
    ThirdPartyTicks.Refresh();                // Прочли доступные данные на источнике архива тиков

  ThirdPartyTicks[Symb].Update();             // Синхронизировали локальный архив с источником по выбранному символу
  ThirdPartyTicks[Symb].ToCustomSymbol(true); // Создали пользовательский символ на основе локального архива
}

// Все символы
void CreateAllSymbols()
{
  if (Sync)
    ThirdPartyTicks.Refresh();                     // Прочли доступные на источнике архива тиков данные

  const uint Amount = ThirdPartyTicks.GetAmount();

  for (uint i = 0; _CS(i < Amount); i++)
  {
    ThirdPartyTicks[i].Update();                   // Синхронизировали локальный архив с источником по выбранному символу
    ThirdPartyTicks[i].ToCustomSymbol();           // Создали пользовательскый символ на основе локального архива
  }
}

void OnStart()
{
  if (symbol != "AllSymbols")
    CreateSymbol();
  else if (MessageBox("Creating all the symbols can take a long time. Do you agree?", __FILE__, MB_YESNO | MB_ICONQUESTION) == IDYES)
    CreateAllSymbols();
}

Особенности

  • Используются только штатные возможности MQL5: нет DLL, подходит для Маркета;
  • Архив котировок сохраняется на локальной машине в виде ZIP-архивов с CSV-файлами;
  • Архив котировок синхронизируется с источником: скачиваются только недостающие данные;
  • В исходниках присутствуют библиотеки ZIP и Symbol;
  • Скрипт может работать с локальным архивом без подключения к интернету;
  • Допускается ручное изменение/добавление данных локального архива;
  • Файловое хранилище не зависит от наличия директорий в нем: можете создавать папки и распределять данные там по своему усмотрению;
  • Баровая история создается с учетом минимальных потерь качества при переходе от режима тестирования "Каждый тик на основе реальных тиков" к "Только цены открытия" - ТС на лимитных ордерах;
  • Ядро скрипта - одноименная библиотека. С ее помощью возможно написание более интересных сценариев;
  • Исходник не оптимизировался и предоставляется в учебных целях, как есть;
  • Чтобы используемая в качестве ядра библиотека стала полностью универсальной, требуется доработка для работы с произвольными источниками и любым форматом котировок.

Автор: fxsaber

 
Automated-Trading:

ThirdPartyTicks:

Автор: fxsaber

But the strategy tester of mt5 cannot work with that tick data - correct? :(

Will you code a script that creates an artificial symbol for MT5 from the tick data so that this artificial symbol(s) can be testes and optimized with one owns local tick data?

== google translate  ====>

Но тестер стратегий mt5 не может работать с данными тика - правильно? :(

Будете ли вы кодировать сценарий, который создает искусственный символ для MT5 из данных тика, чтобы этот искусственный символ (символы) мог быть тестируемым и оптимизирован с использованием собственных данных локального тика?
 
Carl Schreiber:

But the strategy tester of mt5 cannot work with that tick data - correct? :(

Will you code a script that creates an artificial symbol for MT5 from the tick data so that this artificial symbol(s) can be testes and optimized with one owns local tick data?

This script creates custom symbol that you can use for testing in Strategy Tester.

 
// https://www.mql5.com/ru/code/20225
#include <fxsaber\ThirdPartyTicks\Web.mqh>
#include <fxsaber\ThirdPartyTicks\String.mqh>
#include <fxsaber\ThirdPartyTicks\Data.mqh>

struct SYMBOL_PROFILE 
{
  string Name;
  
  double BuyLots;
  double SellLots;
  
  bool operator ==( const SYMBOL_PROFILE &Value) const
  {
    return(this.Name == Value.Name);
  }
  
  string ToString( void ) const
  {
    return(this.Name + " +" + ::DoubleToString(this.BuyLots, 2) + " -" + ::DoubleToString(this.SellLots, 2));
  }
};

class SYMBOLS_PROFILE : public DATA<SYMBOL_PROFILE >
{
private:
  static const uchar CensoredURL[];
  
public:
  SYMBOLS_PROFILE( const string URL = NULL )
  {
    uchar Bytes[];
    
    if (WEB::Get(Bytes, (URL == NULL) ? ::CharArrayToString(SYMBOLS_PROFILE::CensoredURL) : URL))
    {
      string Str = ::CharArrayToString(Bytes);
      
      STRING::Between(Str, "<tbody>", "</tbody");
      STRING::Between(Str, "<tbody>", "</tbody");
      Str = STRING::Between(Str, "<tbody>", "</tbody");
      
      SYMBOL_PROFILE SymbProfile;
      
      while (::StringLen(Str) > 400)
      {
        SymbProfile.Name = STRING::Between(Str, "<td width=\"10%\">", "</td>");
        SymbProfile.BuyLots = (double)STRING::Between(Str, "<span>", "</span>");
        SymbProfile.SellLots = (double)STRING::Between(Str, "<span>", "</span>");
        
        this.Add(SymbProfile);
      }
    }
  }
  
  string ToString(void ) const
  {
    string Res = NULL;
    
    const uint Size = this.GetAmount();
    
    for (uint i = 0; i < Size; i++)
      Res += this[i].ToString() + "\n";
    
    return(Res);
  }
};

static const uchar SYMBOLS_PROFILE::CensoredURL[] =
{
  0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x72, 0x61, 0x6E, 0x6E, 0x66, 0x6F,
  0x72, 0x65, 0x78, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x75, 0x2F, 0x73, 0x68, 0x6F,
  0x77, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2F
};

// Profile
void OnStart()
{
  SYMBOLS_PROFILE Symbols;
  
  Print(Symbols.ToString());
}


Результат

AUDCAD +0.06 -0.00
AUDCHF +0.02 -0.03
AUDUSD +0.05 -0.04
CADCHF +0.02 -0.03
CHFJPY +0.00 -0.01
DAX30 +0.00 -0.10
DJI30 +0.90 -0.00
EURAUD +0.16 -0.08
EURCAD +0.12 -0.00
EURCHF +0.00 -0.03
EURGBP +1.35 -19.99
EURJPY +0.00 -0.28
EURNZD +0.10 -0.00
EURRUB +0.00 -0.02
EURUSD +0.29 -0.19
GBPAUD +0.04 -0.03
GBPCAD +0.22 -0.54
GBPCHF +0.00 -0.06
GBPNZD +0.00 -0.05
GBPUSD +0.02 -0.02
NZDCAD +0.00 -0.01
NZDUSD +0.00 -0.01
USDCAD +0.09 -0.01
USDCHF +0.05 -0.01
USDJPY +0.15 -0.02
USDRUB +0.00 -0.02
USDZAR +0.00 -0.01
XAGUSD +0.00 -0.01
XAUUSD +0.02 -0.00
XBRUSD +0.00 -0.10
 

На ThirdPartyTicks-котировках без отключения проскальзывания лимитных ордеров с помощью этой библиотеки можно получить такую картину в Тестере

final balance 10005004.00 RUR
OnTester result 10004391
2018.04.04 23:59:57   deal #397 balance -613.00 [withdrawal] done
TESTER_Censored,M1: 6268667 ticks, 57486 bars generated. Environment synchronized in 0:00:00.468. Test passed in 0:00:03.416 (including ticks preprocessing 0:00:00.811).
TESTER_Censored,M1: total time from login to stop testing 0:00:03.884 (including 0:00:00.468 for history data synchronization)

Т.е. прибыль 5004 пипсов, при этом 631 пипс (каждый восьмой) - "бонус" от Тестера, что ни есть хорошо.


с отключением проскальзываний лимитных ордеров

final balance 10004391.00 RUR
OnTester result 10004391
TESTER_Censored,M1: 6268667 ticks, 57486 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:03.432 (including ticks preprocessing 0:00:00.827).
TESTER_Censored,M1: total time from login to stop testing 0:00:03.463 (including 0:00:00.031 for history data synchronization)

"бонус" отсутствует, что не вводит в доп. заблуждения.

SlipPage
SlipPage
  • голосов: 20
  • 2016.08.25
  • fxsaber
  • www.mql5.com
Проскальзывания при исполнении ордеров вносят несистемные прибыль/убыток. Данный скрипт выводит величины этих проскальзываний в валюте счета. Можно оценить качество исполнения ордеров торговавшей ТС — вклад несистемных проскальзываний в ее мат. ожидание. Тестер в режиме...
 

Вы упомянули использование каст. символов для МО, можно немного подробней?

я так понимаю, что в текущей версии это арбитраж. Или есть варианты загрузки каких-то других данных?

также интересует подгрузка данных из другого открытого терминала реал тайм, как это более правильно можно реализовать через библиотеку?

 
Maxim Dmitrievsky:

Вы упомянули использование каст. символов для МО, можно немного подробней?

Историю предложил для МО. Обосновывать не стал - см. описание. А кастомные удобны, что можно через MQL сразу и в Тестере.

я так понимаю, что в текущей версии это арбитраж. Или есть варианты загрузки каких-то других данных?

Текущая версия чего? Сам не вижу причин использовать другие источники.

также интересует подгрузка данных из другого открытого терминала реал тайм, как это более правильно можно реализовать через библиотеку?

Реал-тайм кастомные очень легко реализуются. Например, реал-тайм Equity-символ (с автоматически формируемой M1 и "тиковой" историей) создается в 5-10 строк кода на чистом MQL.

Сам же использую кастомные пока только для создания ТС на основе Тестера/Оптимизатора. Для этого использую данный инструментарий, как источник исходного материала.

Ускоряю и настраиваю Тестер/Оптимизатор уже другими средствами - см. пост выше.

 
fxsaber:

Текущая версия чего? Сам не вижу причин использовать другие источники.

текущая версия - в смысле использование котировок стороннего источника, можно же впихнуть туда какие-то макропоказатели экономич. и проч, но это так, предмет исследований для МО

А вот для арбитража (мультивалютного тестирования) на разных котировках - очень интересно, можно запилить интересные модели, но тоже предмет исследований

еще есть мысль транслировать в кастомный символ значения из произвольных распределений.. а вот как применять это дальше - тоже предмет исследований :)

 
Maxim Dmitrievsky:

текущая версия - в смысле использование котировок стороннего источника, можно же впихнуть туда какие-то макропоказатели экономич. и проч, но это так, предмет исследований для МО

А вот для арбитража (мультивалютного тестирования) на разных котировках - очень интересно, можно запилить интересные модели, но тоже предмет исследований

еще есть мысль транслировать в кастомный символ значения из произвольных распределений.. а вот как применять это дальше - тоже предмет исследований :)

Данная ветка все же не по методам использования кастомных символов. Здесь всего лишь сторонняя тиковая история в виде этих самых символов.

А вот почему именно она выбрана - см. описание.

 
fxsaber:

Данная ветка все же не по методам использования кастомных символов. Здесь всего лишь сторонняя тиковая история в виде этих самых символов.

А вот почему именно она выбрана - см. описание.

Просто мысли вслух, сорри, могу удалить предыдущие сообщения, стоит? )

Причина обращения: