Библиотеки: Symbol - страница 4

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Машинное обучение в трейдинге: теория и практика (торговля и не только)

fxsaber, 2018.04.15 16:31

Давайте создадим кастомный символ с нужным распределением тиков и напишем граальную ТС. Сделаем бэктест и выложим результат.

// Пример создания кастомного символа из сгенерированных тиков

#property script_show_inputs

input string SymbName = "TESTER";

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

// Генерация тиковой истории с нужным свойством - технический пример
int GetTicks( MqlTick &Ticks[], const int Amount = 1e5 )
{
  static const MqlTick NullTick = {0};
  
  const int Size = ArrayResize(Ticks, Amount);
  
  long time = (TimeCurrent() - 7 * 24 * 3600) * 1000;
  
  for (int i = 0; i < Size; i++)
  {
    Ticks[i] = NullTick;
    
    const double Price1 = NormalizeDouble(MathRand() / 1000.0, 3);
    const double Price2 = NormalizeDouble(MathRand() / 1000.0, 3);
    
    Ticks[i].bid = MathMin(Price1, Price2);
    Ticks[i].ask = MathMax(Price1, Price2);
    
    time += MathRand();
    
    Ticks[i].time_msc = time;
    Ticks[i].time = (datetime)(time / 1000);
  }
  
  return(Size);
}

void OnStart()
{  
  CUSTOMSYMBOL Symb(SymbName); // Создали символ

  if (Symb.IsCustom())
  {
    Symb.SetProperty(SYMBOL_TRADE_STOPS_LEVEL, 0);    

    // Сделали валюты символа валютой счета
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY));

    // Для расчета профита
//    Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);
//    Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT));
    
    MqlTick Ticks[];
    
    GetTicks(Ticks); // Сформировали тиковую историю
    
    if ((Symb.AddTicks(Ticks) > 0) && (Symb.DataToSymbol() > 0) && Symb.On()) // Отправили тиковую историю в символ
      ChartOpen(Symb.Name, PERIOD_CURRENT); // Открыли график
  }
}

В этом скрипте нужно написать только свою GetTicks. На основе сгенерированной истории получится почти полноценный (кастомный) символ, доступный и для торговли в Тестере.


 
fxsaber:

Еще один сценарий использования кастомных символов (не обязательно с помощью этой библиотеки).


Возможно полностью автоматизировать регулярный бэктест советника на свежих исторических данных и передачу результатов теста в боевой советник для синхронизации картины реала с тестером. Это позволяет без написания собственного тестера реализовывать такую торговую логику


Еще одна возможность применения этой схемы:

Берется бесплатная демо-версия советника из Маркета и гонится в тестере по свежим котирам, копир берет данные с результата тестера. Соответственно, платная версия не требуется.


Возможно, нужно запрещать Маркет-советникам бэктест на кастомных символах...

// Включаем в бэктест текущий день
#property script_show_inputs

#include <Symbol.mqh> // https://www.mql5.com/ru/code/18855

input int Offset = -24 * 7; // Offset in hours

#define HOUR 3600

void OnStart()
{
  const SYMBOL Symb(_Symbol + "_Offset" + (string)Offset); // Создали символ

  if (Symb.IsExist()) // Если символ создан
  {
    Symb.CloneProperties(); // Скопировали свойства
    
    MqlRates Rates[];

    // Сместили время баров
    for (int i = CopyRates(_Symbol, PERIOD_M1, 0, (int)SeriesInfoInteger(_Symbol, PERIOD_M1, SERIES_BARS_COUNT), Rates) - 1; i >= 0; i--)
      Rates[i].time += Offset * HOUR;
      
//    Symb.CloneTicks(Ticks);

    // Записали смещенные бары и включили символ в Обзор рынка
    if ((Symb.CloneRates(Rates) > 0) && Symb.On())
      ChartOpen(Symb.Name, PERIOD_CURRENT); // Открыли график нового символа
  }
}

MT5 Build 1880 - работает пока.

 

Два способа задания проскальзываний в Тестере

  1. Вставить между реальными тиками псевдо-тики (ухудшенные цены на величину проскальзывания). Тогда нечетные тики - анализ, четные - торговля.
  2. Анализ по реальному символу, торговля - по кастомному. Кастомный - ухудшение реального на величину проскальзывания.

 

отличная библиотека, но .. процитирую

Andrey Khatimlianskii:

Благодарю! Как всегда, чуть сложнее, чем хотелось бы ;)

У ваших кодов есть одно неоспоримое преимущество — их можно брать, и использовать. Но что-либо подправить в них достаточно сложно, это минус.

очень удобно, что одной строчкой создаю полностью готовую копию кастомного символа, но:

подскажите как создать свой символ с помощью Вашей библиотеки, но не копировать исторические данные - хочу модифицировать OHLC, и не хочу портить Ваш код ))), заранее благодарен!

 
А мне интересно, зачем кастомные символы нужны? Если торгуются реальные символы, имеющиеся у ДЦ ?
 
Viktar Dzemikhau:
А мне интересно, зачем кастомные символы нужны? Если торгуются реальные символы, имеющиеся у ДЦ ?

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

есть в этом некое рац.зерно 

;)

 
Igor Makanu:

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

есть в этом некое рац.зерно 

;)

Дичь какая-то. Разница какая какой символ? Если символ реальный, то к нему можно обратиться. У меня класс символа свой. Единственный нужный член класса - название торгуемого инструмента. Задают другой инструмент, и поулчаю его все необходимые данные. Вот я и задался вопросом, попав в эту ветку, зачем кастомный символ.. Если его можно торговать, его название есть так и так, а если его торговать нельзя.. как это нельзя?
 
Viktar Dzemikhau:
Если его можно торговать, его название есть так и так, а если его торговать нельзя.. как это нельзя?

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

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

вот набросал из своей синтетики спред EURUSD - GBPUSD

https://charts.mql5.com/18/849/spread-h1-alpari-international-limited.png

очень удобно, что визуально можно график увидеть и время баров проанализировать, ну и в довесок есть все ТФ и можно в тестере стратегий прогнать стратегию, а вернуться обратно на реальные символыэто совсем не проблема

 
Igor Makanu:

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

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

Конечно, считаю. Ведь в 5-ке можно, по ходу дела, в каждый момент времени обращаться к различных инструмента. А писать под каждый инструмент класс, это избыточность. Это как есть фигуры, а мы не будет пользоваться базовым классом фигура, а писать всегда заново. Я нк критикую, конечно. fxsaber пишет достаточно грамотные вещи порой. И ему виднее, видимо ему это нужно. Но по-моему это лишнее..


Igor Makanu:

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

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

вот набросал из своей синтетики спред EURUSD - GBPUSD

https://charts.mql5.com/18/849/spread-h1-alpari-international-limited.png

очень удобно, что визуально можно график увидеть и время баров проанализировать, ну и в довесок есть все ТФ и можно в тестере стратегий прогнать стратегию, а вернуться обратно на реальные символыэто совсем не проблема

Знал бы я что это даст, возможно, и поддержал бы эту идею. А так..))

 
Igor Makanu:

подскажите как создать свой символ с помощью Вашей библиотеки, но не копировать исторические данные - хочу модифицировать OHLC, и не хочу портить Ваш код ))), заранее благодарен!

Выше приведен короткий код. Там подробные комментарии.

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