Hatalar, hatalar, sorular - sayfa 540

 

Şu anda Şampiyonaya katılan Uzman Danışmanım, CTrade standart kitaplığının hatalı çalışması nedeniyle hatalı işlemler gerçekleştiriyor.

Pozisyonları kapatmak için PositionClose işlevini kullanıyorum. Ancak pozisyonların kapanmasıyla birlikte, bu işlevin kendisi işlemleri AÇAR!

İşlev şu şekilde kullanılır:

 //--- Объект класса СTrade
CTrade mytrade;
//--- Объект класса СPositionInfo
CPositionInfo myposition;

//+------------------------------------------------------------------+
//| Проверяет и если нужно, закрывает открытую позицию               |
//+------------------------------------------------------------------+
bool ClosePosition( string ptype, double clp)
  {
   bool R= false , marker= false ; int i;
     
       if (myposition.Select( _Symbol )== true )
        {
         if (myposition. Symbol ()== _Symbol )
           {
             //--- Делаем попытки закрыть позицию, если позиция не закрылась с первого раза
               for (i= 5 ; i>= 1 ; i--) 
                {R=mytrade.PositionClose( _Symbol , 50 , 5 ); if (R == true && myposition.Select( _Symbol )== false ) break ;}
               if (i >= 1 ) 
                 { //--- запрос успешно выполнен
                   Alert ( "Открытая позиция была успешно закрыта!!" );
                  marker= true ;
                 }
               else
                 {
                   Alert ( "Запрос на закрытие позиции не выполнен - ошибка: " ,mytrade.ResultRetcodeDescription());
                 }
             //  }
           }
        }
       return (marker);
     }

Sonuç olarak, PositionClose bazen ek siparişler açar.

Burada, önce bir Alış anlaşması kapatılır ve ardından aynı hacimde fazladan bir Satış anlaşması açılır. Üstelik AccountInfoDouble(ACCOUNT_FREEMARGIN) bu ekstra anlaşmayı fark etmedi. Daha sonra artan lotlu bir anlaşma açıldığından, kullanılan MM'ye göre bunun için fonlar açık ekstra anlaşma dikkate alındığında yeterli değildi.

MQL işlevlerini en iyi şekilde kullanmıyor olabileceğimin farkındayım. Ancak, anlaşmaları kapatmak için tasarlanmış tescilli MQL kitaplığından bir işlevin, anlaşmaları kendisi açacağı gerçeği, işlevlerin kabul edilebilir davranışı hakkındaki fikrime uymuyor.

 
masharov :

MQL işlevlerini en iyi şekilde kullanmıyor olabileceğimin farkındayım. Ancak, anlaşmaları kapatmak için tasarlanmış tescilli MQL kitaplığından bir işlevin, anlaşmaları kendisi açacağı gerçeği, işlevlerin kabul edilebilir davranışı hakkındaki fikrime uymuyor.

MetaTrader 5'teki Ticaret Olayları makalesini okuyun:

Alım satım olayları ve alım satım geçmişindeki değişiklikler bağımsız kanallar aracılığıyla raporlanır. OrderSend() fonksiyonu ile bir satınalma talebi gönderirken, başarılı talep doğrulamasının ardından oluşturulan sipariş biletini hemen öğrenebilirsiniz. Ancak aynı zamanda, siparişin kendisi henüz istemci terminalinde görünmeyebilir ve onu OrderSelect() işlevini kullanarak seçme girişimi başarısız olacaktır.

MetaTrader 5'teki Emirler, Pozisyonlar ve İşlemler makalesinin yanı sıra
 

OrderSend işlevini kullanmadım. PositionClose işlevi, siparişlerle çalışmak için tasarlanmış standart MQL kitaplığından kullanılır.

Bu işlevin yardımı, işlemleri açabileceğini açıklamaz.

Yardımdan alıntı:

PozisyonKapat

Belirtilen sembol üzerindeki konumu kapatır.

