MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1754

 
状況は以下の通りです。X変数にはヒストリーのバーのインデックスが格納されており、新しいバーが現れるとシフトが発生することが分かっているので、Xはすでに別のバーを指しています。どうすれば直るのか?考え方:新しいバーが出るたびにカウンターを増やし(count++)、それをXに追加する。したがって、Xはオフセットに関係なく、常に同じバーを指すことになります。しかし、問題があります。EAが初期化されるとき、最初の現在のバーは考慮されるべきではありません。 私は、カウントが最初にちょうど-1に等しい場合、それは簡単に解決することができると思います。つまり、インクリメントカウントの後の現在のバーでは "0 "になり、次の新しいバー(初期化後、最初に1本分シフトした時)では "1 "になります。いかがでしょうか?もしかしたら、全然違うところで考えているのかも?
 
Nerd Trader #:
状況は以下の通りです。X変数にはヒストリーのバーのインデックスが格納されており、新しいバーが現れるとシフトが発生することが分かっているので、Xはすでに別のバーを指しています。どうすれば直るのか?考え方:新しいバーが出るたびにカウンターを増やし(count++)、それをXに追加する。したがって、Xはオフセットに関係なく、常に同じバーを指すことになります。しかし、問題があります。EAが初期化されるとき、最初の現在のバーは考慮されるべきではありません。 私は、カウントが最初にちょうど-1に等しい場合、それは簡単に解決することができると思います。つまり、インクリメントカウントの後の現在のバーでは "0 "になり、次の新しいバー(初期化後、最初に1本分シフトした時)では "1 "になります。いかがでしょうか?もしかしたら、全然違うところで考えているのかも?

指標となるものであれば、十分である

bool  ArraySetAsSeries(
   const void&  array[],    // массив по ссылке
   bool         flag        // true означает обратный порядок индексации
   );

を、使用するインジケータのすべての配列とバッファに追加します。

すると、ゼロバーがrates_total-1となります。

ArraySetAsSeries - Операции с массивами - Справочник MQL4
ArraySetAsSeries - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArraySetAsSeries - Операции с массивами - Справочник MQL4
 
Nerd Trader #:
状況は以下の通りです。X変数にはヒストリーのバーのインデックスが格納されており、新しいバーが現れるとシフトが発生することが分かっているので、Xはすでに別のバーを指しています。どうすれば直るのか?考え方:新しいバーが出るたびにカウンターを増やし(count++)、それをXに追加する。したがって、Xはオフセットに関係なく、常に同じバーを指すことになります。しかし、問題があります。EAが初期化されるとき、最初の現在のバーは考慮されるべきではありません。 私は、カウントが最初にちょうど-1に等しい場合、それは簡単に解決することができると思います。つまり、インクリメントカウントの後の現在のバーでは "0 "になり、次の新しいバー(初期化後、最初に1本分シフトした時)では "1 "になります。いかがでしょうか?もしかしたら、全然違うところで考えているのかも?
      datetime x=время нужного бара;
      int index=iBarShift(_Symbol,0,x);
 
MakarFX #:
なぜ、そこまでするのか?
 
Alexey Viktorov #:
なぜ、そこまでするのか?
その方が楽だから)
 
MakarFX #:
その方が楽だから)

でも、プロセッサーが重くなった...。

 
Alexey Viktorov #:

でも、プロセッサーが重くなった...。

どの機能がどのような負荷をかけているのかがわからない。どこかで読めるところはないでしょうか?
 
Nerd Trader #:
状況は以下の通りです。X変数にはヒストリーのバーのインデックスが格納されており、新しいバーが現れるとシフトされるため、Xはすでに別のバーを指していることが分かっています。どうすれば直るのか?考え方:新しいバーが出るたびにカウンターを増やし(count++)、それをXに追加する。したがって、Xはオフセットに関係なく、常に同じバーを指すことになります。しかし、問題があります - EAが初期化されるとき、最初の現在のバーは考慮されるべきではありません。 私は、カウントが最初にちょうど-1に等しい場合、それは簡単に解決することができると思います。つまり、インクリメントカウントの後の現在のバーでは "0 "になり、次の新しいバー(初期化後、最初に1本分シフトした時)では "1 "になります。いかがでしょうか?もしかしたら、全然違うところで考えているのかも?

ない。EA/indicatorの読み込み時に、ターミナル内ならともかく、ターミナル外のintuやextern、グローバル変数ではXには何もないので、まずそこに何かを書き込まなければならない。そして、単純にバーの総数の変化を読み取ります(新しいバーの出現を考慮します)。

datetime BarTime。

FlagNewBar=false;
if(BarTime!=iTime(NULL,0,0))
{
 BarTime=iTime(NULL,0,0);
 FlagNewBar=true;
}
if(FlagNewBar==true)
{
// И когда тру, делаем что нужно делать когда появился новый бар, 
//на следующем тике флаг нового бара будет ложь, так как БарТайм время все время существования нулевого бара будет равным
}
 

ごあいさつヒントを教えてください。mt5では、初期化時またはティック時にどのようにテストを定義するのですか?

今のところ、OnDeinit() の直前に呼び出されるOnTester()しか見つかりませんでした。

 
Alexey Viktorov @MakarFX 面白いですね、なかなか良いソリューションです。ありがとうございます。

@Valeriy Yastremskiy OnInit()でインデックスがまだXに配置されています。私のコードは次のようなものです:
last_time = iTime(NULL, 0, 0);

  if(last_time > bar.time_open){
    bar.time_open = last_time;
    coint++;//стартовое значение -1
  }
FlagNewBarとの条件が冗長な気がするのですが。