Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 602

 
AlexeyVik:
То-ли я тебя понять не могу, то-ли ты чего-то не понимаешь... Что не так в .csv файле? Пока первый бар не посчитается prev_calculated или IndicatorCounted() (в старом варианте) будут равны нулю и это правильно.


Да. Это понятно. Я приложил свой лог. Получается у меня дойдя до конца с 20000-го бара до 0-го как будто заново начинает гнать все 20000 баров. То есть либо не завершает работу OnCalculate, либо возвращает вместо rates_total ноль.

Но Вас почему-то этот баг не коснулся. У Вас все нормально работает...

Вот я и не могу понять что не так с моей машиной/системой?

 
Expert:


Да. Это понятно. Я приложил свой лог. Получается у меня дойдя до конца с 20000-го бара до 0-го как будто заново начинает гнать все 20000 баров. То есть либо не завершает работу OnCalculate, либо возвращает вместо rates_total ноль.

Но Вас почему-то этот баг не коснулся. У Вас все нормально работает...

Вот я и не могу понять что не так с моей машиной/системой?

Попробуй сначала убавить вложенные циклы в 100 раз а потом добавляй. Так ты поймёшь твой i5 не справляется или МТ тормозит.

Обратил внимание, что я один вложенный цикл убавил в 10 раз? В таком виде у меня пересчитывал 2 минуты 12 секунд.

Можно в этой строке

limit = (prev_calculated > 0)?rates_total-prev_calculated:rates_total-100;

100 увеличить. Это даст уменьшение пересчитываемых баров при запуске индикатора.



 

Всем доброго вечера(ночи, утра, дня)!

Подскажите пожалуйста как закодировать следующее условие.

Если High[1]......High[300].(все, без исключения) < Open[0]

Открыть ордер.

Спасибо.

 
solnce600:

Всем доброго вечера(ночи, утра, дня)!

Подскажите пожалуйста как закодировать следующее условие.

Если High[1]......High[300].(все, без исключения) < Open[0]

Открыть ордер.

Спасибо.


Как вариант:

int index=iHighest(NULL,0,MODE_HIGH,300,1);
if(High[index]<Open[0])
  {
   //открываем ордер
  }
 
isn-88:


Как вариант:

Спасибо.
 
Не могу найти какая функция в советнике позволяет заглядывать в будущее. Дело в том, что советник открывает позы в определенное время, а дыр великое множество, ищу пути как обойти такое дело.
 
001:
Не могу найти какая функция в советнике позволяет заглядывать в будущее. Дело в том, что советник открывает позы в определенное время, а дыр великое множество, ищу пути как обойти такое дело.

заглядывай не в будущее а в прошлое,сделай проверку на наличие дыры и всё.
 
001:
Не могу найти какая функция в советнике позволяет заглядывать в будущее. Дело в том, что советник открывает позы в определенное время, а дыр великое множество, ищу пути как обойти такое дело.
О каких дырах ты говоришь? Когда задаёшь вопрос по программированию такие выражения не уместны, дырами называют пропуски в исторических данных по инструменту, а здесь ты что имел ввиду? Если в вопросе присутствует "время" видимо ты имел ввиду "дыры для перемещения во времени" телепортацию.
Если я хоть чуток обладаю способностями телепатии, то просто надо добиться качественной истории по инструменту.
 

Нужна помощь, коллеги.

Пишу советника (первенец), для его корректной работы требуется анализ исторических данных.

Использую массивы цен открытия, времен открытия максимумов и минимумов.

При разделении массивов на суточные периоды, получается разное количество минутных баров почти в каждом периоде. На графике физически присутствуют все 1440 минутных баров, а по истории получается то 1380, то 1378, то больше 3000 за сутки.

Помогите разобраться в чем проблема. По моему история не может отличаться от реального (прорисованного) графика.

Вот кусок кода, который это все считает.

void CountStartTime(int i)//Собственно функция расчета времен, параметр - номер периода расчета

{

int my_by_tp, my_sell_tp, my_by_sl, my_sell_sl;

int j_v_t = my_period_array_start[i];//Смещение от начала расчетного периода

// Alert("Обсчет истории в ", i, " день");



do

{

//Устанавливаем пороги

double MyOpenPrise = my_open_array[j_v_t];

double MyByTakeProfit = MyOpenPrise + (TakeProfit + 5)*RealPoint;

double MySellTakeProfit = MyOpenPrise - (TakeProfit + 5)*RealPoint;

double MyByStopLoss = MyOpenPrise - (StopLoss - 5)*RealPoint;

double MySellStopLoss = MyOpenPrise + (StopLoss - 5)*RealPoint;



for ( my_by_tp = j_v_t; my_by_tp >= my_period_array_stop[i-1]; my_by_tp--)

{

if(my_max_array[my_by_tp] >= MyByTakeProfit) break;//Срабатывает при превышении уровня тейк-профита

}



for ( my_by_sl = j_v_t; my_by_sl >= my_period_array_stop[i-1]; my_by_sl--)

{

if(my_min_array[my_by_sl] <= MyByStopLoss) break;//Срабатывает при превышении уровня стоп-лоса

}



for ( my_sell_tp = j_v_t; my_sell_tp >= my_period_array_stop[i-1]; my_sell_tp--)

{

if(my_min_array[my_sell_tp] <= MySellTakeProfit) break;//Срабатывает при превышении уровня тейк-профита

}



for ( my_sell_sl = j_v_t; my_sell_sl >= my_period_array_stop[i-1]; my_sell_sl--)

{

if(my_max_array[my_sell_sl] >= MySellStopLoss) break;//Срабатывает при превышении уровня стоп-лоса

}



//А теперь проверка на наличие всех четырех точек

if(my_by_tp >= my_period_array_stop[i-1] && my_sell_tp >= my_period_array_stop[i-1] && my_by_sl <= my_by_tp && my_sell_sl <= my_sell_tp)

{

my_time_vvoda_array[TimeHour(my_time_array[j_v_t])][TimeMinute(my_time_array[j_v_t])][i-1] = 1;

}

j_v_t--;//отступаем на 1 тикет в сторону окончания периода расчета

}

while(j_v_t >= my_period_array_stop[i-1]);//и расчет точек по новой



Alert("дата первого бара ",TimeToString(my_time_array[my_period_array_start[i]],TIME_DATE),", Start - ",my_period_array_start[i],", дата последнего бара ",TimeToString(my_time_array[my_period_array_stop[i]],TIME_DATE),", Stop - ",my_period_array_stop[i]);

return;

}



void CountStartTimeFinal()//Собственно функция расчета времени на конце истории

{

int my_by_tp, my_sell_tp, my_by_sl, my_sell_sl;

int j_v_f = 2500;//Смещение от начала расчетного периода



do

{

//Устанавливаем пороги

double MyOpenPrise = my_open_array[j_v_f];

double MyByTakeProfit = MyOpenPrise + (TakeProfit + 5)*RealPoint;

double MySellTakeProfit = MyOpenPrise - (TakeProfit + 5)*RealPoint;

double MyByStopLoss = MyOpenPrise - (StopLoss - 5)*RealPoint;

double MySellStopLoss = MyOpenPrise + (StopLoss - 5)*RealPoint;



for ( my_by_tp = j_v_f; my_by_tp >= 1; my_by_tp--)

{

if(my_max_array[my_by_tp] >= MyByTakeProfit) break;//Срабатывает при превышении уровня тейк-профита

}



for ( my_by_sl = j_v_f; my_by_sl >= 1; my_by_sl--)

{

if(my_min_array[my_by_sl] <= MyByStopLoss) break;//Срабатывает при превышении уровня стоп-лоса

}



for ( my_sell_tp = j_v_f; my_sell_tp >= 1; my_sell_tp--)

{

if(my_min_array[my_sell_tp] <= MySellTakeProfit) break;//Срабатывает при превышении уровня тейк-профита

}



for ( my_sell_sl = j_v_f; my_sell_sl >= 1; my_sell_sl--)

{

if(my_max_array[my_sell_sl] >= MySellStopLoss) break;//Срабатывает при превышении уровня стоп-лоса

}



//А теперь проверка на наличие всех четырех точек

if(my_by_tp > 1 && my_sell_tp > 1 && my_by_sl <= my_by_tp && my_sell_sl <= my_sell_tp)

{

my_time_vvoda_final[TimeHour(my_time_array[j_v_f])*60 + TimeMinute(my_time_array[j_v_f])] = 1;

}

j_v_f--;//отступаем на 1 тикет в сторону окончания периода расчета

}

while(j_v_f >= 1);//и расчет точек по новой



return;

}



void tochka_vvoda ()

{

if(AutoCountTime == true)

{

int i, j_v, k_v = 0, l = 0, m, n, a_i = 0;

PointCount();//Считаем значение пункта

for(i=0;i<=23;i++)//Обнуляем значения массивов

{

for(j_v=0;j_v<=59;j_v++)

{

for(k_v=0;k_v<=39;k_v++) my_time_vvoda_array[i][j_v][k_v] = 0;//Итоговый массив по суткам

my_time_vvoda_start[60*i + j_v] = 0;//Итоговый суточный массив дальней истории

my_time_vvoda_final[60*i + j_v] = 0;//Итоговый суточный массив ближайшей истории

my_time_vvoda_count[60*i + j_v] = 0;//Итоговый массив

}

}



k_v = 0;

j_v = 0;

m = 0;

n = 0;

bool srt = false;



Alert("");

Alert("");

Alert("");



datetime StartTime;//Время начала периода расчета

StartTime = StrToTime(StartBarTime); // текущая дата + время

datetime EndTime;//Время конца периода расчета

EndTime = StrToTime(FinishBarTime); // текущая дата + время



k_v = 1;

for(i=0;i<=49999;i++)//Чтение истории на минутном графике и запись ее по массивам

{

while(iTime(Symbol(),1,k_v) == 0) k_v++;

my_open_array[i] = iOpen(Symbol(),1,k_v);//Массив цен открытия

my_max_array[i] = iHigh(Symbol(),1,k_v);//Массим максимумов

my_min_array[i] = iLow(Symbol(),1,k_v);//Массив минимумов

my_time_array[i] = iTime(Symbol(),1,k_v);//Массив времен открытия

k_v++;

if((j_v <= i) && srt == false && (TimeHour(my_time_array[i]) == TimeHour(EndTime)) && (TimeMinute(my_time_array[i]) == TimeMinute(EndTime)))

{

j_v = i + 10;

srt = true;

if(a_i < 40) my_period_array_stop[a_i] = i;//Массив тикетов окончания расчетного периода, разделенный по дням

}

if((j_v <= i)&& srt == true && (TimeHour(my_time_array[i]) == TimeHour(StartTime)) && (TimeMinute(my_time_array[i]) == TimeMinute(StartTime)))

{

j_v = i;

srt = false;

if(a_i < 40) my_period_array_start[a_i] = i;//Массив тикетов начал расчетного периода, разделенный по дням

a_i++;

}

if(k_v >= iBars(Symbol(),1)) break;

}



Alert("Величина истории (iBars) = ",iBars(Symbol(),1), " баров");

Alert("Для расчета можно использовать ",a_i, " периодов");

if(a_i == 0)

{

MessageBox("Расчет истории не возможен","ВНИМАНИЕ",0x00000030);

return;

}



//Вызов функции обсчета истории по дням

if(a_i < VelichinaIstorii) MyHistiryLoss = true;

else MyHistiryLoss = false;

for(day_id = VelichinaIstorii; day_id >= 1; day_id--) CountStartTime(day_id);



for(i=0;i<=23;i++)

{

for(j_v=0;j_v<=59;j_v++)

{

k_v=0;

for(day_id = VelichinaIstorii - 1; day_id >= 0; day_id--)

{

k_v = k_v + my_time_vvoda_array[i][j_v][day_id];

}

if(k_v == VelichinaIstorii - 1) my_time_vvoda_start[60*i + j_v] = 1;//Alert("Полное совпадение в ", i," часов ", j," минут");

}

}



CountStartTimeFinal();//Вызов функции обсчета ближайшей истории



m = 0;

n = 0;

for(i=0;i<=1439;i++)

{

if(my_time_vvoda_start[i] == 1 && my_time_vvoda_final[i] == 1)

{

if( m == 0) m = i;

n++;

}

else

{

if(m != 0 && n != 0) my_time_vvoda_count[m] = n;

m = 0;

n = 0;

}

}



if(m != 0 && n != 0) my_time_vvoda_count[m] = n;

if(MyHistiryLoss != true)

{

k_v = ArrayMaximum(my_time_vvoda_count,WHOLE_ARRAY,0);

l = k_v + MathFloor(my_time_vvoda_count[k_v]/2);

if(my_time_vvoda_count[k_v] != 0)

{

Alert("Максималиное совпадение с ",MathFloor(k_v/60)," часов ",MathMod(k_v, 60)," минут",", длительностью ",my_time_vvoda_count[k_v]," минут");

StartSessionTime = DoubleToStr(MathFloor(l/60),0) + ":" + DoubleToStr(MathMod(l, 60),0);

l = l + MathFloor(my_time_vvoda_count[k_v]/2);

EndSessionTime = DoubleToStr(MathFloor(l/60),0) + ":" + DoubleToStr(MathMod(l, 60),0);

Alert("Начало торговли в ",StartSessionTime);

}

else

{

Alert("Точка входа не найдена");

MyHistiryLoss = true;

}

}

else MessageBox("Расчет точки входа не возможен,\n нет достаточной истории","ВНИМАНИЕ",0x00000030);

}

else

{

Alert("Время торговли устанавливается в ручном режиме");

MyHistiryLoss = false;

}

return;

}
 
AlexeyVik:
О каких дырах ты говоришь? Когда задаёшь вопрос по программированию такие выражения не уместны, дырами называют пропуски в исторических данных по инструменту, а здесь ты что имел ввиду? Если в вопросе присутствует "время" видимо ты имел ввиду "дыры для перемещения во времени" телепортацию.
Если я хоть чуток обладаю способностями телепатии, то просто надо добиться качественной истории по инструменту.

О дырах в истории, конечно же. И тебе тоже вопрос: как добиться качественной истории по инструменту?
Причина обращения: