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

 
CTrade::PositionClose (const ulong bilet,const ulong sapma=ULONG_MAX) ile uğraşıyorum ve içeride pek organize olmadığını anlıyorum. Her şey 2 dönüş koduyla ilgili - bool ve ResultRetcode(). RetCode false döndürmeden önce dahili olarak her zaman sıfırlanmaz, bu nedenle PositionClose false olarak değerlendirilirse RetCode TRADE_RETCODE_DONE döndürebilir. Bu 2 dönüş değeri geliştiriciler tarafından nasıl senkronize edilecekti.
 
. ... Rick D. ... . :
CTrade::PositionClose(const ulong bilet,const ulong sapma=ULONG_MAX) ile uğraşıyorum ve içeride pek organize olmadığını anlıyorum. Her şey 2 dönüş koduyla ilgili - bool ve ResultRetcode(). RetCode false döndürmeden önce dahili olarak her zaman sıfırlanmaz, bu nedenle PositionClose false olarak değerlendirilirse RetCode TRADE_RETCODE_DONE döndürebilir. Bu 2 dönüş değeri geliştiriciler tarafından nasıl senkronize edilecekti.

Kod + örnek + günlükler.

 
Bir garip hata buldum. Belki sadece ben.

COorderInfo::OrderType() her zaman 0 döndürür.

Doğrulama için bekleyen herhangi bir siparişi manuel olarak verebilirsiniz (BuyStop, SellStop, ...),
sonra biletini komut dosyasına girin.
 #include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart ()
{
   ulong ticket = 250262937 ; //здесь ваш тикет
  
   if (!m_order.Select(ticket))
  {
     PrintFormat ( "COrderInfo::Select(#%I64u) failed" , ticket);
     return ;
  }
  
   PrintFormat ( "OrderType= %d" , m_order.Type());
}

Belki sanal işlevler tablosuyla ilgili bir şey? Hata ayıklamada yalnızca sanal int CObject::Type()'a giriyorum

not. Ben zaten kendim anladım. COorderInfo'nun 2 benzer yöntemi vardır: Type() ve OrderType().

 
Vladimir Karputov :

Kod + örnek + günlükler.

