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

 
Неплохо, но по сути, то же самое :)
А что такое SetTrace?


Опаньки :) Щас буду рекламу делать, внимание - http://forexsystems.ru/phpBB/viewtopic.php?t=694&start=45
 
хэндлов не хватает.


Можно ли изменить число хэндлов в системных установках (W'XP) и как?
 
Еще вопрос к разработчикам.

Как правильно:

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



2.

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



3. Безразлично.
4. Надо ставить return и следующий ордер обрабатывать в следующем тике
5. Надо как-то еще.

Поясню. Пусть мы имеем два открытых ордера, оба надо закрыть. Цикл

for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)



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

Я не думаю, что все ошибки обсуждаемого в этой ветке эксперта связаны с этим вопросом, например common error тут вроде ни при чем. Но если я прав, то может быть, это объясняет а) order locked и ему подобные, и б) то, что нужно несколько экспертов, чтобы появились ошибки.



 
хэндлов не хватает.


Можно ли изменить число хэндлов в системных установках (W'XP) и как?

туда лучше не соваться. если программе не хватает хэндлов, то эта программа написана с ошибками. в остальных случаях хэндлов хватает с огромным запасом.
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.
 
Добавлю, что заменой
for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
на
for(int nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
я перешел :) от ошибки 139 к 138 и 4109
(requote, Not initialized string in array)
Последнее вообще без комментариев...
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.


При 10 экспертах на минутном интервале, 30 секунд на каждый... Неправильно, так жить нельзя.
 
Думаете, это все? Было у меня 12 окон, в каждом своя валюта и свой эксперт. Запретил я (Allow live trading) торговлю в 11 из них. А ошибки от них как поступали, так и поступают. Еще один баг.
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.


При 10 экспертах на минутном интервале, 30 секунд на каждый... Неправильно, так жить нельзя.



Так и надо жить, а то что ты проделываешь - это испытание прочности железа.
 
Новая версия эксперта для тестирования. Что изменено:
1. Циклы исправлены.
2. Магик намбер привавляется ко времени начала бара. Это дает, если я не ошибся, задержку открытия. То есть, эксперт с мн 7 откроется через 7 секунд после начала бара. Это позволит избежать перегрузки сервера, процессора компа, конфликта с 2.5 секундным максимумом, если он еще где-то есть...

Но увы - ошибки остаются.

Правила прежние - открываем несколько окон, на любом таймфрейме (минутки, например) и ждем.

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] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
	
	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);
			}
		}
	}

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

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

// ------

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