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

 
doshur :

PositionSelect()'in istemci tarafını mı yoksa sunucu tarafını mı kontrol ettiğini sorabilir miyim?

Sorunun, sunucunun (aracı tarafının) isteği işlediği ve istemci tarafını güncellemediği gecikmeden kaynaklandığına dair güçlü bir his var, bu yüzden PositionSelect() yeniden çalışıyor

CTrade vs MqlTradeRequest yöntemini kullandığımızda hiçbir fark olmadığını ve Sleep işlevinin, PositionSelect() tekrar çift girişe neden olarak tekrar çalışmadan önce müşteri tarafımızın "güncellenmesi" için her şeyi geciktirmeye yardımcı olması gerektiğini kuvvetle hissediyorum. Günlük sekmesinden kontrol ediyorum, > 2013.12.20 08:35:00 ticaret '800****': 313 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alışı <

400'den fazla uyumak güvenli olmalı ???

Ne düşünüyorsun?


"Sorunun, sunucunun (aracı tarafı) isteği işlediği ve istemci tarafını güncellemediği zamandaki gecikmeden kaynaklandığına dair güçlü bir his var, bu yüzden PositionSelect() yeniden çalışıyor"

Ayrıca çift girişin sebebinin bu olduğunu düşünüyorum. Kodumda, mevcut konum boyutu izin verilen maksimum konum boyutuna eşit veya daha büyükse yeni bir sipariş göndermek teorik olarak imkansız, bu nedenle PositionSelect() geçerli konumun durumunu zamanında almadığında, EA'm gönderecek tekrar yeni bir düzende.


"400'den fazla uyku koymak güvenli olmalı ??? "

Zaman aralığı ne kadar büyük olursa o kadar iyi ama bir sorun var. Pozisyonunuzu iki adımda (UZUN'dan KISA'ya veya KISA'dan UZUN'a) çevirirseniz, bu ekstra zaman gecikmesi, özellikle makro ekonomik olay sırasında, kötü bir uygulama fiyatının nedeni olabilir.

 
snelle_moda :


"Sorunun, sunucunun (aracı tarafı) isteği işlediği ve istemci tarafını güncellemediği zamandaki gecikmeden kaynaklandığına dair güçlü bir his var, bu yüzden PositionSelect() yeniden çalışıyor"

Ayrıca çift girişin sebebinin bu olduğunu düşünüyorum. Kodumda, mevcut konum boyutu izin verilen maksimum konum boyutuna eşit veya daha büyükse yeni bir sipariş göndermek teorik olarak imkansız, bu nedenle PositionSelect() geçerli konumun durumunu zamanında almadığında, EA'm gönderecek tekrar yeni bir düzende.


"400'den fazla uyku koymak güvenli olmalı ??? "

Zaman aralığı ne kadar büyük olursa o kadar iyi ama bir sorun var. Pozisyonunuzu iki adımda (UZUN'dan KISA'ya veya KISA'dan UZUN'a) çevirirseniz, bu ekstra zaman gecikmesi, özellikle makro ekonomik olay sırasında, kötü bir uygulama fiyatının nedeni olabilir.

Bence sorun olmamalı. EA'm, bir alım/satım talebi gönderdiğimde hemen geri dönmüyor. EA'mın komisyoncu güncellemelerini beklemek için yeterli zamanı olması için uykumu 800 ms'ye koyuyorum. Umarım Uyku bu sorunu burada çözebilir.
 
doshur :
Komisyoncu burada ayrı mı oynuyor bilmiyorum ama komisyoncumuz aynı görünüyor. Alpari.

Lütfen gerekirse komisyoncu adını kaldırın.
evet komisyoncu aynı.
 
snelle_moda :


03-10-2013'ten beri 1 çift girişim daha oldu. Siparişimi göndermek için her iki yöntemi de kullanıyorum. Bir önceki paylaşımıma bakın.

ah ha...tam beklediğim gibi...
 

az önce uyguladığım şey bu. umarım sorunu çözebiliriz

 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 :

az önce uyguladığım şey bu. umarım sorunu çözebiliriz

Bildiğim kadarıyla sonuç kodu = 10008, aynı zamanda bir ticaretin iyi yapıldığını gösteriyor.
 

Bu sorunun arkasındaki nedeni bulmanın çok önemli olduğunu düşünüyorum, tabii ki biz neler olduğunu tam olarak anlayana kadar bir geçici çözüme (Uyku?) sahip olmak da önemlidir. Bu yüzden durumu devam ettirmeye çalışıyorum:

  • CTrade sınıfından PositionOpen yöntemini kullanırken, en az 3 kullanıcı aynı anda 1 yerine 2 işlem yaptı ve bu da beklenenden iki kat daha fazla hacme sahip bir pozisyona yol açtı.
  • Başlangıçta doshur tarafından yayınlanan kod, hiçbir işlem açılmamışken neden "Pozisyon açıldı..." günlüğünde görebildiğini açıklayabilir. Bunun nedeni, PositionOpen() işlevi doğru olsa bile, bu bir ticaretin yapıldığı anlamına gelmez. belgelere bakın . Ancak neden "çifte" bir ticaretin yapıldığını açıklayamaz.
  • Bu "çifte" ticaret için sadece 2 açıklama görebiliyorum:
  1. PositionSelect() her zaman pozisyonun gerçek durumunu döndürmez. Bir pozisyon açılır ancak PositionSelect false döndürür. O zaman PositionSelect'te hata.
  2. Bir takas yapılır, ancak bir sonraki tikte PositionSelect() çağrıldığında, pozisyon henüz mevcut değildir. Mümkün olup olmadığını anlamak için bir ticaret yapıldığında operasyon akışını bilmemiz gerekir.
  • Bu sorun, Depth of Market'in etkinleştirildiği bir sembolle aynı brokerda ortaya çıkıyor gibi görünüyor (ilgili kişiler bunu onaylayabilir mi lütfen).
  • Bu sorun senkron sıralamada ortaya çıkıyor, asenkron sıralama kullanılmadı (lütfen onaylayın).
  • Sorun rastgele oluşur.
  • Klammeraffe raporlarında artık sorun yok, ancak gönderdiği kodun bunu nasıl açıkladığını göremiyorum. Bu kod her tikte çalıştırılıyor mu? Bu kod, PositionSelect() kullanımından sonra mı yürütülüyor? Belki de hatanın nedenini ortadan kaldırdı ya da sadece rastgele.
  • Kodu kontrol ettikten sonra, CTrade sınıfını veya MqlTradeRequest'i doğrudan OrderSend ile kullanmak arasında bir fark göremiyorum.

En iyi açıklamanın şu olduğu konusunda snella_moda ile aynı fikirdeyim:

I think the problem is the (to slow) execution of the PositionSelect(Symbol()) function. Maybe, the new ticks come in so fast, the EA sends in a new order before it receives a response of the PositionSelect(Symbol()). So the current position size is not calculated properly. In my code, its theoretically impossible to send in a new/double order if the current position size is equal or greater than the max allowed position size, see code. 

Ama kontrol etmek zor.

Bence yapılacak en iyi şey Metaquotes'tan tavsiye istemek. Onu deneyeceğim.

 
angevoyageur :
  • Klammeraffe raporlarında artık sorun yok, ancak gönderdiği kodun bunu nasıl açıkladığını göremiyorum. Bu kod her tikte çalıştırılıyor mu? Bu kod, PositionSelect() kullanımından sonra mı yürütülüyor? Belki de hatanın nedenini ortadan kaldırdı ya da sadece rastgele.

"Her tik" ile ilgili satır, artık olmamasının nedeni olabilir.

İşlev yalnızca yeni bir çubuk göründüğünde yürütülür. Bu nedenle, büyük olasılıkla, bir çubuğun yalnızca ilk işareti bir ticaret gerçekleştirebilir. İlk çubuktan sonra, kod yeni çubuk görünene kadar bir 'dönüş' olur. Belki bu benim için çözdü.

Sanırım bu kod parçası makalelerden:

 //-------------------------------------------------- Check for new bar     
         static datetime OldTime;
         datetime NewTime[ 1 ];
         bool newBar= false ;
         
         int copied= CopyTime ( Symbol (), Period (), 0 , 1 ,NewTime);
         if (copied> 0 )
           {
             if (OldTime != NewTime[ 0 ])
               {  
                 newBar= true ;
                 OldTime=NewTime[ 0 ];
               }
           }
         else
           {
             Print ( "Error in copying historical times data, error =" , GetLastError ());
             ResetLastError ();
             return ;
           }  
         if (newBar== false ) return ;      
//-------------------------------------------------- Check for new bar
 
Klammeraffe :

"Her tik" ile ilgili satır, artık olmamasının nedeni olabilir.

İşlev yalnızca yeni bir çubuk göründüğünde yürütülür. Bu nedenle, büyük olasılıkla, bir çubuğun yalnızca ilk işareti bir ticaret gerçekleştirebilir. İlk çubuktan sonra, kod yeni çubuk görünene kadar bir 'dönüş' olur. Belki bu benim için çözdü.

Sanırım bu kod parçası makalelerden:

Evet bencede. Teşekkür ederim.
 
  • Başlangıçta doshur tarafından yayınlanan kod, hiçbir işlem açılmamışken neden "Pozisyon açıldı..." günlüğünde görebildiğini açıklayabilir. Bunun nedeni, PositionOpen() işlevi doğru olsa bile, bu bir ticaretin yapıldığı anlamına gelmez. belgelere bakın . Ancak neden "çifte" bir ticaretin yapıldığını açıklayamaz.

düzeltme. Çift "Pozisyon açıldı..." var ve 2 işlem açıldı.

  • Bu sorun, Depth of Market'in etkinleştirildiği bir sembolle aynı brokerda ortaya çıkıyor gibi görünüyor (ilgili kişiler bunu onaylayabilir mi lütfen).
Diğerlerinden emin değilim ama benimkinin DOM'si var

  • Bu sorun senkron sıralamada ortaya çıkıyor, asenkron sıralama kullanılmadı (lütfen onaylayın).
Varsayılan cTrade ayarlarını kullanıyorum.

  • Sorun rastgele oluşur.
evet, rastgele

Neden: