Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 602

 
AlexeyVik:
Soit je ne peux pas te comprendre, soit tu ne comprends pas quelque chose... Quel est le problème avec le fichier .csv ? Tant que la première barre n'est pas comptée prev_calculated ou IndicatorCounted() (dans l'ancienne version) sera zéro et ceci est correct.


Oui. C'est compréhensible. J'ai joint mon journal. Il s'avère que lorsque j'arrive à la fin, de la 20000ème barre à la 0ème barre, c'est comme si les 20000 barres recommençaient à défiler. En d'autres termes, soit il ne termine pas OnCalculate, soit il renvoie zéro au lieu de rates_total.

Mais pour une raison quelconque, ce bug ne vous a pas affecté. Tout fonctionne bien dans votre cas.

Je n'arrive donc pas à comprendre ce qui ne va pas avec ma machine/système ?

 
Expert:


Oui, c'est compréhensible. J'ai joint mon journal. Il s'avère que lorsque j'arrive à la fin de 20000 bar à 0, c'est comme s'il recommençait tout le 20000 bar. En d'autres termes, soit il ne termine pas OnCalculate, soit il renvoie zéro au lieu de rates_total.

Mais pour une raison quelconque, ce bug ne vous a pas affecté. Cela fonctionne bien pour vous...

Je n'arrive donc pas à trouver ce qui ne va pas avec ma machine/système ?

Essayez d'abord de réduire les cycles imbriqués par un facteur de 100, puis ajoutez-en d'autres. Ainsi, vous saurez si votre i5 ne peut pas le supporter ou si MT ralentit.

Avez-vous remarqué que j'ai réduit une boucle imbriquée par un facteur de 10 ? Ça m'a pris 2 minutes et 12 secondes pour recalculer comme ça.

Vous pouvez dans cette ligne

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

100 d'augmentation. Cela permettra de réduire le nombre de barres recalculées au démarrage de l'indicateur.



 

Bonsoir (nuit, matin, après-midi) à tous !

Pouvez-vous me dire comment coder la condition suivante.

Si High[1]......High[300].(toutes les exceptions) < Open[0].

Ouvrez une commande.

Merci.

 
solnce600:

Bonsoir (nuit, matin, après-midi) à tous !

Pouvez-vous me dire comment coder la condition suivante.

Si High[1]......High[300].(toutes les exceptions) < Open[0].

Ouvrez une commande.

Merci.


En option :

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


En option :

Merci.
 
Je n'arrive pas à trouver quelle fonction de l'EA me permet de regarder dans le futur. Le problème, c'est que l'EA ouvre les positions à une certaine heure, et qu'il y a un grand nombre de trous, qui cherchent des moyens de contourner une telle chose.
 
001:
Je n'arrive pas à trouver quelle fonction de l'EA me permet de regarder dans le futur. Le problème, c'est que l'EA ouvre les positions à une certaine heure, et qu'il y a un grand nombre de trous, qui cherchent des moyens de contourner une telle chose.

Vous n'avez pas besoin de regarder dans le futur mais dans le passé, vérifiez juste s'il y a des trous et c'est tout.
 
001:
Je n'arrive pas à trouver quelle fonction de l'EA me permet de regarder dans le futur. Le problème est que l'EA ouvre les positions à une certaine heure, et il y a beaucoup de trous, cherchant des moyens de contourner une telle chose.
De quels trous parlez-vous ? Lorsque vous posez des questions sur la programmation, de telles expressions ne sont pas appropriées, les trous sont des trous dans les données historiques d' un symbole, et qu'entendez-vous par là ? Si le mot "temps" est dans la question, vous vouliez probablement parler de téléportation "trous de voyage dans le temps".
Si j'ai des pouvoirs télépathiques, j'ai juste besoin d'avoir une bonne histoire sur l'instrument.
 

Besoin d'aide, collègues.

Je suis en train d'écrire un EA (premier né) et il a besoin d'une analyse des données historiques pour fonctionner correctement.

J'utilise des tableaux de prix d'ouverture, de temps d'ouverture des hauts et des bas.

En divisant les tableaux en périodes quotidiennes, j'obtiens un nombre différent de barres de minutes dans presque chaque période. Toutes les barres 1440 min. sont physiquement présentes dans le graphique, alors que l'historique montre 1380, 1378 ou plus de 3000 par jour.

Veuillez m'aider à comprendre quel est le problème. À mon avis, l'histoire ne peut pas différer du graphique réel (dessiné).

Voici un morceau de code qui calcule tout cela.

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 quels trous parlez-vous ? Lorsque vous posez une question sur la programmation, de telles expressions ne sont pas appropriées, les trous sont des lacunes dans les données historiques de l'outil, mais que voulez-vous dire ici ? Si le mot "temps" est dans la question, vous vouliez probablement parler de téléportation "trous de voyage dans le temps".
Si j'ai des pouvoirs télépathiques, j'ai juste besoin d'avoir une bonne histoire sur l'instrument.

A propos des trous dans l'histoire, bien sûr. Et une question pour vous aussi : comment faire pour obtenir une histoire de qualité sur un instrument ?