初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1174

 
Alexey Viktorov:

配列の2次元目以降をダイナミックにすることはできません。したがって,例えば,int Mas[][7] のように配列が宣言されている場合,MyFun(int &Mas[][7]) で取り込まなければなりません.

はい、そうです。
ありがとうございます。そのための頭脳がなかったのです。
 

プログラマーの皆さん、こんにちは。もう一度、お願いします。標準的なインジケータがあり、そこから1つの値を取得したい。インジケータを接続し、その値の配列をバッファにコピーしました double buf_atr[] ログにプリントされたArrayPrint(buf_atr) はこれらの値を表示します。

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

どのように私は値0.00030を持っているMASSIVEキーに適用するのですか? それは、この値は、現在のキャンドル0にないことが判明し、以前はすでに形成されている1

動作はしているようですが、セルの配列にアクセスしてさらに作業する方法がわかりません;(

input int InpPeriod=14;  // period
int handleIndicator; //указатель на индикатор


int OnInit()
{  
  
handleIndicator = iCustom(NULL,0,"Examples\\INDICATOR",InpPeriod);

   return(INIT_SUCCEEDED);
}



void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);

ArrayPrint(buf_atr);

}
 
Kolya32:

プログラマーの皆さん、こんにちは。もう一度、お願いします。標準的なインジケータがあり、そこから1つの値を取得したい。インジケータを接続し、その値の配列をバッファにコピーしました double buf_atr[] ログにプリントされた ArrayPrint(buf_atr) はこれらの値を表示します。

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

どのように私は値0.00030を持っているMASSIVEキーに適用するのですか? それは、この値は、現在のキャンドル0と前が既に形成されていないことが判明している1

動作はしているようですが、セルの配列にアクセスしてさらに作業する方法がわかりません;(

void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}
 
Vitaly Muzichenko:
void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}


効いたぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁbuf_atr[buf_size-1] I HAVE Tried EVERYTHING に回す必要がある。Vitaly Muzichenko さん、ありがとう ございました。

 

mqlのスタイリングは配列参照が必須ですか?

(
                                     double &value[],// Buffer of values
                                     double& clr[],                                 // Color buffer
                                     const bool asSeries,                           // Numbering flag as in time series
                                     const string label,                           // Series name
                                     const color& colors[],                        // Line colors )
 
CAppDialogの 子孫であるCAppDialogPTR クラスを作成しました - m_background, m_caption を適切にオーバーライドする方法を教えてください ...をCDialogクラスからアクセスすることはできますか?
#property strict
#include <Controls\Dialog.mqh>

class CAppDialogPTR : public CAppDialog
{
private:
   int               m_deinit_reason;
public:
   CAppDialogPTR(void){};
   ~CAppDialogPTR(void){};
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
};

bool CAppDialogPTR::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
   m_deinit_reason=WRONG_VALUE;
   bool res = CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);
   return(res);
}

ダイアログ.mqh.

***
class CDialog : public CWndContainer
  {
private:
   //--- dependent controls
   CPanel            m_white_border;        // the "white border" object
   CPanel            m_background;          // the background object
   CEdit             m_caption;             // the window title object
   CBmpButton        m_button_close;        // the "Close" button object
   CWndClient        m_client_area;         // the client area object
***
 
Peter Vorobyev:
CAppDialogの 子孫であるCAppDialogPTR クラスを作成しました - m_background, m_caption を適切にオーバーライドする方法を教えてください ... をCDialogクラスからアクセスすることはできますか?

ダイアログ.mqh.

無理でしょう。これらのオブジェクトは、private キーワードで示されるように、あなたのクラスで直接変更されないようにロックされています。 直接働きかけることはできません。これらのフィールドを操作するCDialog クラスのメソッドを使用します。

 
Vasiliy Sokolov:

無理でしょう。これらのオブジェクトは、private キーワードで示されるように、あなたのクラスで直接変更されないようにロックされています。 直接働きかけることはできません。これらのフィールドを操作するCDialog クラスのメソッドを使用します。

仮定してみましょう。

作成されたCAppDialogPTR クラスのインスタンスはコントロールを持ちます(CWndContainerクラス-> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); }) からm_background, m_caption にアクセスすることができる。

1) 作成したオブジェクトにアクセスする(メモリを参照する)ための構文は?

"CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);"
 
Peter Vorobyev:

仮に

作成されたCAppDialogPTR クラスのインスタンスはコントロールを持ちます(CWndContainerクラス-> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); }.) を通してm_background, m_caption にアクセスすることができる.

1) 作成したオブジェクトにアクセスする(メモリを参照する)ための構文は?

m_controls コレクションも閉じているので、どのインデックスがどの特定のコントロールに対応するのかが分からないため、コントレイルにアドレス指定でアクセスすることはまだできません。CDialogは、それが構成する要素へのアクセスをロックしますが、その主要なプロパティを一貫して管理できるようにする、というものです。例えば、m_captionに直接アクセスすることはできませんが、Caption(const string text)メソッドを使用してそのテキストを変更することができます。

欲しいのは、要するにハックなんです。どんなMQツールでも、原則的にはあれこれハックしたくなるものですから、あなただけではありません。おそらく最も簡単な方法は、ライブラリを別のディレクトリにコピーして、プライベートセクションをprotectedに移動することです。これは粗雑で間抜けだが、うまくいくだろう。他の選択肢はありえない - ハードコードが多すぎる。

 
Vasiliy Sokolov:

m_controls コレクションも閉じているので、どのインデックスがどのコントロールに対応するのかが分からないため、いずれにせよカウンターパーツにアクセスすることはできません。CDialogは、それが構成する要素へのアクセスをロックしますが、その主要なプロパティを一貫して管理できるようにする、というものです。例えば、m_captionに直接アクセスすることはできませんが、Caption(const string text)メソッドを使用してそのテキストを変更することができます。

欲しいのは、要するにハックなんです。どんなMQツールでも、原則的にはあれこれハックしたくなるものですから、あなただけではありません。おそらく最も簡単な方法は、ライブラリを別のディレクトリにコピーして、プライベートセクションをprotectedに移動することです。 これは粗雑で間抜けだが、うまくいくだろう。他の選択肢は、コードが固いのでうまくいきそうにありません。

MQのソースコードを修正し、メソッドをpublicに引き上げることは、明らかに我々の手法ではありません :) 。
しかし、グローバル変数 panelの宣言後にCaptionのプロパティを参照することができます。

CAppDialogPTR panel;

            int total=panel.ControlsTotal();
            for(int i=0;i<total;i++)
            {
               CWnd *_control=panel.Control(i);
               string _control_name=_control.Name();

               if(StringFind(_control_name,"Caption")>0)
               {
                  CEdit *_caption=(CEdit*)_control;
                  _caption.Text("test";
                  _caption.Color(clrRed);
                  ChartRedraw();
                  break;
               }
               
             }

しかし、見栄えが悪いだけでなく、CAppDialogPTR クラスの背後にあるこのコード。 CAppDialogPTRクラスの内部で同じ ことをするにはどうしたらよいでしょうか?