실수 번호 6 - 페이지 11

 
10분 차트에서 50분 동안 2 번의 인용 만 하십시오. 더 이상 오류가 없습니다. 메타에디터 사전 추가 및 변경 사항 게시
 
error 138 requot는 쉽게 발생할 수 있습니다. 잠재적으로 10명의 작업 전문가와 함께 세마포어 릴리스 대기 시간이 30초 이상이 될 수 있습니다. 이 시간 동안 가격은 쉽게 변경될 수 있습니다. 이 경우 RefreshRates 기능을 사용하고 새 입찰가 또는 요청 값을 사용합니다. 또는 새로운 가격에 대해서는 MarketInfo에 문의하십시오. 129 - 같은 계획의 오류, 잘못된 가격 - 가격이 너무 비싸 대기 시간 동안 몇 가지 변경 사항이 있었습니다. 1은 전혀 오류가 아닙니다. 이미 설정된 동일한 값으로 주문을 수정하려고 할 때 나타납니다. 나오는게 이상합니다. 우리의 경우 거래가 취소되었을 때 수동으로 거래를 확인할 때 발생합니다.


감사합니다만...
내가 마지막으로 게시한 Expert Advisor는 3초의 지연과 50(!) 포인트의 슬립이 있습니다. 가격
3초 동안 12개의 차트 - 가격이 지금까지 실행될 시간이 없습니다. 아니면 내가 뭔가를 이해하지 못합니까?
 
EA에 RefreshRates를 추가했습니다(아래 코드). 이제 오류 번호 1이 쏟아지고 있습니다.
추적할 수 있기를 바랍니다. "Rip" - 이것은 약 2-3분에 한 번을 의미합니다. 작동하지 않으면 서버가 너무 가깝거나 컴퓨터가 너무 빠를 수 있습니다. 내 프로세서의 일부는 신경망 패키지가 차지하므로 MT는 50%를 받습니다. 이제... 여기에서 신경망을 끕니다(일부 다른 프로그램과 달리 일시 중지 버튼이 있음). 오류 번호 1은 사라지지 않았지만 조금 덜 일반적입니다. MT는 프로세서의 55-99%를 "먹습니다". 켜면... MT는 CPU 시간이 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는 개발자가 버전을 변경하고 싶지 않다고 말했습니다! 더 자주 그에게 연락해야 합니다. 단지 100개의 게시물만 있을 뿐입니다). 사실, 개발자들에게 많은 감사를 드립니다. Rosh와 Composer에게도 감사드립니다. 어쨌든 월요일까지 기다려보자 :)
 
아니요, 월요일까지 - 절대 아닙니다 =)))
남쪽이 부르고 있고, 새로운 기능은 일주일 안에 신속하게 점검될 것입니다 =)))))

...감사합니다. 적어도 누군가는 오류를 알아내려고 노력했습니다.)
 
요약하자면. 혼자 일하는 전문가를 제외한 모든 전문가에게는 보호 세마포어가 필요한 것 같습니다. 월요일에 나는 개발자들이 소개한 새로운 기능을 시도할 것입니다(그리고 Rosh는 개발자가 버전을 변경하고 싶지 않다고 말했습니다! 더 자주 그에게 연락해야 합니다. 단지 100개의 게시물만 있을 뿐입니다). 사실, 개발자들에게 많은 감사를 드립니다. Rosh와 Composer에게도 감사드립니다. 어쨌든 월요일까지 기다려보자 :)



Quark, 나는 개발자가 아니라 개발자에 대해 썼습니다. :) 당신은 절단하고 있습니까? 어떤 종교에서는 그것이 신이고, 다른 종교에서는 다른 대우입니다.
그러나 나는 9명의 Expert Advisors가 하나의 계정에서 정상적으로 플레이하고 있다고 썼습니다. 하지만 MT4가 잘못된 것을 삽질할 때의 조건을 찾는 데도 좋습니다. :)
 

아니요, 월요일까지 - 절대 아닙니다 =)))


월요일까지 저를 위해 :)


남쪽이 부르고 있고, 새로운 기능은 일주일 안에 신속하게 점검될 것입니다 =)))))


안녕하세요.


...감사합니다. 적어도 누군가는 오류를 알아내려고 노력했습니다.)


한 번의 실수로. 그리고 그 중 몇 개...
 

Quark, 나는 개발자가 아니라 개발자에 대해 썼습니다. :)


그리고 그냥 웃었습니다 :) 원칙은 어디에서나 동일하지만. 당신은 올바르게 묻습니다 - 당신은 대답을 얻습니다. 당신은 맹세합니다 - 당신은 금지됩니다 :)


그러나 나는 9명의 Expert Advisors가 하나의 계정에서 정상적으로 플레이하고 있다고 썼습니다. 하지만 MT4가 잘못된 것을 삽질할 때의 조건을 찾는 데도 좋습니다. :)


내 조언자 12명과 함께 72개의 창도 있습니다. 그러다가 13번째가 추가되고 시작... 일반적으로, 물론 이 스레드에 게시된 마지막 Expert Advisor를 가져와서 분 단위가 아닌 시간 단위로 사용하고 일시 중지를 3초에서 30초로 늘리면( 그건 그렇고), 당신이 조언했듯이 오류가 없을 것입니다. 그래서 결과는 긍정적...

영어권 포럼에서 온 사람들에게 조금 미안하지만 나는 우리의 수백 개의 게시물을 그들에게 번역하지 않을 것입니다. 건강은 같지 않습니다 :(

행운을 빕니다,
쿼크
 
작업이 완료되었음에도 불구하고 오류 번호 6이 계속 발생합니다. 이것은 MT가 옵티마이저를 사용하는 동시에 포지션을 열 때 발생합니다. 벌써 두 번이나 잡혔다. Expert Advisor를 다시 시작하면 - 포지션 개설 조건이 유효한 경우 - 포지션을 개설할 수 있으며 문제는 없습니다.
 
옵티마이저가 실행 중일 때 오류 6이 발생할 가능성이 훨씬 더 높은 것처럼 보입니다. 컴퓨터 다시 시작, MT 등 조치는 상황을 변경하지 않습니다.

다른 Expert Advisor에서 문제가 발생합니다. 그들 모두의 논리는 세마포어(Slava가 제안한 대로)와 지연(Rosh)으로 수정되어 주어진 10초 동안 1명의 Expert Advisor만 작동합니다. 위에서 언급한 모든 오류는 6번을 제외하고 (지금은) 사라졌습니다.