초보자의 질문 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(무효)

구조의 요소에 값을 계산하고 할당합니다. 구조 외부에서 메서드의 본문을 정의합니다. 이를 위해 컨텍스트 확인 연산자(::)를 사용합니다.

OnTick()에서 우리는 함수를 호출합니다:

무효 OnTick() { //--- STRUCT_POSITION .GetCurrentPositionProperty(); }

그리고 오류가 발생합니다.

'.' - 예상 이름 eSower_and_Gather_5.mq5 69 19
내가 이해하지 못하는 nakosyacheno는 pliz를 도와주세요.

 
Sergey Voytsekhovsky :

'.' - 예상 이름 eSower_and_Gather_5.mq5 69 19

6919행은 무엇입니까? 우편번호 69번 줄에 19번 위치를 표시하십시오. 오류가 어디에 있는지 즉시 알 수 있습니다.

 
Vladimir Karputov :

6919행은 무엇입니까? 우편번호 69번 줄에 19번 위치를 표시하십시오. 오류가 어디에 있는지 즉시 알 수 있습니다.

 STRUCT_POSITION.GetCurrentPositionProperty() ;

위 포스팅에서 빨간색으로 강조표시한 부분입니다. 귀하의 신속한 응답에 감사드립니다.

 
Vladimir Karputov :

6919행은 무엇입니까? 우편번호 69번 줄에 19번 위치를 표시하십시오. 오류가 어디에 있는지 즉시 알 수 있습니다.

이것이 함수에 접근을 허용해야 하는 지점이고, 차례로 구조체의 컨텍스트를 사용하는 것입니다.이것은 교과서에서 이해한 것입니다. 하지만 작동하지 않는 이유를 알 수 없습니다.

 
Sergey Voytsekhovsky :

위 포스팅에서 빨간색으로 강조표시한 부분입니다. 귀하의 신속한 응답에 감사드립니다.

'STRUCT_POSITION'은(는) 데이터 유형 입니다. 이 유형의 변수를 생성한 다음 VARIABLE.GetCurrentPositionProperty()를 호출해야 합니다.

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

이것이 함수에 접근을 허용해야 하는 지점이고, 차례로 구조체의 컨텍스트를 사용하는 것입니다.이것은 교과서에서 이해한 것입니다. 하지만 작동하지 않는 이유를 알 수 없습니다.

코드: ( 함수 는 단순히 호출됩니다 - 구조의 메소드가 아니라 어드바이저의 함수 - 이 방법이 더 명확합니다)

 //+------------------------------------------------------------------+
//|                                                      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'은(는) 데이터 유형 입니다. 이 유형의 개체를 만든 다음 OBJECT.GetCurrentPositionProperty()를 호출해야 합니다.

시험을 마친. 이러한 객체가 생성되고 구조체 선언 직후에 선언됩니다.

StrPositionArray[]

OnTik에 등록하면

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

오류가 발생합니다.

']' - 표현식이 필요함 eSower_and_Gather_5.mq5 69 21

같은 줄, 두 번째 괄호, 마침표 바로 앞에 있는 것입니다.
 
Vladimir Karputov :

코드: ( 함수 는 단순히 호출됩니다 - 구조의 메소드가 아니라 어드바이저의 함수 - 이 방법이 더 명확합니다)

즉, ::를 사용하는 것이 공허한 생각이었습니까?

그렇다면 왜 함수를 작성합니까?

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용이었고, 거기에 기능으로 제시되었습니다. 다음은 텍스트에서 발췌한 것입니다.

하나
2
4
5
6
7
여덟
아홉
열하나
12
구조체 상태
{
int 구매 횟수; // 구매 주문 수
int 판매 횟수; // 판매 주문 수
이중 buy_bottom_price; // 가장 낮은 구매 주문의 오픈 가격
이중 Sell_top_price; // 최고가 매도 주문의 시가
이중 이익; // 모든 주문의 이익
// 계정 상태에 대한 정보를 수집하는 메소드
// 및 업데이트 구조 요소
무효 새로고침();
} 상태;

구조에는 방법이 있습니다.   Refresh() , 값을 계산하고 구조 멤버에 할당합니다. 구조체 외부에서 메서드의 본문을 정의해 보겠습니다. 이를 위해 컨텍스트 확인 연산자 (::)를 사용합니다. 컨텍스트는 구조의 설명자(이름)입니다.

하나
2
4
5
6
7
여덟
아홉
열하나
12
열셋
십사
열 다섯
열여섯
17
십팔
십구
20
21
22
23
24
25
26
27
28
29
서른
31
//+----------------------------------------------- --------------------+
//| 메소드는 계정의 현재 상태에 대한 정보를 수집합니다. |
//| 구조의 해당 필드를 업데이트합니다. |
//+----------------------------------------------- --------------------+
무효 상태::새로 고침( 무효)
{
// 구조체의 숫자 필드 재설정
제로메모리(이);
(int i=OrdersTotal()-1; i>=0; i--)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol()==_Symbol && OrderMagicNumber()==매직)
{
이중 OpenPrice=OrderOpenPrice();
이익+=OrderProfit()+OrderCommission()+OrderSwap();
스위치(주문 유형())
{
케이스 OP_BUY:
구매 횟수++;
if (OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=오픈 프라이스;
부서지다 ;
케이스 OP_SELL:
Sell_count++;
if (OpenPrice>sell_top_price || Sell_top_price==0)
Sell_top_price=오픈 프라이스;
부서지다 ;
}
}
}

메서드 본문에서 컨텍스트 확인 작업을 사용했기 때문에 점을 사용하지 않고 구조의 멤버에 액세스하고 있습니다. 메소드 본문의 맨 처음에 업데이트하기 전의 숫자 필드는 함수에 의해 재설정됩니다.   제로메모리()   키워드로   this , 구조체는 자신에 대한 참조를 전달합니다.

핸들러 내부의 어드바이저 메인 코드   온틱()   이제 다음과 같이 보일 것입니다.

하나
2
4
5
6
7
여덟
아홉
열하나
12
열셋
십사
열 다섯
열여섯
17
십팔
십구
20
21
22
23
24
25
26
27
28
29
서른
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
오십
51
52
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick()
{
for (int i=0; i<2000; i++)
{
이중 b=MathSqrt(i);
}
// 새로운 주문을 열고 새로운 바가 열릴 때만 이익을 얻습니다.
if (IsNewBar())
{
// 새로운 시그널을 얻는다
intSignal=GetSignal();
// 닫힌 막대에 신호가 생성되지 않으면 즉시 함수를 종료합니다.
if(신호<0)
반품;
// 업데이트 구조
StateRefresh(); // (!!!)
사유: