Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 602

 
AlexeyVik:
Entweder kann ich Sie nicht verstehen oder Sie verstehen etwas nicht ... Was ist mit der .csv-Datei nicht in Ordnung? Solange der erste Balken nicht gezählt wird, ist prev_calculated oder IndicatorCounted() (in der alten Version) gleich Null und das ist korrekt.


Ja, das ist verständlich. Ich habe mein Protokoll beigefügt. Es stellt sich heraus, dass, wenn ich am Ende vom 20000. Balken zum 0. Balken komme, es so ist, als würde er alle 20000 Balken noch einmal durchschütteln. Das bedeutet, dass OnCalculate entweder nicht abgeschlossen wird oder anstelle von rates_total null zurückgibt.

Aber dieser Fehler betrifft Sie nicht. In Ihrem Fall funktioniert alles einwandfrei.

Ich kann also nicht verstehen, was mit meinem Gerät/System nicht stimmt?

 
Expert:


Ja, das ist verständlich. Ich habe mein Protokoll beigefügt. Es stellt sich heraus, dass, wenn ich das Ende von 20000 bar auf 0 zu erreichen, ist es, als ob es die ganze 20000 bar wieder beginnt. Das bedeutet, dass OnCalculate entweder nicht abgeschlossen wird oder anstelle von rates_total null zurückgibt.

Aber aus irgendeinem Grund hat dieser Fehler Sie nicht betroffen. Es funktioniert gut für Sie...

Ich kann also nicht herausfinden, was mit meinem Gerät/System nicht stimmt?

Versuchen Sie, verschachtelte Zyklen zunächst um den Faktor 100 zu reduzieren und dann weitere hinzuzufügen. Auf diese Weise wissen Sie, ob Ihr i5 nicht damit umgehen kann oder ob MT langsamer wird.

Haben Sie bemerkt, dass ich eine verschachtelte Schleife um den Faktor 10 reduziert habe? Ich habe für diese Neuberechnung 2 Minuten und 12 Sekunden gebraucht.

Sie können in dieser Zeile

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

100 erhöhen. Dadurch wird die Anzahl der neu berechneten Balken beim Start des Indikators verringert.



 

Guten Abend (Nacht, Morgen, Nachmittag) an alle!

Können Sie mir bitte sagen, wie die folgende Bedingung zu kodieren ist.

Wenn Hoch[1]......Hoch[300].(alle Ausnahmen) < Open[0].

Eröffnen Sie eine Bestellung.

Ich danke Ihnen.

 
solnce600:

Guten Abend (Nacht, Morgen, Nachmittag) an alle!

Können Sie mir bitte sagen, wie die folgende Bedingung zu kodieren ist.

Wenn Hoch[1]......Hoch[300].(alle Ausnahmen) < Open[0].

Eröffnen Sie eine Bestellung.

Ich danke Ihnen.


Als Option:

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


Als Option:

Ich danke Ihnen.
 
Ich kann nicht herausfinden, mit welcher Funktion im EA ich in die Zukunft schauen kann. Die Sache ist die, dass der EA Positionen zu einer bestimmten Zeit öffnet, und es gibt sehr viele Löcher, die nach Wegen suchen, um so etwas zu umgehen.
 
001:
Ich kann nicht herausfinden, mit welcher Funktion im EA ich in die Zukunft schauen kann. Die Sache ist die, dass der EA Positionen zu einer bestimmten Zeit öffnet, und es gibt sehr viele Löcher, die nach Wegen suchen, um so etwas zu umgehen.

Man muss nicht in die Zukunft, sondern in die Vergangenheit schauen, nur nach Löchern suchen und das war's.
 
001:
Ich kann nicht herausfinden, mit welcher Funktion im EA ich in die Zukunft schauen kann. Die Sache ist die, dass der EA Positionen zu einer bestimmten Zeit öffnet, und es gibt eine Menge Löcher, die nach Wegen suchen, um so etwas zu umgehen.
Von welchen Löchern sprechen Sie? Wenn Sie Fragen zur Programmierung stellen, sind solche Ausdrücke nicht angebracht, Löcher sind Lücken in den historischen Daten für ein Symbol, und was meinen Sie damit? Wenn "Zeit" in der Frage vorkommt, meinten Sie wahrscheinlich "Zeitreiselöcher" und Teleportation.
Wenn ich telepathische Kräfte habe, muss ich nur eine gute Geschichte über das Instrument bekommen.
 

Ich brauche Hilfe, Kollegen.

Ich schreibe einen EA (Erstgeborener) und er braucht die Analyse historischer Daten, um korrekt zu funktionieren.

Ich verwende Arrays von Eröffnungskursen, Eröffnungszeiten von Höchst- und Tiefstständen.

Wenn ich die Arrays in tägliche Perioden unterteile, erhalte ich in fast jeder Periode eine unterschiedliche Anzahl von Minutenbalken. Alle 1440 Min.-Balken sind physisch im Chart vorhanden, während die Historie 1380, 1378 oder mehr als 3000 pro Tag anzeigt.

Bitte helfen Sie mir zu verstehen, was das Problem ist. Meiner Meinung nach kann sich die Geschichte nicht von der realen (gezeichneten) Grafik unterscheiden.

Hier ist ein Stück Code, das das alles berechnet.

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:
Von welchen Löchern sprechen Sie? Wenn Sie eine Frage zur Programmierung stellen, sind solche Ausdrücke nicht angebracht, Löcher sind Lücken in den historischen Daten des Tools, aber was meinen Sie hier? Wenn "Zeit" in der Frage vorkommt, meinten Sie wahrscheinlich "Zeitreiselöcher" und Teleportation.
Wenn ich telepathische Kräfte habe, muss ich nur eine gute Geschichte über das Instrument bekommen.

Über Löcher in der Geschichte, natürlich. Und auch eine Frage an Sie: Wie erreichen Sie eine gute Geschichte auf einem Instrument?