AlexeyVik: Ou eu não consigo entendê-lo ou você não entende algo ... O que há de errado com o arquivo .csv? Desde que a primeira barra não seja contada pré_calculada ou IndicatorCounted() (na versão antiga) será zero e isto está correto.
Sim. É compreensível. Anexei meu diário de bordo. Acontece que quando chego ao final da barra de 20000 para a 0ª barra, é como se começasse a girar todas as 20000 barras novamente. Ou seja, ou não completa a OnCalculate, ou retorna zero em vez de taxas_total.
Mas este bug não o afeta. Tudo está funcionando bem em seu caso.
Então, eu não consigo entender o que está errado com minha máquina/sistema?
Sim, é compreensível. Anexei meu diário de bordo. Acontece que quando chego ao final de 20000 bar a 0, é como se começasse novamente a barra de 20000 bar inteira. Ou seja, ou não completa a OnCalculate, ou retorna zero em vez de taxas_total.
Mas por alguma razão, este bug não o afetou. Funciona bem para você...
Então eu não consigo descobrir o que está errado com minha máquina/sistema?
Tente reduzir os ciclos aninhados por um fator de 100 primeiro e depois acrescente mais. Dessa forma, você saberá se seu i5 não consegue lidar com ele ou se o MT está diminuindo a velocidade.
Você notou que eu reduzi um laço aninhado por um fator de 10? Demorei 2 minutos e 12 segundos para recalcular assim.
Não consigo encontrar qual função no EA me permite olhar para o futuro. A questão é que a EA abre posições em um determinado momento, e há muitos buracos, procurando maneiras de contornar tal coisa.
001: Não consigo encontrar qual função no EA me permite olhar para o futuro. A questão é que a EA abre posições em um determinado momento, e há muitos buracos, procurando maneiras de contornar tal coisa.
Você não precisa olhar para o futuro, mas para o passado, basta verificar a existência de buracos e pronto.
001: Não consigo encontrar qual função no EA me permite olhar para o futuro. A questão é que a EA abre posições em um determinado momento, e há muitos buracos, procurando maneiras de contornar tal coisa.
De quais buracos você está falando? Quando você faz perguntas sobre programação, tais expressões não são apropriadas, buracos são lacunas nos dados históricos para um símbolo, e o que você quer dizer neste caso? Se "tempo" está na pergunta, você provavelmente quis dizer "buracos de viagem no tempo" teleportação. Se eu tenho algum poder telepático, só preciso ter uma boa história sobre o instrumento.
Estou escrevendo um EA (primogênito) e ele precisa de análise de dados históricos para funcionar corretamente.
Estou utilizando matrizes de preços de abertura, horários de abertura de altos e baixos.
Ao dividir as matrizes em períodos diários, recebo um número diferente de barras de minutos em quase todos os períodos. Todas as barras de 1440 min. estão fisicamente presentes no gráfico, enquanto a história mostra 1380, 1378 ou mais de 3000 por dia.
Por favor, ajude-me a entender qual é o problema. Na minha opinião, a história não pode diferir do gráfico real (desenhado).
Aqui está um pedaço de código que calcula tudo isso.
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;
}
}
elseMessageBox("Расчет точки входа не возможен,\n нет достаточной истории","ВНИМАНИЕ",0x00000030);
}
else
{
Alert("Время торговли устанавливается в ручном режиме");
MyHistiryLoss = false;
}
return;
}
AlexeyVik: De que buracos você está falando? Quando você faz uma pergunta sobre programação, tais expressões não são apropriadas, buracos são lacunas nos dados históricos da ferramenta, mas o que você quer dizer aqui? Se "tempo" está na pergunta, você provavelmente quis dizer "buracos de viagem no tempo" teleportação. Se eu tenho algum poder telepático, só preciso ter uma boa história sobre o instrumento.
Sobre os buracos na história, é claro. E uma pergunta para você também: como você consegue uma história de qualidade sobre um instrumento?
Ou eu não consigo entendê-lo ou você não entende algo ... O que há de errado com o arquivo .csv? Desde que a primeira barra não seja contada pré_calculada ou IndicatorCounted() (na versão antiga) será zero e isto está correto.
Sim. É compreensível. Anexei meu diário de bordo. Acontece que quando chego ao final da barra de 20000 para a 0ª barra, é como se começasse a girar todas as 20000 barras novamente. Ou seja, ou não completa a OnCalculate, ou retorna zero em vez de taxas_total.
Mas este bug não o afeta. Tudo está funcionando bem em seu caso.
Então, eu não consigo entender o que está errado com minha máquina/sistema?
Sim, é compreensível. Anexei meu diário de bordo. Acontece que quando chego ao final de 20000 bar a 0, é como se começasse novamente a barra de 20000 bar inteira. Ou seja, ou não completa a OnCalculate, ou retorna zero em vez de taxas_total.
Mas por alguma razão, este bug não o afetou. Funciona bem para você...
Então eu não consigo descobrir o que está errado com minha máquina/sistema?
Tente reduzir os ciclos aninhados por um fator de 100 primeiro e depois acrescente mais. Dessa forma, você saberá se seu i5 não consegue lidar com ele ou se o MT está diminuindo a velocidade.
Você notou que eu reduzi um laço aninhado por um fator de 10? Demorei 2 minutos e 12 segundos para recalcular assim.
Você pode, nesta linha
limite = (prev_calculado > 0)?taxas_total-prev_calculado:taxas_total-100;
Aumento de 100. Isto dará uma redução nas barras recalculadas quando o indicador começar.
Boa noite (noite, manhã, tarde) para todos!
Você pode, por favor, me dizer como codificar a seguinte condição
Se Alto[1]......Alto[300].(todas as exceções) < Aberto[0].
Abra um pedido.
Obrigado.
Boa noite (noite, manhã, tarde) para todos!
Você pode, por favor, me dizer como codificar a seguinte condição
Se Alto[1]......Alto[300].(todas as exceções) < Aberto[0].
Abra um pedido.
Obrigado.
Como opção:
Como opção:
Não consigo encontrar qual função no EA me permite olhar para o futuro. A questão é que a EA abre posições em um determinado momento, e há muitos buracos, procurando maneiras de contornar tal coisa.
Você não precisa olhar para o futuro, mas para o passado, basta verificar a existência de buracos e pronto.
Não consigo encontrar qual função no EA me permite olhar para o futuro. A questão é que a EA abre posições em um determinado momento, e há muitos buracos, procurando maneiras de contornar tal coisa.
Se eu tenho algum poder telepático, só preciso ter uma boa história sobre o instrumento.
Precisam de ajuda, colegas.
Estou escrevendo um EA (primogênito) e ele precisa de análise de dados históricos para funcionar corretamente.
Estou utilizando matrizes de preços de abertura, horários de abertura de altos e baixos.
Ao dividir as matrizes em períodos diários, recebo um número diferente de barras de minutos em quase todos os períodos. Todas as barras de 1440 min. estão fisicamente presentes no gráfico, enquanto a história mostra 1380, 1378 ou mais de 3000 por dia.
Por favor, ajude-me a entender qual é o problema. Na minha opinião, a história não pode diferir do gráfico real (desenhado).
Aqui está um pedaço de código que calcula tudo isso.
De que buracos você está falando? Quando você faz uma pergunta sobre programação, tais expressões não são apropriadas, buracos são lacunas nos dados históricos da ferramenta, mas o que você quer dizer aqui? Se "tempo" está na pergunta, você provavelmente quis dizer "buracos de viagem no tempo" teleportação.
Se eu tenho algum poder telepático, só preciso ter uma boa história sobre o instrumento.
Sobre os buracos na história, é claro. E uma pergunta para você também: como você consegue uma história de qualidade sobre um instrumento?