Bakın ne durumdayım.

 #include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart ()
{ 
   int LErr;
   bool bRC;
   double price;

   ResetLastError ();
  
  price = 0.0 ;
  bRC = m_trade.Buy( 0.1 , "EURUSD" , price, 0.0 , 0.0 );

  LErr = GetLastError ();

   PrintFormat ( "! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)" ,
    ticket,
    ( string )bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
   //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
   //---

   ulong ticket = 1 ; //Позиции с таким тикетом нет
  
   ResetLastError ();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError ();
  
   PrintFormat ( "! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)" ,
    ticket,
    ( string )bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
   //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

CTrade'de, her yeni işlemden önce bunları sıfırlamak için SetResultRetcode ve SetResultComment yöntemlerini görmüyorum.

Tek bir yöntemin eklendiği sınıfınızı miras almanız gerekir.


 class CTradeEx : public CTrade
{
public :
   void SetResult( MqlTradeResult & result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... . :

Bakın ne durumdayım.

CTrade'de, her yeni işlemden önce bunları sıfırlamak için SetResultRetcode ve SetResultComment yöntemlerini görmüyorum.

Ne için? Tamamen gereksiz özellikler.

Birincisi: Havaya ateş ediyorsunuz - ilk kontrol olmadan bir ticaret emri gönderin - operasyonun ne döndürdüğünü kontrol etmeden. Yardıma bakın: PositionClose bool türündedir.

İkincisi: pozisyon kapatma zincirine bakarız: pozisyon bulunamadığında (belirtilen bilet ile seçilemez), "false" döndürülür.

 //+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose( const ulong ticket, const ulong deviation)
  {
//--- check stopped
   if ( IsStopped ( __FUNCTION__ ))
       return ( false );
//--- check position existence
   if (! PositionSelectByTicket (ticket))
       return ( false );
   string symbol= PositionGetString ( POSITION_SYMBOL );
//--- clean

Aynı zamanda yapılar hiçbir yerde temizlenmiyor - çünkü bu anlamsız - sonuçta ondan önce bir konum seçmek mümkün değildi, bu nedenle yapılarda bilgi yok.

 
Vladimir Karputov :

Ne için? Tamamen gereksiz özellikler.

Birincisi: Havaya ateş ediyorsunuz - ilk kontrol olmadan bir ticaret emri gönderin - operasyonun ne döndürdüğünü kontrol etmeden. Yardıma bakın: PositionClose bool türündedir.

İkincisi: pozisyon kapatma zincirine bakarız: pozisyon bulunamadığında (belirtilen bilet ile seçilemez), "false" döndürülür.

Aynı zamanda yapılar hiçbir yerde temizlenmiyor - çünkü bu anlamsız - sonuçta ondan önce bir konum seçmek mümkün değildi, bu nedenle yapılarda bilgi yok.

1) Aynı başarı ile ResetLastError()'un kesinlikle gereksiz bir fonksiyon olduğunu söyleyebiliriz.

2) Döndürülen sonucun kontrolü vardır. Benzetme yoluyla, bir WinAPI işlevini çağırdığınızı, bunun bir hata döndürdüğünü ve GetLastError() (ResultRetcode'a benzer) herhangi bir son kodu döndürdüğünü hayal edin.

PositionClose'u çağırmadan önce bir çek eklersem (ve bir tane ekleyeceğim), RetCode değişmediğinde diğer aramalardan önce diğer kontrolleri geçersiz kılmaz.

Uzman Danışmanım, bilgileri günlüğe yazar. Tüm ihtiyacım olan, bazı çağrılar yanlış dönerse, aklı başında ResultRetcode ve ResultComment'ı günlüğe yazmak.

 
. ... Rick D. ... . :

1) Aynı başarı ile ResetLastError()'un kesinlikle gereksiz bir fonksiyon olduğunu söyleyebiliriz.

2) Döndürülen sonucun kontrolü vardır. Benzetme yoluyla, bir WinAPI işlevini çağırdığınızı, bunun bir hata döndürdüğünü ve GetLastError() (ResultRetcode'a benzer) herhangi bir son kodu döndürdüğünü hayal edin.

PositionClose'u çağırmadan önce bir çek eklersem (ve bir tane ekleyeceğim), RetCode değişmediğinde diğer aramalardan önce diğer kontrolleri geçersiz kılmaz.

Uzman Danışmanım, bilgileri günlüğe yazar. Tüm ihtiyacım olan, bazı çağrılar yanlış dönerse, aklı başında ResultRetcode ve ResultComment'ı günlüğe yazmak.

Gerektiğinde CTrade sınıfının alım satım işlemleriyle ilgili yardımı okuyun   ResultRetcode() yöntemini çağırarak bir ticaret talebinin (işlem sunucusu dönüş kodu) yürütülmesinin sonucunu kontrol edin .

 
Vladimir Karputov :

Gerektiğinde CTrade sınıfının alım satım işlemleriyle ilgili yardımı okuyun   ResultRetcode() yöntemini çağırarak bir ticaret talebinin (işlem sunucusu dönüş kodu) yürütülmesinin sonucunu kontrol edin .

bunu iddia edebilirsin

1) PositionClose false döndürürse, Retcode hiçbir zaman doldurulmaz mı?

2) PositionClose true değerini döndürürse, Retcode her zaman doldurulur mu?

 
Vladimir Karputov :

Sipariş -> anlaşma -> pozisyon. Pozisyondan açılış fiyatını alın.

Bu şekilde bir resim gösterebilirsiniz Order -> Deal -> pozisyonu, bu anlaşmanın yazıldığı alttan bu yüzden orada kopyalanmasına izin vermiyor


 
Seric29 :

Bu şekilde bir resim gösterebilirsiniz Order -> Deal -> pozisyonu, bu anlaşmanın yazıldığı alttan bu yüzden orada kopyalanmasına izin vermiyor


Lütfen sorunuzu yeniden yazın veya noktalama işaretleri koyun veya daha da iyisi resimde ne, nerede ve kim olduğunu ekleyin. Aksi takdirde tanıdık harfler gördüğüm ortaya çıkıyor ama anlamını ve düşüncenizi anlayamıyorum.