Чемпионат Automated Trading Championship 2011 стартовал! - страница 3

 
SimSim2011:
   
Нулевое значение может быть выдано чем угодно, поэтому всё, абсолютно всё нужно проверять на ноль перед делением. Даже координаты объектов или значение Equity. ))) 
 
papaklass:
Раз уж Вы ищете поддержку на форуме, то нужно выкладывать полный код проблемной части. Хотя я думаю, что это бесполезно. Если бы была ошибка со стороны организаторов, то пострадали бы не Вы один. А в данной ситуации ошибка в алгоритме, скорее всего.

Данный блок в МТ4 выглядел так - и не было никаких проблем в течении нескольких лет  

if (AccountMargin() > 0)
{if ( AccountEquity()/AccountMargin()*100 > AccountStopoutLevel() && AccountEquity()/AccountMargin()*100 < AccountStopoutLevel()+20 )
{Print("StopOut= ",AccountEquity()/AccountMargin()*100);CloseAll();CloseBS=true;Print("Закрытие всех ордеров по Стоп Ауту"); }} // stop out
 

 

перевел в МТ5 в таком виде    -  с  фиксированным  уровнем Стопа для чемпионата

if ( AccountInfoDouble(ACCOUNT_MARGIN) > 0)
{
double UrStopOut = AccountInfoDouble(ACCOUNT_EQUITY)/AccountInfoDouble(ACCOUNT_MARGIN)*100 ;
if ( UrStopOut > 50 && UrStopOut < 70 )
{ Print("< < < Sim-Sim > > > StopOut= ",UrStopOut); CloseAll();CloseBS=true; Print("< < < Sim-Sim > > > Закрытие всех ордеров по Стоп Ауту"); } // stop out
}

И советник работает уже в течении 2-недель на домашнем ПК без проблем.

понимаю что код    

double margin = AccountInfoDouble(ACCOUNT_MARGIN);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
if(margin!=0)double UrStopOut=equity/margin*100.0;

более надёжен и прочее, но особого криминала в своём коде не нахожу.

 

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

 
SimSim2011:


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

К сожалению, эксперт не будет перезапущен, так как его остановка является следствием программной ошибки.
 
Rosh:
К сожалению, эксперт не будет перезапущен, так как его остановка является следствием программной ошибки.

 Ясно.   Эта  программная ошибка есть следствие пока ещё  не стабильной работы стандартных функций, ведь проверка на 0 была сделана!!!  

 

До встречи в 2012 году .    

 
SimSim2011:

 Ясно.   Эта  программная ошибка есть следствие пока ещё  не стабильной работы стандартных функций, ведь проверка на 0 была сделана!!!  

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

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

Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
Rosh:

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

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

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

 

И всё-таки может попробуем перегрузить  эксперта - если он  снова наступит на эти грабли   - значит не судьба  в этом году. 

 
SimSim2011:

И всё-таки может попробуем перегрузить  эксперта - если он  снова наступит на эти грабли   - значит не судьба  в этом году. 

Доктор сказал "В морг", значит в морг. Я не имею ни доступа, ни прав для перезапуска.
 
SimSim2011:

 Ясно.   Эта  программная ошибка есть следствие пока ещё  не стабильной работы стандартных функций, ведь проверка на 0 была сделана!!!  

 

До встречи в 2012 году .    

Эксперт работает в своём потоке, а изменение цен происходит в другом потоке. То есть, изменение цены со всеми последствиями (в данном случае расчёт маржевых требований) по определению асинхронно по отношению к эксперту.

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

Отсюда вывод.

1. Кешировать запрашиваемое значение

double margin=AccountInfoDouble(ACCOUNT_MARGIN);
double equity=AccountInfoDouble(ACCOUNT_EQUITY);

2. В расчётах использовать кешированное значение

if(margin > 0)
  { 
   double UrStopOut = equity/margin*100;
...
  } 

Вообще, это распространённая ошибка начинающих (либо нежелающих учиться) программистов. Не проверяют значение после каждого возврата из функции (Вы проверили первый возврат, второй возврат остался непроверенным). Многократное использование одинаковых вызовов вместо кеширование. Использование вызова функции в том месте цикла, где этот вызов считается (подразумевается) инвариантным - многие прямо в условии цикла лепят проверку с вызовом функции ( for(int i=0; i<TradesTotal(); i++) {...} ), не задумываясь о тормозах на каждой итерации

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 
Yedelkin:
Исправьте, плиз, глюк. У меня IE 8.0 на XP32(SP3) не показывает графики с чемпионата. Сначала думал, что это временное явление, но в Win7_64 и в IE 8.0 на работе (что-то типа Microsoft Windows Server) всё показывается.
Проверьте, установлен ли Flash
 
stringo:

Использование вызова функции в том месте цикла, где этот вызов считается (подразумевается) инвариантным - многие прямо в условии цикла лепят проверку с вызовом функции ( for(int i=0; i<TradesTotal(); i++) {...} ), не задумываясь о тормозах на каждой итерации

Поясните, плиз, дотошному. В качестве ликбеза.

В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал. 

Причина обращения: