Проблема с Highest / Lowest

 
Помогите, пожалуйста, разобраться. Ниже вставлен эксперт, взятый из какого-то форума и портированный с МТ3 на МТ4.

В теле эксперта есть код:

double varH = High[Highest(MODE_HIGH, nBarNum, nBarNum)];
double varL = Low[Lowest(MODE_LOW, nBarNum, nBarNum)];
Print(varH, ", ", varL);

Который выводит в лог два нуля, вместо наименьшего и наибольшего значений цены. Вопрос - что не так?

С уважением,
Кварк.


int nBarNum = 700;
int dD = 80;
int dZazor = 10;

double dLotSize = 0.1;
double dInitAmount = 1000.0;
int nNumOfExperts = 5;		// To do: autocalculate number of active experts
int nSlip = 3;

double dProfit = 0;		// old: arrTotals

double dStopLoss = 15;
double dTakeProfit = 200;
double dTrailingStop = 50;

int nMagic = 7;
bool bReportDone = false;
//////////////////
int init ()
{ 
	if(Symbol() == "EURUSD" && Period() == 1)
	{
		nBarNum = 700;
		dD = 80 * Point;
		dZazor = 20 * Point;
		dTrailingStop = 50 * Point;

		dStopLoss = 25 * Point;
		dTakeProfit = 250 * Point;

		nMagic = 7;
	}
	else if(Symbol() == "EURJPY" && Period() == 1)
	{
		nBarNum = 700;
		dD = 80 * Point;
		dZazor = 20 * Point;
		dTrailingStop = 50 * Point;

		dStopLoss = 25 * Point;
		dTakeProfit = 250 * Point;

		nMagic = 8;
	}
	else if(Symbol() == "USDJPY" && Period() == 1)
	{
		nBarNum = 700;
		dD = 80 * Point;
		dZazor = 10 * Point;
		dTrailingStop = 50 * Point;

		dStopLoss = 25 * Point;
		dTakeProfit = 200 * Point;

		nMagic = 9;
	}

	return(0);
}
//////////////////
int deinit()
{
	return(0);
}
////////////////////
int start()
{
	if(Bars < 700)
		return(0);

	if(AccountFreeMargin() < 500)
		return(0);
		
	Report("SimpleBreak");

	// ------
	
	double varH = High[Highest(MODE_HIGH, nBarNum, nBarNum)];
	double varL = Low[Lowest(MODE_LOW, nBarNum, nBarNum)];
	
Print(varH, ", ", varL);	

	int nNumOfOpenedOrders = 0;
	
	for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
		if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
		{
			nNumOfOpenedOrders++;
		}
	}
	
	dProfit = 0;
		
	for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);
		if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
		{
			dProfit += OrderProfit();
		}
	}   
	
	if(varH - varL <= dD && nNumOfOpenedOrders < 2)
	{
		dLotSize = GetLotSize();
		
		if(nNumOfOpenedOrders == 0)
		{
			OrderSend(Symbol(), OP_BUYSTOP, dLotSize, varH + dZazor, 
				nSlip, varH + dZazor - dStopLoss, varH + dZazor + dTakeProfit, 
				"SimpleBreak", nMagic, 0, Aqua);
			return(0);
		}
		
		if(nNumOfOpenedOrders == 1)
		{
			OrderSend(Symbol(), OP_SELLSTOP, dLotSize, varL - dZazor, nSlip, 
				varL - dZazor + dStopLoss, varL - dZazor - dTakeProfit, 
				"SimpleBreak", nMagic, 0, OrangeRed);
			return(0);
		}
	}

	int nStopCount = 0;

	for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
		if(OrderMagicNumber() == nMagic && 
			(OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
		{
			nStopCount++;
		}
	}
	
	if(nStopCount > 0)
	{
		for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
		{
			OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
			if(OrderMagicNumber() == nMagic && 
				(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) 
				&& OrderSymbol() == Symbol())
			{
				OrderDelete(OrderTicket());
				return(0);
			}	
		}	
	}
	
	// ------
	
	for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
		if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol())
		{
			if(OrderType() == OP_BUY && Bid - OrderOpenPrice() > dTrailingStop) 
			{
				OrderModify(OrderTicket(), OrderOpenPrice(), 
					Bid - dTrailingStop, OrderTakeProfit(), 0, Aqua);
				return(0);
			}
			
			if(OrderType() == OP_SELL)
			{
				OrderModify(OrderTicket(), OrderOpenPrice(), 
					Ask + dTrailingStop, OrderTakeProfit(), 0, OrangeRed);
				return(0);
			}
		}
	}

	return(0);
}

// ------

double GetLotSize()
{
	double dLot = (0.1 * dInitAmount + 0.1 * dProfit) / 1000;
	
	// To do: what fraction of free margin should be used
	if(dLot * 2 * dInitAmount > AccountFreeMargin() / nNumOfExperts)
		dLot = AccountFreeMargin() / (2 * dInitAmount * nNumOfExperts);

	dLot = MathFloor(dLot * 10) / 10;
	
	if(dLot < 0.1)
		dLot = 0.1;

	return(dLot);
}

// ------

void Report(string strFileName)
{
	if(Hour() == 0 && Minute() >= nMagic && IsTesting() == false)
	{
		if(bReportDone == false)
		{
			int hFile = FileOpen(strFileName + "_" + Symbol() + "_" + Period() + ".rpt", 
				FILE_BIN | FILE_WRITE, ',');
			
			string str = "CloseDateTime,Type,Profit\r\n";
			FileWriteString(hFile, str, StringLen(str)); 

			for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++)
			{
				OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);	
				if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
				{
					str = "";
					str = str + TimeToStr(OrderCloseTime(), TIME_DATE|TIME_MINUTES);
					
					if(OrderType() == OP_BUY)
						str = str + ", buy";
					else
						str = str + ", sell";
					
					str = str + "," + OrderProfit();
					str = str + "\r\n";
					
					FileWriteString(hFile, str, StringLen(str));
				}
			}			

			FileFlush(hFile); 
			FileClose(hFile); 
			
			bReportDone = true;
		}
	}
	else if(Hour() != 0)
		bReportDone = false;
}


// ------
 
первые 2 параметра Highest и Lowest - symbol, period. поставьте NULL, 0
и вообще, внимательно почитайте, что написано в словаре MetaEditor про эти функции
 
первые 2 параметра Highest и Lowest - symbol, period. поставьте NULL, 0
и вообще, внимательно почитайте, что написано в словаре MetaEditor про эти функции


Спасибо. А вообще-то, я писал вам, что хелп сломан, а вы (Ренат) "экспериментируйте сами", "пробуйте"... Блин. Но все равно, спасибо :)
 
Спасибо. А вообще-то, я писал вам, что хелп сломан, а вы (Ренат) "экспериментируйте сами", "пробуйте"... Блин. Но все равно, спасибо :)

у нас-то он не сломан. и многие вещи просто не воспроизводятся. поэтому мы просим: "если есть проблема, максимально подробно описывайте сопутствующие обстоятельства". и всегда работайте с последними билдами
 
Спасибо. А вообще-то, я писал вам, что хелп сломан, а вы (Ренат) "экспериментируйте сами", "пробуйте"... Блин. Но все равно, спасибо :)

у нас-то он не сломан. и многие вещи просто не воспроизводятся. поэтому мы просим: "если есть проблема, максимально подробно описывайте сопутствующие обстоятельства". и всегда работайте с последними билдами


Я всегда работаю с последними билдами. После предпоследнего апдейта хелп и перестал работать. Все подробности описал...
Работаю на вин. 2000, английская, русифицирована стандартными средствами с диска инсталляции, затем с сайта Майкрософта подкачаны все критические апдейты. А что еще написать? Если Вы мне подскажете, в каком из файлов Вашей поставки находится хелп по Highest, я посмотрю этот файл, или пришлю его вам. Вся проблема - в том, что при нажатии на ф1, выдается хелп по applied price enumeration, не всегда, но на половине ключевых слов. Проблема была и раньше, но после какого-то апдейта исчезла. Теперь вернулась. Проблема была не только у меня - на форуме кто-то ответил (когда я сообщил о проблеме в первый раз), что и у него такое было.

Надеюсь, найдете.
Кварк
 
Спасибо. А вообще-то, я писал вам, что хелп сломан, а вы (Ренат) "экспериментируйте сами", "пробуйте"... Блин. Но все равно, спасибо :)

у нас-то он не сломан. и многие вещи просто не воспроизводятся. поэтому мы просим: "если есть проблема, максимально подробно описывайте сопутствующие обстоятельства". и всегда работайте с последними билдами


А после сегодняшнего апдейта хелп заработал :) Зато появилась проблема с крешем, см. мой следующий пост.
Причина обращения: