どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 602

 
AlexeyVik:
私があなたを理解できないか、あなたが何かを理解していないかのどちらかです..csvファイルに問題があるのでしょうか?最初のバーがカウントされていない限り prev_calculated または IndicatorCounted() (旧バージョン) はゼロになり、これは正しい。 。


そうですね、理解できますね。私のログを添付します。20000本目のバーから0本目のバーまで行くと、また20000本全部を回し始めるようなことが判明しました。つまり、OnCalculateが 完了しないか、rates_totalの代わりにゼロを返す。 でも、なぜかこのバグは影響がなかったんですよね。あなたの場合、すべてうまくいっていますね。

では、私のマシン/システムのどこが悪いのか、理解できないのですか?

 
Expert:


そうですね、理解できますね。私のログを添付しました。20000barの最後を0にすると、また20000barを全部始めるかのようになることが判明しました。つまり、OnCalculateが完了しないか、rates_totalの代わりにゼロを返す。

でも、なぜかこのバグは影響がないんですよね。あなたには問題なく使えますが...。

では、私のマシン/システムのどこが悪いのかがわからないのですか?

ネストしたサイクルをまず100分の1に減らし、さらに追加してみてください。そうすれば、i5が処理しきれないのか、MTが遅くなっているのかがわかるでしょう。

ネストしたループを1つだけ10分の1に減らしたことに気づきましたか?そんな感じで、再計算に2分12秒かかりました。

この行でできること

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

100%増量。これにより、インジケータ起動時に再計算されるバーを減らすことができます。



 

皆さん、こんばんは!(夜、朝、昼)。

以下の条件のコーディング方法を教えてください。

High[1]の場合...High[300]の場合。(すべて例外)< Open[0].

注文を開始する。

ありがとうございます。

 
solnce600:

皆さん、こんばんは!(夜、朝、昼)。

以下の条件のコーディング方法を教えてください。

High[1]の場合...High[300]の場合。(すべて例外)< Open[0].

注文を開始する。

ありがとうございます。


オプションとして

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


オプションとして

ありがとうございます。
 
EAのどの機能で未来を見ることができるのかがわからない。EAは決まった時間にポジションを開くということですが、そういうのを回避する方法を探して、非常に多くの穴があります。
 
001:
EAのどの機能で未来を見ることができるのかがわからない。EAは決まった時間にポジションを開くということですが、そういうのを回避する方法を探して、非常に多くの穴があります。

未来ではなく、過去を見る必要はなく、穴が開いていないかチェックすればいいだけです。
 
001:
EAのどの機能で未来を見ることができるのかがわからない。EAは決まった時間にポジションを開くということですが、そんなことを回避する方法を探して、穴だらけになっています。 。
どの穴のことを言っているのですか?プログラミングの質問をすると、このような表現は適切ではない、穴はシンボルのヒストリカルデータの ギャップである、ここはどういう意味か?質問文に「時間」が入っている場合、おそらく「タイムトラベルホール」テレポーテーションのことを指しているのでしょう。
もし私にテレパシー能力があるのなら、楽器の履歴をしっかり把握すればいいんです。
 

助けが必要だ、同僚たちよ。

EA(第一子)を書いているのですが、正しく動作させるためにはヒストリカルデータの分析が必要です。

始値、高値と安値の 値の配列を使用しています。

アレイを日足に分割すると、ほぼすべての期間で異なる数の分バーが表示されます。1440分のバーはすべて物理的にチャートに存在するが、履歴では1日あたり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:
どの穴のことを言ってるんだ?プログラミングの質問をすると、このような表現は適切ではない、穴はツールの履歴データにギャップがある、しかしここではどういうことなのか?質問文に「時間」が入っている場合、おそらく「タイムトラベルホール」テレポーテーションのことを指しているのでしょう。
もし私にテレパシー能力があるのなら、楽器の履歴をしっかり把握すればいいんです。

歴史の穴について、もちろんです。そして、あなたにも質問です。楽器で質の高いストーリーを実現するには、どうすればいいのでしょうか?
理由: