Новая версия MetaTrader 4 Client Terminal 388 - страница 6

 

При обновлении на 388 версию, все ранее написанные советники отказываются корректно работать.

Начну:

1. for(int i=0;i<OrdersTotal();i++) OrderSelect(i,0,0) ...

При работе на реальном/демо счете индексу i=0 соответствует размер депозита, а i=1 и т.д. ордеры. При тестировании, индекс открытых ордеров начинается с i=0. При этом начальный размер депо отсутствует! Баг?

2. Функция GlobalVariableDel(); теперь вообще не работает. Приходится использовать новую GlobalVariableDeleteAll();, а она удаляет лишнее, в итоге приходится восстанавливать их из памяти.

3. Итог вычисления маржи через спред marketinfo отличается от AccFreeMargin()-AccFreeMarginCheck(). Иногда на десятые-сотые доли, а иногда на 20-60 баксов. Но наверное это вина брокера. При открытии позиции сумма маржи совпадает с AccFreeMargin()-AccFreeMarginCheck().

4. При тестировании, marketinfo вместо дневных максимумов и минимумов возвращает 0. Так задумано?

Остальное потом напишу... или скорее всего откачусь на более раннюю версию.

 
Alexandr27:

При обновлении на 388 версию, все ранее написанные советники отказываются корректно работать.

Начну:

1. for(int i=0;i<OrdersTotal();i++) OrderSelect(i,0,0) ...

При работе на реальном/демо счете индексу i=0 соответствует размер депозита, а i=1 и т.д. ордеры. При тестировании, индекс открытых ордеров начинается с i=0. При этом начальный размер депо отсутствует! Баг?

2. Функция GlobalVariableDel(); теперь вообще не работает. Приходится использовать новую GlobalVariableDeleteAll();, а она удаляет лишнее, в итоге приходится восстанавливать их из памяти.

3. Итог вычисления маржи через спред marketinfo отличается от AccFreeMargin()-AccFreeMarginCheck(). Иногда на десятые-сотые доли, а иногда на 20-60 баксов. Но наверное это вина брокера. При открытии позиции сумма маржи совпадает с AccFreeMargin()-AccFreeMarginCheck().

4. При тестировании, marketinfo вместо дневных максимумов и минимумов возвращает 0. Так задумано?

Остальное потом напишу... или скорее всего откачусь на более раннюю версию.


1. В четвёрочном тестере так было всегда.

2. В этом месте мы ничего не трогали. Однако перепроверили Ваше заявление. Функция GlobalVariableDel работает, как и работала, правильно. Пожалуйста, предоставьте исходный код, который иллюстрирует указанную проблему.

3. В этом месте также ничего не трогали. Аналогичная просьба - покажите Вашу формулу расчёта через спред. Попутный вопрос, несовпадения расчётных значений происходят в тестере или при реальной работе советника?

4. В четвёрочном тестере так было всегда.

 

Запустил отладку советника на 388 билде. Пришел утром - сообщение Out of Memory.

В диспетчерез задач наблюдаю неуклонный рост потребляемой памяти. За 5 минут плюс 200МБ.

Советник мультивалютный, может это поможет. Стоит Windows7, 32 бита.

Пока откатываюсь на страрый билд.

На 387 память стоит как вкопанная.

В итоге все равно откатился еще дальше, до версии 229. Потому что в 387-я зависает. Показывается какое-то непрорисованное окно с надписью в заголовке "Сигнал" и программа висит. Вместо графиков - "Ожидание обновления". И так пару часов, пока не мне не надоело. ДО перехода с 387 на 388 этот глюк неоднократно проявлялся, надеялся что исправили.

так что пока работаю снова с 229, никаких проблем.

 
stringo:


1. В четвёрочном тестере так было всегда.

2. В этом месте мы ничего не трогали. Однако перепроверили Ваше заявление. Функция GlobalVariableDel работает, как и работала, правильно. Пожалуйста, предоставьте исходный код, который иллюстрирует указанную проблему.

3. В этом месте также ничего не трогали. Аналогичная просьба - покажите Вашу формулу расчёта через спред. Попутный вопрос, несовпадения расчётных значений происходят в тестере или при реальной работе советника?

4. В четвёрочном тестере так было всегда.

1. Хреново.


2. Поправочка, вот так удаляется:

bool A=0;

void start()

{

string Name="Euro";

if (GlobalVariableCheck(Name)) GlobalVariableDel(Name);

if (A) return;

GlobalVariableSet(Name,12345.0);

A=1;

}

А вот так переменные остаются как вкопанные.

bool A=0;

void start()

{

string Name="Euro";

string Name2="Euro2";

if (GlobalVariableCheck(Name))

{

GlobalVariableDel(Name);

GlobalVariableDel(Name2);

}

if (A) return;

GlobalVariableSet(Name,12345.0);

GlobalVariableSet(Name2,123456.0);

A=1;

}

Причем, если перенести в функцию init() то всё работает.

3. Долго резать кусок кода из советника, он разбит на несколько функций. Попозже постараюсь. Сейчас могу точно сказать, что в .226 версии маржа всегда правильно вычислялась и изменения в код с тех пор не вносились.

4. Хреново.

 
dimonsky:

Запустил отладку советника на 388 билде. Пришел утром - сообщение Out of Memory.

В диспетчерез задач наблюдаю неуклонный рост потребляемой памяти. За 5 минут плюс 200МБ.

Советник мультивалютный, может это поможет. Стоит Windows7, 32 бита.

Пока откатываюсь на страрый билд.

На 387 память стоит как вкопанная.

В итоге все равно откатился еще дальше, до версии 229. Потому что в 387-я зависает. Показывается какое-то непрорисованное окно с надписью в заголовке "Сигнал" и программа висит. Вместо графиков - "Ожидание обновления". И так пару часов, пока не мне не надоело. ДО перехода с 387 на 388 этот глюк неоднократно проявлялся, надеялся что исправили.

так что пока работаю снова с 229, никаких проблем.


Не могли бы Вы пояснить, что такое "запустил отладку советника"?
 
stringo:

Не могли бы Вы пояснить, что такое "запустил отладку советника"?


пардон, не отладку а оптимизацию.

 
StukovAlexStv:

Не знаю у кого как, но я вынужденно откатился на старый билд.

Я работаю на лицензионной Windows 7. Моя ТС представляет из себя несколько кастомных индикаторов с вложенными вызовами один в другого. Так вот, старый билд программы проводил оптимизацию без проблем.

Новый билд, за 20 минут работы, сожрал 2Гб(!!!) оперативной памяти и продолжал это делать как ни в чем не бывало... На лицо утечка памяти (memory leak)!

Наверно тоже придется откатываться, через некоторое время работы вылезает:

2011.03.16 13:39:26 Memory handler: cannot allocate 1464908512 bytes of memory

Моих 8 Гб оперативы на Win7x64 не хватает. Приходится перезапускать терминал. Раньше такого не было. Никаких изменений в свои обычные инструменты не вносил, все как обычно. Проверьте что там все-таки не так.

Вряд ли поможет, но:

1) За не которое время до вылезания этой ошибки уже 3й раз наблюдаю такую картину. Нажимаю "старт" оптимизации, кнопка "старт" остается активной, на "стоп" не меняется, при этом оптимизация идет своим ходом. Пару раз кликнешь на "старт" вылезает вышеуказаная ошибка.

2) Мой инструментарий не использует никаких индикаторов, объектов. Зато мои советники много работают с файлами.

 
Здравствуйте, похоже что в новом билде конструкции вида:
 if(bar!=Bars) //---- фракталы M1
  {  
    i=Bars-(bar-1); bar=Bars; M_1(); 
  
    if(bar_M5!=iBars(NULL,5)) //---- фракталы М5
     {  
      i=iBars(NULL,5)-(bar_M5-1); bar_M5=iBars(NULL,5); M_5();
     }  
    if(bar_H1!=iBars(NULL,60)) //---- фракталы H1
     {  
      i=iBars(NULL,60)-(bar_H1-1); bar_H1=iBars(NULL,60); H_1();
     } 
  } 

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

Я экспериментировал и с функцией IndicatorCounted(), если использовать только ее, вместо Bars, в конструкции вида:

int  nCountedBars;
     nCountedBars=IndicatorCounted(); 

     if(nCountedBars<=2)
      {
       i=Bars-nCountedBars-3; M_1();
       }
     if(nCountedBars>2)
      {
       nCountedBars--;
       i=Bars-nCountedBars-1;  M_1();
      }
то фракталы с минутного таймфрема (на минутном графике) не пропадают. Если же добавить сюда вызов функций iBars, для экономного расчета других таймфремов и отображений пятиминутного и часового фракталов на минутном графике:
int  nCountedBars;
     nCountedBars=IndicatorCounted(); 

     if(nCountedBars<=2)
      {
        i=Bars-nCountedBars-3; M_1();
   
        if(bar_M5!=iBars(NULL,5)) //---- фракталы М5
         {  
          i=iBars(NULL,5)-(bar_M5-1); bar_M5=iBars(NULL,5); M_5();
         }  
         if(bar_H1!=iBars(NULL,60)) //---- фракталы H1
          {  
           i=iBars(NULL,60)-(bar_H1-1); bar_H1=iBars(NULL,60); H_1();
          } 
       }
     if(nCountedBars>2)
      {
        nCountedBars--;
        i=Bars-nCountedBars-1;  M_1();
   
        if(bar_M5!=iBars(NULL,5)) //---- фракталы М5
         {  
          i=iBars(NULL,5)-(bar_M5-1); bar_M5=iBars(NULL,5); M_5();
         }  
        if(bar_H1!=iBars(NULL,60)) //---- фракталы H1
         {  
          i=iBars(NULL,60)-(bar_H1-1); bar_H1=iBars(NULL,60); H_1();
         } 
       }

то минутные фракталы не исчезают, а пятиминутные и часовые исчезают и начинают рисоваться с места включения... Возможно, при вызове iBars происходит докачка истории или другие процессы которые приводят к принудительной инициализации, но почему тогда так выборочно? - часть буферов единого индикатора остается не тронутой, а часть обнуляется? Если это так, то тогда, как я писал выше, необходимо привести эту инициализацию к единому виду - как при изменении свойств индикатора.

Если так навязывается использование экономного расчета индикаторов через функцию IndicatorCounted() (читал посты stringo в предыдущей теме про это), то как с ее помощью организовать экономный расчет индикатора на данных других таймфреймов? Возможно необходимо добавить в нее переменную с какого таймфрейма производится расчет, например так: IndicatorCounted(PERIOD_H1) . Но, я считаю, что лучше привести к единому виду инициализацию т.к. у многих через Bars и iBars индикаторы организованы, хотя не против и того и другого :) но что то делать надо...

 
zenz:
Здравствуйте, похоже что в новом билде конструкции вида:

но что то делать надо...

Хотелось бы чтобы при внесении изменений разработчики учли, что из одного индикатора можно вызывать данные относящиеся к другим инструментам. Чтобы эта часть тоже не испортилась.
 
dimonsky:


пардон, не отладку а оптимизацию.


Спасибо. Утечку памяти устранили
Причина обращения: