Bunun için MQL4'te OOP ile programlayamazsınız, bu yüzden hala daha popüler.
Kodumu zaten gösterdim ve tekrar göstereceğim:
class CTradeProcessorI : public CMyObject
{
public :
void CTradeProcessorI() { SetMyObjectType(MOT_TRADE_PROCESSOR_I); };
virtualvoid ~CTradeProcessorI() {};
// Настроечный интерфейсvirtualvoid SetSlippage( uint uiSlippage) = 0 ;
// Торговый интерфейс// Все функции возвращают код возврата торгового сервераvirtualint Buy( long & lTicket,ECurrencySymbol csSymbol, double dVolume, double dTP= 0 , double dSL= 0 , ulong ulMagic = 0 , string strComment = NULL ) = 0 ; // Всегда по цене Ask, если успешно - возвращается lTicketvirtualint Sell( long & lTicket,ECurrencySymbol csSymbol, double dVolume, double dTP= 0 , double dSL= 0 , ulong ulMagic = 0 , string strComment = NULL ) = 0 ; // Всегда по цене Bid, если успешно - возвращается lTicket virtualint ModifyTPSL(CTradePosComponentI* ptpcComponent, double dTP= 0 , double dSL= 0 ) = 0 ;
virtualint ModifyTPSL( long lTPCTicket, double dTP= 0 , double dSL= 0 ) = 0 ;
virtualint CloseTradeComponent(CTradePosComponentI* ptpcComponent, double dCloseVolume= EMPTY_VALUE ) = 0 ; // dCloseVolume - закрываемый объем. Если равен EMPTY_VALUE или равен или больше, чем объем торговой компоненты с указанным тикетом - закрывается вся торговая компонента. virtualint CloseTradeComponent( long lTPCTicket, double dCloseVolume= EMPTY_VALUE ) = 0 ; // dCloseVolume - закрываемый объем. Если равен EMPTY_VALUE или равен или больше, чем объем торговой компоненты с указанным тикетом - закрывается вся торговая компонента. virtualint PendingSet( long & lTicket,ECurrencySymbol csSymbol, ENUM_ORDER_TYPE otOrderType, double dSetPrice, double dVolume, double dTP= 0 , double dSL= 0 , ulong ulMagic = 0 , string strComment = NULL ) = 0 ; // если успешно - возвращается lTicketvirtualint PendingDelete( long lTicket) = 0 ;
virtualint PendingDelete(COrderInfoCore* poiOrder) = 0 ;
virtualint PendingModify( long lTicket, double dSetPrice, double dTP= 0 , double dSL= 0 ) = 0 ;
virtualint PendingModify(COrderInfoCore* poiOrder, double dSetPrice, double dTP= 0 , double dSL= 0 ) = 0 ;
// Проверка кода возвратаvirtualbool TradeOperationWasSuccessful( int iTradeResCode) = 0 ;
// Если функция возвращает true, то при возникновении пользовательских ошибок (iTradeResCode > ERR_USER_ERROR_FIRST) советник прекратит работу// В случае false - работа будет продолженаvirtualbool IsUserErrorsFalal() = 0 ;
};
Bu işlem işlemcisi arayüzüdür - hem MT4 hem de MT5 için tamamen aynıdır.
Kullanıcı sadece bu arayüzü alır - ve alım satım işlemleri için tüm olanaklara sahiptir. Nerede olduğunu bilmesine bile gerek yok - MT4 veya MT5'te. Bir satın alma yapmanız gerekiyor - Satın Alma işlevini arayın. sizin için açık bir ticaret bileşeninin biletini dolduracak (MT4 için bu bir emirdir, MT5 için bir pozisyondur) ve ticaret sunucusunun dönüş kodunu döndürür.
MT4 ve MT5 protokolleri arasındaki farkı düşünmenize bile gerek yok - arayüz ihtiyacınız olan her şeyi sağlar.
Bu işlem işlemcisi arayüzüdür - hem MT4 hem de MT5 için tamamen aynıdır.
Kullanıcı sadece bu arayüzü alır - ve alım satım işlemleri için tüm olanaklara sahiptir. Kesinlikle nerede olduğunu bilmesine bile gerek yok - MT4 veya MT5'te.
Diyelim ki, TP-SL'yi ticaret işlemcisine değiştirme isteği gönderen işlevim:
EEAWorkRetcode CChngTPSLRequest::_ProceedRequestInto(CTradeProcessorI* ptpProcessor)
{
ASSERT_MYPOINTER(ptpProcessor);
m_uiServerRetCode = ptpProcessor.ModifyTPSL(m_lComponentTicket,m_dTP,m_dSL);
if (ptpProcessor.TradeOperationWasSuccessful(m_uiServerRetCode) != true )
{
Print ( "Торговый запрос на изменение ТП-СЛ компоненты отработал с ошибкой, код возврата: " ,m_uiServerRetCode);
TRACE_INTEGER( "Торговый запрос на изменение ТП-СЛ компоненты отработал с ошибкой, код возврата: " ,m_uiServerRetCode);
return (WR_SERVER_PROCEED_ERROR);
};
return (WR_SUCCEEDED);
};
İlk olarak, Uzman Danışmanın nesneleri-bölümleri, ticaret işlemleri için talepler oluşturur (işte bu taleplerden biri - TP-SL'yi değiştirmek için). Bundan sonra, işlem işlemcisine işlem eylemi hakkında bilgi göndermek için tüm istekler için ProceedRequestInto()işlevi çağrılır .
Ticaret işlemcisinin kendisi aşağıdaki sınıfın bir nesnesidir:
// СTradeProcessor - переносимый класс торгового процессора// Именно этот класс необходимо использовать для торговли. // Класс реализует интерфейс CTradeProcessorI#ifdef __MQL5__#include <MyLib\Trade\MT5TradeProcessor.mq5>
#else // __MQL5__#include <MyLib\Trade\MT4TradeProcessor.mq5>
#endif //__MQL5__#ifdef __MQL5__class CTradeProcessor : public CMT5TradeProcessor
#else // __MQL5__class CTradeProcessor : public CMT4TradeProcessor
#endif //__MQL5__
{
public :
void CTradeProcessor( uint uiSlippage = DEFAULT_TRADE_POINT_SLIPPAGE);
void ~CTradeProcessor() {};
// Функции отложенных ордеров, которые используют платформоспецифические virtualint PendingDelete(COrderInfoCore* poiOrder);
virtualint PendingModify(COrderInfoCore* poiOrder, double dSetPrice, double dTP= 0 , double dSL= 0 );
};
Yani, platforma bağlı olarak CTradeProcessor sınıfı ya CMT5TradeProcessor sınıfından ya da CMT4TradeProceccor sınıfından miras alınır.
Bütün bunlar, elbette, OOP olmadan yapılabilir - anahtarlar ve ifdef'lerin yardımıyla. Ancak bence OOP yaklaşımı çok daha uygun ve net. Ve en önemlisi - varlıkları birbirinden ayırmanıza ve küresel değişkenler yığınından kurtulmanıza izin verir.
Bu arada, bir "OOP yankısı" daha - sadece mevduatlarla çalışmanın ek işlevlerinde. İşlem işlemcisi - uygun olmayan gecikme biletleriyle çalışır - MT4 ve MT5'teki biletlere erişim farklıdır. Bu nedenle, sipariş arayüzünün halefi olan ortak bir COrderInfoCore sınıfı vardır. Bu nesneye bir işaretçiyi işlemciye iletmek çok daha uygundur. Buna göre, aynı şekilde - platforma bağlı yerleri atlıyoruz.
Diyelim ki, TP-SL'yi ticaret işlemcisine değiştirme isteği gönderen işlevim:
İlk olarak, Uzman Danışmanın nesneleri-bölümleri, ticaret işlemleri için talepler oluşturur (işte bu taleplerden biri - TP-SL'yi değiştirmek için). Bundan sonra, işlem işlemcisine işlem eylemi hakkında bilgi göndermek için tüm istekler için ProceedRequestInto()işlevi çağrılır .
Aslında içeride neler olduğunu anlamak bana çok karmaşık geliyor... Ve işin özünü anlamadan, kimsenin kullanmaması pek olası değil... MT5 ve MT5 için ayrı bir versiyon yazmak daha kolay değil mi? gerektiğinde bağla?
Andrei : Aslında içeride neler olduğunu anlamak bana çok karmaşık geliyor... Ve işin özünü anlamadan, birinin onu kullanması pek olası değil... MT5 ve MT5 için ayrı bir versiyon yazmak daha kolay değil mi? gerektiğinde bağla?
Neden "gerçekten içeride neler olduğunu anlamak"? Platformdan bağımsız olarak bir eylem gerçekleştiren sabit bir arayüz var - ve onu kullanıyoruz. Ve düşük seviyede ne var - fark nedir?
Ancak bence OOP yaklaşımı çok daha uygun ve net. Ve en önemlisi - varlıkları birbirinden ayırmanıza ve küresel değişkenler yığınından kurtulmanıza izin verir.
Mesele şu ki, her şeyi her şeyden izole ederek, gerekli tüm değişkenlerin mevcut değerlerini bilmeniz gerektiğinde, kodun yeterli hata ayıklamasının imkansızlığından bahsetmiyorum bile, bu tür kodlarla başa çıkmak çok daha zor olacaktır. ..
Ve sonra, ana hesabım MT4'te açık ve MT5'teki strateji test cihazı çok daha iyi.
Evet ve Freelance'da, söylentilere göre, müşterilerin çok sık bir gereksinimi - "hem MT4 hem de MT5 üzerinde çalışmak" - yani bu bir tesadüf değil. Kendim Freelance çalışmak için bir neden göremiyorum, ancak orada çalışanlara müşterilerin neden çapraz platforma ihtiyaç duyduğunu sorabilirsiniz.
George Merts : Neden "gerçekten içeride neler olduğunu anlamak"? Platformdan bağımsız olarak bir eylem gerçekleştiren sabit bir arayüz var - ve onu kullanıyoruz. Ve düşük seviyede ne var - fark nedir?
Düşük seviyeden değil, zamanın mümkün olan her anında neyin nereye aktığının ve neye dönüştüğü mantığından bahsediyoruz, tüm içsel değişkenlerin bilgisi de dahil... Bütün bu gereksiz mantığı anlamadan, kullanmanın anlamı yazar olmayanlar için bu kod tamamen kaybolur .. .
Bunun için MQL4'te OOP ile programlayamazsınız, bu yüzden hala daha popüler.
Kodumu zaten gösterdim ve tekrar göstereceğim:
Bu işlem işlemcisi arayüzüdür - hem MT4 hem de MT5 için tamamen aynıdır.
Kullanıcı sadece bu arayüzü alır - ve alım satım işlemleri için tüm olanaklara sahiptir. Nerede olduğunu bilmesine bile gerek yok - MT4 veya MT5'te. Bir satın alma yapmanız gerekiyor - Satın Alma işlevini arayın. sizin için açık bir ticaret bileşeninin biletini dolduracak (MT4 için bu bir emirdir, MT5 için bir pozisyondur) ve ticaret sunucusunun dönüş kodunu döndürür.
MT4 ve MT5 protokolleri arasındaki farkı düşünmenize bile gerek yok - arayüz ihtiyacınız olan her şeyi sağlar.
Bunların hepsi OOP'nin özellikleridir.
Kodumu zaten gösterdim ve tekrar göstereceğim:
Bu işlem işlemcisi arayüzüdür - hem MT4 hem de MT5 için tamamen aynıdır.
Kullanıcı sadece bu arayüzü alır - ve alım satım işlemleri için tüm olanaklara sahiptir. Kesinlikle nerede olduğunu bilmesine bile gerek yok - MT4 veya MT5'te.
Ve hepsi OOP sayesinde.
Tipik durumlar için kullanım örnekleri var mı?
Teorinize göre, MQL4=MQL5 ise, MQL4, MT5'te başlatılabilir ve bunun tersi de geçerlidir.
Tipik durumlar için kullanım örnekleri var mı?
Diyelim ki, TP-SL'yi ticaret işlemcisine değiştirme isteği gönderen işlevim:
EEAWorkRetcode CChngTPSLRequest::_ProceedRequestInto(CTradeProcessorI* ptpProcessor) { ASSERT_MYPOINTER(ptpProcessor); m_uiServerRetCode = ptpProcessor.ModifyTPSL(m_lComponentTicket,m_dTP,m_dSL); if (ptpProcessor.TradeOperationWasSuccessful(m_uiServerRetCode) != true ) { Print ( "Торговый запрос на изменение ТП-СЛ компоненты отработал с ошибкой, код возврата: " ,m_uiServerRetCode); TRACE_INTEGER( "Торговый запрос на изменение ТП-СЛ компоненты отработал с ошибкой, код возврата: " ,m_uiServerRetCode); return (WR_SERVER_PROCEED_ERROR); }; return (WR_SUCCEEDED); };İlk olarak, Uzman Danışmanın nesneleri-bölümleri, ticaret işlemleri için talepler oluşturur (işte bu taleplerden biri - TP-SL'yi değiştirmek için). Bundan sonra, işlem işlemcisine işlem eylemi hakkında bilgi göndermek için tüm istekler için ProceedRequestInto()işlevi çağrılır .
Ticaret işlemcisinin kendisi aşağıdaki sınıfın bir nesnesidir:
Yani, platforma bağlı olarak CTradeProcessor sınıfı ya CMT5TradeProcessor sınıfından ya da CMT4TradeProceccor sınıfından miras alınır.
Bütün bunlar, elbette, OOP olmadan yapılabilir - anahtarlar ve ifdef'lerin yardımıyla. Ancak bence OOP yaklaşımı çok daha uygun ve net. Ve en önemlisi - varlıkları birbirinden ayırmanıza ve küresel değişkenler yığınından kurtulmanıza izin verir.
Bu arada, bir "OOP yankısı" daha - sadece mevduatlarla çalışmanın ek işlevlerinde. İşlem işlemcisi - uygun olmayan gecikme biletleriyle çalışır - MT4 ve MT5'teki biletlere erişim farklıdır. Bu nedenle, sipariş arayüzünün halefi olan ortak bir COrderInfoCore sınıfı vardır. Bu nesneye bir işaretçiyi işlemciye iletmek çok daha uygundur. Buna göre, aynı şekilde - platforma bağlı yerleri atlıyoruz.
Diyelim ki, TP-SL'yi ticaret işlemcisine değiştirme isteği gönderen işlevim:
İlk olarak, Uzman Danışmanın nesneleri-bölümleri, ticaret işlemleri için talepler oluşturur (işte bu taleplerden biri - TP-SL'yi değiştirmek için). Bundan sonra, işlem işlemcisine işlem eylemi hakkında bilgi göndermek için tüm istekler için ProceedRequestInto()işlevi çağrılır .
Kodum MT4 ve MT5'te tamamen değişmeden çalışıyor.
Ve neden farklı terminallerde çalıştırın?
Aslında içeride neler olduğunu anlamak bana çok karmaşık geliyor... Ve işin özünü anlamadan, birinin onu kullanması pek olası değil... MT5 ve MT5 için ayrı bir versiyon yazmak daha kolay değil mi? gerektiğinde bağla?
George Merts :
Ancak bence OOP yaklaşımı çok daha uygun ve net. Ve en önemlisi - varlıkları birbirinden ayırmanıza ve küresel değişkenler yığınından kurtulmanıza izin verir.
Mesele şu ki, her şeyi her şeyden izole ederek, gerekli tüm değişkenlerin mevcut değerlerini bilmeniz gerektiğinde, kodun yeterli hata ayıklamasının imkansızlığından bahsetmiyorum bile, bu tür kodlarla başa çıkmak çok daha zor olacaktır. ..
Ve neden farklı terminallerde çalıştırın?
Ve sonra, ana hesabım MT4'te açık ve MT5'teki strateji test cihazı çok daha iyi.
Evet ve Freelance'da, söylentilere göre, müşterilerin çok sık bir gereksinimi - "hem MT4 hem de MT5 üzerinde çalışmak" - yani bu bir tesadüf değil. Kendim Freelance çalışmak için bir neden göremiyorum, ancak orada çalışanlara müşterilerin neden çapraz platforma ihtiyaç duyduğunu sorabilirsiniz.
Neden "gerçekten içeride neler olduğunu anlamak"? Platformdan bağımsız olarak bir eylem gerçekleştiren sabit bir arayüz var - ve onu kullanıyoruz. Ve düşük seviyede ne var - fark nedir?