실수 번호 6 - 페이지 6

 
나쁘지는 않지만 본질적으로 동일합니다 :)
SetTrace란 무엇입니까?


Opanki :) 바로 지금 광고, 관심을 할 것입니다 - http://forexsystems.ru/phpBB/viewtopic.php?t=694&start=45
 
хэндлов не хватает.


시스템 설정(W'XP)에서 핸들 수와 방법을 변경할 수 있습니까?
 
개발자를 위한 또 다른 질문입니다.

어떻게:

하나.
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(주문 유형() == OP_BUY)
				OrderClose(OrderTicket(), OrderLots(), 입찰, nSlip, 아쿠아);
			그렇지 않으면(주문 유형() == OP_SELL)
				OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
		}
	}
}



2.

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(주문 유형() == OP_BUY)
				OrderClose(OrderTicket(), OrderLots(), 입찰, nSlip, 아쿠아);
			그렇지 않으면(주문 유형() == OP_SELL)
				OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
		}
	}
}



3. 상관없어요.
4. 반품을 넣고 다음 틱에 다음 주문을 처리하기 위해 필요합니다
5. 다른 방법으로 필요합니다.

설명하겠습니다. 두 개의 미결 주문이 있고 둘 다 마감되어야 한다고 가정합니다. 주기

for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)



0 주문을 닫고 첫 번째 주문은 0이 됩니다. 그런 다음 그는 첫 번째 주문을 종료하려고 시도하고 오류가 발생합니다. 그래서?

이 스레드에서 논의된 전문가의 모든 오류가 이 문제와 관련이 있다고 생각하지 않습니다. 예를 들어 일반적인 오류는 관련이 없는 것 같습니다. 그러나 내가 옳다면 아마도 이것은 a) 주문 잠김 등, b) 오류를 일으키는 데 여러 전문가가 필요하다는 것을 설명합니다.



 
хэндлов не хватает.


Можно ли изменить число хэндлов в системных установках (W'XP) и как?

거기에 가지 않는 것이 좋습니다. 프로그램에 충분한 핸들이 없으면 이 프로그램은 오류와 함께 작성됩니다. 다른 경우에는 큰 여백을 가진 충분한 핸들이 있습니다.
 
물론 두 번째 옵션은 맞지만 반환 대신에 Sleep() 초를 30초에 넣고 콧수염을 길러야 합니다.
 
나는 그 교체를 추가 할 것입니다
for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)

for(int nCnt = OrdersTotal() - 1, nCnt >= 0, nCnt--)
나는 갔다 :) 오류 139에서 138 및 4109로
(인용하기, 배열에서 초기화되지 않은 문자열 )
마지막은 노코멘트...
 
물론 두 번째 옵션은 맞지만 반환 대신에 Sleep()초를 30초에 넣고 콧수염을 길러야 합니다.


10명의 전문가가 1분 간격으로 1인당 30초씩... 틀리죠, 당신은 그렇게 살 수 없습니다.
 
그게 다라고 생각해? 제게는 12개의 창이 있었는데 각각 고유한 통화와 고유한 전문가 고문이 있었습니다. 나는 그 중 11개에서 (라이브 거래 허용) 거래를 금지했습니다. 그리고 그들 모두의 실수가 도착했습니다. 또 다른 버그.
 
Конечно, второй вариант правилен, только вместо return надо ставить Sleep() секунд на 30 и усе.


10명의 전문가가 1분 간격으로 1인당 30초씩... 틀리죠, 당신은 그렇게 살 수 없습니다.



사람은 이렇게 살아야 하고, 너희가 하는 것은 철의 강함을 시험하는 것이다.
 
테스트용 Expert Advisor의 새 버전. 변경된 사항:
1. 주기가 고정되었습니다.
2. 바 시작 시간에 매직 넘버가 추가됩니다. 이것은 내가 틀리지 않았다면 오프닝 지연을 제공합니다. 즉, 승수가 7인 전문가는 막대 시작 7초 후에 열립니다. 이렇게 하면 서버 과부하, 컴퓨터 프로세서, 최대 2.5초 충돌을 피할 수 있습니다. 충돌이 여전히 어딘가에 있을 경우...

그러나 슬프게도 실수는 남아 있습니다.

규칙은 동일합니다. 임의의 시간대(예: 분)에 여러 창을 열고 기다리십시오.

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;
		
	timePrev += nMagic;	// Open nMagic seconds after the new bar

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

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

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

	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(Symbol() + ", " + 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(Symbol() + ", " + 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);
}

// ------