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

 
こんにちは。 効果的なプログラム開発のための構造体の使用 」という 授業に 触発され、MT5でこのような簡単な構造 体を作りました。
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
   
   void               GetCurrentPositionProperty();
  };
  STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   STRUCT_POSITION.GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//---Заполнение массива свойств позиций                              +
//+------------------------------------------------------------------+
void STRUCT_POSITION::GetCurrentPositionProperty(void)
{   
   ZeroMemory(this);
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
      {
         if(m_position.SelectByIndex(i))
            {
               StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
               StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
               StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
               StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
               StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
               StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
               StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
               StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
               StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
               StrPositionArray[i].comission  = m_position.Commission();              // комиссия
               StrPositionArray[i].swap       = m_position.Swap();                    // своп
            }
      } 
} 
//+------------------------------------------------------------------+

構造上

struct_position

構造体にメソッドが 含まれる

GetCurrentPositionProperty(void)

を計算し、構造体の要素に値を割り当てるものである。構造体の外側にメソッド本体を定義する。そのためには、コンテキスト解決操作(::)を使用します。

OnTick()の中で、関数を呼び出します。

void OnTick() { //---STRUCT_POSITION.GetCurrentPositionProperty();}.

そして、ここでエラーが発生します。

'.'- name expected eSower_and_Gather_5.mq5 69 19
どこで間違ったのかわかりません、よろしく お願いします。

 
Sergey Voytsekhovsky:

'.'- 期待される名前 eSower_and_Gather_5.mq5 69 19

69 19行目とは?コードライン69を公開し、19の位置がどこなのかを明示してください。どこにエラーがあるのか、すぐに明らかになるはずです。

 
Vladimir Karputov:

69 19行目とは?ポストコードライン69で、19番目の位置がどこかを指定する。どこにエラーがあるのか、すぐに明らかになるはずです。

STRUCT_POSITION.GetCurrentPositionProperty();

上の投稿で赤くハイライトされています。早速のご返信ありがとうございました。

 
Vladimir Karputov:

69 19行目とは?ポストコードライン69で、19番目の位置がどこかを指定する。どこにエラーがあるのか、すぐに明らかになるはずです。

これは、関数にアクセスするためのポイントであり、その関数は構造体のコンテキストを使用します。しかし、なぜうまくいかないのかが理解できない。

 
Sergey Voytsekhovsky:

は、上の投稿で赤くハイライトされています。早速のご返信ありがとうございました。

STRUCT_POSITION' はDATA TYPE です。この型の変数を作成し、VARIABLE.GetCurrentPositionProperty()を呼び出す必要があります。

Документация по MQL5: Основы языка / Типы данных
Документация по MQL5: Основы языка / Типы данных
  • www.mql5.com
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
 
Sergey Voytsekhovsky:

これが、関数にアクセスするポイントであり、関数が構造の文脈を利用することになるのです。しかし、なぜうまくいかないのか、私には理解できない。

コード: (関数を呼び出すだけ です。構造体メソッドではなくEA関数です。その方が理にかなっています。)

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>
//---
CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий

   void               GetCurrentPositionProperty();
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//| Заполнение массива свойств позиций                               |
//+------------------------------------------------------------------+
void GetCurrentPositionProperty(void)
  {
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
     {
      if(m_position.SelectByIndex(i))
        {
         StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
         StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
         StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
         StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
         StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
         StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
         StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
         StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
         StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
         StrPositionArray[i].comission  = m_position.Commission();              // комиссия
         StrPositionArray[i].swap       = m_position.Swap();                    // своп
        }
     }
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

STRUCT_POSITION' はDATA TYPE で ある。このタイプのオブジェクトを作成し、OBJECT.GetCurrentPositionProperty()を呼び出す必要があります。

試してみました。の宣言の直後に宣言され、このようなオブジェクトが作成されます。

StrPositionArray[]。

OnTickに追加した場合

void OnTick()
  {
//---
   StrPositionArray[].GetCurrentPositionProperty();
  }

というエラーが発生します。

']'- 期待される表現 eSower_and_Gather_5.mq5 69 21

これは同じ行で、2つ目のブラケット、ドットの直前のブラケットだけです。
 
Vladimir Karputov:

コード: (関数を呼び出すだけ です。構造体メソッドではなくEA関数です。その方が理にかなっています。)

では、::を使うのは無駄な考えだったのでしょうか?

では、なぜ関数を書いたのか

GetCurrentPositionProperty()

構造体内部?中に詰め物をしなくても、構造物が埋まりますよね?私は混乱しています、多分これは時代遅れの機能で、私はそれを忘れるべきですか?

 
Sergey Voytsekhovsky:

では、::を使うのは無駄だったのでしょうか?

それならなぜ、関数

構造体内?というか、それがなくても構造体は完璧に埋まります。はっきりさせてください。混乱しています。もしかしたら、これは忘れ去られるべき時代遅れのアイデアかもしれません。

コピーペーストする。コピーペーストの後に一行が残っています。

このようになります(構造体の中にはメソッドはありません)。

//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 
Vladimir Karputov:

コピーペーストする。コピペの後に一行が残っています。

このようになります(構造体の中にはメソッドはありません)。

さて、これだけ時間をかけてレッスンしてきたのですから。MT4用ではありますが、そこでは仕掛けとして紹介されていましたので、本文を抜粋してご紹介します。

1
2
3
4
5
6
7
8
9
10
11
12
構造体状態
{
int buy_count; // 買い注文の数
int sell_count; // 売り注文の数
double buy_bottom_price; //最安値の買い注文の始値
double sell_top_price; //最高値の売り注文の始値
double profit; // すべての注文の利益
// アカウントの状態に関する情報を収集するためのメソッド
// そして、構造体の要素を更新する
void Refresh( )。
}状態です。

構造体は、Refresh()メソッドを 持ち、構造体の要素に値を計算し、代入する。構造体の外側にメソッド本体を定義してみましょう。そのために、コンテキスト解決操作(::)を利用する。コンテキストは、構造体の記述子(名前)である。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//+------------------------------------------------------------------+
//| メソッドは、アカウントの現在の状態に関する情報を収集します。
//| そして、構造体の関連するフィールドを更新します。
//+------------------------------------------------------------------+
void state::Refresh( void )
{
//構造体の数値フィールドをゼロにする
ZeroMemory( this );
for ( int i=OrdersTotal()-1; i>=0; i--)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
double OpenPrice=OrderOpenPrice()です。
profit+=OrderProfit()+OrderCommission()+OrderSwap()です。
switch (OrderType())
{
case OP_BUY:
buy_count++;
if (OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=OpenPrice。
を壊す。
case OP_SELL:
sell_count++;
if (OpenPrice>sell_top_price || sell_top_price==0)
sell_top_price=OpenPrice。
を壊す。
}
}
}

なお、メソッド本体では、コンテキスト解決操作を行ったので、ドットを使わずに構造体の要素を参照しています。数値フィールドは、メソッド本体の先頭で更新する前に、この キーワードでZeroMemory()によって ゼロにされるので、構造体は自分自身への参照を渡します。

OnTick() ハンドラ内のメインのEAコードは、次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//+------------------------------------------------------------------+
//| エキスパートティック機能|
//+------------------------------------------------------------------+
void OnTick()
{
for ( int i=0; i<2000; i++)
{
double b=MathSqrt(i);
}
// 新しいバーの開始時にのみ、新規注文と利益確定を行う。
if (IsNewBar())
{
// 新しいシグナルを取得する
int Signal=GetSignal()。
// クローズドバーでシグナルが発生しなかった場合、直ちに関数を終了します。
if (Signal<0)
を返す。
//構造体を更新する
State.Refresh(); // (!!! )