Скачать MetaTrader 5

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 16

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Artyom Trishkin
Модератор
92392
Artyom Trishkin  
fxsaber:

Интересно. И такой вопрос. Мне не понравилась текущая реализация и я ее подрихтовал. Конечно, криво. Как получить оригинал библы?

Вот - из 1702

Файлы:
Generic.zip 44 kb
fxsaber
10813
fxsaber  
Artyom Trishkin:

Вот - из 1702

Спасибо! Вынесу вопрос разработчикам. Т.к. я еще тот рихтовальщик...

Vasiliy Sokolov
30824
Vasiliy Sokolov  

Пример 2: Торговля несколькими экспертами на нетто-счете

Нетто-представление головная боль, для тех, кто торгует несколькими экспертами на одном символе одновременно. Для разруливания ситуаций, когда оба эксперта находятся в хедже, но должны понимать, что отсутствие нетто-позиции на самом деле не говорит о том, что они не в рынке, порождает сложный код. Одним из решений служит подсчет вклада каждого эксперта в совокупную позицию. Для этого надо проанализивароть всю историю, и рассчитать, какое-число контрактов принадлжит каждому уникальному меджику. Если число равно 0.0 - эксперт в не рынка, если отрицательное - эксперт держит короткую позицию, если положительное - длиную. На самом деле сделать это очень просто, если использовать CHashMap, для этого достаточно разложить все сделки по магическим ордерам просуммировав их объем. Очень упрощенный код (прототип) я накидал ниже:

//+------------------------------------------------------------------+
//|                                                 NettoByMagic.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Generic\HashMapGen.mqh>

CHashMap<ulong, double> PositionsByMagic;
int prev_deals = 0;
//+------------------------------------------------------------------+
//| Добавляет новый объем и его меджик                               |
//+------------------------------------------------------------------+
void AddVolume(ulong magic, double volume)
{
   double cur_volume = 0.0;
   if(PositionsByMagic.TryGetValue(magic, cur_volume))
      PositionsByMagic.TrySetValue(magic, cur_volume+volume);
   else
      PositionsByMagic.Add(magic, volume);
}
//+------------------------------------------------------------------+
//| Добавляет новые сделки в словарь                                 |
//+------------------------------------------------------------------+
void ParseDeals()
{
   HistorySelect(0, TimeCurrent());
   for(int i = prev_deals; i < HistoryDealsTotal(); i++)
   {
      ulong ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetString(ticket, DEAL_SYMBOL)!= Symbol())
         continue;
      ENUM_DEAL_TYPE deal_type = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
      double volume = 0.0;
      if(deal_type == DEAL_TYPE_BUY)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
      else if(deal_type == DEAL_TYPE_SELL)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME)*(-1);
      else
         continue;
      ulong magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      AddVolume(magic, volume);
   }
   prev_deals = HistoryDealsTotal();
}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   ParseDeals();
   for(int i = 0, k = 0; i < PositionsByMagic.Count(); i++)
   {
      ulong magic = PositionsByMagic.GetKeyAt(i);
      double valume = PositionsByMagic.GetValueAt(i);
      if(k == 10)
         break;
   }
}
//+------------------------------------------------------------------+

Внимание! Для упрощения код рассчитывает только нетто-объем для текущего символа. Также CHashMap в текущей реализации не содерижит итераторов перебора, поэтому я на скорую руку сделал такие итераторы. Изменненный CHashMap представлен во вложении.

Файлы:
Alexey Oreshkin
7889
Alexey Oreshkin  
fxsaber:

Скорость тестера важна для трейдинга? Если да, то HashMap так же влияет на трейдинг, т.к. увеличивает скорость разработки и выполнения ТС.

Тестер, оптимизация и торговля это разные вещи.

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

fxsaber
10813
fxsaber  
Alexey Oreshkin:

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

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

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения

fxsaber, 2017.12.08 22:46

Для более реального тестерного случая (2000 сделок и 1 000 000 единичных обращений к истории) результат выглядит так

2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 122969
2017.12.05 00:00:00   Time[SetHashMap()] = 816
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 23852
2017.12.05 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 114427

Почти 100 мс экономии на проход! Если, допустим, делаем Оптимизацию на 10 000 полноценных проходов, то Hash-вариант закончится на 15 минут быстрее.

fxsaber
10813
fxsaber  
Vasiliy Sokolov:

Пример 2: Торговля несколькими экспертами на нетто-счете

Забыли
prev_deals = HistoryDealsTotal();


Хороший пример! Действительно, удобно.

Vasiliy Sokolov
30824
Vasiliy Sokolov  
fxsaber:
Забыли

Хороший пример! Действительно, удобно.

Исправил.

fxsaber
10813
fxsaber  

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

Generic - не такой велосипед. Быстро и правильно написать не получится. Допилили бы только.

Alexey Oreshkin
7889
Alexey Oreshkin  
fxsaber:

Отличный теоретический пример! На практике кто-нить когда-нить оперировал тысячами сделок ?

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

Vasiliy Sokolov
30824
Vasiliy Sokolov  
Alexey Oreshkin:

На практике кто-нить когда-нить оперировал тысячами сделок ?

На Forts каждый первый.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий