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

 
Stanislav Korotky:

Разве бид и аск не нужно местами менять?

Чтобы спред не был отрицательным - нужно.

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

У меня в этом примере открывается график кастомного символа без истории. И отрисовка баров начинается только от текущих тиков.

Как с историей сделать ?

expression not boolean  Symbol.mqh      192     17
 
ilvic:

У меня в этом примере открывается график кастомного символа без истории. И отрисовка баров начинается только от текущих тиков.

Как с историей сделать ?

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

Готовые скрипты для пользователей не публикуются в ветке.

 

Пытаюсь создать кастомный символ с историей который будет обновляться реалтайм ,на основе обычной МА .

iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);

Тики не важны ,построение по минуткам.

Попытал этот код-

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

#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 = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.ask = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.last = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
}

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);
}

Получается совсем не то что задумал(

Может кто из спецов подскажет как правильно создать кастомный символ из МА?

 
erotin:

как правильно создать кастомный символ из МА?

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

bool FillPrices( MqlTick &Tick )
{
  static const int handle = iMA(Symbol(), Period(), 1, 0, MODE_SMA, PRICE_CLOSE);
  double Array[1];
  
  const bool Res = (CopyBuffer(handle, 0, 0, 1, Array) > 0);

  if (Res)
  {
    Tick.bid = Array[0];
    Tick.ask = Array[0];
    Tick.last = Array[0];
  }
    
  return(Res);
}

void OnTick()
{
  static const SYMBOL Symb("CUSTOM_" + _Symbol, NULL, _Symbol); // Создали символ
  static const bool Init = Symb.IsExist() && Symb.IsCustom() && Symb.On() && ChartOpen(Symb.Name, PERIOD_M1);
    
  MqlTick Tick[1];
  
  if (Init && SymbolInfoTick(_Symbol, Tick[0]) && FillPrices(Tick[0]))
//    Symb += Tick;
    CustomTicksAdd(Symb.Name, Tick);
}
 
fxsaber:

Спасибо .

А как добавить ещё допустим 1 год истории показаний МА на этот график?

 
erotin:

А как добавить ещё допустим 1 год истории показаний МА на этот график?

Все остальное уже без меня.

 
fxsaber:

ЗЫ Замерил досконально на EURGBP. Выигрыш по времени получается в ~2 раза. Сделки полностью совпадают. Действительно, бесплатно!

Быстро проверил новый режим Тестера по пипсам. Результаты одиночных прогонов.


Все валюты символа установлены в валюту счета.

final balance 107448.00 EUR
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.084. Test passed in 0:00:40.141 (including ticks preprocessing 0:00:04.524).


Режим по пипсам

final balance 107448.00 pips
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.093. Test passed in 0:00:38.827 (including ticks preprocessing 0:00:04.508).


Длительность совпадает в пределах погрешности.

 

Если открыть демо-счет на сервере Swissquote-Server и запустить этот скрипт, то получим следующие строку.

2020.03.26 08:53:12.567 5, 5

Это обозначает, что в тиковой истории Bid/Ask-цены отличаются на 5 пипсов от тех, что транслируются в Обзор рынка (там лучше цены, чем в истории).

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


Единственное решение - через кастомный символ, который основывается на соответствующем демаркапе тиковой истории.

 

А интересный вопрос возник - со стаканом такая же проблема не наблюдается - то есть, чтобы в стакане цены отличались от графика?

Мне пользователь жалуется на рассинхронизацию индюка, построенного по BookEvent-ам, и чарта.

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