실수 번호 6 - 페이지 9

 
감사합니다. 12개 창(12개 통화)용 Expert Advisor 버전을 설치했습니다. 오류는 더 적지만 여전히 있습니다. 소리. 나는 그럭저럭 138과 1을 얻었습니다. 직접 해보십시오.

추가 안내를 바랍니다.

쿼크
 
그건 그렇고, 코드
동안(!Isstopped())
{
	if(GlobalVariableGet(strTradeSemaphore) == 0.0)
	{
		GlobalVariableSet(strTradeSemaphore, 1.0);
		b세마포어 = true;
         
		부서지다;
	}
		
	수면(1000);
}



if(GlobalVariableGet(strTradeSemaphore) == 0.0)과 GlobalVariableSet (strTradeSemaphore, 1.0) 사이를 허용합니다. 다른 전문가가 들어옵니다. 실행 스레드를 캡처 및 차단(즉, 리소스 대기)한 다음 제어를 전문가에게 반환하는 함수가 필요합니다. WaitForExclusive()와 같은 것

하지만 그게 핵심이 아닐 수도 있습니다. 하지만 계속해서 실수가 쏟아지고 있다.

 
그게 낫다. 그러나 이전에는 존재하지 않았던 오류가 있었습니다(예: 오류 1).
도움을 바랍니다.

그건 그렇고,이 대화가 이미 발생했기 때문에 NormalizeDouble 을 사용하여 가격에 대해 얼마나 많은 표지판을 떠날지 자동으로 결정하는 방법, 즉 EURUSD는 4, EURJPY는 2... ?

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits = 4;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
	{
		nMagic = 2;
		nDigits = 2;
	}
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
	{
		nMagic = 5;
		nDigits = 2;
	}
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
	{
		nMagic = 7;
		nDigits = 2;
	}
	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;
	
	if(!bIsBarEnd)
		return(0);

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

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

		if(GlobalVariableGet(strTradeSemaphore) == nMagic)
			break;
		
		Sleep(1000);
	}

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

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

	GlobalVariableSet(strTradeSemaphore, 0.0);	

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

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

	dLotSize = GetLotSize();

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

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + NormalizeDouble(Bid, nDigits) + ", Stop: " + 
			NormalizeDouble(Bid + dStopLoss, nDigits) + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

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

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

 
오류 138 은 가끔 나타납니다(오류가 발생하는 데 오래 걸리지 않도록 분당 12개 쌍을 실행함). 오류 129도 완벽하게 정상적인 가격으로 나타납니다.
 
그래서. 실수 1. 도움말의 무료 번역에서 "뭔가 잘못되었습니다". 분당 12개의 통화 쌍, 약 5-10분마다 한 번씩 오류가 발생합니다.

오류 138 . 분당 여러 번(즉, 12명의 전문가 중 여러 명이 생성).

오류 129. 이미 가격을 정상화하고 모든 것을 수행했습니다 ...
 
그건 그렇고,이 대화가 이미 발생했기 때문에 NormalizeDouble을 사용하여 가격에 대해 얼마나 많은 기호를 떠날 것인지 자동으로 결정하는 방법, 즉 EURUSD는 4, EURJPY는 2... ?
 int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




내 5번째 전문가 고문 중 한 명이 이 모든 시간 동안 6번의 오류를 냈습니다.
내 수정에서 전문가가 작동하지 않습니다-이 빌드에서 잘못되었습니다 =)
오 예... 내 5도 작동하지 않습니다 =)))) 젠장...

 
стати, раз уж этот разговор возник, как автоматически определить, сколько знаков оставлять для цены при помощи NormalizeDouble, то есть, 4 для EURUSD, 2 для EURJPY... ?
 int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




내 5번째 전문가 고문 중 한 명이 이 모든 시간 동안 6번의 오류를 냈습니다.
내 수정에서 전문가가 작동하지 않습니다-이 빌드에서 잘못되었습니다 =)
오 예... 내 5도 작동하지 않습니다 =)))) 젠장...



