MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 166

 
-Aleks-:

この方法を私の機能で示すことができますか?本当に理解するのに苦労しています。


関数からどの変数が必要かを決めて(メインプログラムに)渡す/取り出す必要があります。もしAllが必要なら、これらの変数をプログラムの最初に宣言すれば、すべての関数から一度に見えるようになります。
 
-Aleks-:

なぜ」と考えるのではなく、「どのように」と考えるのが良い。

だから、この機能には適用されないって言ったのに...。

このような関数は、原則として大きなものである。そのため、異なる値を得るために何度も実行のために呼び出すのは残念なことだが、私はすべての結果を一度に得たいのだ。

例えば、全ロット数と全注文数を注文タイプ 別に分けて一度に取得したいんです。

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double n_Lot_BUY;
double n_Lot_SELL;
int n_Order_BUY;
int n_Order_SELL;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
   F();
   Print("Лотов BUY:",n_Lot_BUY,"   Лотов SELL:",n_Lot_SELL,"   Позиций BUY:",n_Order_BUY,"   Позиций SELL:",n_Order_SELL);
  }
//+------------------------------------------------------------------+
void F()
  {
   n_Lot_BUY=0;
   n_Lot_SELL=0;
   n_Order_BUY=0;
   n_Order_SELL=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)){break;}
      if(OrderType()==0)
        {
         n_Order_BUY++;
         n_Lot_BUY=n_Lot_BUY+OrderLots();
        }
      if(OrderType()==1)
        {
         n_Order_SELL++;
         n_Lot_SELL=n_Lot_SELL+OrderLots();
        }
     }
  }
//+------------------------------------------------------------------+
 
Nikolay Gaylis:

つまり、すべての変数をあらかじめ宣言しておいて、関数を通して変更するということです。しかし、同じ種類の変数に同じ変数名が使われていると、不便なこともありますね...。他に選択肢はないのか?
 

のように、同じ型を構造体にまとめ、配列として宣言 することができます)

//структура из переменных
struct OrdStruct
   {
   double tp;
   double sl;
   double open;
   double close;
   double lot;
   datetime time_open; 
   datetime time_close;
   };

//массив структур
OrdStruct ORDERS[];


//обращение к переменным
ORDERS[i].sl=OrderStopLoss();
ORDERS[i].tp=OrderTakeProfit();
ORDERS[i].lot=OrderLots();

//или
ORDERS[i]=ORDERS[i+1];

ZeroMemory(ORDERS[i]);
 
Taras Slobodyanik:

同じ型を構造体にまとめ、上記のように配列として宣言 することも可能です)

これはもう理解しがたいですね...例えば、i - が何に等しいのか理解できませんし、ORDERS[i]= の配列にはサイズを与えるべきじゃないですか?

 
-Aleks-:

これはもう理解しがたいですね......例えば、iが理解できないのですが、何が等しいのか、また、ORDERS[i]=の配列は大きくない方がいいのでしょうか?


これはあくまで例であり、もちろんiは指定する必要があるし、配列のサイズも 注文数に応じて調整する必要がある...。

つまり、変数が同じようなものです。が,配列iのインデックスを変更する

 
-Aleks-:

あなたの苦悩を見るにつけ、心が痛みます...。技術フォーラムなんだから、論理的に考えてくださいよ。

1 問題を説明する。

使用している変数を記述してください。

出力として得たいものを記述する。

技術フォーラムで自分の考えを専門用語で表現することを学ぶ。そうでないと、ここを当てるのに時間がかかってしまいます。

 
Taras Slobodyanik:


これは例えばですが、もちろん注文数に応じて配列のサイズを 指定・設定 する必要があるのですが...。

つまり、変数が同じようなものです。が,配列iのインデックスが変化する

はい、わかりました!ありがとうございます!今後、どこかで使ってみようかな...。私はちょうど理解していない、配列としてこの構造で動作しますか?ソートやその他の標準的な操作を行うか?

 
Alexey Kozitsyn:

あなたの苦悩を見るにつけ、心が痛みます...。技術フォーラムなんだから、論理的に考えてくださいよ。

1.問題を説明する。

使用している変数を記述してください。

出力として得たいものを記述する。

技術フォーラムで自分の考えを専門用語で表現することを学ぶ。そうでないと、ここを当てるのに時間がかかってしまいます。

私の言葉のどこに論理性がないのか書いてください。

知ることの苦悩は、解くことの喜び。

自分の問題をこぼしたくなかったので、シンプルにしました。知覚しにくい原因を推測するのは難しいのですが......。私の「苦悩」で不愉快な思いをさせてしまったのなら申し訳ありません。

 
-Aleks-:

つまり、すべての変数をあらかじめ宣言しておき、関数を通して変更することです。しかし、同じ種類の変数に同じ変数名が使われていると不便なことも......。他に選択肢はないのか?

ここを よく読めば、何が起こっているのかがわかるはずです。ここでは、最初に提案されたオプションである参照渡しのパラメータについて説明する。

簡単に言うと、関数を呼び出すときに、その変数をパラメータとして渡すことができる。

double FirstMethod(int i,int j)

または、変数名の前に&記号がある場合は参照で。

double SecondMethod(int &i,int &j)

2番目のバリエーションでは、関数に参照渡しされた変数が、さらに異なる名前を持つ変数とともに変更されます。特殊な場合、これらは変数iとjである

それ以外のことは、ヘルプテキストを見れば十分わかります。

Передача параметров - Функции - Основы языка - Справочник MQL4
Передача параметров - Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Передача параметров - Функции - Основы языка - Справочник MQL4