Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1264

 
Tünaydın. " Program geliştirmenin verimliliğini artırmak için yapıları kullanma " dersine dayanmaktadır.   yapının içindeki işlevin kullanımından ilham aldı ve MT5'te çok basit bir yapı yarattı.
 #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();                     // своп
            }
      } 
} 
//+------------------------------------------------------------------+

yapı olarak

STRUCT_POSITION

mevcut yöntem  

GetCurrentPositionProperty(void)

bir yapının elemanlarına değerleri hesaplar ve atar. Yöntemin gövdesini yapının dışında tanımlarız. Bunu yapmak için bağlam çözümleme operatörünü kullanırız (::).

OnTick()'te şu işlevi çağırırız:

geçersiz OnTick() { //--- STRUCT_POSITION .GetCurrentPositionProperty(); }

Ve bir hata alıyoruz:

'.' - beklenen ad eSower_and_Gather_5.mq5 69 19
Nakosyacheno'yu anlamadığım yerde, pliz'e yardım et.

 
Sergey Voytsekhovsky :

'.' - beklenen ad eSower_and_Gather_5.mq5 69 19

69 19 satırı nedir? 69 numaralı satırı kodlayın ve 19 numaralı konumun nerede olduğunu belirtin. Hatanın nerede olduğu hemen anlaşılacaktır.

 
Vladimir Karputov :

69 19 satırı nedir? 69 numaralı satırı kodlayın ve 19 numaralı konumun nerede olduğunu belirtin. Hatanın nerede olduğu hemen anlaşılacaktır.

 STRUCT_POSITION.GetCurrentPositionProperty() ;

Yukarıdaki mesajda kırmızı ile vurgulanmıştır. Hemen yanıt verdiğiniz için teşekkür ederiz.

 
Vladimir Karputov :

69 19 satırı nedir? 69 numaralı satırı kodlayın ve 19 numaralı konumun nerede olduğunu belirtin. Hatanın nerede olduğu hemen anlaşılacaktır.

Fonksiyona erişim sağlaması gereken nokta bu, sırayla struct bağlamını kullanır, ders kitaplarından anladığım buydu. Ama neden işe yaramadığını anlayamıyorum.

 
Sergey Voytsekhovsky :

Yukarıdaki mesajda kırmızı ile vurgulanmıştır. Hemen yanıt verdiğiniz için teşekkür ederiz.

'STRUCT_POSITION' bir VERİ TÜRÜ'dür. Bu tipte bir değişken oluşturmanız ve ardından VARIABLE.GetCurrentPositionProperty();

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

Fonksiyona erişim sağlaması gereken nokta bu, sırayla struct bağlamını kullanır, ders kitaplarından anladığım buydu. Ama neden işe yaramadığını anlayamıyorum.

Kod: ( işlev basitçe çağrılır - yapının yöntemi değil, danışmanın işlevi - bu şekilde daha açıktır)

 //+------------------------------------------------------------------+
//|                                                      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' bir VERİ TÜRÜ'dür. Bu türde bir nesne oluşturmanız ve ardından OBJECT.GetCurrentPositionProperty();

Sınanmış. Böyle bir nesne oluşturulur, yapının bildirilmesinden hemen sonra ilan edilir.

StrPositionArray[]

OnTik'e kaydolursanız

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

bir hata alıyoruz:

']' - İfade bekleniyor eSower_and_Gather_5.mq5 69 21

aynı satır, sadece ikinci parantez, noktadan hemen önceki.
 
Vladimir Karputov :

Kod: (işlev basitçe çağrılır - yapının yöntemi değil, danışmanın işlevi - bu şekilde daha açıktır)

Yani :: kullanmak boş bir fikir miydi?

O zaman neden bir fonksiyon yaz

GetCurrentPositionProperty()

iç yapı??? Sonuçta, yapının içinde reçete yazmadan bile, onu mükemmel bir şekilde dolduracaktır. Lütfen açıklığa kavuşturun, bir şey genellikle karıştı, belki de bu, unutmanız gereken eski bir özelliktir ???

 
Sergey Voytsekhovsky :

Yani, :: kullanmak boş bir fikir miydi?

O zaman neden bir fonksiyon yaz

iç yapı??? Sonuçta, yapının içinde reçete yazmadan bile, onu mükemmel bir şekilde dolduracaktır. Lütfen açıklığa kavuşturun, bir şey genellikle karıştı, belki de bu, unutmanız gereken eski bir özelliktir ???

Kopyala yapıştır. Kopyala yapıştırdan sonra bir satır vardı.

Böyle olması gerekiyor (yapının içinde herhangi bir yöntem yok)

 //+------------------------------------------------------------------+
//| 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 :

Kopyala yapıştır. Kopyala yapıştırdan sonra bir satır vardı.

Böyle olması gerekiyor (yapının içinde herhangi bir yöntem yok)

Şey, derse çok zaman harcadım. Doğru, MT4 içindi, orada bir özellik olarak sunuldu, işte metinden bir alıntı:

1
2
3
4
5
6
7
sekiz
dokuz
on
on bir
12
yapı durumu
{
int buy_count; // satın alma siparişi sayısı
int satış_sayısı; // satış emri sayısı
çift buy_bottom_price; // en düşük satın alma emrinin açık fiyatı
çift sell_top_price; // en yüksek satış emrinin açık fiyatı
çifte kar; // tüm siparişlerin karı
// hesabın durumu hakkında bilgi toplama yöntemi
// ve yapı elemanlarını güncelle
geçersiz Yenile();
} Belirtmek, bildirmek;

Yapının bir yöntemi var   Değerleri hesaplayan ve yapı üyelerine atayan Refresh() . Yöntemin gövdesini yapı dışında tanımlayalım. Bunu yapmakiçin bağlam çözümleme operatörünü kullanırız (::). Bağlam, bir yapının tanımlayıcısıdır (adı):

1
2
3
4
5
6
7
sekiz
dokuz
on
on bir
12
on üç
on dört
on beş
on altı
17
on sekiz
on dokuz
20
21
22
23
24
25
26
27
28
29
otuz
31
//+------------------------------------------- --------------------+
//| Yöntem, hesabın mevcut durumu hakkında bilgi toplar |
//| ve yapının ilgili alanlarını günceller |
//+------------------------------------------- --------------------+
geçersiz durum::Yenile(void)
{
// yapının sayısal alanlarını sıfırla
ZeroMemory( bu );
for (int i=OrdersTotal()-1; i>=0; i--)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
double OpenPrice=OrderOpenPrice();
kâr+=OrderProfit()+OrderCommission()+OrderSwap();
geçiş(SiparişTürü())
{
durum OP_BUY:
buy_count++;
if (OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=OpenPrice;
kırmak ;
OP_SELL durumu:
satış_sayımı++;
if (OpenPrice>sell_top_price || sell_top_price==0)
sell_top_price=OpenPrice;
kırmak ;
}
}
}

Metodun gövdesinde, bağlam çözümleme işlemini kullandığımız için yapının üyelerine nokta kullanmadan eriştiğimizi unutmayın. Yöntem gövdesinin en başında güncellemeden önce sayısal alanlar, işlev tarafından sıfırlanır.   SıfırBellek()   anahtar kelime ile   this , bu nedenle yapı kendisine bir başvuru iletir.

Danışmanın işleyici içindeki ana kodu   OnTick()   şimdi şöyle görünecek:

1
2
3
4
5
6
7
sekiz
dokuz
on
on bir
12
on üç
on dört
on beş
on altı
17
on sekiz
on dokuz
20
21
22
23
24
25
26
27
28
29
otuz
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
elli
51
52
//+------------------------------------------- --------------------+
//| Uzman onay işlevi |
//+------------------------------------------- --------------------+
geçersiz OnTick()
{
(int i=0; i<2000; i++) için
{
çift b=MathSqrt(i);
}
// yeni siparişler aç ve sadece yeni bir barın açılışında kar elde et
eğer (IsNewBar())
{
// yeni bir sinyal al
intSignal=GetSignal();
// kapalı çubukta sinyal oluşmadıysa fonksiyondan hemen çık
if(Sinyal<0)
dönüş;
// yapıyı güncelle
StateRefresh(); // (!!!)