Кастомный символ на основе обычного, но с заданными изменениями

 

Добрый вечер.


Подскажите, пожалуйста, пару моментов по работе с кастомными символами.


Собственно задача: сгенерировать кастомный символ на основе обычного, но в сокращённом виде для ускоренного грубого тестирования (и/или со своим спредом). Для этого хочу реализовать два варианта:
а) Берётся каждый n-й тик (если быть точным, предполагаю выбирать три тика из каждых 3*n: с max(Bid), min(Bid) и произвольный внутренний. Но не суть)
б) Берутся только тики, которые нужны для тестирования по OHLC на старшем таймфрейме, скажем, OHLC на M5
(+возможность задать свой спред или умножить текущий на некий коэффициент)

Занявшись, обнаружил, что работать ни создавать, ни добавлять тики в кастомные символы из экспертов нельзя - только из скриптов. Но это ладно. Хотел бы уточнить вот что:


1) Я правильно понимаю, что тики и бары создаются отдельно? Если я набросаю в кастомный символ какие-то тики, это не избавит от необходимости создать соответствующие минутные бары (по минутам, в которые был хоть один тик)?


2) Время в миллисекундах, которое нужно для работы с тиками, можно получить из обычного просто как long(datetime_var)*1000?


3) Более крупные бары достроятся на основе минутных автоматически?


P. S.: 4) Интересно, есть ли какая-то возможность узнать глубину загруженной истории по символу? (именно загруженной - сколько тиков и баров уже хранится в истории терминала и за какой период времени)

 

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

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

fxsaber, 2018.04.17 11:44

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

#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:

Спасибо, почитал на свежую голову исходники, вроде разобрался. Резюмируя: на вопросы 1-3 ответ "да", на 4 - "нет".
 
Quantum_Logic:
Спасибо, почитал на свежую голову исходники, вроде разобрался. Резюмируя: на вопросы 1-3 ответ "да", на 4 - "нет".

Косвенно - по наличию соответствующих tkc-файлов.

 

подскажите пожалуйста, кто знает, почему у меня в кастомных символах не получается получить число по модулю?

Вот пример формулы. По логике, график должен строиться по значениям, взятым по модулю. Но как я не крутил, по модулю не получается, числа выходят отрицательными. 


 

а вот так получается по модулю число получить


с функцией fabs что только не делал ,и иструмент в кавычки ставил тоже, никак не получается

 
Maxim Romanov:

подскажите пожалуйста, кто знает, почему у меня в кастомных символах не получается получить число по модулю?

Вот пример формулы. По логике, график должен строиться по значениям, взятым по модулю. Но как я не крутил, по модулю не получается, числа выходят отрицательными. 


А, вроде, MathAbs должно быть, не?
 
BlackTomcat:
А, вроде, MathABS должно быть, не?
Я из справки взял эту функцию. Плюс, когда ввожу в строке формул, терминал сам предлагает такую функцию. То есть все сходится. И в справке есть и терминал понимает, что такая есть. Но я попробую сейчас mathabs
 
BlackTomcat:
А, вроде, MathAbs должно быть, не?
Maxim Romanov:
Я из справки взял эту функцию. Плюс, когда ввожу в строке формул, терминал сам предлагает такую функцию. То есть все сходится. И в справке есть и терминал понимает, что такая есть. Но я попробую сейчас mathabs

Нет, на MathAbs пишет: "неверное имя функции"

 
Maxim Romanov:

Нет, на MathAbs пишет: "неверное имя функции"

Ну я бы ещё попробовал вместо просто 2 написать 2.0, чтобы не было неявного преобразования типов. Других идей нет.

 
Maxim Romanov:

подскажите пожалуйста, кто знает, почему у меня в кастомных символах не получается получить число по модулю?

Вот пример формулы. По логике, график должен строиться по значениям, взятым по модулю. Но как я не крутил, по модулю не получается, числа выходят отрицательными. 


К сожалению, это ошибка в работе терминала.

Исправил.

Исправление будет доступно в следующем билде.

Спасибо за сообщение.