실수 번호 6 - 페이지 5

 
이제 나는 터미널을 보았습니다. 어제 저와 함께 몇 가지 문제가 시작되었습니다.
2005.08.11 11:15:00 ****l EURUSD,H1: #139 오류로 OrderSend 실패
2005.08.11 11:07:12 TradeDispatcher: 모든 거래 컨텍스트가 사용 중입니다.

이 고문을 풀었습니다. 다음에 무슨 일이 일어나는지 지켜보겠습니다.


여기. 이것이 바로 그것입니다. 시작합니다. 139는 주문이 잠겨 있습니다. 누구에 의해, 왜 - 명확하지 않습니다. 그런 다음 2, 6, 심지어 힙이 있습니다.

가장 불쾌한 것은 이 Expert Advisor에 다른 것과 구별되는 것이 없다는 것입니다. 따라서 가까운 거리에서 이 "무언가"를 보지 못하거나 모든 조언자가 실패할 수 있습니다. 모든 사람이 알아차리지 못한 채 매시간 작동할 필요는 없습니다.

따라서 모든 사람에게 질문하십시오. 로그에 비슷한 항목이 있습니까?

Rosh, Alpari를 사용합니까? 그렇다면 질문은 Alpari에 대한 것입니다. 서버가 정상적으로 작동합니까?

오늘 밤 알게 된 사실 :(

1. EA는 자체적으로 ONE이 작동하며 오류를 제공하지 않거나 너무 드물게 오류를 제공하여 밤으로 충분하지 않습니다.

2. 더 많은 Expert Advisors(더 정확하게는 6개 통화에 대해 1개)와 함께 오류가 재현되었지만 한 시간이 아니라 4시간 후에 오류가 재현되었습니다.

여기에서 이어지는 내용은 무엇입니까?
1. MT(또는 내 Expert Advisor에 있지만 너무 간단하여 가능성이 없음)에 버그가 있으며, 이는 때때로 거래 시작을 허용하지 않습니다. 그건 그렇고, 너무 가깝습니다.
물론 다음과 같이 우회할 수 있습니다.

동안(n결과 == -1)
{
    nResult = 주문 보내기(...);
}



말할 필요도 없이 이것은 매우 나쁜 프로그래밍 스타일이며 브로커는 기분이 상할 수 있습니다...

2. 이제 Expert Advisor를 더 간단하면서도 동시에 오류가 발생하도록 다시 작성하고 있습니다. 나는 앞으로 몇 시간 안에 그것을 게시할 것입니다. 오류에 대해 전문가 2명이 필요한 것으로 판명되면 어떻게 해야 하나요?






 
2. 이제 Expert Advisor를 더 간단하면서도 동시에 오류가 발생하도록 다시 작성하고 있습니다. 나는 앞으로 몇 시간 안에 그것을 게시할 것입니다. 오류에 대해 전문가 2명이 필요한 것으로 판명되면 어떻게 해야 하나요?

그리고 우리는 확인할 것입니다
 
쿼크, 내가 진단을 내렸어, 당신의 조언자는 책임이 있습니다. 귀하의 전문가 조언자로부터 경고 가 나오자마자 (나는 그것들을 전혀 사용하지 않습니다) - 나는 즉시
 2005.08.11 13:01:19 TradeDispatcher: 모든 거래 컨텍스트가 사용 중입니다.


경고 및 차단 시간은 동일합니다. 고문의 코드는 전혀 보지 않았습니다.

 
그럼. 다음은 한 손으로 오류를 생성하는 새로운 슈퍼 전문가입니다. 지금까지 139번 오류 이상으로 진행이 되지 않아 테스트를 진행하겠습니다.

사용 방법: 각 통화(EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) 시간별 차트를 엽니다.
전문가에 따라 각 차트에 대해. 모두의 mn이 다르기 때문에 그들은 상호 작용하지 않습니다.

차트당 하나씩 위치가 즉시 열립니다 . 다음 시간이 시작될 때 위치가 바뀌어야 하는 식입니다.

한 번에 2개의 오류가 발생하므로 원칙적으로 2시간을 기다려야 하는 경우 옵션이 가능합니다.

거래 서버와 특별한 관계가 있는 경우 테스트를 위해 일반 계정을 사용하는 것이 가장 좋습니다. 알파리를 사용하고 있습니다.

또한 위치를 여는 화살표의 위치에 주의하십시오(이것은 독립적인 버그라고 생각합니다). 이론상 새 막대에서 위치가 열리므로 화살표도 새 막대에 있어야 합니다.

마지막으로, 한 시간을 기다리고 싶지 않다면 분 차트를 엽니다. 오류가 재현됩니다.

다시 한 번 말하지만 오류 139에 대해 이야기하고 있습니다. 동시에, 저는 아직 이 방법으로 오류 2와 6을 얻을 수 없었습니다. 그래서 아마도 더 많은 게시물이있을 것입니다.

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;

	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]) 
		bIsBarEnd = true;
	timePrev = Time[0];
	
	if(!bIsBarEnd)
		return(0);

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

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

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

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

