Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 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:
Не могу найти какая функция в советнике позволяет заглядывать в будущее. Дело в том, что советник открывает позы в определенное время, а дыр великое множество, ищу пути как обойти такое дело.
О каких дырах ты говоришь? Когда задаёшь вопрос по программированию такие выражения не уместны, дырами называют пропуски в исторических данных по инструменту, а здесь ты что имел ввиду? Если в вопросе присутствует "время" видимо ты имел ввиду "дыры для перемещения во времени" телепортацию.
Если я хоть чуток обладаю способностями телепатии, то просто надо добиться качественной истории по инструменту.
[Deleted]  

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

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

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

При разделении массивов на суточные периоды, получается разное количество минутных баров почти в каждом периоде. На графике физически присутствуют все 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:
О каких дырах ты говоришь? Когда задаёшь вопрос по программированию такие выражения не уместны, дырами называют пропуски в исторических данных по инструменту, а здесь ты что имел ввиду? Если в вопросе присутствует "время" видимо ты имел ввиду "дыры для перемещения во времени" телепортацию.
Если я хоть чуток обладаю способностями телепатии, то просто надо добиться качественной истории по инструменту.

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