Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 602

 
AlexeyVik :
Ya ben seni anlamıyorum ya da sen bir şey anlamıyorsun... .csv dosyasında ne var? İlk çubuk hesaplanana kadar prev_calculated veya IndicatorCounted() (eski versiyonda) sıfıra eşit olacaktır ve bu doğrudur.


Evet. Bu temiz. Günlüğümü ekledim. 20000 bardan 0. bara kadar sona ulaştığımda, 20000 barın hepsini tekrar sürmeye başlıyor gibi görünüyor. Yani, ya OnCalculate işini tamamlamaz ya da Rate_total yerine sıfır döndürür.

Ama nedense bu böcek sana dokunmadı. Her şey senin için iyi çalışıyor...

Yani makinemde/sistemimde neyin yanlış olduğunu anlayamıyorum?

 
Expert :


Evet. Bu temiz. Günlüğümü ekledim. 20000 bardan 0. bara kadar sona ulaştığımda, 20000 barın hepsini tekrar sürmeye başlıyor gibi görünüyor. Diğer bir deyişle, OnCalculate işini tamamlamaz veya oranları_toplam yerine sıfır döndürür.

Ama nedense bu böcek sana dokunmadı. Her şey senin için iyi çalışıyor...

Yani makinemde/sistemimde neyin yanlış olduğunu anlayamıyorum?

Önce iç içe döngüleri 100 kat azaltmayı deneyin ve ardından ekleyin. Böylece i5'inizin baş edemediğini veya MT'nin yavaşladığını anlayacaksınız.

İç içe geçmiş bir döngüyü 10 kat azalttığımı fark ettiniz mi? Bu formda 2 dakika 12 saniye saydım.

Bu çizgi olabilir

limit = (önceki_hesaplanan > 0)?rates_total-prev_hesaplanan:rates_total- 100 ;

100 artış. Bu, gösterge başlatıldığında yeniden hesaplanan çubuklarda bir azalma sağlayacaktır.

 

Herkese iyi akşamlar (gece, sabah, gün)!

Lütfen bana aşağıdaki koşulu nasıl kodlayacağımı söyleyin.

Yüksek ise[1]......Yüksek[300]. (istisnasız hepsi) <[0] Aç

Bir sipariş açın.

Teşekkür ederim.

 
solnce600 :

Herkese iyi akşamlar (gece, sabah, gün)!

Lütfen bana aşağıdaki koşulu nasıl kodlayacağımı söyleyin.

Yüksek ise[1]......Yüksek[300]. (istisnasız hepsi) <[0] Aç

Bir sipariş açın.

Teşekkür ederim.


Bir seçenek olarak:

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


Bir seçenek olarak:

Teşekkür ederim.
 
Danışmanda hangi işlevin geleceğe bakmanıza izin verdiğini bulamıyorum. Gerçek şu ki, danışman belirli bir zamanda pozları açıyor ve çok fazla boşluk var, bunu aşmanın yollarını arıyorum.
 
001 :
Danışmanda hangi işlevin geleceğe bakmanıza izin verdiğini bulamıyorum. Gerçek şu ki, danışman belirli bir zamanda pozları açıyor ve çok fazla boşluk var, bunu aşmanın yollarını arıyorum.

geleceğe değil, geçmişe bakın, bir delik olup olmadığına bakın, hepsi bu.
 
001 :
Danışmanda hangi işlevin geleceğe bakmanıza izin verdiğini bulamıyorum. Gerçek şu ki, danışman belirli bir zamanda pozları açıyor ve çok fazla delik var, böyle bir şeyi aşmanın yollarını arıyorum.
Hangi deliklerden bahsediyorsun? Programlama ile ilgili bir soru sorduğunuzda bu tür ifadeler uygun değil, bir enstrümanın geçmiş verilerindeki boşluklara delik deniyor ama burada ne demek istediniz? Soruda "zaman" varsa, görünüşe göre "zamanda hareket etmek için delikler" ışınlanmasını kastetmişsiniz.
En azından biraz telepatik yeteneklerim varsa, o zaman enstrümanda yüksek kaliteli bir geçmişe ulaşmam gerekiyor.
 

Yardıma ihtiyacımız var meslektaşlarım.

Bir Uzman Danışman (ilk doğan) yazıyorum, doğru çalışması için geçmiş verilerin analizi gerekiyor.

Açılış fiyatları, en yüksek ve en düşük açılış saatleri dizilerini kullanıyorum.

Diziler günlük periyotlara bölündüğünde hemen hemen her periyotta farklı sayıda dakika çubuğu elde edilmektedir. 1440 dakikalık çubukların tümü grafikte fiziksel olarak bulunur, ancak tarihe göre, günde 1380, sonra 1378, sonra 3000'den fazla olduğu ortaya çıkıyor.

Sorunun ne olduğunu anlamama yardım et. Bana göre tarih, gerçek (çizilmiş) tablodan farklı olamaz.

İşte hepsini yapan bir kod parçası.

 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 :
Hangi deliklerden bahsediyorsun? Programlama ile ilgili bir soru sorduğunuzda bu tür ifadeler uygun değil, bir enstrümanın geçmiş verilerindeki boşluklara delik deniyor ama burada ne demek istediniz? Soruda "zaman" varsa, görünüşe göre "zamanda hareket etmek için delikler" ışınlanmasını kastetmişsiniz.
En azından biraz telepatik yeteneklerim varsa, o zaman enstrümanda yüksek kaliteli bir geçmişe ulaşmam gerekiyor.

Tabii ki tarihteki delikler hakkında. Ayrıca bir sorunuz var: Bir enstrümanın yüksek kaliteli bir geçmişine nasıl ulaşılır?