포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 602

 
AlexeyVik :
내가 당신을 이해하지 못하거나 당신이 뭔가를 이해하지 못합니다... .csv 파일에 무엇이 잘못되었습니까? 첫 번째 막대가 계산될 때까지 prev_calculated 또는 IndicatorCounted()(이전 버전에서)는 0과 같을 것이며 이것은 정확합니다.


네. 이것은 분명합니다. 내 로그를 첨부했습니다. 20000번째 마디에서 0번째 마디에 다다르면 다시 20000번째 마디를 모두 몰기 시작하는 것 같습니다. 즉, OnCalculate가 작업을 완료하지 않거나 rate_total 대신 0을 반환합니다.

그러나 웬일인지 이 버그는 당신을 건드리지 않았습니다. 당신을 위해 모든 것이 잘 작동합니다 ...

내 기계/시스템에 무엇이 문제인지 알 수 없습니까?

 
Expert :


네. 이것은 분명합니다. 내 로그를 첨부했습니다. 20000번째 마디에서 0번째 마디에 다다르면 다시 20000번째 마디를 모두 몰기 시작하는 것 같습니다. 즉, OnCalculate가 작업을 완료하지 않거나 rate_total 대신 0을 반환합니다.

그러나 웬일인지 이 버그는 당신을 건드리지 않았습니다. 당신을 위해 모든 것이 잘 작동합니다 ...

내 기계/시스템에 무엇이 문제인지 알 수 없습니까?

먼저 중첩 루프를 100배로 줄이고 추가하십시오. 따라서 i5가 대처할 수 없거나 MT가 느려진다는 것을 이해하게 될 것입니다.

내가 하나의 중첩 루프를 10배 줄인 것을 눈치채셨나요? 이 형식에서 나는 2분 12초를 세었다.

이 라인을 할 수 있습니까?

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

100 증가. 이렇게 하면 표시기가 시작될 때 다시 계산된 막대가 감소합니다.

 

좋은 저녁(밤, 아침, 낮) 여러분!

다음 조건을 코딩하는 방법을 알려주세요.

높음[1].......높음[300]인 경우. (예외 없이 모두) < 열기[0]

주문을 엽니다.

고맙습니다.

 
solnce600 :

좋은 저녁(밤, 아침, 낮) 여러분!

다음 조건을 코딩하는 방법을 알려주세요.

높음[1].......높음[300]인 경우. (예외 없이 모두) < 열기[0]

주문을 엽니다.

고맙습니다.


옵션:

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


옵션:

고맙습니다.
 
나는 당신이 미래를 내다볼 수 있게 해주는 어드바이저의 기능을 찾을 수 없습니다. 사실 어드바이저가 특정 시점에 포즈를 오픈하고, 구멍이 많다는 점에서 그런 부분을 우회할 방법을 찾고 있다.
 
001 :
나는 당신이 미래를 내다볼 수 있게 해주는 어드바이저의 기능을 찾을 수 없습니다. 사실 어드바이저가 특정 시점에 포즈를 오픈하고, 구멍이 많다는 점에서 그런 부분을 우회할 방법을 찾고 있다.

미래가 아니라 과거를 내다보고 구멍을 확인하면 됩니다.
 
001 :
나는 당신이 미래를 내다볼 수 있게 해주는 어드바이저의 기능을 찾을 수 없습니다. 사실 어드바이저가 특정 시점에 포즈를 오픈하고, 구멍이 많다는 점에서 그런 부분을 우회할 방법을 찾고 있다.
어떤 구멍을 말씀하시는 건가요? 프로그래밍에 대해 질문을 하면 그런 표현은 적절하지 않고 기기에 대한 이력 데이터 의 간격을 구멍이라고 합니다. 그런데 여기서 말하는 의미는 무엇이었습니까? 질문에 "시간"이 있는 경우 "시간 이동을 위한 구멍" 순간이동을 의미한 것 같습니다.
내가 텔레파시 능력이 조금이라도 있다면 악기에 대한 고품질 기록을 달성하기만 하면 됩니다.
 

동료 여러분, 도움이 필요합니다.

저는 Expert Advisor(맏형)를 쓰고 있습니다. 올바른 작동을 위해서는 과거 데이터 분석이 필요합니다.

저는 시가, 고가와 저가 의 시가 시간 배열을 사용합니다.

배열을 일별 기간으로 나누면 거의 각 기간마다 다른 수의 분 막대가 얻어집니다. 1440분 막대는 모두 차트에 물리적으로 존재하지만 기록에 따르면 하루에 1380, 1378, 3000 이상으로 나타납니다.

문제가 무엇인지 알아낼 수 있도록 도와주세요. 내 생각에 역사는 실제(그린) 차트와 다를 수 없습니다.

다음은 모든 작업을 수행하는 코드입니다.

 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 :
어떤 구멍을 말씀하시는 건가요? 프로그래밍에 대해 질문을 하면 그런 표현은 적절하지 않고 기기에 대한 이력 데이터의 간격을 구멍이라고 합니다. 그런데 여기서 말하는 의미는 무엇이었습니까? 질문에 "시간"이 있는 경우 "시간 이동을 위한 구멍" 순간이동을 의미한 것 같습니다.
내가 텔레파시 능력이 조금이라도 있다면 악기에 대한 고품질 기록을 달성하기만 하면 됩니다.

물론 역사의 구멍에 대해. 또한 질문이 있습니다. 악기의 고품질 역사를 달성하는 방법은 무엇입니까?