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

 
за 50 минут работы на 10 минутных графиках всего 2 реквоты. больше никаких ошибок. дополним словарь метаэдитора и выложим изменения
 
ошибка 138 requote может запросто возникнуть. потенциально при 10 работающих экспертах ожидание освобождения семафора может быть 30 секунд и выше. за это время цена запросто может измениться. в этом случае используйте функцию RefreshRates и берите новое значение бид или аск. либо обращайтесь к MarketInfo за новой ценой. 129 - ошибка того же плана, неверная цена - цена слишком далеко уехала и было несколько её изменений за время ожидания. 1 - это вообще не ошибка. она появляется когда идёт попытка модификации ордера теми же значениями, которые уже установлены. странно, что она возникает. у нас она возникает при ручном подтверждении торговли при отказе от сделки


Спасибо, но...
Последний выложенный мной эксперт имеет задержку 3 секунды и слип 50 (!) пунктов. Цена
12 графиков по 3 секунды - цена не успеет так далеко убежать. Или я что-то не понимаю?
 
Добавил RefreshRates в эксперт (код ниже). Теперь сыплются ошибки номер 1.
Надеюсь, сможете отследить. "Сыплются" - это значит примерно раз в 2-3 минуты. Если у вас не так - наверное, сервер слишком близко, или там компьютер слишком быстрый. У меня часть процессора занята нейросетевым пакетом, поэтому МТ получает процентов 50... Сейчас... Вот, отключил нейросеть (там есть кнопка пауза, в отличие от некоторых других программ). Ошибка номер один не пропала, но стала чуть реже. МТ "кушает" 55-99 процентов процессора. Включаю... МТ получает раза в 1.5 меньше процессорного времени. Ошибка тоже стала чаще.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;
int nBars;
int nDelaySeconds = 3;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init()
{
	nBars = Bars;

	if(!IsTesting() && !GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;

	nDigits = MarketInfo( Symbol(), MODE_DIGITS );
	
	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] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
*/

	bool bIsBarEnd = false;
	if(nBars != Bars)
	{
		if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds))
		{
			bIsBarEnd = true;
			nBars = Bars;
		}
	}
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	if(!IsTesting())
	{
		while(!IsStopped())
		{
			if(GlobalVariableGet(strTradeSemaphore) == 0.0)
				GlobalVariableSet(strTradeSemaphore, nMagic);

			if(GlobalVariableGet(strTradeSemaphore) == nMagic)
				break;
		
			Sleep(1000);
		}
	}
	
	RefreshRates();
	
	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);
			}
		}
	}

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

	if(!IsTesting())
		GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = Bid;//MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Bid + dStopLoss;//MathFloor((Bid + dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits);

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, dBid, 
		nSlip, dStop, 0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + dBid + ", Stop: " + dStop + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dAsk = Ask;//MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Ask - dStopLoss;//MathFloor((Ask - dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits);

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, dAsk, 
		nSlip, dStop, 0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", buy: " + dAsk + 
			", Stop: " + dStop + ", error: " + 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);
}


 
Резюмирую, наверное. Похоже, что любой эксперт, кроме работающих в полном одиночестве, нуждается в защитных семафорах. В понедельник я попробую новую функцию, введенную разработчиками (а Rosh говорил, что Разработчик не хочет менять версию! Надо чаще к нему обращаться, всего-то каких-то сто постов). На самом деле, разработчикам большое спасибо. Спасибо также Рошу и Компосеру. Впрочем, доживем до понедельника :)
 
не, до понедельника - точно нет =)))
Юг зовёт, а новая ф-ция будет оперативно проверена через неделю =)))))

...и тебе спасибо, хоть кто-то попытался разобраться с ошибками ;)
 
Резюмирую, наверное. Похоже, что любой эксперт, кроме работающих в полном одиночестве, нуждается в защитных семафорах. В понедельник я попробую новую функцию, введенную разработчиками (а Rosh говорил, что Разработчик не хочет менять версию! Надо чаще к нему обращаться, всего-то каких-то сто постов). На самом деле, разработчикам большое спасибо. Спасибо также Рошу и Компосеру. Впрочем, доживем до понедельника :)



Quark, я писал про Разработчика, а не разработчиков. :) Просекаешь? В одних религиях это Бог, в других - другое обращение.
И еще, я писал, что мои 9 советников шуруют на одном счете нормально. Но и ты молодец, что нашел условия , когда МТ4 чего-то не то лопатит :)
 

не, до понедельника - точно нет =)))


Мне - до понедельника :)


Юг зовёт, а новая ф-ция будет оперативно проверена через неделю =)))))


Югу большой привет.


...и тебе спасибо, хоть кто-то попытался разобраться с ошибками ;)


С одной ошибкой. А сколько их...
 

Quark, я писал про Разработчика, а не разработчиков. :)


А я просто хохмил :) Хотя принцип везде один и тот же. Спрашиваешь корректно - получаешь ответ. Ругаешься - тебя банят :)


И еще, я писал, что мои 9 советников шуруют на одном счете нормально. Но и ты молодец, что нашел условия , когда МТ4 чего-то не то лопатит :)


72 окна с 12 моими советниками - тоже. Потом добавился 13-й - и началось... Вообще же, конечно, если взять последнего эксперта, выложенного в этой ветке, и юзать его на часовках, а не минутках, и паузу увеличить с 3 секунд до 30 (как ты советовал, кстати), то ошибок не будет. Так что результат достигнут, положительный...

Немного жаль ребят с англоязычного форума, но наши сто постов я им переводить не стану. Здоровье уже не то :(

Удачи,
Кварк
 
Несмотря на проделанную работу, ошибка номер 6 продолжает возникать. Происходит это, когда МТ использует оптимизатор, и одновременно открывает позицию. Ловил уже дважды. Повторный запуск эксперта - если условия открытия позиции остаются в силе - приводят к открытию позиции, никаких проблем.
 
Похоже, когда работает оптимизатор, ошибка 6 гораздо более вероятна. Перезапуск компьютера, МТ и т.п. меры ситуации не меняют.

Проблема возникает на разных экспертах. Логика у них всех была модифицирована семафорами (как предложил Слава) и задержкой (Rosh) - чтобы в данные 10 секунд работал только 1 эксперт. Все ошибки, которые я упоминал выше исчезли (пока), кроме номер 6.