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

 

Баг это или вопрос, но что-то непонятное... происходит и в тестере и дебаге... на EURUSD всё нормально, а на USDJPY вот такая проблема...

Часть кода

void funArrPositionTicket(ulong & arrBuy[], int & buySize, ulong & arrSell[], int & sellSize)
{
 double bp, sp;
  buyProfit = 0; sellProfit = 0; buyVolume = 0; sellVolume = 0;
   int i, total = PositionsTotal();
    for(i = 0; i < total; i++)
     {
      if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol)
       {
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          buySize = ArraySize(arrBuy);
           ArrayResize(arrBuy, buySize+1);
            arrBuy[buySize] = (int)PositionGetInteger(POSITION_TICKET);
           buyProfit += PositionGetDouble(POSITION_PROFIT);
          buyVolume += PositionGetDouble(POSITION_VOLUME);
         }
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          sellSize = ArraySize(arrSell);
           ArrayResize(arrSell, sellSize+1);
            arrSell[sellSize] = (int)PositionGetInteger(POSITION_TICKET);
           sp = PositionGetDouble(POSITION_PROFIT);
           sellProfit += sp;
          sellVolume += PositionGetDouble(POSITION_VOLUME);
         }
       }
     }
}/*******************************************************************/

Что из кода интересует, понятно из скринов... в коде выделено.

Есть ОДИН ордер Sell с убытком 7.39 но код выдаёт убыток всего 0.93


Зелёная стрелка на следующем скрине говорит о том, что дебаг остановлен на этой строке...



То-есть переменной sl уже присвоено значение PositionGetDouble(POSITION_PROFIT)


ВОПРОС: Почему так происходит??? Это баг или закономерность, особые свойства тестера\дебагера mql5???

Переменная sp была введена чуть позже, изначально проверялась переменная sellProfit которая обнулялась при входе в функцию.

 
Alexey Viktorov:

Баг это или вопрос, но что-то непонятное... происходит и в тестере и дебаге... на EURUSD всё нормально, а на USDJPY вот такая проблема...

На билде на десяток-другой раньше текущего была проблема, когда визуализатор показывал будущее на один тик, а MQL работал нормально - будущего не видел.

Попробуйте сравнить  PositionGetDouble(POSITION_PROFIT) на следующем тике. Если будет совпадать с тем, что показывал визуализатор до него - проблема в этом. Slawa давал разъяснения и обещал поправить.

Если нет - очередной баг тогда. 

 
fxsaber:

На билде на десяток-другой раньше текущего была проблема, когда визуализатор показывал будущее на один тик, а MQL работал нормально - будущего не видел.

Попробуйте сравнить  PositionGetDouble(POSITION_PROFIT) на следующем тике. Если будет совпадать с тем, что показывал визуализатор до него - проблема в этом. Slawa давал разъяснения и обещал поправить.

Если нет - очередной баг тогда. 

Возможно и так, но код не предусматривает проверку на следующем тике. Только один раз в момент открытия нового бара. И какие гарантии что это значения со следующего тика??? Да никаких... Запустил ещё раз, убыток показал 2.55, а в дебагере по прежнему 0.93.

Зато, пальцы в растопырку... тестер 5 на порядок лучше тестера 4... Одни глюки и неадекватная работа... Как можно отладить советник при таких заморочках??? Как ещё люди занимаются оптимизацией??? По сути оптимизация уже самообман, а с такими заморочками, самообман в степени лежачей 8.

Придётся проверять на демке... не одну неделю...

 

От того, что визуализатор показывает ерунду - это не значит, что тестер сам не верен. Проблемы визуализации тестер не волнуют, от слова совсем.

Посчитайте сами через TickValue размер профита и сравните с POSITION_PROFIT. Увидите, что все совпадает. А визуализация - бага, похоже.

 
fxsaber:

От того, что визуализатор показывает ерунду - это не значит, что тестер сам не верен. Проблемы визуализации тестер не волнуют, от слова совсем.

Посчитайте сами через TickValue размер профита и сравните с POSITION_PROFIT. Увидите, что все совпадает. А визуализация - бага, похоже.

Да пересчитал прежде чем размещать вопрос. Похоже на правду, можно пересчитать по скринам. Проверять-то я начал не спроста. От убытка считается размер лота при закрытии которого по тейку будет ожидаемый профит. На EURUSD всё считалось правильно, а на USDJPY вдруг убыток не перекрывается... Начал проверять формулу... и дошёл до этого бага. Выходит что визуализатор вообще не при делах.

 
Alexey Viktorov:

Да пересчитал прежде чем размещать вопрос. Похоже на правду, можно пересчитать по скринам. Проверять-то я начал не спроста. От убытка считается размер лота при закрытии которого по тейку будет ожидаемый профит. На EURUSD всё считалось правильно, а на USDJPY вдруг убыток не перекрывается... Начал проверять формулу... и дошёл до этого бага. Выходит что визуализатор вообще не при делах.

Извините, но я не уловил Вашу мысль. Кто, по-Вашему, бажит - тестер или визуализатор?
 

Ошибка при компиляции Script1.mq5

//Script.mqh
typedef void (*fn)();
#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void h();
        void h( fn );
#import
class A {
public:
        void f1() { h( g ); } //Error: #1 - no one of the overloads can be applied to the function call
                              //Error: #2 - cannot resolve function address
        void f2() {    g(); } //нормально (*)
        void f3() { Print( __FUNCTION__ ); }
};
//Script1.mq5
#property library
#include "Script.mqh"
void g() export
{
        A a;
        a.f3();
}

Ошибка #1. По сигнатуре вызов h здесь однозначен. 

Ошибка #2. В A::f1() вызов h( g ) в смысле g - может показаться неоднозначным, но с другой стороны в A::f2() компилятор же относительно g() не задает лишних вопросов (и правильно делает - по крайней мере поначалу существовавщие проблемы включения заголовочного файла с объявлением функции в модуль с ее реализацией и последующего использования в этом модуле давно уже были решены). И кроме того переписать по другому затруднительно, поскольку Script.mqh - общий заголовочный файл

 
fxsaber:
Извините, но я не уловил Вашу мысль. Кто, по-Вашему, бажит - тестер или визуализатор?

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

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

 

Почему warning на ровном месте?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
Уважаемые проффи, помогите, пожалуйста, понять в чем дело. Советник работает по сигналам индикатора, период которого можно изменять в широких пределах от 3-х баров вплоть до 10000 и более. Сам индикатор, в отдельности, работает исправно, адекватно реагируя на изменения периода в указанных пределах. А советник в тестере не воспринимает настройку свыше 1002 баров, сообщает "зеро дивид". В чем может быть проблема? Ограничений в коде советника не обнаружил.
Причина обращения: