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

 

Так и надо жить, а то что ты проделываешь - это испытание прочности железа.


См. пост про новую версию эксперта. Железу теперь дано по секунде на эксперт. Лучше не стало.
Потом, нам же обещали, что запросы выстраиваются в очередь.
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.


Вот вариант, предложенный Rosh'ем. Ошибки остались.

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;
		
//	timePrev += nMagic;	// Open nMagic seconds after the new bar

	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 = OrdersTotal() - 1; nCnt >= 0; 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);
					
				Sleep(10);
			}
		}
	}

	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(Symbol() + ", " + nError);
	}

Sleep(10);
}
// ------
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(Symbol() + ", " + nError);
	}

Sleep(10);
}
// ------

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);
}

// ------



 
Такой момент
if(OrderType() == OP_BUY)
	OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
else if(OrderType() == OP_SELL)
	OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);


чему будет равен OrderType(), если мы закрыли ордер на покупку (выполнилось первое условие)
Попробуй выкинуть проверку во втором условии, то есть я пишу всегда так:

if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
 
Ну что же, как всегда, Rosh, похоже, прав. Поставил я Sleep(0), два эксперта уже дают ошибки. Поставил Sleep(100), четыре эксперта работают, ошибки появляются при добавлении пятого (пять окон, пять валют, по эксперту на каждое).

Поставил Sleep(200) - пять экспертов уживаются (почти, иногда все же дают ошибки. Сделать 5 экспертов без ошибок я этим способом не смог).

Речь идет пока только об ошибках 138 и 139.

По-прежнему, жду советов от разработчиков.

Rosh, тебе отдельное спасибо, хотя твой подход со слипом мне не нравится.
 
Такой момент
if(OrderType() == OP_BUY)
	OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
else if(OrderType() == OP_SELL)
	OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);


чему будет равен OrderType(), если мы закрыли ордер на покупку (выполнилось первое условие)
Попробуй выкинуть проверку во втором условии, то есть я пишу всегда так:

if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);



Да, пожалуй. Хотя паузу я ставил после этого if, но кто их знает, многозадачных.

Попробовал. На душе лучше, но ошибки остались :)
 


Rosh, тебе отдельное спасибо, хотя твой подход со слипом мне не нравится.


Ну... жизнь тоже не самое лучшее, что я видел. Есть такой момент - когда-то умираешь. Мне это тоже не нравится, но Разработчик не меняет версию. :)
 


Rosh, тебе отдельное спасибо, хотя твой подход со слипом мне не нравится.


Ну... жизнь тоже не самое лучшее, что я видел. Есть такой момент - когда-то умираешь. Мне это тоже не нравится, но Разработчик не меняет версию. :)


Да, и АПИ не выкладывает :)
Но всегда можно найти обходной путь :)) Используя Sleep(), например :)))

А вообще, это глубокое замечание. Надо чаще обращаться к разработчикам. Говорят, они иногда отвечают :))))
 
Ребят, а можно я с вами пообсуждаю? =)))
А то у вас тут такая дисскусия на 4 листа, а я молчу ( день варения отпивалисс =))...


По поводу ошибок:
Error №6 - no connection with trade server - вполне может быть из-за плохой связи. У меня выделенка Data Over Voice - типа "данные "над" голосом", и когда поднимаешь телефонную трубку, скорость резко падает. Так вот именно в эти моменты возникает эта ошибка.

Error №139 - order is locked - мне кажется, это просто глюк: типа терминал что-то делает с этой позицией, и в этот момент эксперт с ней работать не может. Не знаю, другого объяснения я для себя не нашёл (

Error №138 - requote - тоже вполне может быть из-за коннекта. Посмотри загруженность канала во время ошибок.

Хотя это всё лирика - догадки... Нормальное описание ошибок и инструкции по реагированию я просил у разработчиков давно - сказали, когда-нибудь будет ;)



По поводу Sleep() - использовать всегда - глупо. Но между торговлей лучше делать паузу - использовать LastTradeTime. Я библиотеку trade_lib&info_lib.mqh доделываю (переделываю) - выложу на виаке, ссылку дам. Там все эти вопросы решаются (частично). Ошибок должно быть намного меньше.


Вот пока все мысли, если чего ещё надумаю - скажу ;)
 

Ребят, а можно я с вами пообсуждаю? =)))
А то у вас тут такая дисскусия на 4 листа, а я молчу ( день варения отпивалисс =))...


Да уж, флуд я учинил... :)


По поводу ошибок:
Error №6 - no connection with trade server - вполне может быть из-за плохой связи. У меня выделенка Data Over Voice - типа "данные "над" голосом", и когда поднимаешь телефонную трубку, скорость резко падает. Так вот именно в эти моменты возникает эта ошибка.


У меня выделенка, хорошее качество. Опять же, прохая связь не объясняет, почему ошибка возникает КАЖДЫЙ раз, когда несколько экспертов одновременно что-то делают. С мегабитным-то (в теории) каналом!


Error №139 - order is locked - мне кажется, это просто глюк: типа терминал что-то делает с этой позицией, и в этот момент эксперт с ней работать не может. Не знаю, другого объяснения я для себя не нашёл (


Согласен. Остался пустяк, понять ГДЕ он это что-то делает. Эксперт настолько прост, что места такого просто нет. Хотя, конечно, возможно это я его не вижу. (ты лося видишь? нет. и я нет. А он СЕЙЧАС БУДЕТ)


Error №138 - requote - тоже вполне может быть из-за коннекта. Посмотри загруженность канала во время ошибок.


Не знаю. Если в Москве по выделенке нельзя торговать двумя экспертами одновременно, то торговать нельзя вообще.

Я думал насчет реквотов. Например, какой минимальный слип надо ставить, чтобы цена не убежала. 5 пойнтов? 10? Ставил 15 - ошибка остается.


Хотя это всё лирика - догадки... Нормальное описание ошибок и инструкции по реагированию я просил у разработчиков давно - сказали, когда-нибудь будет ;)


А еще говорят, что рынок - совершенен! Ха!


По поводу Sleep() - использовать всегда - глупо. Но между торговлей лучше делать паузу - использовать LastTradeTime. Я библиотеку trade_lib&info_lib.mqh доделываю (переделываю) - выложу на виаке, ссылку дам. Там все эти вопросы решаются (частично). Ошибок должно быть намного меньше.


Я уже писал, что ошибки эти можно обойти "в лоб" - посылая OrderSend в цикле, пока не вернет значение, отличное от минус 1. Но вопрос-то принципиальный - что происходит? Я на ровном месте получаю ошибки 5-6 разных типов. Нарисую обходной путь сегодня, они завтра выскочат там, где их не ждут. Пока я на демо торгую, лучше этот вопрос решить. Потом будут убытки.


Вот пока все мысли, если чего ещё надумаю - скажу ;)


Спасибо :)
Попробуй запустить этот эксперт у себя. Может, какие мысли возникнут... Или - если торгуешь на деме - поставь подобные алерты в своих экспертах... кто знает... вдруг и они не все сделки открывают?
 
у меня тоже постоянно лезут такие ошибки. И я тоже сижу в Альпари. Может попробовать другой ДЦ? Может, это не МТ виноват?
Причина обращения: