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

 
MrBrooklin #:

ありがとう、アレクサンダー。あなたの修正でコードが機能するようになりました。正直なところ、私自身、三本松で混乱していたことに気づきました。関数に引数を渡すことをもう一度勉強する必要がある。 どうやら私はここで完全な誤解をしているようだ。

ありがとう、ウラジミール。

グローバル領域に変数を出力することは、関数に引数を渡すことではない。

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint & pos_buy,uint & pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

関数の入力で変数名の前に&をつければ、すべての問題は解決する。

 
Alexey Viktorov #:

グローバル・スコープに変数を出力することは、関数に引数を渡すことではない...

関数の入力で変数名の前に&をつければ、すべての問題は解決する。

こんにちは、アレクセイ!ありがとうございます 私の頭はすべて壊れていました!脳みそだけでは足りないことがわかったよ!!!!))

ありがとう、ウラジーミル。

 
Alexey Viktorov #:
関数の入力で変数名の前に&をつければ、すべての問題は解決する

リファレンスを使った関数についてのビデオを 見つけたので見た。このビデオレッスンを見て、私は単なる初心者向けのMQL5レッスンではなく特にバカな才能を持った初心者向けのMQL5 レッスンが必要だと気づいた。要するに、私は何も理解していなかったのだ。一般的には、受け取った情報をすべて消化し、このビデオを5回でも6回でも見直す必要がある。でも、暇なときにやることはあるだろう!))

ありがとう、ウラジミール。

 
MrBrooklin #:

リンクのある関数についてのビデオを見つけて見た。このビデオレッスンから、私は単なる初心者 向けの MQL5 レッスンではなく、特にバカの才能に恵まれた初心者向けのMQL5 レッスンが必要だと気づいた。要するに、私は何も理解していなかったのだ。一般的には、受け取った情報をすべて消化し、このビデオを5回も6回も見直す必要がある。でも、暇なときにやることはあるだろう!))

ありがとう、ウラジミール。

たとえ使うところがなくても、時間を無駄にしてはいけない。先生」の名前が物語っている。ディレッタントはディレッタントだ。

このビデオは3分間しか役に立たない。そして残りは気が散るだけで、有益な情報を失ってしまう。

ドキュメントを 注意深く読み、例を使って実験した方がいい。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Передача параметров - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

時間を無駄にするな、たとえ無駄な場所がなくても。先生」の名前だけでわかる、素人は素人。

このビデオに有益な情報は3分しかない。あとは気が散るだけで、有益な情報を失ってしまう。

ドキュメントを 注意深く読み、例題で実験した方がいい。そうすればすべてを理解できるだろう。

アレクセイ、ありがとう。ビデオレッスンの方が有益で役に立つと思ったが、まったく逆だった。MQL5リファレンスマニュアルのパラメータ送信の セクションも同じように読みましたが、「本を見ると図が見える!」という有名なことわざのようになってしまいました。何も理解できなかった。要するに、もちろん、もう何回か読み直して実験してみるつもりだ。))

ありがとう、ウラジミール。

 

ビデオ・チュートリアルを見たり、MQL5リファレンス・マニュアルで参照渡しの引数について 読んだりした結果、だいたい理解できたように思います。しかし、リファレンス・マニュアルで紹介されているコードを分析したところ、ある断片がまだ当惑を引き起こしていました:

//+------------------------------------------------------------------+
//| передача параметров по ссылке                                    |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---.
   int a=14,b=8;
   Print("a и b перед вызовом:",a," ",b);
   double d= SecondMethod(a,b);
   Print("a и b после вызова:",a," ",b);
  }
//+------------------------------------------------------------------+
//--- результат выполнения скрипта
//  a и b перед вызовом: 14 8
//  a и b после вызова: 28 4

この点に関して、MQL5プログラミングの専門家に質問があります。なぜOnStart()のd 変数にSecondMethod(a,b ) 関数を「押し込んだ」のでしょうか?スクリプトを正しく動作させるための前提条件なのでしょうか、それとも私がまた何か誤解しているのでしょうか?

語句, ウラジミール.

 

助けてください。

時刻を持つ多くの配列があり、これらの配列のいくつかの要素の時刻が一致することがあります。

私は、時間の値を繰り返すことなく、それらを1つの配列に収集する必要があります。

私はこのようにしました:

struct str1
  {
   int               time[];// в массиве порядка 10 тыс элементов
  };

struct str2
  {
   str1              arr[];// в массиве порядка 1 тыс элементов
  };

str2 m_name[]; // в массиве порядка 100 элементов

int ArrFull[]; // массив в который нужно собрать отсортированное время без повторений
//+------------------------------------------------------------------+
void OnStart()
  {
// считаем что m_name[] ранее уже заполнили


   int tempArr[];// объявляю дополнительный массив

   int size1 = ArraySize(m_name);
   for(int i = 0; i < size1; i++)
     {
      int size2 = ArraySize(m_name[i].arr);
      for(int j = 0; j < size2; j++)
        {
         // копирую в дополнительный массив все массивы времени из структур
         ArrayInsert(tempArr, m_name[i].arr[j].time, ArraySize(tempArr));
        }
     }
// сортирую дополнительный массив
   ArraySort(tempArr);

   int size = ArraySize(tempArr);
   ArrayResize(ArrFull, size);
   ArrFull[0] = tempArr[0];
   int j = 1;

// копирую не повторяющиеся элементы из дополнительного массива в массив с которым в дальнейшем буду работать
   for(int i = 1; i < size; i++)
      if(ArrFull[j - 1] != tempArr[i])
        {
         ArrFull[j] = tempArr[i];
         j++;
        }

   size = ArrayResize(ArrFull, j);

// дальше продолжение. много много букв
  }
//+------------------------------------------------------------------+


しかし、とても遅いコードになってしまった。もっと速くする必要がある。どうすればいい?

 
MrBrooklin 参照渡しの引数について 読んだりした結果、だいたい理解できたように思います。しかし、リファレンス・マニュアルで紹介されているコードを分析したところ、ある断片がまだ混乱を引き起こしていた:

この点に関して、MQL5プログラミングの専門家に質問があります。なぜOnStart()のd 変数にSecondMethod(a,b ) 関数を「押し込んだ」のでしょうか?スクリプトを正しく動作させるための前提条件なのでしょうか?

ヴラジミール。

The d variable is assigned the result of the function execution
 
Artyom Trishkin #:
変数dには、関数の実行結果が代入されます。

Artyomさん、ご回答ありがとうございます!代入 なしで 関数SecondMethod(a,b)だけを 使用する ことは不可能 ですか?

よろしくお願いします。

 
MrBrooklin #:

Artyomさん、回答ありがとうございます!代入 せずに SecondMethod(a,b) という関数だけを使う ことはできないのでしょうか?

ウラジミールさん、よろしくお願いします。

はい、可能です。その場合、参照渡しされた変数にのみ2つの値が返されます。つまり、この関数は3つの値を返します。
理由: