например, пересчитанные значения оказались за пределами видимости графика. недавно разбирал один такой кастом-индикатор. проблема оказалась в том, что стояла проверка 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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Почему такое может случаться???