EA'm çift giriş yapıyor - sayfa 7

 

uyku kullanırsam kene kaybeder miyim?

sonuçları ne olacak? benimle paylaşabilir mi?

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur :

uyku kullanırsam kene kaybeder miyim?

sonuçları ne olacak? benimle paylaşabilir mi?

Stratejinize bağlı. "Çifte işlem" ile ilgili bu sorun, yalnızca işlem kodunuz her bir işarette çalıştırıldığında ortaya çıkabileceğinden, muhtemelen işarete bağlı bir stratejiniz vardır. Bu nedenle, gecikmeniz (uyku) sırasında gelen keneleri kaybederseniz, sonucun ne olabileceğini değerlendirmek size kalmış.

 
angevoyageur :

Stratejinize bağlı. "Çifte işlem" ile ilgili bu sorun, yalnızca işlem kodunuz her bir işarette çalıştırıldığında ortaya çıkabileceğinden, muhtemelen işarete bağlı bir stratejiniz vardır. Bu nedenle, gecikmeniz (uyku) sırasında gelen keneleri kaybederseniz, sonucun ne olabileceğini değerlendirmek size kalmış.

Yani eğer 800 için uyursam

sonraki 800ms için keneleri kaybettiğim anlamına mı geliyor? Ticaretime girdikten sonra, EA'm hiçbir şey yapmıyor, sadece TP veya SL'ye kadar orada oturuyor veya çıkmak için zamanın gelmesini bekliyor.

Yani uyku kullanırsam stratejim tamam mı?

refreshrates() işlevini çağırmak keneleri geri alır mı?

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur :

Yani eğer 800 için uyursam

sonraki 800ms için keneleri kaybettiğim anlamına mı geliyor? Ticaretime girdikten sonra, EA'm hiçbir şey yapmıyor, sadece TP veya SL'ye kadar orada oturuyor veya çıkmak için zamanın gelmesini bekliyor.

Yani uyku kullanırsam stratejim tamam mı?

refreshrates() işlevini çağırmak keneleri geri alır mı?

doshur, keneler seni gevşetir, sen kaybedersin, geri dönüş makinesi yoktur.

https://www.mql5.com/en/docs/common/sleep adresindeki belgelerle ilgili olarak, işlev , geçerli Uzman Danışmanın veya komut dosyasının belirli bir aralıkta yürütülmesini askıya alır.

Bu nedenle, muhtemelen EA yalnızca bir iş parçacığı kullandığı için OnTimer olayları bile askıya alınacaktır.

Bu nedenle, sabit bir uyku kullanın Uyku kesin bir çözüm değildir, yalnızca "numeroloji"dir, yani gecikme değerinizden düşükse bir geçici çözümdür.

Ve bu nedenle, pozisyonu açtıktan sonra, PositionOpen uygulamasını iki kez kontrol etmek ve sadece Sleep()'ten daha iyi bir geçici çözüm olarak geri dönmek için PositionSelect'i bir döngü testi öneriyorum ve bu aynı zamanda sorunun nedenini de düzeltiyor ( angevoyageur testlerine göre).

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 

