Архив версий МТ.

 

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

Мне вот сейчас нужен билд 2007. Есть у кого? Поделитесь, пожалуйста.

 
Сергей Таболин:

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

Мне вот сейчас нужен билд 2007. Есть у кого? Поделитесь, пожалуйста.

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

 


ссылку убили мою тут,

разработчики предлагают скачивать только из проверенных источников

если хочешь рискнуть мой билд испытать пиши в личку

самому надо сохранять рабочие стабилки в портабле или архив и вообще с осознанием обновляться на тестовые билды

в ДЦ сейчас 2007 билд может

 
Fast235:

ссылку убили мою тут,

разработчики предлагают скачивать только из проверенных источников

если хочешь рискнуть мой билд испытать пиши в личку

самому надо сохранять рабочие стабилки в портабле или архив и вообще с осознанием обновляться на тестовые билды

в ДЦ сейчас 2007 билд может

Правильно делают, что убирают старые версии.

Писать надо нормально программы. Не игнорировать предупреждения. Инициализировать переменные, и по максимуму не использовать глобальные. Избегать потенциально опасных моментов в коде.

У меня на десятки тысяч строк кода - ни одного предупреждения на strict-режиме. Половина поделок из КодоБазы - даже без strict'a выдают предупреждения, хотя в них нет даже тысячи строк. А потом начинаются разговоры про то, что "в старом билде все работало, а в новом - перестало"...

 
Georgiy Merts:

Правильно делают, что убирают старые версии.

Писать надо нормально программы. Не игнорировать предупреждения. Инициализировать переменные, и по максимуму не использовать глобальные. Избегать потенциально опасных моментов в коде.

У меня на десятки тысяч строк кода - ни одного предупреждения на strict-режиме. Половина поделок из КодоБазы - даже без strict'a выдают предупреждения, хотя в них нет даже тысячи строк. А потом начинаются разговоры про то, что "в старом билде все работало, а в новом - перестало"...

Это программа марсохода? Что можно описывать в таком количестве строк???

 
Sergey Basov:

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

Спасибо. Скачал.

Fast235:

ссылку убили мою тут,

разработчики предлагают скачивать только из проверенных источников

если хочешь рискнуть мой билд испытать пиши в личку

самому надо сохранять рабочие стабилки в портабле или архив и вообще с осознанием обновляться на тестовые билды

в ДЦ сейчас 2007 билд может

На тестовые не обновляюсь. А сохранять теперь буду  )))

Georgiy Merts:

Правильно делают, что убирают старые версии.

Писать надо нормально программы. Не игнорировать предупреждения. Инициализировать переменные, и по максимуму не использовать глобальные. Избегать потенциально опасных моментов в коде.

У меня на десятки тысяч строк кода - ни одного предупреждения на strict-режиме. Половина поделок из КодоБазы - даже без strict'a выдают предупреждения, хотя в них нет даже тысячи строк. А потом начинаются разговоры про то, что "в старом билде все работало, а в новом - перестало"...

Георгий, почитай мой последний пост в теме. Я нашёл источник проблемы. Он не в моём коде.

 
Сергей Таболин:

Спасибо. Скачал.

На тестовые не обновляюсь. А сохранять теперь буду  )))

Георгий, почитай мой последний пост в теме. Я нашёл источник проблемы. Он не в моём коде.

Я прочитал.

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

Помню, еще во времена, когда МТ5 лишь пробивал себе дорогу - все удивлялся, народ массово использует переменные без инициализации, считая, что в них будет нуль.

Как тут не вспомнить анекдот:

Мальвина дала Буратине три яблока. Два он съел. Сколько яблок осталось у Буратины?

Программист N1:
- Неизвестно сколько. Никто ж не знает, сколько яблок было у него до этого !

Мораль: обнуляйте начальные переменные.


Программист N2
- Неизвестно сколько. Может быть, пока Мальвина отдавала яблоки, их ел еще и Пьеро ?

Мораль: не используйте глобальные переменные.

Программист N3
- Неизвестно сколько. Там не сказано, что Буратино ел именно яблоки, сказано, что съел два, а чего - неясно.  Кроме того, с учетом того что имя "Буратино" не склоняется - Буратине и Буратины - это разные переменные.


Мораль: следите за синтаксисом

 
Сергей Таболин:

Спасибо. Скачал.

На тестовые не обновляюсь. А сохранять теперь буду  )))

Георгий, почитай мой последний пост в теме. Я нашёл источник проблемы. Он не в моём коде.

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

1:

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

Ну и что прикажете делать дальше?

Сергей Таболин, 2019.06.16 00:17

Нашёл я причину этого безобразия.

Дело вот в этом:

//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))  TesterStop();
      check_init = true;
   }
//*/

Оказывается в новом релизе после TesterStop() запускается ещё и OnTester(), хотя, по уму, запускаться не должен.

Естественно, никакие данные не подготавливаются, вот и получается чёрте что.

Косяк МТ 2085.

2:

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

Ну и что прикажете делать дальше?

Сергей Таболин, 2019.06.16 09:02

Извиняюсь. В описании как раз и написано, что после вызывается OnTester(). (((

Приходится ещё и там делать проверки. Попробую заменить на ExpertRemove()...

И ведь далее опять "попробую"... А потом, если ваши пробы не увенчаются успехом, то виноваты опять MQ ?

Не помню, но по-моему есть специальная функция для пропуска "плохих" проходов. И как раз то, что вы хотите попробовать, разработчики не рекомендовали использовать - опять-таки - если мне память не изменяет.

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

 
Artyom Trishkin:

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

1:

2:

И ведь далее опять "попробую"... А потом, если ваши пробы не увенчаются успехом, то виноваты опять MQ ?

Не помню, но по-моему есть специальная функция для пропуска "плохих" проходов. И как раз то, что вы хотите попробовать, разработчики не рекомендовали использовать - опять-таки - если мне память не изменяет.

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

Артём, проблема в новом билде!

Скажите, вот Вы написали код, который работает без ошибок. Долго работает. И вдруг, после нового релиза МТ он валиться с кучей ошибок. Кто виноват? Тем более, если учесть, что документация, как многие знают, далеко не всегда поспевает описывать новшества.

Так вот, мой код работал без ошибок.

Я использовал вот это:

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

Чем заменить INIT_PARAMETERS_INCORRECT ? Найдено решение )))

Сергей Таболин, 2019.04.24 08:48

Нашёл ответ на свой же вопрос в теме:

Всё оказалось довольно просто. Достаточно перенести проверку на недопустимые параметры из OnInit() в OnTick()

bool                 check_init              = false;                // флаг проверки входных параметров
..........
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                 ExpertRemove();
      if(period_HMA7C == 0 && move_stop)                                   ExpertRemove();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                 ExpertRemove();
      check_init = true;
   }
//*/ 
//+------------------------------------------------------------------+ 

Проверено! Работает. Генетика не валится )))

Теперь, после возникших проблем, я добавил ещё пару строк:

bool                 check_init              = false;                // флаг проверки входных параметров
bool                 tester_stop             = true;                 // флаг проверки выхода по TesterStop
.............
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;
   }
//*/
.........
}
Вызов TesterStop() считается нормальным завершением тестирования, и поэтому будет вызвана функция OnTester() 
с отдачей тестеру стратегий всей накопленной торговой статистики и значения критерия оптимизации.

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

А на деле TesterStop() Вовсе не останавливает тест!

double OnTester()
{
   if(tester_stop) return(-99999999999.99);
   
   double   equity_dd_percent             = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   if(equity_dd_percent > 0.0)
   {
      equity_dd_percent = 100.0 / equity_dd_percent;
   }
   else     equity_dd_percent    = 1.0;
   
   double   param                         = 0.0;
   double   profit                        = TesterStatistics(STAT_PROFIT);
   double   stability                     = 0.0;
   int      balance_arr_size              = ArraySize(balance_arr) - 1;
   int      alpha_size                    = balance_arr_size - 1;
   int      beta_size                     = alpha_size - 1;
   double   trade2time                    = ratioTrades2Time(TesterStatistics(STAT_TRADES));
   double   max_balance                   = balance_arr[0];
//+-------------------   
   if(balance_arr[balance_arr_size-1] - balance_arr[0] == 0.0) return(-99999999999.88);
//+-------------------   

Я ввёл "недопустимый" параметр и получил такой вот результат:

LL      0       11:30:20.816    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
QN      0       11:30:20.816    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
NJ      3       11:30:20.816    Core 1  TesterStop() called on 0% of testing interval
CD      0       11:30:20.816    Core 1  final balance 10000.00 USD
QF      0       11:30:20.816    Core 1  OnTester result -99999999999.88

Так что это косяк! и Косяк именно MQ.

Считаю, что при таком раскладе TesterStop() и ExpertRemove() должны, если уж не могут тотчас передать управление в OnTester(), возвращать true. Чтобы можно было как-то реагировать, например так:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

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

 
Сергей Таболин:

Артём, проблема в новом билде!

Скажите, вот Вы написали код, который работает без ошибок. Долго работает. И вдруг, после нового релиза МТ он валиться с кучей ошибок. Кто виноват? Тем более, если учесть, что документация, как многие знают, далеко не всегда поспевает описывать новшества.

Так вот, мой код работал без ошибок.

Я использовал вот это:

Теперь, после возникших проблем, я добавил ещё пару строк:

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

А на деле TesterStop() Вовсе не останавливает тест!

Я ввёл "недопустимый" параметр и получил такой вот результат:

Так что это косяк! и Косяк именно MQ.

Считаю, что при таком раскладе TesterStop() и ExpertRemove() должны, если уж не могут тотчас передать управление в OnTester(), возвращать true. Чтобы можно было как-то реагировать, например так:

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

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

ЗЫ. И желательно забыть слова типа "косяк", "вина", "танцы с бубном" и прочие "дерьмокоды" при багрепортах - всё люди, и вы тоже не без допущения ошибок. Да и "психованные" заявления выглядят весьма не серьёзно и не конструктивно.

 
Artyom Trishkin:

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

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

Что касается указанной темы, то что-то мне кажется, что вопрос может там запросто "затеряться". Поэтому думаю, что новая тема с конкретной проблемой более эффективна? Или нет?

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

Попробую добавить вопрос туда...