OOP vs prosedürel programlama - sayfa 33

 
Andrei :

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); };
   virtual void ~CTradeProcessorI() {};
   
   // Настроечный интерфейс
   virtual void SetSlippage( uint uiSlippage) = 0 ;
   
   // Торговый интерфейс
   // Все функции возвращают код возврата торгового сервера
   virtual int Buy( long & lTicket,ECurrencySymbol csSymbol, double dVolume, double dTP= 0 , double dSL= 0 , ulong ulMagic = 0 , string strComment = NULL ) = 0 ;               // Всегда по цене Ask, если успешно - возвращается lTicket
   virtual int Sell( long & lTicket,ECurrencySymbol csSymbol, double dVolume, double dTP= 0 , double dSL= 0 , ulong ulMagic = 0 , string strComment = NULL ) = 0 ;               // Всегда по цене Bid, если успешно - возвращается lTicket  

   virtual int ModifyTPSL(CTradePosComponentI* ptpcComponent, double dTP= 0 , double dSL= 0 ) = 0 ;       
   virtual int ModifyTPSL( long lTPCTicket, double dTP= 0 , double dSL= 0 ) = 0 ;       

   virtual int CloseTradeComponent(CTradePosComponentI* ptpcComponent, double dCloseVolume= EMPTY_VALUE ) = 0 ;               // dCloseVolume - закрываемый объем. Если равен EMPTY_VALUE или равен или больше, чем объем торговой компоненты с указанным тикетом - закрывается вся торговая компонента.   
   virtual int CloseTradeComponent( long lTPCTicket, double dCloseVolume= EMPTY_VALUE ) = 0 ;               // dCloseVolume - закрываемый объем. Если равен EMPTY_VALUE или равен или больше, чем объем торговой компоненты с указанным тикетом - закрывается вся торговая компонента.   
   
   virtual int 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 ; // если успешно - возвращается lTicket
   virtual int PendingDelete( long lTicket) = 0 ; 
   virtual int PendingDelete(COrderInfoCore* poiOrder) = 0 ; 
   
   virtual int PendingModify( long lTicket, double dSetPrice, double dTP= 0 , double dSL= 0 ) = 0 ;       
   virtual int PendingModify(COrderInfoCore* poiOrder, double dSetPrice, double dTP= 0 , double dSL= 0 ) = 0 ;       
   
   // Проверка кода возврата
   virtual bool TradeOperationWasSuccessful( int iTradeResCode) = 0 ;
   
   // Если функция возвращает true, то при возникновении пользовательских ошибок (iTradeResCode > ERR_USER_ERROR_FIRST) советник прекратит работу
   // В случае false - работа будет продолжена
   virtual bool 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.

Bunların hepsi OOP'nin özellikleridir.

 
George Merts :

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ı?

 
Andrei :
Teorinize göre, MQL4=MQL5 ise, MQL4, MT5'te başlatılabilir ve bunun tersi de geçerlidir.
Kodum MT4 ve MT5'te tamamen değişmeden çalışıyor.
 
Andrei :

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:

 // С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() {};
 
   // Функции отложенных ордеров, которые используют платформоспецифические  
   virtual int PendingDelete(COrderInfoCore* poiOrder);
   virtual int 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.

 
George Merts :

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?
 
George Merts :
Kodum MT4 ve MT5'te tamamen değişmeden çalışıyor.

Ve neden farklı terminallerde çalıştırın?

 
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?
 

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.

 
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 .. .