"ダミー "からの質問 - ページ 235

 
lazarev-d-m:

これに変更

動作しているようです。

配列がシリアライズされていない。

だから、これなんです。

Buffer[i+1]=Buffer[i]+delta;

未来窺い


同じ理由で、0バールを再計算しないのです。

 
sergeev:

配列がシリアライズされていない。

というわけで、これなんです。

未来を覗き見る


0からスタートしないのと同じ理由で、0バールの再計算はしません。

私の0気圧は、計算式に従って計算されていません。

Buffer[0]=price[0]; 

そして、値動きに基づいて、インジケータがトレンドに追いつくようになる

価格が指標から離れて移動し、移動しない場合たとえば、ろうそくの指標の"期間"の間に価格をキャッチアップしますが、これは私のためにMAに代わる一種である。

 

lazarev-d-m:

私にとってはMAの代替品です。

1バー先まで見渡せるので、この選択肢は安心して捨てられます。
 

私の最初の指標。シンボルを0から100まで拡大縮小したい。私は正しいことをしているのだろうか?また、現在のバーを再計算しないようにするにはどうしたらよいでしょうか (テスターではカクつきますが、チャート上ではカクつきません)。

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   
   int first,bar,nLowBar=0,nHighBar=0;
   int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   if(prev_calculated==0) // проверка на первый старт расчёта индикатора
     {
      first=0; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated-1; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for(bar=first; bar<rates_total; bar++)
     {
      nLowBar =ArrayMinimum(low, bar, nVizCount);
      nHighBar=ArrayMaximum(high, bar, nVizCount);
      if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
        }
      else
        {
         MainBuffer[bar]=EMPTY_VALUE;
        }
     }

  
//--- return value of prev_calculated for next call

   return(rates_total);
  }
 
Konstantin83: 現在のバーを再計算しないようにする方法

現在のバーの開始時刻を 記憶し、入力されるティックの同じ値と比較します。値が一致しない場合のみ、現在のバーの値を再計算する。

私なら初期化ブロックに入れます。

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

で、変数はプログラムのグローバルレベルで宣言されることになる。

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

現在のバーの開始時刻を 記憶し、入力されるティックの同じ値と比較します。値が一致しない場合のみ、現在のバーの値を再計算する。

私なら、これを初期化ブロックに入れます。

ありがとうございます。一般的にはこれでいいのでしょうか?
 
Konstantin83: そして、一般的にはすべて正しいのですか?

他には何も気づいていません。記事からは、同様の構造がうかがえる。ゼロによる除算の チェックがあります。

はい、再計算しないように、私の記憶ではprev_calculatedとrates_totalを比較することも可能です。

 
Yedelkin:

他には何も気づいていません。記事からは、同様の構造がうかがえる。ゼロによる除算のチェックがあります。

はい、再計算しないように、私の記憶ではprev_calculatedとrates_totalを比較することも可能です。

ターミナルを閉じてから再起動 すると、インジケータが線を引かないのですが、なぜかわかりますか?他の時間軸に切り替えた場合は、描画されます。
 
Konstantin83: インジケーターを表示した端末を終了し、端末を再起動 するとインジケーターが線を描かなくなるのですが、なぜかわかりますか?他の時間軸に切り替えた場合は、描画されます。

端末は、起動時にデータベースをサーバーと同期させるなど、「立ち上がる」ための時間が必要です。同時にインジケータを起動した場合、インジケータ計算の ためのデータがない場合があります。最も簡単な方法は、OnInit()に2〜3秒の遅延を挿入することです。

一般に、問題箇所を検索する際には、重要な情報はすべて印刷することが望ましいとされています。のように

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666 :ビジュアライゼーションが必要

ライブ取引に関するヘルプはまだ見つかっていません。デモ口座でポジションを開いたり閉じたりしてみてください。

ここでは、https://www.mql5.com/ru/forum/6343/page96#comment_419028