エラー、バグ、質問 - ページ 1699

 
Karputov Vladimir:
間違ったプログラミングスタイルをすべてバグのせいにするのは無理があります。

どんなSURPRISEなんだ!?明らかなバグを指摘したら、「スタイル」なんて戯言を言われる。

A100やMeatとは月と同じくらい遠い存在です。よくわからないけど、バグを見せてくれる。でも、そこに自分の「スタイル」を持ち込むつもりはありません。

 
fxsaber:
うまくいかないんです。

以下はコードの全文です。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
//if(handle!=INVALID_HANDLE)
   if(prev_calculated!=0)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
         Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

とプリントアウトする。

2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 18992.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 12498.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       
... экономия бумаги :)
2016.09.23 12:34:31.804 2 (SBRF-12.16,M1)       
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 5343.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 17815.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #4 OnDeinit
ファイル:
2.mq5  3 kb
 
Karputov Vladimir:

以下はコードの全文です。

とプリントアウトする。

OnDeinitにすら辿り着けないのです。

そして、私の数値はログと一致していますが、あなたの数値は一致していないことに注意してください。マイログ

PP      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
FE      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 13573.0
IQ      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 13573.0
CF      0       12:41:08.169    Test3 (RTS-12.16,H1)    
JO      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
QI      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 25434.0
NM      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 25434.0
MJ      0       12:41:08.169    Test3 (RTS-12.16,H1)    
DJ      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
QO      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 9469.0
HK      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 9469.0
CM      0       12:41:08.187    Test3 (RTS-12.16,H1)    
JF      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
OS      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 1887.0
NG      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 1887.0
ターミナルでインジケーターやEAを1つも動かしていない。
 
fxsaber:

OnDeinitにすら辿り着けないのです。

そして、私の数値はログと一致していますが、あなたの数値は一致していないことに注意してください。マイログ

ターミナルでインジケーターやExpert Advisorを起動していないのですが、どうしたらいいですか?

私はこのような構成にしています。

2016.09.23 12:25:34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09.23 12:25:34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+02:00
2016.09.23 12:25:34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(サーマル再起動後、ログタブ、最初の3行)

 
Karputov Vladimir:

私はこのような構成にしています。

(サーマル再起動後、ログタブ、最初の3行)

2016.09.23 12:42:22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09.23 12:42:22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700 K  @ 3.50 GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+02:00
2016.09.23 12:42:22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber:

曖昧。x32マシンの場合。

2016.09.23 13:23:55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09.23 13:23:55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00, UAC, Intel Atom  Z3740 @ 1.33 GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+02:00
2016.09.23 13:23:55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


動作しない。

 
Andrey Barinov:
それらは「ドロップアウト」しますが、それらを呼び出そうとするとコンパイルエラーが 発生します。

そんなことより、これからの生活を楽にするために、いろいろと工夫しているんです。

私はこの方法で問題を解決しました。親ではすべてのprotecdと継承はprotecdの下で行われ、次にoverrideになります。

 
Karputov Vladimir:

曖昧。x32マシンの場合。


動作しない。

アプリケーションは、何度もやってうんざりしているにもかかわらず、作られています。
 
fxsaber:

インジケーターでチャート上の自分のハンドルを知るにはどうしたらいいですか?ChartIndicatorName は、短い名前を返すので、適切では ありません。また、同じ名前のインジケータが、異なる入力パラメータで既に実行されている可能性があります。

チャートと計算からインジケータを削除できるようにしてほしい。

もうお分かりかもしれませんが、念のため明らかにしておきます。インジケーターのハンドルは、実際にはインジケーターを作成したプログラム(Expert Advisor、インジケーター、スクリプトなど)内部のインジケーターの記述への参照でしかなく、一種の「番号」と考えることができます。つまり、この「数値」は、そのインジケータを作成した(ハンドルを取得した)プログラムの外では意味を持ちません。ChartIndicatorGet()関数を 呼び出すプログラムでも、何かグローバルなインジケータのハンドルを取得するわけではなく、このインジケータの記述を作成し、その「番号」をアドレス指定用に割り当てるだけです。 端末全体で一意のグローバルなインジケータ・ハンドルは存在しない。

ショートネームの使用は、例として挙げることができます。できるようになります。

   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");

これにより、 同じインジケータが異なる入力パラメータで既に実行 されている」という問題を解決することができます。

そして、視覚的にもどのインジケーターが機能するかが明確になります。


 
Anton:

もうお分かりかもしれませんが、念のため明らかにしておきます。インジケータハンドルは、実際にはインジケータを作成したプログラム(Expert Advisor、インジケータ、スクリプトなど)内のインジケータの説明へのアドレスに過ぎず、一種の「番号」と考えることができます。つまり、この「数値」は、そのインジケータを作成した(ハンドルを取得した)プログラムの外では意味を持ちません。ChartIndicatorGet()関数を 呼び出すプログラムでも、何かグローバルなインジケータのハンドルを取得するわけではなく、このインジケータの記述を作成し、その「番号」をアドレス指定用に割り当てるだけです。 端末全体で一意のグローバルなインジケータ・ハンドルは存在しない。

ShortNameの使い方は、例で見ての通りです。こんな風にできるんですね。

これにより、 同じインジケータが異なる入力パラメータで既に実行 されている」という問題を解決することができます。

また、視覚的にもどのインジケーターが効くのかが分かりやすくなっています。

ありがとうございます。以前、stringoさんからそのような説明を受けたことがあります。ハンドルが「私」のものであることを判断する方法はいくつか見つかりました。

  1. インジケータバッファの極値を変更し、対応するCopyBufferの値と比較しています。一致すれば「私」です。これが、undeletableインジケーターの考え方です。
  2. ShortNameを変更し、ChartIndicatorNameと比較しています。