Şimdi kullandığım şey bu. Figurelli tarafından sağlanan geçici çözümü daha zarif bir şekilde nereye kodlamalıyım?

 //
         {
            Price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

             if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 ))
            {
               Sleep ( 800 );

               if (m_Trade.ResultRetcode() == 10009 )
               {
                   Print ( "Position opened in " , Symbol ());

                   return ;
               }
               else
               {
                   Print ( "Error opening position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription());
               }
            }
             else
            {
               Print ( "Error with PositionOpen in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription());
            }
         }
 
doshur :

Şimdi kullandığım şey bu. Figurelli tarafından sağlanan geçici çözümü daha zarif bir şekilde nereye kodlamalıyım?

Merhaba doshur, EA'larımdan birinde çift girişle ilgili sorunlar da yaşıyordum. Aslında bu sorunlar sadece ben yüksek likiditeye sahip varlıklarla işlem yaparken ortaya çıkıyordu. Eşzamansız modda gönderilecek siparişleri ayarladıktan sonra bile, EA "görünüşe göre" bir sunucu yanıtının PositionsTotal()'ı güncellemesi için çok uzun süre bekliyordu... bu arada, gelen diğer onay işaretleri ikinci bir sipariş göndermek için koşulları tetikliyordu... Portekiz forumunda burada paylaşmak istediğim bir geçici çözüm yayınladım.

Fikir basit:

//--- global variables
CTrade trade;
bool position_opened= false ;

//--- inside OnTick()
if ( conditions to open && position_opened== false )
  {
   //--- set the global variable to true to avoid duplicate orders
   position_opened= true ;
   trade.PositionOpen( _Symbol ,order_type,lot,price,sl,tp, "comment" );
  }

Bu kodla ilgili tek sorun, siparişin sunucu tarafından kabul edilmemesidir, bu nedenle global değişkeni "sıfırlamanız" gerekir... Bunu kullanabilirsiniz:

 MqlTradeResult mresult;

//--- 
if (mresult.retcode== 10009 || mresult.retcode== 10008 )
  { Print ( "Success!" );}
else 
  {
   Print ( "Error = " , GetLastError ());
   ResetLastError ();
   //--- Sets the global variable to false
   position_opened= false ;
   return ;
  }

Bu nedenle, gönderilen ilk siparişin bir hata vermesi durumunda, EA'nın başka bir sipariş gönderebilmesi için global değişken false olarak ayarlanır. Ancak şunu söylemeliyim ki bu kodu sadece hisse senedi ve vadeli işlemlerde test ettim forex piyasasında denemedim... :-(

 
Malacarne :

Merhaba doshur, EA'larımdan birinde çift girişle ilgili sorunlar da yaşıyordum. Aslında, bu sorunlar sadece yüksek likiditeli varlıklarla işlem yaparken ortaya çıkıyordu. Eşzamansız modda gönderilecek siparişleri ayarladıktan sonra bile, EA "görünüşe göre" bir sunucu yanıtının PositionsTotal()'ı güncellemesi için çok uzun süre bekliyordu... bu arada, gelen diğer onay işaretleri ikinci bir sipariş göndermek için koşulları tetikliyordu... Portekiz forumunda burada paylaşmak istediğim bir geçici çözüm yayınladım.

Fikir basit:

Bu kodla ilgili tek sorun, siparişin sunucu tarafından kabul edilmemesidir, bu nedenle global değişkeni "sıfırlamanız" gerekir... Bunu kullanabilirsiniz:

Bu nedenle, gönderilen ilk siparişin bir hata vermesi durumunda, EA'nın başka bir sipariş gönderebilmesi için global değişken false olarak ayarlanır. Ancak şunu söylemeliyim ki bu kodu sadece hisse senedi ve vadeli işlemlerde test ettim forex piyasasında denemedim... :-(

Bu uygulanabilir görünüyor. Figürlü ve angevoyageur'un bu geçici çözüm hakkında herhangi bir yorumu olup olmadığını görelim ...
 
doshur :
Bu uygulanabilir görünüyor. Figürlü ve angevoyageur'un bu geçici çözüm hakkında herhangi bir yorumu olup olmadığını görelim ...

Malacarne tarafından önerilen bu çözüm (önereceğim bazı ayarlamalarla birlikte) harika, çünkü benim için bir geçici çözüm değil (Malacarne'in mütevazı bir şekilde ifade ettiği gibi), bu soruyu ele almanın zarif ve doğru bir yolu.

Benim düşünceme göre, orijinal çift giriş sorunu bir MT5 hatası değil, yardımda belirtildiği için bir kodlama hatasıdır:

" PositionOpen(...) yönteminin başarıyla tamamlanması, her zaman ticaret işleminin başarılı bir şekilde yürütülmesi anlamına gelmez . ResultRetcode() ve ResultDeal() tarafından döndürülen değeri kullanarak ticaret isteğinin (ticaret sunucusu dönüş kodu) sonucunu kontrol etmek gerekir. "

Bu nedenle, herhangi bir piyasa koşuluna daha dayanıklı olmak için bazı küçük değişiklikler öneriyorum:

1) Test PostionOpen() de orijinal kod olarak geri döner, örneğin:

 if (trade.PositionOpen( _Symbol ,order_type,lot,price,sl,tp, "comment" )) position_opened= true ;

2) 10010 - TRADE_RETCODE_DONE_PARTIAL gibi diğer ilgili gönderileri açabileceğiniz için, ResultRetcode()'un daha eksiksiz bir tedavisi - İsteğin yalnızca bir kısmı tamamlandı. Ayrıca, 10008 - TRADE_RETCODE_PLACED - Verilen sipariş benim için Başarılı değil, sadece 10009 - TRADE_RETCODE_DONE - İstek tamamlandı ve bunlar asenkron mesajlardır, dolayısıyla Malacarne kodunun ikinci kısmı anlaşma yapıldıktan sonra bu ve/veya d eal biletini dikkate alabilir, fazla.

Neyse bana öyle geliyor ki artık doğru yoldayız ve son noktayı koyduk.

 
Malacarne :

Merhaba doshur, EA'larımdan birinde çift girişle ilgili sorunlar da yaşıyordum. Aslında, bu sorunlar sadece yüksek likiditeli varlıklarla işlem yaparken ortaya çıkıyordu. Eşzamansız modda gönderilecek siparişleri ayarladıktan sonra bile, EA "görünüşe göre" bir sunucu yanıtının PositionsTotal()'ı güncellemesi için çok uzun süre bekliyordu... bu arada, gelen diğer onay işaretleri ikinci bir sipariş göndermek için koşulları tetikliyordu... Portekiz forumunda burada paylaşmak istediğim bir geçici çözüm yayınladım.

Fikir basit:

Bu kodla ilgili tek sorun, siparişin sunucu tarafından kabul edilmemesidir, bu nedenle global değişkeni "sıfırlamanız" gerekir... Bunu kullanabilirsiniz:

Bu nedenle, gönderilen ilk siparişin bir hata vermesi durumunda, EA'nın başka bir sipariş gönderebilmesi için global değişken false olarak ayarlanır. Ancak şunu söylemeliyim ki bu kodu sadece hisse senedi ve vadeli işlemlerde test ettim forex piyasasında denemedim... :-(

Bu geçerli bir yaklaşımdır, ancak pozisyonunuz kapalıyken pozisyon_opened global değişkeninizi false olarak sıfırlamanız gerekir. Bunu nerede yapıyorsun?

Uygulamanız hakkında bazı ayrıntılar:

  1. Bir hata varsa position_opened önce true, sonra false olarak ayarlanmasına gerek yoktur.
  2. CTrade sınıfının bir nesnesini kullanıyorsunuz, dolayısıyla yeni bir MqlTradeResult yapısı kullanmanıza gerek yok.
  3. Figurelli'nin gönderisinde belirttiği gibi, PositionOpen'ın döndürülen değerini kontrol etmeniz gerekir.
  4. Sınıfın adı CTrade değil, CTrade'dir. mql5 büyük/küçük harf duyarlıdır.
  5. position_opened bir bool, false ile karşılaştırmanıza gerek yok. Bunu yaparsanız, '=' değil '==' kullanmanız gerekir.

İşte değiştirilmiş kod ( Derlenmiş ancak test edilmemiştir ):

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened= false ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if (conditions_to_open && !position_opened ) //-- Or position_opened ==false
     {
       if (trade.PositionOpen( _Symbol ,order_type,lot,price,sl,tp, "comment" )
         && 
         (trade.ResultRetcode()== 10009 || trade.ResultRetcode()== 10008 )) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened= true ;
         Print ( "Success!" );
        }
       else
        {
         Print ( "Error = " , GetLastError (), "trade error = " , trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return ;
        }

     }
//--- 
  }
//+------------------------------------------------------------------+
 
figurelli :

...

Benim düşünceme göre, orijinal çift giriş sorunu bir MT5 hatası değil, yardımda belirtildiği için bir kodlama hatasıdır:

" PositionOpen(...) yönteminin başarıyla tamamlanması, her zaman ticaret işleminin başarılı bir şekilde yürütülmesi anlamına gelmez . ResultRetcode() ve ResultDeal() tarafından döndürülen değeri kullanarak ticaret isteğinin (ticaret sunucusu dönüş kodu) sonucunu kontrol etmek gerekir. "

Bu konu ile alakalı olduğunu düşünmüyorum. Aldığımız sorun, bir talebin başarıyla doldurulması ve bir pozisyonun açılması durumundadır. Ancak bu pozisyon ticaret sunucusunda açılır, karşılaştığımız sorun, her zamanki gibi daha önemli bir gecikme olduğunda ve MT5 terminaline yeni bir tick işlendikten SONRA bu yeni pozisyondan haberdar edilir.

Bu şekilde tasarlandığı için bir bug değildir. AMA bence açıkça senkronize ve asenkron ticaret isteklerine izin veren bir platform için zayıf tasarlanmış. Burada senkron olması gereken bir istekten bahsediyoruz, ama aslında bu istek için sunucudan yanıt aldığınızda olduğu gibi (yukarıdaki kodda trade.ResultRetCode) hala MT5'i beklemek zorunda olduğumuz için gerçekten senkronize değil. işlem sonuçları hakkında bilgi sahibi olmak ve güncellenmek için platform. (Bu konu ile hepsini anladım).

Bu nedenle, herhangi bir piyasa koşuluna daha dayanıklı olmak için bazı küçük değişiklikler öneriyorum:

1) PostionOpen() işlevinin de orijinal kod olarak geri dönmesini test edin, örneğin:

2) 10010 - TRADE_RETCODE_DONE_PARTIAL gibi diğer ilgili gönderileri açabileceğiniz için, ResultRetcode()'un daha eksiksiz bir tedavisi - İsteğin yalnızca bir kısmı tamamlandı. Ayrıca, 10008 - TRADE_RETCODE_PLACED - Verilen sipariş benim için Başarılı değil, sadece 10009 - TRADE_RETCODE_DONE - İstek tamamlandı ve bunlar asenkron mesajlardır , bu nedenle Malacarne kodunun ikinci kısmı anlaşma yapıldıktan sonra bu ve/veya d eal biletini dikkate alabilir, fazla.

Neyse bana öyle geliyor ki artık doğru yoldayız ve son noktayı koyduk.

Elbette, PositionOpen'ın döndürülen değerini VE ticaret sonucunun döndürülen kodunu kontrol etmeniz gerektiği konusunda kesinlikle haklısınız. Ancak ResultRetCode senkronizedir, MT5 veritabanının asenkron olan pozisyon (anlaşma ve sipariş) hakkında güncellenmesidir. Teklifinizle yaptığım test bunu gösterdi, çünkü elbette ticaret talebinin iade edilen değerini kontrol eden bir kod kullanıyorum.