Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 602

 
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?

 
Expert:


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.

 
solnce600:

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:

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


Como opção:

Obrigado.
 
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.
 

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.

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:
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?