bool PozisyonKapat (
const dize sembol , // sembol
uzun sapma=ULONG_MAX // sapma
)

Seçenekler

semboller

[içinde] Pozisyonun kapatılması gereken alım satım aracının adı.

sapma=ULONG_MAX

[içinde] Mevcut fiyattan maksimum sapma (puan olarak).

Geri dönüş değeri

true - yapıların temel kontrolünün başarılı olması durumunda, aksi takdirde false.

Not

PositionClose(...) yönteminin başarıyla tamamlanması, her zaman bir ticaret işleminin başarılı bir şekilde yürütülmesi anlamına gelmez. ResultRetcode() yöntemini çağırarak bir ticaret talebinin (işlem sunucusu dönüş kodu) yürütülmesinin sonucunu kontrol etmek gerekir.

 
masharov :

OrderSend işlevini kullanmadım. Siparişlerle çalışmayı basitleştirmek için tasarlanmış standart MQL kitaplığındaki PositionClose işlevi kullanılır.

Bu işlevin yardımı, işlemleri açabileceğini açıklamaz.

Yardımdan alıntı:

PozisyonKapat

Belirtilen sembol üzerindeki konumu kapatır.

bool PozisyonKapat (
const dize sembol , // sembol
uzun sapma=ULONG_MAX // sapma
)

Seçenekler

semboller

[içinde] Pozisyonun kapatılması gereken alım satım aracının adı.

sapma=ULONG_MAX

[içinde] Mevcut fiyattan maksimum sapma (puan olarak).

Geri dönüş değeri

true - yapıların temel kontrolünün başarılı olması durumunda, aksi takdirde false.

Not

PositionClose(...) yönteminin başarıyla tamamlanması, her zaman bir ticaret işleminin başarılı bir şekilde yürütülmesi anlamına gelmez. ResultRetcode() yöntemini çağırarak bir ticaret talebinin (işlem sunucusu dönüş kodu) yürütülmesinin sonucunu kontrol etmek gerekir.

PositionClose(...) kitaplık işlevinde hata yok. Ve işte sahip olduğunuz kod. Burada kendiniz yardımdan alıntı yaptınız.

Успешное окончание работы метода PositionClose(...) не всегда означает успешное совершение торговой операции. 
Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode(). 

Örneğin, kodunuzda bu kontrolü görmüyorum.

 
masharov :

OrderSend işlevini kullanmadım. PositionClose işlevi, siparişlerle çalışmak için tasarlanmış standart MQL kitaplığından kullanılır.

Bu işlevin yardımı, işlemleri açabileceğini açıklamaz.


Ve PositionClose işlevinin uygulanmasına bakıyorsunuz:

 bool CTrade::PositionClose( const string symbol, ulong deviation)
  {
   bool    partial_close= false ;
   int     retry_count  = 10 ;
   uint    retcode      = TRADE_RETCODE_REJECT ;
//--- check stopped
   if ( IsStopped ( __FUNCTION__ )) return ( false );
//--- variables
   string action,result;
//--- clean
   ClearStructures();
   do
     {
       //--- checking
       if ( PositionSelect (symbol))
        {
         if (( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
           {
             //--- prepare request for close BUY position
            m_request.type = ORDER_TYPE_SELL ;
            m_request.price= SymbolInfoDouble (symbol, SYMBOL_BID );
           }
         else
           {
             //--- prepare request for close SELL position
            m_request.type = ORDER_TYPE_BUY ;
            m_request.price= SymbolInfoDouble (symbol, SYMBOL_ASK );
           }
        }
       else
        {
         //--- position not found
         m_result.retcode=retcode;
         return ( false );
        }
       //--- setting request
      m_request.action      = TRADE_ACTION_DEAL ;
      m_request.symbol      =symbol;
      m_request.deviation   =(deviation== ULONG_MAX ) ? m_deviation : deviation;
      m_request.type_filling=m_type_filling;
      m_request.volume      = PositionGetDouble ( POSITION_VOLUME );
       //--- check volume
       double max_volume= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
       if (m_request.volume>max_volume)
        {
         m_request.volume=max_volume;
         partial_close= true ;
        }
       else
         partial_close= false ;
       //--- order check
       if (! OrderCheck (m_request,m_check_result))
        {
         //--- copy return code
         m_result.retcode=m_check_result.retcode;
         if (m_log_level>LOG_LEVEL_NO)
             printf ( __FUNCTION__ + ": %s [%s]" ,FormatRequest(action,m_request),FormatRequestResult(result,m_request,m_result));
         return ( false );
        }
       //--- order send
       if (! OrderSend (m_request,m_result))
        {
         if (--retry_count!= 0 ) continue ;
         if (retcode== TRADE_RETCODE_DONE_PARTIAL )
            m_result.retcode=retcode;
         if (m_log_level>LOG_LEVEL_NO)
             printf ( __FUNCTION__ + ": %s [%s]" ,FormatRequest(action,m_request),FormatRequestResult(result,m_request,m_result));
         return ( false );
        }
      retcode= TRADE_RETCODE_DONE_PARTIAL ;
       if (partial_close) Sleep ( 1000 );
     }
   while (partial_close);
   if (m_log_level>LOG_LEVEL_ERRORS)
       printf ( __FUNCTION__ + ": %s [%s]" ,FormatRequest(action,m_request),FormatRequestResult(result,m_request,m_result));
//--- ok
   return ( true );
  }
 

Standart kitaplıkların kaynak kodunu incelemem gerekmediğini düşündüm.

Yardım, PositionClose işlevini kullanarak işlem açma olasılığını açıklamaz. Ekibiniz tarafından geliştirilen PositionClose işlevi, açılış anlaşmalarına karşı kontroller ve koruma içermelidir. Standart kitaplıkların başkaları için bir model olarak hizmet etmek için ideal kod olduğuna inanıyorum. Bu nedenle, kütüphane kodunu kullanmadan önce demonte etmek gerekli olmamalıdır.

Alıntı:

MQL5 Standard Library, MQL5 dilinde yazılmıştır ve son kullanıcılar için programların (göstergeler, komut dosyaları, Uzman Danışmanlar) yazılmasını kolaylaştırmak üzere tasarlanmıştır. Kitaplık, çoğu dahili MQL5 işlevine kolay erişim sağlar.

 
masharov :

Standart kitaplıkların kaynak kodunu incelemem gerekmediğini düşündüm.

Yardım, PositionClose işlevini kullanarak işlem açma olasılığını açıklamaz. Ekibiniz tarafından geliştirilen PositionClose işlevi, açılış anlaşmalarına karşı kontroller ve koruma içermelidir. Standart kitaplıkların başkaları için bir model olarak hizmet etmek için ideal kod olduğuna inanıyorum. Bu nedenle, kütüphane kodunu kullanmadan önce demonte etmek gerekli olmamalıdır.

Yasayı bilmemek mazeret değildir. Kodunuzda pozisyonun kapalı olduğunun kontrolü nerede?

             //--- Делаем попытки закрыть позицию, если позиция не закрылась с первого раза
               for (i= 5 ; i>= 1 ; i--) 
                {
                 R=mytrade.PositionClose( _Symbol , 50 , 5 ); 
                 if (R == true && myposition.Select( _Symbol )== false ) break ;
                }

İfade

R == true

sadece PositionClose() fonksiyonunun başarılı bir şekilde yürütülmesinden bahseder, fakat pozisyonun kapatılmasından bahsetmez:

Not

PositionClose(...) yönteminin başarıyla tamamlanması, her zaman bir ticaret işleminin başarılı bir şekilde yürütülmesi anlamına gelmez. ResultRetcode() yöntemini çağırarak bir ticaret talebinin (işlem sunucusu dönüş kodu) yürütülmesinin sonucunu kontrol etmek gerekir.

Ve ikinci ifade

myposition.Select( _Symbol )== false )

eşittir

 PositionSelect ( _Symbol )== false )

ve ayrıca asenkron ticaret işlemlerini garanti etmez. Pozisyon ticaret sunucusunda zaten kapatıldı ve bununla ilgili mesaj henüz terminale ulaşmadı. Böylece kodda kendi elinizle bir hata yarattığınız ortaya çıktı.

Hayatta her şey test cihazındaki kadar sorunsuz değildir, ayrıca bir ticaret talebinin gönderilmesi ile yürütülmesinin sonucu arasında küçük gecikmeler vardır. Herkes bu sorunu kendi başına çözer, başlangıçta, yardımda yazıldığı gibi ResultRetcode() işlevini kullanarak dönüş kodunu kontrol etmekten zarar gelmez.

 

Tekrarlıyorum.

MQL işlevlerini en iyi şekilde kullanmıyor olabileceğimin farkındayım. Ancak, anlaşmaları kapatmak için tasarlanmış tescilli MQL kitaplığından bir işlevin, anlaşmaları kendisi açacağı gerçeği, işlevlerin kabul edilebilir davranışı hakkındaki fikrime uymuyor.

Söylediğiniz her şey takasları kapatmakla ilgili. Evet, EA pozisyon kapanışını en uygun şekilde kontrol etmez. Ancak bu, açık işlemleri kapatmak için amaçlanan işlevin kendi başına izin vermez.

Yardım diyor ki:

PozisyonKapat

Belirtilen sembol üzerindeki konumu kapatır.

Fonksiyonun bir ticaret açabileceğine dair hiçbir koşul tanımlanmamıştır. İade kodunu kontrol etme önerisi, yalnızca işlemin kapatılıp kapatılmadığının ek doğrulaması için de kullanılır.

 
masharov :

Tekrarlıyorum.

MQL işlevlerini en iyi şekilde kullanmıyor olabileceğimin farkındayım. Ancak, anlaşmaları kapatmak için tasarlanmış tescilli MQL kitaplığından bir işlevin, anlaşmaları kendisi açacağı gerçeği, işlevlerin kabul edilebilir davranışı hakkındaki fikrime uymuyor.
Pozisyon kapatma fonksiyonu yoktur, sadece alım veya satım talebi göndermek için fonksiyonlar vardır (ve sonucun ne olacağı - bir pozisyonun açılması veya kapatılması - bilinmemektedir). Sizin durumunuzda, algoritmik bir hata nedeniyle, önceki isteğin yürütülmesi kontrol edilmeden tekrarlanan istekler gönderilir.
 
Rosh :
Pozisyon kapatma fonksiyonu yoktur, sadece alım veya satım talebi göndermek için fonksiyonlar vardır (ve sonucun ne olacağı - bir pozisyonun açılması veya kapatılması - bilinmemektedir). Sizin durumunuzda, algoritmik bir hata nedeniyle, önceki isteğin yürütülmesi kontrol edilmeden tekrarlanan istekler gönderilir.

Yardımda böyle bir işlev var

MQL5 Referansı / Standart Kitaplık / Ticaret Sınıfları / CTrade / PositionClose

Belirtilen sembol üzerindeki konumu kapatır.

Kullanıcının düşük seviyede işlevin nasıl uygulandığı konusunda endişelenmemesi gerekir. Böyle bir işlev olduğundan, MetaQuotes'un yardımda açıklanmayan standart dışı davranışa sahip olmayacağını garanti ettiğine inanıyorum.

MQL5 Standard Library, MQL5 dilinde yazılmıştır ve son kullanıcılar için programların (göstergeler, komut dosyaları, Uzman Danışmanlar) yazılmasını kolaylaştırmak üzere tasarlanmıştır. Kitaplık, çoğu dahili MQL5 işlevine kolay erişim sağlar.