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

 
oldiol : kodu yazıyorum: if(!m_Trade.PositionClose(_Symbol,100))//--- mevcut sembol üzerindeki pozisyonu kapat. Sonuç - konum tersine çevrilir! Bir ipucu için çok minnettar olurum, pozisyonu nasıl kapatabilirim?
Program sunucuya iki özdeş istek gönderdiği için konum tersine çevrilir. Program sunucuya iki özdeş istek gönderir, çünkü kodu daha önce gönderilen bir isteğin varlığını kontrol etmeyi sağlamaz (ve ayrıca bu isteğin sunucuda işlenmesinin sonucunu kontrol etmeyi sağlamaz).
 
Yedelkin :
Program sunucuya iki özdeş istek gönderdiği için konum tersine çevrilir. Program sunucuya iki özdeş istek gönderir, çünkü kodu daha önce gönderilen bir isteğin varlığını kontrol etmeyi sağlamaz (ve ayrıca bu isteğin sunucuda işlenmesinin sonucunu kontrol etmeyi sağlamaz).
Lütfen kodumu düzeltin...
 

Yedelkin şunu yazıyor: kodunun daha önce gönderilmiş bir isteğin varlığını kontrol etmeyi sağlamadığını. Bu hangi işlevi kontrol ediyor lütfen söyler misiniz?

 
oldiol : Lütfen kodumu doğru olana düzeltin...

Herkesin kodun doğruluğu konusunda kendi anlayışı vardır. Bu nedenle, "doğru" kodun sonunda sizin tarafınızdan yazılması gerekecektir. Ve başka bir ipucu olarak, aşağıdaki kodun doğru şekilde çalışıp çalışmadığını deneyin (sentRequest bayrağının şematik kullanımı):

 bool sentRequest= false ;   //задать на уровне глобальных переменных программы
...

    if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
     {
      if (!sentRequest)
        {                           
         if (p_close1<buy_stop_level)
           {
             if (!m_Trade.PositionClose( _Symbol , 100 ))
               Print ( "Метод PositionClose() потерпел неудачу. Код возврата=" ,m_Trade.ResultRetcode(), ". Описание кода: " ,m_Trade.ResultRetcodeDescription());
             else
               {
                 Print ( "Метод PositionClose() выполнен успешно. Код возврата=" ,m_Trade.ResultRetcode(), " (" ,m_Trade.ResultRetcodeDescription(), ")" );       
                sentRequest= true ;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции ");        
       }
     else 
      if(sentRequest) sentRequest= false ;
 
Yedelkin :

Herkesin kodun doğruluğu konusunda kendi anlayışı vardır. Bu nedenle, "doğru" kodun sonunda sizin tarafınızdan yazılması gerekecektir. Ve başka bir ipucu olarak, aşağıdaki kodun doğru şekilde çalışıp çalışmadığını deneyin (sentRequest bayrağının şematik kullanımı):

Çok teşekkürler! Deniyorum...

 

Sonuç aşağıdaki gibidir: kod, uzun bir pozisyonu doğru bir şekilde kapatır ve kısa bir pozisyon açmaz... Ama! Uzun bir pozisyonu yeniden açarken, uzman artık pozisyonu şartlı olarak kapatmaz. Uzman penceresinde her zaman mesajlar vardır:

Bu kod sadece 1 kez çalışıyorsa Expert Advisor bünyesinde nasıl kullanılır?

 

oldiol : При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

Bu konuda, her şey oldukça basit olmalıdır. Şematik kodda, açık pozisyon bir Alış pozisyonu değilse (kodun son satırı) sentRequest bayrağı sıfıra ayarlanmalıdır. Açık pozisyon olmadığı veya açık pozisyonun Alış pozisyonu olmadığı durumlarda kodunuzdaki bu bayrağın neden sıfırlanmadığını görün.

 

Yaşasın! Kazanılan))) Kaldırıldı lse if( sentRequest ) sentRequest= false ; Ve bloğun önüne if( PositionsTotal()==0 ) sentRequest=false; yazdım. Yardımlarınız için Yedelkin'e derin şükranlarımı sunarım, BAŞARILAR SİZE!

 
oldiol oldiol : Kaldırıldı if(sentRequest) sentRequest= false ; Ve bloğun önüne if(PositionsTotal()==0) sentRequest=false; yazdım.
Onlar. ana kodda bir pozisyonun olup olmadığı kontrol edilmedi mi? Ardından, belirli bir sembolün konumunun PositionGetSymbol veya PositionSelect işlevleri kullanılarak seçildiğini ekleyeceğim.
 

oldiol : Uzun bir pozisyonu yeniden açarken, EA artık pozisyonu şartlı olarak kapatmaz. Uzman penceresinde her zaman mesajlar vardır: Bu kod sadece 1 kez çalışıyorsa bir uzmanın gövdesinde nasıl kullanılır? Kusura bakmayın benim hatam... Kodda bir koşul daha var

if(PositionSelect(_Symbol)==true) // açık pozisyon var
{

POZİSYON KAPATMA BLOK

} // ... Bu yüzden

e lse if( sentRequest ) sentRequest= false ;// sonraki parantezden sonra yerleştirilir ve her şey BÜYÜK çalışır. Yedelkin TEŞEKKÜR EDERİM!