Особенности языка mql5, тонкости и приёмы работы - страница 68

 
Быстрая реализация мультисимвольного OnTick

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

Анализ результатов тестов и оптимизации в тестере стратегий MetaTrader 5

fxsaber, 2018.01.28 12:25

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Советник

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
fxsaber:
Быстрая реализация мультисимвольного OnTick
Можно использовать вместо таймера? Посмотрим 
 
Vladislav Andruschenko:
Можно использовать вместо таймера? Посмотрим 

Да, в OnInit идет подписка на символы из массива

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

Последовательность выполнение Init() и DeInit()

Slava, 2017.04.14 10:21

У сервисов будет OnTick(string symbol). Но на тики от конкретного символа надо будет подписаться
 

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

Анализ результатов тестов и оптимизации в тестере стратегий MetaTrader 5

fxsaber, 2018.01.29 15:24

скорость Оптимизации зависит от последовательности проходов. Если сначала идут односимвольные проходы, а затем - многосимвольные, то время выполнения будет меньше, чем при обратной последовательности проходов Оптимизации.
После обязательной MQL5-оптимизации кода для поднятия производительности пробуйте сэкономить на Облаке и таким образом.


ЗЫ Наверное, 90% облачных денег можно было бы сэкономить нормальным написанием кода. Но это последнее, о чем думают авторы.

 
fxsaber:
Быстрая реализация мультисимвольного OnTick

Круто!!!
Это реально работает даже без долгожданных сервисов.

Спасибо большое! 

А, вот на MQL4, как ни старался, не получилось. Индикатор из iCustom моделирует пользовательские сообщения еще в течении где-то 10 миллисекунд после последнего обращения iCustom, а дальше "замолкает".

Файлы:
 
Nikolai Semko:

на MQL4, как ни старался, не получилось. Индикатор из iCustom моделирует пользовательские сообщения еще в течении где-то 10 миллисекунд после последнего обращения iCustom, а дальше "замолкает".

В MT4 за жизнью индикаторных "хендлов" следит сам Терминал. Поэтому данное решение не подходит.


ЗЫ Метод описан более семи лет назад.

Реализация мультивалютного режима в MetaTrader 5
Реализация мультивалютного режима в MetaTrader 5
  • 2011.01.10
  • Konstantin Gruzdev
  • www.mql5.com
В настоящее время мультивалютных торговых систем, индикаторов и экспертов разработано огромное количество. Тем не менее, до сих пор создатели этого "огромного количества" сталкивались со специфическими для мультивалютных систем трудностями. С выпуском в свет терминала MetaTrader 5 и языка программирования MQL5 появилась возможность  реализации...
 
При ручной отправке приказов всегда сначала вызывается OrderCheck. И если он не пройден, торговый приказ не отправляется.
 
OnTradeTransaction позволяет написать неторговый советник (Сервис), отслеживающий наличие запущенного на счете торгового "клона"-советника. Такие ситуации иногда случаются по невнимательности.
 
В MT5 даже при удалении ордеров требуется учитывать его особенности. Пример на СБ

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

Советники: VR---ZVER v.2

fxsaber, 2018.02.06 11:29

void DeleteAllOrders()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(m_order.SelectByIndex(i) && (m_order.State() == ORDER_STATE_PLACED))
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
И, конечно, желательно после OrderDelete заново проходить цикл.
 
fxsaber:
Быстрая реализация мультисимвольного OnTick
могут быть пропуски тиков
Причина обращения: