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

 
class CURRENCY_CHECK
{
public:
  CURRENCY_CHECK( void )
  {
    const string CurrencyProfit = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
    const string AccountCurrency = ::AccountInfoString(ACCOUNT_CURRENCY);
    const bool Res = !::MQLInfoInteger(MQL_TESTER) || (CurrencyProfit == AccountCurrency);
    
    if (!Res && !::MQLInfoInteger(MQL_OPTIMIZATION))
    {
      ::Print(CurrencyProfit + " = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = " + AccountCurrency);
      
      ::TesterStop();
    }
  }
};

CURRENCY_CHECK CurrencyCheck; // Не дает тестироваться медленным вариантам

2018.07.01 00:00:00   TER = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = USD
TesterStop() called on 0% of testing interval
 
// Скрипт задает комиссию для всех позиций с не нулевым профитом.
#property script_show_inputs

input double inCommission = 0.004; // Комиссия в процентах за круг (0.004 - 20 единиц на сторону за миллион)
input bool inAdd = false;          // true - добавляется к текущей, false - заданное значение

#include <Symbol.mqh>

string CommissionToString( const double TickValue )
{
  const double Commission = 1 - TickValue;
  
  return("Commission = " + DoubleToString(Commission * 100, 5) + "% per round (" + DoubleToString(Commission * 1000000 / 2, 1) + " per million (one side))");
}

void OnStart()
{
  const SYMBOL Symb;
  
  if (Symb.IsCustom())
  {
    const double TickValue = Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE);
    const double NewTickValue = inAdd ? TickValue * (1 - inCommission / 100) : 1 - inCommission / 100;
    
    if ((MessageBox(Symb.Name + "\nBefore: " + CommissionToString(TickValue) +
                   "\nAfter: " + CommissionToString(NewTickValue) + "\n\n Do you agree?", "Commission Change", MB_YESNO) == IDYES) &&
        Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, NewTickValue))
      MessageBox(Symb.Name + ": current " + CommissionToString(Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE)));
  }
}


ЗЫ Пока не работает.

 

если не затруднит, то хотел бы пример как библиотеку Symbol использовать правильно для генерации кастомного символа - пусть это будет 1/EURUSD = USDEUR

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

заранее благодарен

 
Igor Makanu:

если не затруднит, то хотел бы пример как библиотеку Symbol использовать правильно для генерации кастомного символа - пусть это будет 1/EURUSD = USDEUR

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

заранее благодарен

// Пример создания перевернутого символа

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

CUSTOMSYMBOL CustomSymb(StringSubstr(_Symbol, 3, 3) + StringSubstr(_Symbol, 0, 3) + StringSubstr(_Symbol, 6)); // Создали символ

double ReversePrice( const double Price )
{
  return(Price ? NormalizeDouble(1 / Price, _Digits) : 0);
}

void ReverseTick( MqlTick &Tick )
{
  Tick.bid = ReversePrice(Tick.bid);
  Tick.ask = ReversePrice(Tick.ask);
  Tick.last = ReversePrice(Tick.last);
}

bool ReverseTicks( MqlTick &Ticks[] )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    ReverseTick(Ticks[i]);
    
  return(true);
}

bool GetTicks( MqlTick &Ticks[] )
{
  return(CopyTicks(_Symbol, Ticks) > 0);
}

void OnInit()
{
  MqlTick Ticks[];
  
  if (CustomSymb.IsCustom() && GetTicks(Ticks) && ReverseTicks(Ticks) &&
      (CustomSymb.AddTicks(Ticks) > 0) && (CustomSymb.DataToSymbol() > 0) && CustomSymb.On())
    ChartOpen(CustomSymb.Name, PERIOD_CURRENT); // Открыли график
}

void OnTick()
{  
  MqlTick Tick[1];
  
  if (CustomSymb.IsCustom() && SymbolInfoTick(_Symbol, Tick[0]) && ReverseTicks(Tick))
    CustomTicksAdd(CustomSymb.Name, Tick);
}
 
fxsaber:

Спасибо!

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

----------------------------------


запустил пример // Пример создания перевернутого символа

все четко, вообще фантастика, что в пару строк можно получить реально живой кастомный символ программно, очень крутая штука!

ЗЫ: в билде 1158 при компиляции появилось предупреждение:

expression not boolean Symbol.mqh 192 17

в файле Symbol.mqh метод  bool IsCustom( void ) const
 
Igor Makanu:

ЗЫ: в билде 1158 при компиляции появилось предупреждение:

expression not boolean Symbol.mqh 192 17

в файле Symbol.mqh метод  bool IsCustom( void ) const

Забываю обновлять, в КБ уже прилично кода своего лежит, что уж говорить о дебрях своей MQL-папки...

Обновил.

 
fxsaber:

Обновил.

обновил:

0 error(s), 0 warning(s), compile time: 1220 msec

все ОК, спасибо!
 

Здравствуйте!

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

Хочется просто склеить фьючерсы друг за другом, как это есть по факту - всю их историю, а в советнике просто сделать точки по датам периодов, где торговля не ведется.
 
Aleksey Vyazmikin:

Здравствуйте!

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

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

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


Единственное, нужно определиться с ценой формирования баров и по каким ценам будут исполняться маркет-ордера. Я бы исключил last-цены, но каждый волен решать самостоятельно, что ему нужно.

 
fxsaber:

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


Единственное, нужно определиться с ценой формирования баров и по каким ценам будут исполняться маркет-ордера. Я бы исключил last-цены, но каждый волен решать самостоятельно, что ему нужно.

Исходные данные конечно есть в терминале - фьючерсы прошлых лет. А что значит формирование тикового архива? Вообще меня бы устроил варианттестирования  OHLC на M1, без лишних тиков, так сказать.

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

Поможете с таким скриптом?

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