Библиотеки: Virtual - страница 52

 
Forester #:

- зачем в MultiTick( void ) каждый раз создавать массив Ticks[], может где-то 1 раз его создать и потом использовать?

Он static. Надо будет сделать полем.


- в CalcOrders( void ) не очень понял что она делает... похоже что при изменении истории, коприрует  все ордера по всем символам в один OrdersCounter[].

При изменении количества живых ордеров по одному из символов.

- в   int CorrectTicksTime( MqlTick &Ticks[] ){
    const int Amount = ::MathMin(this.Size, ::ArraySize(Ticks));
размер Ticks вроде бы такой же как this.Size, ниже есть ArrayResize(Ticks, this.Size)

Нужно для перегрузки у MultiTicks-метода.

- CorrectTicksTime нужен, чтобы всем инструментам присвоить самое последнее время. Если передаем тики с индикаторов, то можно только его одного пересчитывать (см выше) или его время присвоить всем инстр. Если работаем по тикам основного, то можно без поиска старшего присвоить время тика всем инструментам.

Первый вариант еще буду править.

По идее:
как я понял, для каждого символа делается свой new ORDERS и все расчеты идут в своих массивах. С одной стороны удобно смотреть баланс по конкретному инструменту.
Но обычно мультивалютник на одном балансе работает. Как потом сделать общий отчет, общий баланс? Видимо и итоговых отчетов через Report.mqh надо несколько делать?

Так и есть.
 
Forester #:

Если исправят тестер MQ к одинаковому поведению, то будет точно совпадать со всеми инструментами.

Вроде, сейчас не должен совпадать, если, например, торговать AUDJPY на USD-счете. Т.к. Тестер на каждом тике пересчитывает TickValue.

 
fxsaber #:

Вроде, сейчас не должен совпадать, если, например, торговать AUDJPY на USD-счете. Т.к. Тестер на каждом тике пересчитывает TickValue.

Этот символ не пробовал, но в B4093 ситуация с свопами в конце теста по прежнему разная, в каких то добавляет, в каких то нет.
Вот по GBPCHF   счет в EUR свопы добавились. Как видите общая сумма до их начисления абсолютно такая же и в MQ тестере и в вашем после пересчета в цену счета.
GIF-ка

В общем удалось подобрать алгоритмы перевода цен, комиссий, свопов в цену аккаунта. Но еще не все пары проверил, вчера на GBPUSD EUR появилась ошибка по комиссии, пришлось править код. Проверил все кобинации GBP CHF USD EUR к счетам GBP CHF USD EUR
По свопам - они всегда считаются по последним ценам до ролловера.
В коде https://www.mql5.com/ru/forum/282062/page51#comment_51013502 в вызов

newSwap *= K_CURRENCY_TO_ACC_CURRENCY( this.Orders[i].GetType()==1 ? 0 : 1 );//

заменил на

newSwap *= K_SWAP_TO_ACC ( this.Orders[i].GetType(), LastTickAsk_, LastTickBid_, Day, RolloverTime_ );

А он при смене дня считает цены до ролловера. Пока пользуюсь такой функцией https://www.mql5.com/ru/forum/455977/page30#comment_51050354 , надеюсь разработчики сделают запрос побыстрее и одной строкой.

Если будете делать себе пересчет в валюту аккаунта - пишите - скину. Запарка не несколько дней оказалась. Да и то, не все пары еще проверил. С вашим опытом может побыстрее сделаете или даже где-то есть готовый код. Мне пришлось тупо перебирать варианты... как видно со скриншота, пока что все точно.
Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления
Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления
  • 2023.12.10
  • www.mql5.com
В пятницу 20 октября 2023 года будет выпущена обновленная версия MetaTrader 5. В ней мы внесли ряд улучшений в новый торговый отчет и веб-терминал...
Файлы:
22.gif  71 kb
 
fxsaber #:

Реализация довольно простая. SymbolID не понадобился. Критика приветствуется.

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

Поэтому нужен хороший мультивалютный советник для сравнения. Идеи такого советника приветствуются.


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

for (uint i = OrdersTotal(); (bool)i--;)
  if (OrderSelect(i, SELECT_BY_POS) &&
      (OrderType() == Type) &&
      (OrderMagicNumber() == Magic) &&
      (OrderSymbol() == Symbols[Num]))
  {
    OrderModify(...);
  }

Такой MT4-style подход можно было оправдать в MT4-тестере, т.к. тот моновалютный. Но в MT5-тестере - ужас писать подобное.


Целесообразно так.

for (uint i = OrdersTotal(); (bool)i--;)
  if (OrderSelect(i, SELECT_BY_POS) &&
      (OrderType() == Type) &&
      (OrderMagicNumber() == Magic) &&
      (OrderSymbolID() == Num))
  {
    OrderModify(...);
  }

Но этого нет и не будет в MT4-style. Поэтому, чтобы не самоубиваться, видится правильным писать хотя бы так.

for (uint i = OrdersTotal(); (bool)i--;)
  if (OrderSelect(i, SELECT_BY_POS) &&
      (OrderType() == Type) &&
      (OrderMagicNumber() == Magic) &&
      (VIRTUAL::GetHandle() ? (OrderSymbolID() == Num) : (OrderSymbol() == Symbols[Num])))
  {
    OrderModify(...);
  }
 
fxsaber #:

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

Поэтому нужен хороший мультивалютный советник для сравнения. Идеи такого советника приветствуются.

Да наверное сюда же https://www.mql5.com/ru/forum/282062/page46#comment_50705106
можно 10 символов на Бай и 10 на Селл добавить по номерам от 1 до 10. Или расширить до всех 28 вариантов мажоров.

Библиотеки: Virtual - Закомментировал свой расчет в AddHistoryOrder.
Библиотеки: Virtual - Закомментировал свой расчет в AddHistoryOrder.
  • 2023.11.23
  • www.mql5.com
то он возьмет своп предыдущего перенесенного в историю ордера. А переносимый ордер посчитает своп во время выпонения AddHistoryOrder Если ваш вариант. где вызывается AddHistoryOrder и происходит перенос в историю
 
Forester #:

GIF-ка

Явная ошибка либо в Virtual, либо в Report.


Что касается,

Этот символ не пробовал

посмотрите реакцию этого советника в Тестере.
void OnTick()
{
  static double PrevTickValue = 0;
  
  if (SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE) != PrevTickValue)
    Print(PrevTickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
}

Точного совпадение быть не может. И пересчитывать TickValue - это еще одно самоубийство.

 
fxsaber #:

Явная ошибка либо в Virtual, либо в Report.

Ошибка в MQ тестере - это он добавил свопы в конце теста, а не должен.

fxsaber #:

 И пересчитывать TickValue

Не считаю через него, не все пары совпали. Может у вас получится... Считаю по другому, но тоже долго.
Код подходит только для пересчета профита в валюту аккаунта (свопам и комиссиям не подойдет)

double K_CURRENCY_TO_ACC_CURRENCY ( int type = 0 ){//вычисление коэффициента цены символа, к валюте аккаунта. type=0=ORDER_TYPE_BUY если покупаем, =1=ORDER_TYPE_SELL если продаем. 
   //вариант через запрос по прибыльной/убыточной прзиции
   //неверно для //EURUSD CHF -> USDCHF и EURCHF USD->USDCHF, USDCHF EUR ->EURCHF 
   //if(type==1){ return (SymbolInfoDouble(SYMBOL, SYMBOL_TRADE_TICK_VALUE_PROFIT ) / (CONTRACT_SIZE * POINT)); }//стоимость тика для прибыльной позиции
   //else{        return (SymbolInfoDouble(SYMBOL, SYMBOL_TRADE_TICK_VALUE_LOSS   ) / (CONTRACT_SIZE * POINT)); }//стоимость тика для убыточной позиции

   double k_acc = 0.0;
   if(PROFIT_Is_ACC) {return 1.0;}//профит уже в валюте аккаунта  EURUSD USD, USDCHF CHF, EURCHF CHF
   if(BASE_Is_ACC){
      //if( is_PROFIT_ACC) //PROFIT_ACC = PROFIT_BASE - перевернутых к себе не бывает
      if( is_ACC_PROFIT && SymbolInfoDouble(ACC_PROFIT, (type==1 ? SYMBOL_ASK : SYMBOL_BID ), k_acc)){return 1.0 / k_acc;}//USDCHF USD ->USDCHF, EURUSD EUR -> EURUSD, EURCHF EUR -> EURCHF
   }else{
      if( is_PROFIT_ACC && SymbolInfoDouble(PROFIT_ACC, (type==1 ? SYMBOL_ASK : SYMBOL_BID ), k_acc)){return k_acc;}//EURUSD CHF -> USDCHF 
      if( is_ACC_PROFIT && SymbolInfoDouble(ACC_PROFIT, (type==0 ? SYMBOL_ASK : SYMBOL_BID ), k_acc)){return 1.0 / k_acc;}//EURCHF USD->USDCHF, USDCHF EUR ->EURCHF 
   }
   
   return k_acc;
}

Строки ACC_PROFIT, PROFIT_ACC заранее собрал и пометил из bool-ами is_PROFIT_ACC, is_ACC_PROFIT, что они существуют.

 
Forester #:
Строки ACC_PROFIT, PROFIT_ACC заранее собрал и пометил из bool-ами is_PROFIT_ACC, is_ACC_PROFIT, что они существуют.
Попробую все это оформить в структуру и массив структур по инструментам, А в фунции передавать как ссылку на структуру. Такой вариант будет универсальнее. Сейчас все работает только с 1м символом. Из массива можно будет выбирать нужный символ.
 
Forester #:

не все пары совпали.

Не понимаю, зачем нужно, чтобы совпали? Нужна золотая середина между скоростью и точностью. У Тестера со скоростью швах, золотой серединой не пахнет.
 
fxsaber #:

Остальное дописать - рутина, т.к. архитектурно все решилось.

https://www.mql5.com/ru/blogs/post/755348

Мультисимвольное виртуальное окружение.
Мультисимвольное виртуальное окружение.
  • www.mql5.com
Данный пост посвящен дополнительному функционалу библиотеки виртуального окружения Virtual : Мультисимвольность. Теперь можно торговать в VIrtual не по одному символу, а по любым в одном виртуальном