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 |//+------------------------------------------------------------------+structSTRUCT_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; // комментарийvoidGetCurrentPositionProperty() ;
};
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//---//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
//---STRUCT_POSITION.GetCurrentPositionProperty() ;
}
//+------------------------------------------------------------------+//---Заполнение массива свойств позиций +//+------------------------------------------------------------------+voidSTRUCT_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 (::).
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.
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
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 |//+------------------------------------------------------------------+intOnInit ()
{
//---//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
//---
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(); // своп
}
}
}
//+------------------------------------------------------------------+
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 ???
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)
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ı):
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:
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.
'.' - 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.
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.
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.
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();
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)
'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
bir hata alıyoruz:
']' - İfade bekleniyor eSower_and_Gather_5.mq5 69 21
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
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 ???
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)
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ı:
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ı):
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: