Новая версия платформы MetaTrader 5 build 1640: создание и тестирование собственных финансовых инструментов - страница 7

 
pivomoe:


Мне кажется там не хватает функции, которая делает пользовательский символ, который является точной копией обычного. Конечно не особо трудно с помощью этого десятка функций все настроить, но тогда возникает вопрос. А что будет если вы расширите какое нибудь перечисление из свойств символа ? Наши советники, то об этом не узнают. Соответственно это уже будет не точная копия.

Нет. Вы явно должны установить все свойства кастомного символа

Что значит "наши советники об этом не узнают"?

Советники, скомпилированные год назад, уже сейчас много чего не знают.

Поддерживайте своих советников, перекомпилируйте их, и проблем никаких не будет. "Мы в ответе за тех, кого приручили"

 
Slava:
Нет. Вы явно должны установить все свойства кастомного символа

На самом деле, когда доходит до практического применения, в 99% исходят из копии, а потом небольших правок.

Например, когда руками создаем, только мазохист начнет ставить каждое поле с нуля. Ну и у Вас по этой причине в GUI предусмотрена возможность скопировать полностью настройки и даже их сохранить.

Поэтому и логично иметь штатный вариант копирования всех настроек и Load/Save их через файлы.


А не писать целую портянку для копирования - ну вот она

class SYMBOL
{
public:
  const string Name;

  SYMBOL( const string Symb = NULL, const string Path = NULL ) : Name((Symb == NULL) ? _Symbol : Symb)
  {
    if (!this.GetProperty(SYMBOL_CUSTOM))
      ::CustomSymbolCreate(this.Name, Path);
  }

  bool SetProperty( const ENUM_SYMBOL_INFO_DOUBLE Property, double Value ) const
  {
    return(::CustomSymbolSetDouble(this.Name, Property, Value));
  }

  bool SetProperty( const ENUM_SYMBOL_INFO_INTEGER Property, long Value ) const
  {
    return(::CustomSymbolSetInteger(this.Name, Property, Value));
  }

  bool SetProperty( const ENUM_SYMBOL_INFO_STRING Property, string Value ) const
  {
    return(::CustomSymbolSetString(this.Name, Property, Value));
  }

  long GetProperty( const ENUM_SYMBOL_INFO_INTEGER Property ) const
  {
    return(::SymbolInfoInteger(this.Name, Property));
  }

  double GetProperty( const ENUM_SYMBOL_INFO_DOUBLE Property ) const
  {
    return(::SymbolInfoDouble(this.Name, Property));
  }

  string GetProperty( const ENUM_SYMBOL_INFO_STRING Property ) const
  {
    return(::SymbolInfoString(this.Name, Property));
  }

  bool Delete( void ) const
  {
    return(::CustomSymbolDelete(this.Name));
  }

#define CLONE(A) this.SetProperty(A, Source.GetProperty(A))

  bool CloneProperties( const string Symb = NULL ) const
  {
    const SYMBOL Source(Symb);

    return(CLONE(SYMBOL_BASIS) &&
    CLONE(SYMBOL_CURRENCY_BASE) &&
    CLONE(SYMBOL_CURRENCY_MARGIN) &&
    CLONE(SYMBOL_CURRENCY_PROFIT) &&
    CLONE(SYMBOL_DESCRIPTION) &&
    CLONE(SYMBOL_FORMULA) &&
    CLONE(SYMBOL_ISIN) &&
    CLONE(SYMBOL_PAGE) &&
    CLONE(SYMBOL_PATH) &&

    CLONE(SYMBOL_MARGIN_HEDGED) &&
    CLONE(SYMBOL_MARGIN_INITIAL) &&
    CLONE(SYMBOL_MARGIN_MAINTENANCE) &&
    CLONE(SYMBOL_OPTION_STRIKE) &&
    CLONE(SYMBOL_POINT) &&
    CLONE(SYMBOL_SESSION_PRICE_LIMIT_MAX) &&
    CLONE(SYMBOL_SESSION_PRICE_LIMIT_MIN) &&
    CLONE(SYMBOL_SESSION_PRICE_SETTLEMENT) &&
    CLONE(SYMBOL_SWAP_LONG) &&
    CLONE(SYMBOL_SWAP_SHORT) &&
    CLONE(SYMBOL_TRADE_ACCRUED_INTEREST) &&
    CLONE(SYMBOL_TRADE_CONTRACT_SIZE) &&
    CLONE(SYMBOL_TRADE_FACE_VALUE) &&
    CLONE(SYMBOL_TRADE_LIQUIDITY_RATE) &&
    CLONE(SYMBOL_TRADE_TICK_SIZE) &&
    CLONE(SYMBOL_TRADE_TICK_VALUE) &&
    CLONE(SYMBOL_VOLUME_LIMIT) &&
    CLONE(SYMBOL_VOLUME_MAX) &&
    CLONE(SYMBOL_VOLUME_MIN) &&
    CLONE(SYMBOL_VOLUME_STEP) &&

    CLONE(SYMBOL_BACKGROUND_COLOR) &&
    CLONE(SYMBOL_CHART_MODE) &&
    CLONE(SYMBOL_DIGITS) &&
    CLONE(SYMBOL_EXPIRATION_MODE) &&
    CLONE(SYMBOL_EXPIRATION_TIME) &&
    CLONE(SYMBOL_FILLING_MODE) &&
    CLONE(SYMBOL_MARGIN_HEDGED_USE_LEG) &&
    CLONE(SYMBOL_OPTION_MODE) &&
    CLONE(SYMBOL_OPTION_RIGHT) &&
    CLONE(SYMBOL_ORDER_GTC_MODE) &&
    CLONE(SYMBOL_ORDER_MODE) &&
    CLONE(SYMBOL_SPREAD) &&
    CLONE(SYMBOL_SPREAD_FLOAT) &&
    CLONE(SYMBOL_START_TIME) &&
    CLONE(SYMBOL_SWAP_MODE) &&
    CLONE(SYMBOL_SWAP_ROLLOVER3DAYS) &&
    CLONE(SYMBOL_TICKS_BOOKDEPTH) &&
    CLONE(SYMBOL_TRADE_CALC_MODE) &&
    CLONE(SYMBOL_TRADE_EXEMODE) &&
    CLONE(SYMBOL_TRADE_FREEZE_LEVEL) &&
    CLONE(SYMBOL_TRADE_MODE) &&
    CLONE(SYMBOL_TRADE_STOPS_LEVEL));
  }

#undef CLONE

  int CloneHistory( string Symb = NULL ) const
  {
    Symb = (Symb == NULL) ? _Symbol : Symb;

    MqlRates Rates[];

    const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);

    return((Size > 0) ? ::CustomRatesReplace(this.Name, Rates[0].time, Rates[Size - 1].time, Rates) : -1);
  }

  bool Clone( const string Symb = NULL ) const
  {
    return(this.CloneProperties() && (this.CloneHistory() != -1));
  }

  bool operator =( const string Symb ) const
  {
    return(this.Clone(Symb));
  }

//......

Специально привел полностью, чтобы показать, как это неприятно. И стоит добавить/удалить свойство символа, как надо будет править портянку.

Да, благодаря ООП пользоваться может очень удобно

  const SYMBOL Symb(_Symbol + PostFix); // Создали символ

  Symb = _Symbol; // Скопировали с основного символа все свойства и баровую историю - клон

Но от этого некоторая нелогичность не исчезла, а просто осталась завуалированной.


ЗЫ Портятку можно переписать в более лаконичный вид - в виде массива свойств и цикла установки по нему. Но это опять же будет завуалированной нелогичностью.

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 

Не осознавал раньше, но сейчас понимаю, что в MT4 в GUI-тестера была, действительно, очень удобная фишка - переход на исходник советника, который выставлен для тестирования.

В MT5 этого нет. Вот выбрал советник для теста и решил что-то в нем подправить, а на исходник не перейти одним нажатием, как это было в MT4. Надо лезть в редактор и искать файл с исходником.


Но что очень раздражает, это необходимость постоянного повторного выбора советника в GUI MT5-тестера, если его перекомпилируешь. Это не нужно делать только в том случае, если запустишь отладку на исторических данных (CTRL+F5), но делаю это не часто, поэтому настройки тестера после перекомпиляции слетают, что, мягко говоря, раздражает.

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии ( советники ) перед началом использования их в реальной торговле. При...
 

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

Библиотеки: Report

fxsaber, 2017.07.27 08:51

На данный момент MT5-тестер при составлении отчетов тестирования нигде не упоминает о флаге кастомности символов, по которым тестирует.

 
fxsaber:

