Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 602

 
AlexeyVik:
O io non riesco a capirti o tu non capisci qualcosa... Cosa c'è di sbagliato nel file .csv? Finché la prima barra non viene contata prev_calculated o IndicatorCounted() (nella vecchia versione) sarà zero e questo è corretto.


Sì, è comprensibile. Ho allegato il mio registro. Si scopre che quando arrivo alla fine dalla 20000esima barra alla 0esima barra, è come se iniziasse a sfornare tutte le 20000 barre da capo. Cioè, o non completa OnCalculate, o restituisce zero invece di rates_total.

Ma per qualche ragione questo bug non ti ha colpito. Tutto funziona bene nel tuo caso.

Quindi, non riesco a capire cosa c'è di sbagliato nella mia macchina/sistema?

 
Expert:


Sì, è comprensibile. Ho allegato il mio registro. Risulta che quando arrivo alla fine di 20000 bar a 0, è come se ricominciasse tutto il 20000 bar. Cioè, o non completa OnCalculate, o restituisce zero invece di rates_total.

Ma per qualche ragione questo bug non ti ha colpito. Funziona bene per te...

Quindi non riesco a capire cosa c'è di sbagliato nella mia macchina/sistema?

Prova a ridurre i cicli annidati di un fattore 100 prima e poi aggiungine altri. In questo modo saprete se il vostro i5 non riesce a gestirlo o se MT sta rallentando.

Avete notato che ho ridotto un ciclo annidato di un fattore 10? Ho impiegato 2 minuti e 12 secondi per ricalcolare così.

Puoi in questa linea

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

Aumento di 100. Questo darà una riduzione delle barre ricalcolate all'avvio dell'indicatore.



 

Buona sera (notte, mattina, pomeriggio) a tutti!

Potete per favore dirmi come codificare la seguente condizione.

Se High[1]......High[300].(tutte le eccezioni) < Open[0].

Aprire un ordine.

Grazie.

 
solnce600:

Buona sera (notte, mattina, pomeriggio) a tutti!

Potete per favore dirmi come codificare la seguente condizione.

Se High[1]......High[300].(tutte le eccezioni) < Open[0].

Aprire un ordine.

Grazie.


Come opzione:

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


Come opzione:

Grazie.
 
Non riesco a trovare quale funzione nell'EA mi permette di guardare nel futuro. Il fatto è che l'EA apre le posizioni ad una certa ora, e ci sono un sacco di buchi, cercando modi per aggirare una cosa del genere.
 
001:
Non riesco a trovare quale funzione nell'EA mi permette di guardare nel futuro. Il fatto è che l'EA apre le posizioni ad una certa ora, e ci sono un sacco di buchi, cercando modi per aggirare una cosa del genere.

Non c'è bisogno di guardare nel futuro ma nel passato, basta controllare se ci sono buchi ed è tutto.
 
001:
Non riesco a trovare quale funzione nell'EA mi permette di guardare nel futuro. Il fatto è che l'EA apre le posizioni ad una certa ora, e ci sono un sacco di buchi, cercando modi per aggirare una cosa del genere.
Di quali buchi stai parlando? Quando fai domande sulla programmazione, tali espressioni non sono appropriate, i buchi sono lacune nei dati storici per un simbolo, e cosa intendi qui? Se "tempo" è nella domanda, probabilmente intendevi "buchi temporali" di teletrasporto.
Se ho dei poteri telepatici, ho solo bisogno di avere una buona storia dello strumento.
 

Ho bisogno di aiuto, colleghi.

Sto scrivendo un EA (primogenito) e ha bisogno dell'analisi dei dati storici per funzionare correttamente.

Sto usando array di prezzi di apertura, tempi di apertura dei massimi e dei minimi.

Quando divido gli array in periodi giornalieri, ottengo un numero diverso di barre di minuti in quasi ogni periodo. Tutte le barre di 1440 min. sono fisicamente presenti nel grafico, mentre la storia mostra 1380, 1378 o più di 3000 al giorno.

Per favore, aiutatemi a capire qual è il problema. Secondo me, la storia non può differire dal grafico reale (disegnato).

Ecco un pezzo di codice che calcola il tutto.

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:
Di quali buchi stai parlando? Quando fai una domanda sulla programmazione, tali espressioni non sono appropriate, i buchi sono lacune nei dati storici dello strumento, ma cosa intendi qui? Se "tempo" è nella domanda, probabilmente intendevi "buchi temporali" di teletrasporto.
Se ho dei poteri telepatici, ho solo bisogno di avere una buona storia dello strumento.

Sui buchi nella storia, ovviamente. E una domanda anche per voi: come si ottiene una storia di qualità su uno strumento?