코드 감사합니다. 오랫동안 찾고 있었을 것입니다.
Slava가 제안하고 개선한 Expert Advisor는 아래와 같습니다. 저처럼 12개의 창에서 12개의 통화로 실행할 수 있습니다. 그것은 모든 시간대에 작동하지만 몇 분 만에 더 빠릅니다. :) 오류가 계속 쏟아지고 있습니다. 젠장 ... 왜 그런지 이해할 것입니다.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!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;
	
	if(!bIsBarEnd)
		return(0);

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

		if(GlobalVariableGet(strTradeSemaphore) == nMagic)
			break;
		
		Sleep(1000);
	}

	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(500);

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

	Sleep(500);
	
	GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = 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 = MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = 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);
}


 
그건 그렇고, 코드는 [건너 뛴다]
if(GlobalVariableGet(strTradeSemaphore) == 0.0)과 GlobalVariableSet(strTradeSemaphore, 1.0) 사이를 허용합니다. 다른 전문가가 들어옵니다. 실행 스레드를 캡처 및 차단(즉, 리소스 대기)한 다음 제어를 전문가에게 반환하는 함수가 필요합니다. WaitForExclusive()와 같은 것

하지만 그게 핵심이 아닐 수도 있습니다. 하지만 계속해서 실수가 쏟아지고 있다.

바로 그거죠. 이것이 내가 글로벌 변수를 첫 번째 매개변수로 설정할 수 있는 가상의 함수 GlobalVariableSetOnCondition 에 대해 이야기한 이유입니다. 전역 변수에 대한 액세스가 차단되므로 "원자성"이 부여됩니다.

이제 IsStopped 함수에 대해 알아보겠습니다. EA가 정상적으로 종료될 수 있도록 EA의 중지 플래그를 확인합니다(2.5초 동안). 이 기능을 루프 조건 중 하나로 사용하는 것이 좋습니다. 특히 무한
 

바로 그거죠. 이것이 내가 글로벌 변수를 첫 번째 매개변수로 설정할 수 있는 가상 함수 GlobalVariableSetOnCondition에 대해 이야기한 이유입니다. 전역 변수에 대한 액세스가 차단되었으므로 "원자성"이 부여됩니다.


내 인생에 감사합니다, 나는이 텍스트를 이해하지 못합니다. 또는 다른 말로 어떻게든 설명하거나 당신이 의미하는 바를 보여줍니다. 내가 할 수 있다면.

그건 그렇고, 내가 수정한 코드에 어떤 문제가 있습니까? 즉, 작동하지 않기 때문에 뭔가 잘못된 것이 분명하지만 오류가 표시되지 않습니다. 내 계산에 따르면 이것은 독점적인 액세스를 제공했어야 했습니다 ...

동안(!Isstopped())
{
	if(GlobalVariableGet(strTradeSemaphore) == 0.0)
		GlobalVariableSet(strTradeSemaphore, nMagic);

	if(GlobalVariableGet(strTradeSemaphore) == nMagic)
		부서지다;
		
	수면(1000);
}
 

именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"


내 인생에 감사합니다, 나는이 텍스트를 이해하지 못합니다. 또는 다른 말로 어떻게든 설명하거나 당신이 의미하는 바를 보여줍니다. 내가 할 수 있다면.

우리는 GlobalVariableGet 및 GlobalVariableSet 함수에 대한 호출 사이의 가능성을 방지하는 것에 대해 이야기하고 있습니다. 오류가 여전히 관찰되기 때문에 다른 전문가의 쐐기는 실제입니다. 이것이 내가 원자적 접근에 대해 말하는 이유입니다. 우리는 같은 문제를 다른 단어로만 해결하는 것에 대해 이야기하고 있습니다.

그건 그렇고, 내가 수정한 코드에 어떤 문제가 있습니까? 즉, 작동하지 않기 때문에 뭔가 잘못된 것이 분명하지만 오류가 표시되지 않습니다. 내 추정에 따르면 이것은 독점적인 액세스를 제공했어야 했습니다 ...

동안(!Isstopped())
{
	if(GlobalVariableGet(strTradeSemaphore) == 0.0)
		GlobalVariableSet(strTradeSemaphore, nMagic);

	if(GlobalVariableGet(strTradeSemaphore) == nMagic)
		부서지다;
		
	수면(1000);
}



당신의 모범이 더 좋을 것입니다