Не осознавал раньше, но сейчас понимаю, что в MT4 в GUI-тестера была, действительно, очень удобная фишка - переход на исходник советника, который выставлен для тестирования.

В MT5 этого нет. Вот выбрал советник для теста и решил что-то в нем подправить, а на исходник не перейти одним нажатием, как это было в MT4. Надо лезть в редактор и искать файл с исходником.


Но что очень раздражает, это необходимость постоянного повторного выбора советника в GUI MT5-тестера, если его перекомпилируешь. Это не нужно делать только в том случае, если запустишь отладку на исторических данных (CTRL+F5), но делаю это не часто, поэтому настройки тестера после перекомпиляции слетают, что, мягко говоря, раздражает.

Правда? Я думал что это бесит только меня одного, оказывается не только меня.

 
Vitaly Muzichenko:

Правда? Я думал что это бесит только меня одного, оказывается не только меня.

Можно создать целую ветку с "Бесит в тестере МТ5", но в итоге опять окажется, что весь МТ5 само совершенство. )))
 
Anton:

1. Можете визуально (через FAR или какой-нибудь просмотрщик) посмотреть что внутри файла - он весь заполнен данными или только малая часть (остальные это 0-ли, которые отображаются как пустота или пробелы)

2. До этого когда вы последний раз запускали тестирование на сервере BCS5?

3. Если закрыть терминал и удалить файл с тиками и запустить по новой терминал и тестирование, то опять файл разрастается до 20 гбайт?


Здравствуйте! Тот же баг с огромным файлом тиковой истории (реальный счет в открывашке, вчера, после закрытия торгов). Делал запрос глубокой истории через CopyTick и руками. В сервисдеск писать? или уже нашли проблему?

 
fxsaber:

Не осознавал раньше, но сейчас понимаю, что в MT4 в GUI-тестера была, действительно, очень удобная фишка - переход на исходник советника, который выставлен для тестирования.

В MT5 этого нет. Вот выбрал советник для теста и решил что-то в нем подправить, а на исходник не перейти одним нажатием, как это было в MT4. Надо лезть в редактор и искать файл с исходником.


Но что очень раздражает, это необходимость постоянного повторного выбора советника в GUI MT5-тестера, если его перекомпилируешь. Это не нужно делать только в том случае, если запустишь отладку на исторических данных (CTRL+F5), но делаю это не часто, поэтому настройки тестера после перекомпиляции слетают, что, мягко говоря, раздражает.


У меня слетает выбранный советник в тестере стратегий при перекомпеляции, только когда этот советник последний в списке выбора советников.

Скорее всего в МТ выбраный советник определяется по номеру в списке.
Когда идет перекомпиляция, то удаляется и создается исполняемый файл.
В этот момент МТ не может выбрать соответствующий файл из списка по номеру и сбрасывает на значение по умолчанию.
Как результат происходит сброс выбранного в тестере стратегий советника.

 
Sergey Dzyublik:

У меня слетает выбранный советник в тестере стратегий при перекомпеляции, только когда этот советник последний в списке выбора советников.

Скорее всего в МТ выбраный советник определяется по номеру в списке.
Когда идет перекомпиляция, то удаляется и создается исполняемый файл.
В этот момент МТ не может выбрать соответствующий файл из списка по номеру и сбрасывает на значение по умолчанию.
Как результат происходит сброс выбранного в тестере стратегий советника.

А с такими ситуациями, как перечислено ниже, кроме того, что уже отметили, не сталкивались?

  • После компиляции эксперта, если он был выбран в тестере, то заменяется другим.
  • После оптимизации и запуска теста прохода не отключается режим оптимизации. Часто забываешь об этом и вместо теста прохода нажатием на кнопке "Старт" случайно запускаешь оптимизацию снова.

Также бывают ситуации, когда (воспроизвести сложно, так как возникают спонтанно и редко):

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

Оптимизация стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Оптимизация стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии ( советники ) перед началом использования их в реальной торговле. При...
 

Билд 1643.

В МетаЭдиторе если нажать кнопку для вывода функций - не всегда виден список (скриншот прилагаю)

Как предположение, может связано с тем, что это файл MQH  и он использует #include других MQH-файлов.

В соседних открытых файлах списки функций - видны.
Файлы:
func.png  211 kb
Причина обращения: