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

 
muzzletop:
午後EAがあり、ストラテジーテスターで問題なく動作しています(注文もすべて開きます)。しかし、チャート上に置いただけでは、何も起こらない。EAが動作しない。また、チャートのEA名の横に十字が表示されていることに気づきました。修正方法は?


EAを チャート上に配置すると、パラメータを表示するウィンドウが開き、さまざまなタブがあります。

EAがすでにチャート上にあり、十字で表示されている場合 - ツールバーの「EAs」ボタン(帽子の中に黄色い立方体、円の中に赤い円と白い四角がある)をクリックします。

 

こんにちは。奇妙な問題に対処するのを助けてください。

要は、マルチタイムインジケーター、つまり、いつでも開いていて、他のすべての時間帯でも計算し、シグナルを出すようなインジケーターを書いているのです。

指標の基本はRSIです。

init()でタイムフレームを切り替える際に、インジケータの ラインに対応する別の配列を入れる。それぞれ、この時間、この時間にいる、というラインは表示されますが、それ以外の時間の計算が進みません(関数iRSIがバカみたいに計算でゼロを追っています)。すなわち、現在の時刻は計算されるが、他の時刻は計算されない。

コードを貼り付けています。

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80

#property indicator_level1 20          // уровень RSI
#property indicator_level2 42          // уровень RSI
#property indicator_level3 50          // уровень RSI
#property indicator_level4 58          // уровень RSI
#property indicator_level5 80          // уровень RSI

#property indicator_levelcolor White   // цвет уровней 

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2           // толщина RSI

//--- buffers
double   RSI_M1[];               // буферы под RSI
double   RSI_M5[];
double   RSI_M15[];
double   RSI_M30[];
double   RSI_H1[];
double   RSI_H4[];
double   RSI_D1[];
double   RSI_W1[];
double   RSI_MN[];

int         RSI_per           = 12;                // период RSI
int         RSIPriceType      =  PRICE_CLOSE;      // покакой цене считать RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   IndicatorShortName("test");
   
   switch(Period()) {
      case PERIOD_M1:
          SetIndexBuffer(0, RSI_M1);
          break;
      case PERIOD_M5:
          SetIndexBuffer(0, RSI_M5);
          break;
      case PERIOD_M15:
          SetIndexBuffer(0, RSI_M15);
          break;
      case PERIOD_M30:
          SetIndexBuffer(0, RSI_M30);
          break;
      case PERIOD_H1:
          SetIndexBuffer(0, RSI_H1);
          break;
      case PERIOD_H4:
          SetIndexBuffer(0, RSI_H4);
          break;
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          break;
      case PERIOD_W1:
          SetIndexBuffer(0, RSI_W1);
          break;
      case PERIOD_MN1:
          SetIndexBuffer(0, RSI_MN);
          break;
   }   
   
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0,"RSI(" + RSI_per + ")");
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   shift, _Bars;
   static int  _counted_bars_W1 = 0,
               _counted_bars_D1 = 0;
   //--------------------------------------------------------------------
   _Bars = iBars(NULL, PERIOD_W1);
   shift = _Bars - _counted_bars_W1 - 1;   // Индекс первого непосчитанного
   _counted_bars_W1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_W1[shift]       = iRSI(NULL, PERIOD_W1, RSI_per, RSIPriceType, shift);
      Print(RSI_W1[shift]);
      shift--;
   }
   //------------------------------------------
   _Bars = iBars(NULL, PERIOD_D1);
   shift = _Bars - _counted_bars_D1 - 1;   // Индекс первого непосчитанного
   _counted_bars_D1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_D1[shift]       = iRSI(NULL, PERIOD_D1, RSI_per, RSIPriceType, shift);
      shift--;
   }
   //------------------------------------------   
   return(0);
  }
//+------------------------------------------------------------------+

面白いのは、インジケータライン用の配列を1つだけ残して、いつでもW1だけを計算するようにすると、どんな(!)時でもすべてが正しく計算・描画されることです。
そのコツとは?初期化時に、時間によってインジケータ線に異なる配列を取ることは不可能なのでしょうか?

 
satorifx:

こんにちは。奇妙な問題に対処するのを助けてください。

要は、マルチタイムインジケータ、つまり、いつでも開いていて、他のすべての時間帯でも計算してシグナルを出すようなインジケータを書いているのです。

指標の基本はRSIです。

init()でタイムフレームを切り替える際に、インジケータのラインに対応する別の配列を入れる。それぞれ、この時間、この時間にいる、というラインは表示されますが、それ以外の時間の計算が進みません(関数iRSIがバカみたいに計算でゼロを追っています)。すなわち、現在の時刻は計算されるが、他の時刻は計算されない。

コードを貼り付けています。

面白いのは、インジケータライン用の配列を1つだけ残して、いつでもW1だけを計算するようにすると、どんな(!)時でもすべてが正しく計算・描画されることです。
そのコツとは?初期化時に、時間によってインジケータ線に異なる配列を取ることは不可能なのでしょうか?

W1、D1のみ読み込みます何がしたいんだ?私たちのために完成させなさい!
 
borilunad:
W1、D1のみ読み込みます何がしたいんだ?他の人のために完成させるんだ!

そういう問題じゃないんです。コードが長くなりすぎないように、D1とW1のみ計算を行いました。注:各タイムフレームの各ティックで、W1 の計算値が印刷されます。そのため、W1以外の時刻を開くと、0が出力されます。W1で成功したのだから、他でも成功するはずだ。
 
satorifx:

そういう問題じゃないんです。コードが長くなりすぎないように、D1とW1についてのみ計算を与えています。注意:どの時間枠のティックでも、W1 の計算値が印刷されます。そのため、W1以外の時刻を開くと、0が出力されます。W1でうまくいけば、それ以外でもうまくいくはずです。
そうなんだ!週足チャートを開かないと、他のチャートで表示できないのです
 
borilunad:
正解!他のチャートで表示するには、週足チャートも開く必要があります


正直なところ、この発言は理解できなかった。
そして、それ以外のものを見せる必要はない。コードを実行すると、すでに私が望むものを表示していることがわかります。D1にはチャートRSI D1、W1にはチャートRSI W1を表示していますが、同時に、D1が開いていれば、W1のRSIはすべてゼロ、W1が開いていれば、D1の計算もゼロになっています。問題は、なぜそうなるのか、どうすれば解決できるのかということです。

 

問題は、インデックス配列が 初期化され、適切なサイズにリサイズされることです。
そのため、D1を開くと - RSI_D1[]がインデックス化され、それですべてがOKになりますが、他の配列は胎生状態のままです。
試しに、すべての配列をこのように宣言してみました。

double   RSI_W1[]    =  {0};
init()のスイッチを次のように変更しました:
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

しかし、ArrayResizeのGetLastErrorでは、エラーが発生します。

EURUSD,Daily:配列のサイズを変更できません。

EURUSD,Daily: some array error

とにかく、この問題を解決する方法を教えてくれる人はいませんか?

 
satorifx:

問題は、インデックス配列が初期化され、適切なサイズにリサイズされることです。
そのため、D1を開くと - RSI_D1[]がインデックス化され、それですべてがOKになりますが、他の配列は胎生状態のままです。
試しに、すべての配列をこのように宣言してみました。

init()のスイッチを次のように変更しました:

しかし、ArrayResizeのGetLastErrorでは、エラーが発生します。

EURUSD,Daily:配列のサイズを変更できません。

EURUSD,Daily: some array error

とにかく、この問題を解決する方法を教えてくれる人はいませんか?

配列が動的な場合は、値を書き込むときに、新しいデータに対応するように配列のサイズを 大きくすることを確認します。ArrayResize()
 
artmedia70:
配列が動的な場合は、値を書き込む際に新しいデータに対応できるように配列のサイズを大きくしてください。ArrayResize()

上に書きましたが、
しかし、ArrayResizeGetLastErrorは エラーを出します:

EURUSD,Daily: cannot resize array

EURUSD,Daily: some array error.
 
satorifx:
これは、上に書いたとおりです。
しかし、ArrayResizeのGetLastErrorでは、エラーが発生します。

EURUSD,Daily:配列のサイズを変更できません。

EURUSD,Daily:いくつかの配列エラー
satorifx です。


正直なところ、その発言は理解できなかった。
そして、それ以外のものを見せる必要はない。私のコードを実行すると、D1にはRSI D1、W1にはRSI W1が表示されますが、同時に、D1が開いていれば、W1のRSIはすべてNULL、W1が開いていれば、D1のRSIもすべてNULLとなります。問題は、なぜそうなるのか、どうすれば解決できるのかということです。

なぜなら、バッファは一人で、あなたの呼びかけで一つずつ表示されるからです

#property indicator_buffers 1
私があなたの "コード "をダウンロードしてテストする以外にすることがないとでも思っているのでしょうか?アドバイスのお手伝いをしています。そして、何かあったときには、すべてそこに書いてあるのですそれとも、怠惰が先に生まれたのか!