Ошибка номер 6 - страница 29

 
логи послал.
А куда вставлять этот код?
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000);
    GlobalVariableSet(strTradeSemaphore, 0.0);


на выходе из функции start
 
Попробовал подобрать Sleep()
До 100000 без видимых улучшений

Заменил
	if(!IsTesting())
	{
		Sleep(1000);
		GlobalVariableSet(strTradeSemaphore, 0.0);
	}


на

while(!IsStopped() && !IsTradeAllowed()) Sleep(1000);
    GlobalVariableSet(strTradeSemaphore, 0.0);



Тот же перец.
Ошибка 146

 
вдогонку. по некотором размышлении оказалось, что есть точный метод. попробую его сформулировать
    while(!IsStopped() && !IsTradeAllowed()) Sleep(1000);
    GlobalVariableSet(strTradeSemaphore, 0.0);


то есть, мы сами ждём освобождения занятого нами же торгового контекста

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



Еще раз.

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

Зачем давать вредные советы?
 
Зачем давать вредные советы?

предполагается, что если советник дошёл до этого места, значит флаг торговли стоит!
 
Зачем давать вредные советы?

предполагается, что если советник дошёл до этого места, значит флаг торговли стоит!

На чем основано такое предположение? Когда предположения не совпадают с реальностью, появляются неожиданные ошибки.
Флаг - ерунда.
Синхронизация, мутексы, разделяемые ресурсы - проблема реальная. Советовать решать ее с помощью глобальных переменных на уровне пользователя - нонсенс. Тем более, что пример неработоспособен.
 
Начиная с 12 ночи вс\пн, работали эксперты на MQ-demo и Alpari-demo. За все время ошибки 128 не было ни там, ни там, на Alpari была одна ошибка 6 (ping error), и на обоих - несколько олд тиков. Ордера отрабатывались безошибочно. Билд 1.8.3 от 05.10. Может, дело в чем-то еще? Например, в особенностях соединения через 443-й порт у разных интернет-провайдеров? У МТ3 ведь были ошибки, но этих в таком количестве - не было.


Увы. "Начиная с 12 ночи" - это не статистика. По неведомым причинам, проблемы накатывают волнами, то нет, то несколько сразу...
 

Quark, имей совесть, не выкладывай такие логи на форум =)))))


Я думал - кому интересно (тоном Скрипача из Киндзадза) :))


На счёт реальности закрытия/открытия - у меня во всех ф-циях стоят проверки и ошибки появляются, но это ЛОЖНЫЕ ошибки. Я проверял по логам и по истории ордеров, все позиции были закрыты. Просто ордер не успевает переместится в историю. Я сделал задержку 1сек перед проверкой - но этого мало... Когда я спрашивал - ничего не ответили.


Мысль хорошая. Но у меня были случаи, когда и час спустя ордер никуда не девался, то есть, иногда они и не ложные.
У меня задержка тоже стоит, по 10 секунд.
 
Мысль хорошая. Но у меня были случаи, когда и час спустя ордер никуда не девался, то есть, иногда они и не ложные.
У меня задержка тоже стоит, по 10 секунд.

все мои ошибки, как оказалось, были в коде =) т.е. я неправильную проверку после ордерклоус сделал.
После того, как исправил - нет ни одной. Правда, мало времени прошло, надо подождать...
 

все мои ошибки, как оказалось, были в коде =) т.е. я неправильную проверку после ордерклоус сделал.
После того, как исправил - нет ни одной. Правда, мало времени прошло, надо подождать...


Как выглядит исправленный код?
 
Как выглядит исправленный код?

для ордерклоус:
//---- проверяем - действительно ли закрылась позиция и, если нет, выводим информацию и выходим, возвращая -5
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
		{
			if ( OrderCloseTime() <= 0 )
			{
				Processing_Error ( 0, "OrderClose" );
				_Return_ ( 3, "Error", 0, "Позиция не была закрыта", "OrderClose(...)", "Позиция не была закрыта" );
				return(-5);
			}
			else
			{ break; }
		}
		Close_GetLastError = GetLastError();
		_Print_ ( 3, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
	}


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

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