Не получается подсчитать индикатор с текущими данными.

 
Здравствуйте всем. В описание MQL4 сказано, что программа может реализовать любую торговую стратегию. Но у меня при вызове данных индикатора iOSMA выдается только прошедшие значения. Даже при применении в расчете индикатора индекса 0, индикатор расчитывает программа выдает не последний расчет индикатора (который кстати виден на экране), а предпоследний. Соответственно при индексе 1, индикатор выдает предпредпоследний. А при индексе (-1) индикатор не считает. Подскажите, как запросить данные индикатора с учетом текущего бара?
 
приведите пример своего кода
 
sergeev писал(а) >>
приведите пример своего кода

// Смысл советника, что он сравнивает три точки на индикаторе
// ОsMA и в случае, что если вторая точка больше первой и третья меньше второй
// то дается сигнал на продажу (верхний перегиб). Если же вторая точка меньше первой,
//а третья больше второй, то дается сигнал на покупку (верхний перегиб).

// Расчет всех трех точек индикатора

OsmaOdin = 10000000*iOsMA(NULL,0,12,26,9,PRICE_OPEN,2);
Alert("Номер тика ",Count," Величина OsmaOdin равняется = ", OsmaOdin);

OsmaDva = 10000000*iOsMA(NULL,0,12,26,9,PRICE_OPEN,1);
Alert("Номер тика ",Count," Величина OsmaDva равняется = ", OsmaDva);

OsmaTri = 10000000*iOsMA(NULL,0,12,26,9,PRICE_OPEN,0);
Alert("Номер тика ",Count," Величина OsmaTri равняется = ", OsmaTri);

//-------------------------------------------------------4--------------------------------------

// Запрос и присвоение переменной total количества открытых и отложенных ордеров.
total=OrdersTotal();

//-------------------------------------------------------5--------------------------------------

if(total<1)
{
// Проверка отсутствия открытых ордеров -------------5.1---------------------------------------

if(AccountFreeMargin()<(1000*Lots))
{
Print("У нас недостаточно денег. Свободные средстваFree Margin = ", AccountFreeMargin());
return(0);
}
//-------------------------------------------------------5.1--------------------------------------
// Проверка возможности ордера на ПОКУПКУ, индикатор находится в нижней части прогиба--------
//-------------------------------------------------------5.2--------------------------------------
if(OsmaOdin>OsmaDva && OsmaDva<OsmaTri)
{
Alert("Ситуация для ПОКУПКИ ");
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,0,"macd sample",16384,0,Green);
Alert("Номер ордера ticket = ",ticket);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Alert("Ошибка при открытии ордера на Покупку. № ошибки = ",GetLastError());
return(0);
}

Вот пожалуйста

 
Kirilll писал(а) >>

// Смысл советника, что он сравнивает три точки на индикаторе
// ОsMA и в случае, что если вторая точка больше первой и третья меньше второй
// то дается сигнал на продажу (верхний перегиб). Если же вторая точка меньше первой,
//а третья больше второй, то дается сигнал на покупку (верхний перегиб).

// Расчет всех трех точек индикатора

OsmaOdin = 10000000*iOsMA(NULL,0,12,26,9,PRICE_OPEN,2);
Alert("Номер тика ",Count," Величина OsmaOdin равняется = ", OsmaOdin);

OsmaDva = 10000000*iOsMA(NULL,0,12,26,9,PRICE_OPEN,1);
Alert("Номер тика ",Count," Величина OsmaDva равняется = ", OsmaDva);

OsmaTri = 10000000*iOsMA(NULL,0,12,26,9,PRICE_OPEN,0);
Alert("Номер тика ",Count," Величина OsmaTri равняется = ", OsmaTri);

//-------------------------------------------------------4--------------------------------------

// Запрос и присвоение переменной total количества открытых и отложенных ордеров.
total=OrdersTotal();

//-------------------------------------------------------5--------------------------------------

if(total<1)
{
// Проверка отсутствия открытых ордеров -------------5.1---------------------------------------

if(AccountFreeMargin()<(1000*Lots))
{
Print("У нас недостаточно денег. Свободные средстваFree Margin = ", AccountFreeMargin());
return(0);
}
//-------------------------------------------------------5.1--------------------------------------
// Проверка возможности ордера на ПОКУПКУ, индикатор находится в нижней части прогиба--------
//-------------------------------------------------------5.2--------------------------------------
if(OsmaOdin>OsmaDva && OsmaDva<OsmaTri)
{
Alert("Ситуация для ПОКУПКИ ");
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,0,"macd sample",16384,0,Green);
Alert("Номер ордера ticket = ",ticket);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Alert("Ошибка при открытии ордера на Покупку. № ошибки = ",GetLastError());
return(0);
}

Вот пожалуйста

Файлы:
 
В коде у вас все правильно. Просто имейте в виду, что вы запросили данные по ЦЕНЕ ОТКРЫТИЯ. И, вероятно, сравниваете эти данные со значением индикатора, посчитанного по ЦЕНЕ ЗАКРЫТИЯ. Тогда вам просто нужно изменить параметры расчета индикатора, например:
OsmaTri = 10000000*iOsMA(NULL,0,12,26,9,PRICE_CLOSE,0);

Тогда с каждым тиком вы будете получать измененное значение, а значение по цене OPEN уже не изменится.

Точно также можно получить значение индикатора по любой другой цене. Смотрите ценовые констаны

 
Scriptong писал(а) >>
В коде у вас все правильно. Просто имейте в виду, что вы запросили данные по ЦЕНЕ ОТКРЫТИЯ. И, вероятно, сравниваете эти данные со значением индикатора, посчитанного по ЦЕНЕ ЗАКРЫТИЯ. Тогда вам просто нужно изменить параметры расчета индикатора, например:

Тогда с каждым тиком вы будете получать измененное значение, а значение по цене OPEN уже не изменится.

Точно также можно получить значение индикатора по любой другой цене. Смотрите ценовые констаны

Большое СПАСИБО. я сделал как вы сказали, и у меня все заработало как планировалось. Только я теорию вашего ответа не понял. А откуда программа знает цену закрытия ? и соответсвенно почему все таки не расчитывается по ценам открытия ?

 
Kirilll >>:

Большое СПАСИБО. я сделал как вы сказали, и у меня все заработало как планировалось. Только я теорию вашего ответа не понял. А откуда программа знает цену закрытия ? и соответсвенно почему все таки не расчитывается по ценам открытия ?

Для нулевого бара цена закрытия - это текущая цена BID, которая постоянно меняется вплоть до закрытия бара. Когда бар сформирован и его индекс стал не ноль, а один, цена закрытия становится фиксированной и далее не меняется.

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


 
Scriptong писал(а) >>

Для нулевого бара цена закрытия - это текущая цена BID, которая постоянно меняется вплоть до закрытия бара. Когда бар сформирован и его индекс стал не ноль, а один, цена закрытия становится фиксированной и далее не меняется.

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

Все понял . Еще раз большое СПАСИБО.

 
Scriptong писал(а) >>

Оффтоп, потом сотру. С удовольствием прочитал грамотные развернутые ответы Игоря, написанные хорошим языком.

Надеюсь, он успеет это увидеть.

Причина обращения: