например, пересчитанные значения оказались за пределами видимости графика. недавно разбирал один такой кастом-индикатор. проблема оказалась в том, что стояла проверка if (prevtime==Time[0])...
Если можно поподробнее,
1.-чем определяются пределы видимости графика(количеством баров или временными рамками..???)
2. Почему условие if (prevtime==Time[0]) некорректно -(запрашиваемое значение оператора или переменной не существует на каком либо баре???.. )
1.-чем определяются пределы видимости графика(количеством баров или временными рамками..???)
2. Почему условие if (prevtime==Time[0]) некорректно -(запрашиваемое значение оператора или переменной не существует на каком либо баре???.. )
1. пределы видимости графика определяются и начальным-конечным барами на странице(это и есть временные рамки), и диапазоном цен на странице.
2. это условие корректно до тех пор, пока Вы не проскроллитесь назад до упора и не получите новую порцию данных. Вам придёт ещё, скажем, 200 баров, а условие сработает так, как Вы и предполагаете. если Вы производите пересчёт индикатора только в начале каждого бара, то при подкачке следующей порции Вы получите смещение индикаторного массива как раз на эту порцию. это условие лучше ставить в экспертах, но не в индикаторах
2. это условие корректно до тех пор, пока Вы не проскроллитесь назад до упора и не получите новую порцию данных. Вам придёт ещё, скажем, 200 баров, а условие сработает так, как Вы и предполагаете. если Вы производите пересчёт индикатора только в начале каждого бара, то при подкачке следующей порции Вы получите смещение индикаторного массива как раз на эту порцию. это условие лучше ставить в экспертах, но не в индикаторах
if (prevtime==Time[0]) некорректно
Этого условия недостаточно. Надо проверять и общее кол-во баров на графике.
if (prevtime==Time[0] && prevbars==Bars)
а в кастом индикаторах можно и более чистый вариант использовать:
int cbars=IndicatorCounted();
if(cbars<1) { // были структурные изменения в истории графика, надо все с начала
// пересчитать
IndicatorCounted() специально введен чтобы гарантированно распознавать серьезные изменения
в истории графика (например: после подкачки, после импорта или любых изменений в History Center).
..А что если IndicatorCounted()==0 это означает, что были серьезные структурные изменения в графике??
-с вариантом <0 вроде разобрались в "Борьба с неграмотностью!!!"
(вот цитата из ответа:
1. если возвращаемое значение меньше 0, то это либо катастрофа, либо переполнение счётчика баров (более 2 миллиардов - какое там максимальное целое положительное число?)
это условие тянется из первых наработок. считайте этот атавизм паранойей и спокойно убирайте это условие. )
Вот фрагмент кода индикатора:
int start()
{
datetime DayTime[];
double DayLowes[],DayHighes[];
int limit;
int k=0;
int counted_bars=IndicatorCounted();
ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- midle counted
for(int i=0; i<limit; i++)
{if(Time[i]<DayTime[k]) k++;
int j=k+1;
ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}
return(0);
}
Скажите почему индикатор может пропадать после смены периода графика, и акурат появляться заново после выбора периода графика D1 ???
-с вариантом <0 вроде разобрались в "Борьба с неграмотностью!!!"
(вот цитата из ответа:
1. если возвращаемое значение меньше 0, то это либо катастрофа, либо переполнение счётчика баров (более 2 миллиардов - какое там максимальное целое положительное число?)
это условие тянется из первых наработок. считайте этот атавизм паранойей и спокойно убирайте это условие. )
Вот фрагмент кода индикатора:
int start()
{
datetime DayTime[];
double DayLowes[],DayHighes[];
int limit;
int k=0;
int counted_bars=IndicatorCounted();
ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- midle counted
for(int i=0; i<limit; i++)
{if(Time[i]<DayTime[k]) k++;
int j=k+1;
ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}
return(0);
}
Скажите почему индикатор может пропадать после смены периода графика, и акурат появляться заново после выбора периода графика D1 ???
Неужели все знатоки MQL умывают руки?
Вся фишка в том что на убогом языке Метастока этот индикатор пишется в две строчки -и при этом все работает недвусмысленно однозначно;
А здесь приходиться развозить все на страницу- все по взрослому: описание переменных, циклы, массивы, -класно вопросов нет!! Вот если бы еще также стабильно работало ..
Вся фишка в том что на убогом языке Метастока этот индикатор пишется в две строчки -и при этом все работает недвусмысленно однозначно;
А здесь приходиться развозить все на страницу- все по взрослому: описание переменных, циклы, массивы, -класно вопросов нет!! Вот если бы еще также стабильно работало ..
много раз уже говорили, если хотите, чтобы Вам кто-то помог, оформите ПОЖАЛУЙСТА исходный текст должным образом! в тегах pre
Дубль два
..А что если IndicatorCounted()==0 это означает, что были серьезные структурные изменения в графике??
-с вариантом <0 вроде разобрались в "Борьба с неграмотностью!!!"
(вот цитата из ответа:
Вот фрагмент кода индикатора:
..А что если IndicatorCounted()==0 это означает, что были серьезные структурные изменения в графике??
-с вариантом <0 вроде разобрались в "Борьба с неграмотностью!!!"
(вот цитата из ответа:
1. если возвращаемое значение меньше 0, то это либо катастрофа, либо переполнение счётчика баров (более 2 миллиардов - какое там максимальное целое положительное число?)
это условие тянется из первых наработок. считайте этот атавизм паранойей и спокойно убирайте это условие. )
это условие тянется из первых наработок. считайте этот атавизм паранойей и спокойно убирайте это условие. )
Вот фрагмент кода индикатора:
int start()
{
datetime DayTime[];
double DayLowes[],DayHighes[];
int limit;
int k=0;
int counted_bars=IndicatorCounted();
ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- midle counted
for(int i=0; i<limit; i++)
{if(Time[i]<DayTime[k]) k++;
int j=k+1;
ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}
return(0);
}
Скажите почему индикатор может пропадать после смены периода графика, и акурат появляться заново после выбора периода графика D1 ???
Дубль два
Просьба вставлять оригинал кода, а не его урезанную и отформатированную копию.
Ситуация очень проста: если хотите чтобы Вам помогли, сделайте все так, чтобы желающий
помочь не тратил время на разбор искореженного кода. Это правило работает в любой области.
Вопросов нет.
Индикатор серидины цены предыдущего дня:
Индикатор серидины цены предыдущего дня:
//+------------------------------------------------------------------+
//| Midday.mq4 |
//| Copyright © 2004, .co. |
//| http:// |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, .co ."
#property link "http:// "
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Violet
//---- indicator parameters
//---- indicator buffers
double ind_buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init(string Midday="H1")
{
//---- 2 additional buffers are used for counting.
IndicatorBuffers(3);
//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
SetIndexDrawBegin(0,0);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+0);
//---- 1 indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer))
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("Midday("+Midday+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Midday function |
//+------------------------------------------------------------------+
int start()
{
datetime DayTime[];
double DayLowes[],DayHighes[];
int limit;
int k=0;
int counted_bars=IndicatorCounted();
ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- Midday counted
for(int i=0; i<limit; i++)
{if(Time[i]<DayTime[k]) k++;
int j=k+1;
ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}
return(0);
}
//+------------------------------------------------------------------+
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Почему такое может случаться???