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?
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ì.
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.
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;
}
}
elseMessageBox("Расчет точки входа не возможен,\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?
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?
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.
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:
Come opzione:
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.
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.
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.
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?