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

 
Karputov Vladimir:
Print(MQLInfoString(MQL_PROGRAM_NAME));短いインジケータ 名を返します。短縮名が指定されない場合は、フルネームが返される。
ありがとうございます。
 
Vladimir Pastushak:

ありがとうございます。

Alexey、あなたの例はうまくいきません。親のメソッドが継承者にダンプされたままになっています。


このようなことはないはずですが、コードを投げることができますか?

親で 保護 公開されて いたデータは、protected-inheritance で保護される

	          
 
  1. NONEのチャートにインジケータを設定しました
    #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)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. チャートからインジケータを手で外します。
  3. ログを見ると、インジケータが動作し続けていることがわかります。ターミナルですべてのチャートを閉じても、実行されたままです。そして、それは当然ながら何の役にも立ちません。
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. 端末を再起動すると、インジケータの実行が停止します。
  5. どれだけの指標がアイドリングストップになるのか、私たちは知らないままなのです。コントロールが全くできていないのです。
 
fxsaber:
  1. チャート上のNULLインジケーターを手で設定する
  2. チャートからインジケータを手で外します。
  3. ログを見ると、インジケータが動作し続けていることがわかります。ターミナルですべてのチャートを閉じても、実行されます。
  4. 端末を再起動すると、インジケータの実行が停止します。
  5. どれだけの指標がアイドリングストップになるのか、それすらも聞いていないのか。コントロールが全くできていないのです。

defineや:で 囲まれたコードを読み、目を通すことは不可能です。

一般的なMQL5のスタイルでコードを書き換えてください。

 
fxsaber:
  1. チャート上のNULLインジケーターを手で設定する
  2. チャートからインジケータを手で外します。
  3. ログを見ると、インジケータが動作し続けていることがわかります。ターミナルですべてのチャートを閉じても、実行されます。
  4. 端末を再起動すると、インジケータの実行が停止します。
  5. アイドルモードで実行できるインジケータで、私たちが知らないものがどれだけあるでしょうか。コントロールが全くできていないのです。
StopFlagチェックを追加しても効果がない?
 
Karputov Vladimir:

define と : を使ったコードを読んだり見たりすることは不可能です。

一般的なMQL5スタイルでコードを書き換えてください。

これがMQL5スタイルです。何が#defineで何が::なのかを勉強してください。
 
Alexey Kozitsyn:
StopFlagチェックを追加しても効果がない?
どこに添加すればいいのか、少なくとも理論的にはどう役に立つのか。これは端末のバグです。しかも、深刻なバグです。私はラッキーでした。ログを見ると、インジケータが動作していることがわかります。しかし、端末には何の情報もなく動作しているインジケーターがたくさんあります。しかし、話題になっているのは、空の端末でなぜこんなにCPUに負荷がかかっているのか?
 
fxsaber:
これが「MQL5」のスタイルです。何が#defineで何が::なのかを勉強してください。
そういうことではありません。あなたの例では、":: "はまったく必要ありません。あなたの癖かもしれませんが、そこにはまったく必要ないのです。defaneを使わなくても、普通にコードを書くことができます。ただ、書き換えてみて、何か腑に落ちることがあるかどうか。
 
Karputov Vladimir:
そういうことではありません。"::" は、あなたの例ではまったく必要ありません。あなたの習慣かもしれませんが、そこではまったく必要ないのです。defaneがなくても問題なくコードは書けます。ただ、書き換えてみて、何か腑に落ちることがあるかどうか。

一か所だけ「:」があったんです。それに、私はゼロからコードを書くわけではありません。原則として、私は自分のコードから何かを取り出すことにしています。ここで :: コピーペーストによるものがありました。今まで気にしたことがなかったのですが、気持ちが楽になるので削除しました。

しかし、#defineを削除しないのは主義主張の問題ではありません。99%のコードはこれ無しで書けます。取り上げるような場面ではありません。

そして、#defineなしにはできないことが1%(比較的)あるのです

 
fxsaber:

一か所だけ「:」があったんです。それに、私はゼロからコードを書くわけではありません。原則として、私は自分のコードから何かを取り出すことにしています。ここで :: コピーペーストによるものがありました。今まで気にしたことがなかったのですが、気持ちが楽になるので外しました。

しかし、#defineを削除しないのは主義主張の問題ではありません。99%のコードはこれ無しで書けます。取り上げるような場面ではありません。

そして、1%(条件付きで)#defineがないとダメな場合もあるのです

バッファをコピー しない場合。

//+------------------------------------------------------------------+
//|                                                      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)
     {
      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:11:12.655 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:14.794 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:15.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:16.936 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #4 OnDeinit