Ошибки, баги, вопросы - страница 3155

 
murziks #:


Подскажите, вместо csv что еще Метатрейдер читать умеет?

Бинарные файлы можно читать и записывать. Переменные, структуры, массивы. Всё это записывается в файлы и читается обратно.

 

Уважаемые разработчики мобильного терминала, пожалуйста почините уже работу с письмами во вкладке "Почта".

До крайнего билда мобильного терминала (Андроид) при подключении к рабочему счёту во вкладке "Почта" навалены письма, которые ранее уже неоднократно удалялись.

Стоит только переподключиться к счёту, как во вкладке "Почта" каша из неудаленных и удаленных ранее писем. Ну что нужно сделать, чтобы от этого избавиться?

 

Объясните пожалуйста, что меняет в терминале для ПК "Сервис > Настройки > Показывать торговую историю", если при любом значении чекбокса можно включить/выключить отображение торговой истории через "ПКМ > Торговая история" и "F8 > Показывать торговую историю" ?

Ну то есть, в общих настройках терминала я могу отключить отображение торговой истории чтобы не мешала, при этом на любом графике она будет отображаться если её включить в настройках графика или через ПКМ. Не догоняю логику.

 

Уважаемые разработчики терминала для ПК. Уже давно при работе с профилями графиков (не шаблонами, а именно профилями) сохраняется странная логика, что любое изменение в профиле автоматически приводит к его сохранению без ручного указания об этом.

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

Ну почему нельзя сделать так, что пока пользователь не сохранил профиль вручную, то и изменения, которые в профиль внесены не сохранялись бы (пусть сохраняются во временный файл профиля, а не в последний рабочий профиль) ?

Много лет уже ждём изменений во встроенном интерфейсе а ля TradingView, это же наверняка Вам не сложно, а Пользователям очень удобно.

 

Почему такая разница например тест с галкой "прибыль в пипсах для ускорения расчетов" просадка 15%, а без этой галке просадка 93 %?

Какой результат более верный?

Колво сделок одинаковое

При этом в 1 случае прибыль 2 бакса а во втором 20 баксов при том же лоте.

Так же это видно если менять лот разнцица тоже на 10ку.

 
Спасибо. А то txt и не хотелось бы
 
 Криптовалюты исчезли с серверов MQ. Деградация, печаль и досада.
 

Ошибки в Generic/Queue.

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

[ВОЗМОЖНАЯ ОШИБКА] Класс контейнера CQueue

Лорис Де Марчи , 2022.02.14 13:00

Всем привет!

Я подозреваю, что по крайней мере в методах CQueue::Contains(T item) и CQueue::Remove(T item) есть ошибка.

Очередь управляется с помощью классической круговой системы «голова-хвост», поэтому этот код должен быть неправильным:

 //+------------------------------------------------------------------+
//| Removes all values from the CQueue<T>.                           |
//+------------------------------------------------------------------+
template < typename T>
bool CQueue::Contains(T item)
  {
   int count=m_size;
//--- try to find item in array
   while (count--> 0 )
     {
       //--- use default equality function
       if (::Equals(m_array[count],item))
         return ( true );
     }
   return ( false );
  }

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


Метод Remove явно терпит неудачу при запуске этого простого кода, например:

   CQueue< ulong > foo;
   foo.Enqueue( 1 );
   foo.Remove( 1 );
   foo.Enqueue( 2 );
   printf (foo.Contains( 2 ));

Он печатает «false», когда элемент явно находится в очереди...


Дайте мне знать, исправлен ли этот класс или мне следует использовать один из моих.

Спасибо!


 

Здравствуйте. Известно, что в MQL массивы могут быть как с прямой, так и с обратной индексацией (серия). Поэтому, у меня возник вопрос, как лучше всего работать с массивами в MQL, если нужна серия или, обратная индексация? Первый вариант получения значения по индексу для серии может выглядеть так.

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

Второй вариант с использованием ArraySetAsSeries.

double arrayValue(double &array[], conct int shift) {
  int len = (int)array.Size();
  double ret;
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  if (!ArraySetAsSeries(array, true))
    return WRONG_VALUE;
  ret = array[shift];
  ArraySetAsSeries(array, false);
  return ret;
}

Я конечно ничего не утверждаю, но, думаю, что, поскольку, массив это объект (что видно даже из кода приведенных примеров), то  ArraySetAsSeries просто включает массиву флаг серии и при обращении к значению по индексу происходит как в первом примере.

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

И вот так, примерно, идет обряжение к значению по индексу.

Имеет ли смысл каждый раз включать серию для массивов в обработчике OnCalculate индикаторов или лучше обращаться к младшему бару используя длину массивов rates_total?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) 
{
  Print(price[rates_total-1]); // получение цены на младшем баре без использования серии
  return(rates_total);
}

Одинаковы ли по скорости эти два представленных способа или я где-то ошибаюсь в своих размышлениях? 

 

Терминал не возвращает накопленный профит закрытых позиций. Подскажите где может быть проблема? 

double GetClosedPositionsInstrumentProfit(string symbol, datetime from) 
{
   HistorySelect(from, TimeCurrent());

   double profitSum = 0;

      for (int i = HistoryDealsTotal()-1; i >= 0; i--) 
    {   
      ulong ticket = HistoryDealGetTicket(i);
      if (ticket < 0) continue; 
      long magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      if (magic != EXPERT_MAGIC) continue; 
      string positionSymbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
      if (symbol != positionSymbol) continue; 
      
      double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) + HistoryDealGetDouble(ticket, DEAL_SWAP)+ HistoryDealGetDouble(ticket, DEAL_COMMISSION);
      profitSum += profit; 
         
      Print ("Profit " + DoubleToString(profitSum,2));              
    }         
   return profitSum;
}
Причина обращения: