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

 
Сейчас посмотрел терминал - какие-то траблы начались у меня вчера.
2005.08.11 11:15:00 ****l EURUSD,H1: OrderSend failed with error #139
2005.08.11 11:07:12 TradeDispatcher: all trade context is busy

Я этот советник отцепил, посмотрю что дальше будет.


Вот. Это оно и есть. Начинается. 139 - это order is locked. Кем, зачем - непонятно. Потом будут 2, 6, и еще до кучи.

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

Соответственно, вопрос ко всем - есть ли у вас в логах подобные записи?

Rosh, ты используешь Альпари? Если да, то вопрос к Альпари - у вас сервер работает нормально?

Что я выяснил за сегодняшнюю ночь :(

1. Советник сам по себе, ОДИН, работает, и либо ошибок не выдает, либо выдает их настолько редко, что ночи для этого недостаточно.

2. В сочетании с еще несколькими советниками (точнее, с одним, по шести валютам), ошибка воспроизвелась, правда, не через час, а через 4 часа.

Что отсюда следует?
1. Есть некий баг в МТ (или в моем советнике, но он настолько прост, что вряд ли), который иногда не позволяет открывать сделки. И закрывать, кстати, тоже.
Конечно, можно его обойти:

while(nResult == -1)
{
    nResult = OrderSend(...);
}



Надо ли говорить, что это ОЧЕНЬ плохой стиль программирования, да и брокера можно обидеть...

2. Я сейчас переписываю эксперт, чтобы он был попроще, и в то же время вызывал ошибку. Выложу в ближайшие часы. Если окажется, что для ошибки нужны два эксперта, что поделать, выложу два :)






 
2. Я сейчас переписываю эксперт, чтобы он был попроще, и в то же время вызывал ошибку. Выложу в ближайшие часы. Если окажется, что для ошибки нужны два эксперта, что поделать, выложу два :)

а мы будем проверять
 
Quark, я вынес диагноз, виноват твой советник. Как только вылезает Alert из твоего советника (я их вообще не использую) - так сразу полчаю
2005.08.11 13:01:19	TradeDispatcher: all trade context is busy


Время Алерта и блокировки совпадает . Код советника вообще не глядел.

 
Ну что же. Вот новый суперэксперт, который в одиночку выдает ошибки. Пока что дальше ошибки 139 я не продвинулся, так что буду продолжать тесты.

Как им пользоваться: для каждой из валют (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) открываем часовой график.
К каждому графику по эксперту. Они не взаимодействуют, так как мн у всех разные.

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

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

Если у вас особые отношения с торговым сервером, лучше, наверное, использовать обычный аккаунт для теста. Я использую Альпари.

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

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

Еще раз повторюсь, речь идет об ошибке 139. В то же время, этим способом мне пока не удалось получить ошибку 2 и 6. А раньше они в основном и были. Так что, видимо, будут еще посты.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;

//////////////////
int init ()
{
	timePrev = 0;

	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
		nMagic = 2;
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
		nMagic = 5;
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
		nMagic = 7;
	else if(Symbol() == "AUDUSD")
		nMagic = 8;
	else if(Symbol() == "EURGBP")
		nMagic = 9;
	else if(Symbol() == "USDCAD")
		nMagic = 10;
	else if(Symbol() == "EURCHF")
		nMagic = 11;
	else if(Symbol() == "EURAUD")
		nMagic = 12;

	return(0);	
}

// ------

int deinit()
{
	return(0);
}
// ------
int start()
{
	if(Bars < 5)
		return(0);
	
	// The previous bar just closed
	bool bIsBarEnd = false;
	if(timePrev != Time[0]) 
		bIsBarEnd = true;
	timePrev = Time[0];
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	int nSignal = GetSignal();

	if(nSignal == OP_BUY) 
		Buy();
	else if(nSignal == OP_SELL) 
		Sell();

	for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);

		if(OrderMagicNumber() == nMagic)
		{
			if(CurTime() - OrderOpenTime() > (nHoursToHold - 1) * 60 * 60)
			{
				if(OrderType() == OP_BUY)
					OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
				else if(OrderType() == OP_SELL)
					OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
			}
		}
	}

	return(0);
}
// ------

void Sell()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 
		0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(nError);
	}
}
// ------
void Buy()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 
		0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(nError);
	}
}
// ------

double GetLotSize()
{
	double dLot = 0.1;
	
	return(dLot);
}

// ------

int GetSignal()
{
	int nSignal;
	if(MathMod(Hour(), 2) == 0)
		nSignal = OP_BUY;
	else
		nSignal = OP_SELL;
		
	return(nSignal);
}

// ------
 
Quark, я вынес диагноз, виноват твой советник. Как только вылезает Alert из твоего советника (я их вообще не использую) - так сразу полчаю
2005.08.11 13:01:19	TradeDispatcher: all trade context is busy


Время Алерта и блокировки совпадает . Код советника вообще не глядел.



Все бы хорошо, но я ввел алерты после того, как заметил, что сделки не совершаются. К тому же, алерт в коде сразу после OrderSend.

Сейчас попробую перейти на Print, но сомневаюсь что-то...
 
Кстати, вот интересно. При перекомпилляции советника, обнуляется та переменная, которую я использую для рассчета bIsBarEnd. Соответственно, если я в редакторе нажимаю Ф5, все советники должны закрыть старые позиции и открыть новые. Нажал Ф5... Валют (и советников) 12. Обновились 3. Гм?

Поставил Print вместо Алерт, чтобы проверить предположение Rosh'a. Увы, вся разница в том, что теперь сообщения об ошибке 139 появляется в логе, а не на экране.
 
Черт его знает, глянуд код, придраться вроде особо не к чему. Это место я бы через Bars решал, а не по вермени открытия
	bool bIsBarEnd = false;
	if(timePrev != Time[0]) 
		bIsBarEnd = true;
	timePrev = Time[0];



И такая вещь непонятная :
2005.08.11 13:08:12 '18708': close order #680413 buy 0.10 EURUSD at 1.2385 sl: 0.0000 tp: 0.0000 at price 1.2408
и далее

2005.08.11 13:08:13 '18708': order #680413 buy 0.10 EURUSD at 1.2385 sl: 1.2275 tp: 0.0000 closed at price 1.2408

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

 
Черт его знает, глянуд код, придраться вроде особо не к чему. Это место я бы через Bars решал, а не по вермени открытия
	bool bIsBarEnd = false;
	if(timePrev != Time[0]) 
		bIsBarEnd = true;
	timePrev = Time[0];



И такая вещь непонятная :
2005.08.11 13:08:12 '18708': close order #680413 buy 0.10 EURUSD at 1.2385 sl: 0.0000 tp: 0.0000 at price 1.2408
и далее

2005.08.11 13:08:13 '18708': order #680413 buy 0.10 EURUSD at 1.2385 sl: 1.2275 tp: 0.0000 closed at price 1.2408

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



Если есть оттестированный кусочек кода, с удовольствием посмотрю на "через Bars" :)

Что касается нулевого стопа - я его присвоил в init, и больше нигде не меняю. Баг, наверное. Блин, с тех пор, как С++ забросил, не думал, что придется снова заниматься энтомологией.

На самом деле, ну эксперт, ну ладно. Но ведь он настолько прост, что возникает вопрос: а нет ли опасности, что другие эксперты также себя ведут? Да еще учитывая, что баг проявляется лишь когда экспертов много, да еще - что ошибки разные выдает.

Например, есть эксперт, использующий MACD + ADX + Stochastic. Протестировав его тестером (где серверных ошибок нет по определению), будет ли человек сидеть и проверять тупо "вот тут все условия выполнились, а сделка не совершена". Скорее всего, не будет... Опасный баг.
 


Если есть оттестированный кусочек кода, с удовольствием посмотрю на "через Bars" :)



Например, так:
int start()
  {
   int total,ticket,totalExpert;
//---- 
   SetTrace();
   if (Bars>b)
      {   
      b=Bars;
 
Неплохо, но по сути, то же самое :)
А что такое SetTrace?