// ------
 
쿼크, 내가 진단을 내렸어, 당신의 조언자는 책임이 있습니다. 귀하의 전문가 조언자로부터 경고가 나오자마자 (나는 그것들을 전혀 사용하지 않습니다) - 나는 즉시
 2005.08.11 13:01:19 TradeDispatcher: 모든 거래 컨텍스트가 사용 중입니다.


경고 및 차단 시간은 동일합니다. 고문의 코드는 전혀 보지 않았습니다.



모든 것이 잘 될 것이지만 거래가 이루어지지 않는다는 것을 알게 된 후 경고를 도입했습니다. 또한 OrderSend 바로 뒤에 있는 코드의 경고입니다.

이제 인쇄로 전환하려고 하지만 뭔가 의심스럽습니다...
 
그건 그렇고, 이것은 흥미 롭습니다. Advisor를 다시 컴파일할 때 bIsBarEnd를 계산하는 데 사용하는 변수가 재설정됩니다. 따라서 편집기에서 F5 키를 누르면 모든 고문이 이전 위치를 닫고 새 위치를 열어야 합니다. F5 키를 눌렀습니다... 통화(및 고문) 12. 업데이트됨 3. 흠?

경고 대신 인쇄를 넣어 Rosh의 추측을 테스트하십시오. 아아, 유일한 차이점은 이제 오류 메시지 139가 화면이 아닌 로그에 표시된다는 것입니다.
 
악마는 알고 있습니다. 코드를 보면 불평할 것이 없는 것 같습니다. 나는이 장소를 영업 시간이 아닌 Bar를 통해 결정할 것입니다.
 부울 bIsBarEnd = 거짓;
	if(timePrev != 시간[0]) 
		bIsBarEnd = true;
	timePrev = 시간[0];



그리고 이 이상한 점:
2005.08.11 13:08:12 '18708': 주문 마감 #680413 1.2385 sl: 0.0000 tp: 0.0000 가격 1.2408에 0.10 EURUSD 매수
이후

2005.08.11 13:08:13 '18708': 주문 번호 680413 1.2385 sl: 1.2275 tp: 0.0000 1.2408 가격에 0.10 EURUSD 매수

즉, 처음에는 주문이 스탑 없이 진행되고 차익을 얻으다가 갑자기 스탑 로스가 오더에 나타납니다.

 
악마는 알고 있습니다. 코드를 보면 불평할 것이 없는 것 같습니다. 나는이 장소를 영업 시간이 아닌 Bar를 통해 결정할 것입니다.
 부울 bIsBarEnd = 거짓;
	if(timePrev != 시간[0]) 
		bIsBarEnd = true;
	timePrev = 시간[0];



그리고 이 이상한 점:
2005.08.11 13:08:12 '18708': 주문 마감 #680413 1.2385 sl: 0.0000 tp: 0.0000 가격 1.2408에 0.10 EURUSD 매수
이후

2005.08.11 13:08:13 '18708': 주문 번호 680413 1.2385 sl: 1.2275 tp: 0.0000 1.2408 가격에 0.10 EURUSD 매수

즉, 처음에는 주문이 스탑 없이 진행되고 차익을 얻으다가 갑자기 스탑 로스가 오더에 나타납니다.



테스트된 코드가 있으면 "바를 통해" 살펴보겠습니다. :)

Zero stop은 init에서 지정했고 다른 곳에서는 변경하지 않았습니다. 버그, 아마도. 젠장, C++을 포기한 이후로 곤충학을 다시 해야 할 거라고 생각하지 않았어요.

사실, 글쎄요, 전문가입니다. 글쎄요. 그러나 너무 간단해서 질문이 생깁니다. 다른 전문가들이 같은 방식으로 행동할 위험이 있습니까? 또한, 버그는 전문가가 많을 때만 나타나며 심지어는 다른 오류가 발생한다는 점을 고려하십시오.

예를 들어 MACD + ADX + Stochastic을 사용하는 Expert Advisor가 있습니다. 테스터(서버 오류가 정의되지 않은 곳)와 함께 테스트하면 "여기서 모든 조건이 충족되었지만 트랜잭션이 완료되지 않았습니다." 대부분은 그렇지 않을 것입니다... 위험한 버그입니다.
 


테스트된 코드가 있으면 "바를 통해" 살펴보겠습니다. :)



예를 들면 다음과 같습니다.
 정수 시작()
  {
   int total, 티켓, totalExpert;
//---- 
   설정 추적();
   if (막대>b)
      {   
      b=바;
 
나쁘지는 않지만 본질적으로 동일합니다 :)
SetTrace란 무엇입니까?
사유: