실수 번호 6 - 페이지 10

 
[인용문
당신의 모범이 더 좋을 것입니다
[/인용문]

이 예제는 작동하지 않습니다. 오류를 제공합니다. 경험이 더 많은 개발자로서 작동하도록 도울 수 있습니까?
감사합니다,
쿼크
 

질문: while(!IsStopped())는 어떻게 작동합니까? 도움말에서 완전히 명확하지 않지만 라이브 거래 허용에 대한 수표라고 생각했습니다.

이것은 그들이 외부에서 전문가를 닫을 것인지 여부를 확인합니다.

질문: 이 동안과 절전 모드는 시스템 속도를 늦추지 않습니까?

시스템이 느려지지 않습니다. 단 한 명의 전문가

질문: 절전 모드와 세마포어가 테스트 모드에서 올바르게 처리됩니까?

테스트의 슬립은 어떤 식으로든 해결되지 않고 단순히 건너뜁니다. 세마포어를 사용하면 질문이 더 어렵습니다. 실제 작업 전문가는 테스트 중에 이 세마포어를 놓고 경쟁할 수 있습니다. 테스트할 때 하나의 Expert Advisor만 테스트 중이므로 세마포어를 전혀 사용할 수 없습니다. 상호 작용하는 Expert Advisor의 동시 테스트를 구성할 수 없습니다. 테스트 중에 세마포어 작업을 제외하려면 IsTesting 함수를 사용하십시오.

더 논리적입니다. 세마포어를 설정하고 제거하는 사이에 주문을 처리할 수 있는 최대 두 번의 기회가 있습니다. 먼저 Buy() 또는 Sell()을 수행한 다음 아래에 CloseOrder()를 수행합니다. 이 두 "활동"은 전문가 내에서도 서로 경쟁하지 않을 뿐만 아니라 마치 두 명의 전문가가 있는 것처럼 경쟁하지 않을까요? 아니면 프로세스가 선형으로 보장되고 Buy()가 반환될 때까지 CloseOrder()가 거기에 도달하지 않습니까?

이러한 활동은 서로 경쟁하지 않을 것입니다. 우리의 거래 작업 이 이제 동기식이기 때문입니다. 즉, Expert Advisor는 거래 작업이 완료되기를 기다리고 있습니다. "프로세스는 선형으로 보장됩니다."
 
이 예제는 작동하지 않습니다. 오류를 제공합니다. 경험이 더 많은 개발자로서 작동하도록 도울 수 있습니까?

나는 강요하지 않을 것이다. GlobalVariableSetOnCondition 함수에 대해 며칠 기다리면 모든 액세스 제어 문제가 해결됩니다.
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

나는 강요하지 않을 것이다. GlobalVariableSetOnCondition 기능을 위해 며칠 기다리면 모든 액세스 제어 문제가 해결됩니다.


GlobalVariableSetOnCondition 기능 을 MT에 도입할 계획이시라면 미리 말씀해 주시겠습니까?

이 상황에서 어떻게 사용할 것을 제안합니까?

며칠 - 주말을 계산합니까?
 
우리의 토론에서 감사합니다. 유용한 조언에 더하여 저는 한 가지 아이디어를 냈습니다. 더 정확하게는 제안입니다. 나는 이미 그것을 언급했다, 나는 그것을 반복할 것이다.

MT에서 주문 대기열을 만들어야하지 않습니까? 즉, 해당 위치에 대한 작업 요청을 비동기적으로 작성할 수 있으며 MT는 시간이 있을 때 별도의 스레드에서 이 요청을 처리하고 다른 사람이 거기에 맞지 않는다는 보장을 받습니다.

쿼크
 
GlobalVariableSetOnCondition 기능을 MT에 도입할 계획이시라면 미리 말씀해 주시겠습니까?

이 상황에서 어떻게 사용할 것을 제안합니까?

며칠 - 주말을 계산합니까?

나는 이미 예를 들었다
      if(GlobalVariableSetOnCondition(세마포 이름, 1.0, 0.0)==true)
        {
         bSemaphored=참;
         부서지다;
        }


전역 변수 의 값이 0.0이면 값을 1.0으로 설정하고 true를 반환합니다. 그렇지 않으면 아무것도 설치하지 마십시오. 하나의 함수 호출에서 값을 확인하고 변경합니다.

"며칠"은 만일을 대비하여 말한 것입니다. 오늘 포스팅 잘 부탁드립니다

 
MT에서 주문 대기열을 만들어야하지 않습니까? 즉, 해당 위치에 대한 작업 요청을 비동기적으로 작성할 수 있으며 MT는 시간이 있을 때 별도의 스레드에서 이 요청을 처리하고 다른 사람이 거기에 맞지 않는다는 보장을 받습니다.

우리는 주문 대기열을하지 않습니다
 

나는 이미 예를 들었다


그들은 그것이 무엇인지 말하지 않았습니다 :) 나는 그 기능이 나에게 쓰여지도록 제안되었다고 생각했습니다.


"며칠"은 만일을 대비하여 말한 것입니다. 오늘 포스팅 잘 부탁드립니다


고맙습니다.
 
추가적으로.

1. 이 100개의 게시물에서 Expert Advisor에서 작업하는 동안 발견된 몇 가지 버그가 있었지만 직접적인 관련이 없었습니다. 예를 들어, 해당 Expert Advisors는 라이브 거래 허용 확인란이 제거된 후에도 계속 거래합니다. 나는 당신이 그들을 잊지 않기를 바랍니다.

2. 아래에 I AGAIN 전문가 코드를 제공합니다. 그것은 오류 1, 129, 138을 생성합니다. a) 138( requote )이 무엇인지, 왜 발생하는지, 세마포어와 관련이 있는지, 제거하는 방법을 설명해 주시겠습니까? b) 왜 129인가? 오류와 함께 가격이 표시되는데 정확한 것 같습니다. c) 글쎄, 약 1도.

테스트 방법을 상기시켜 드리겠습니다: 12개 통화에 대한 12분 창.

감사합니다,
쿼크

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