Çoklu sipariş sorunu - sayfa 2

 

Merhaba Raptor;

Tester'da TrailingStop kapandığında tüm siparişler kapalıyken, Demo'da yalnızca TrailingStop aracılığıyla kapatılan sipariş kapanır, açık olan herhangi bir sipariş hala açıktır.

Tavsiyenizin üstüne aşağıdaki kodu kullanmanın mantığı şudur;

"Son siparişin durumunu bulun, eğer bir kapanışsa, kalan tüm açık siparişleri kapatmaya başlamak için kodu uygulayın."

Bunun neden olduğuna dair bir ipucu var mı?

Saygılarımla

Luis

 int OrdType, GLError;
   double OrderClosed;
   RefreshRates();
   
     for ( int Closed = OrdersTotal ()- 1 ;Closed >= 0 ; Closed--) 
       if ( OrderSelect (Closed,SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()== MagicNumber
        && OrderSymbol()== Symbol ())
        { //29
        OrderClosed = OrderCloseTime();
         if (OrderClosed!= 0 )
           { //30                                  
   for ( int OrderPos = OrdersTotal ()- 1 ; OrderPos >= 0 ; OrderPos--)       
       if ( OrderSelect (OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber()== MagicNumber 
         && OrderSymbol()== Symbol ())                                       
         { //31
         OrdType = OrderType();
         if (OrdType == OP_BUY || OrdType==OP_SELL)
           { //32
           if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
               GLError = GetLastError ();
           } //32                                         
          } //31
       } //30
     } //29 
    
   if (GLError > 0 ) Print ( "Error Closing/Deleting Order, error # " , GLError, " for ticket: " , OrderTicket());           
   return ( 0 );
  } //0 
 
luisneves :

Merhaba Raptor;

Tester'da TrailingStop kapandığında tüm siparişler kapalıyken, Demo'da yalnızca TrailingStop aracılığıyla kapatılan sipariş kapanır, açık olan herhangi bir sipariş hala açıktır.

Tavsiyenizin üstüne aşağıdaki kodu kullanmanın mantığı şudur;

"Son siparişin durumunu bulun, eğer bir kapanışsa, kalan tüm açık siparişleri kapatmaya başlamak için kodu uygulayın."

Bunun neden olduğuna dair bir ipucu var mı?

Bunu yapamazsın . . .

     for ( int Closed = OrdersTotal ()- 1 ;Closed >= 0 ; Closed--)     // OrdersTotal is the total of open orders
       if ( OrderSelect (Closed,SELECT_BY_POS,MODE_HISTORY)         //  this is looping through the closed orders

. . . Kapalı Siparişler arasında döngü başlatmak için döngü başlangıç koşulu olarak Açık Siparişlerin sayısını kullanmanın bir anlamı yoktur . Belki OrderssHistoryTotal() kullanmak istediniz? ancak kapalı bir Siparişin OrderCloseTime()'ı asla == 0 olmaz

 
luisneves :

.....

Birden fazla siparişin açılmasını önlemek için kodda BuyTicket ve SellTicket kullanıyorum ama bu doğru bir yöntem değil gibi görünüyor...

.....

Üçüncü bir sipariş açmak için bir koşul geldiğinde bir sorun ortaya çıkar ve bu böyle devam eder. Yine de burada açma koşulları var ve kod ikinci açılışta gayet iyi, kod neden burada çalışmıyor?

Anladığım kadarıyla ilk konuyu biraz değiştirmişsiniz ve belki ilk konu sonuna kadar tartışılmıştır (benim için sorun değil)
Yine de ilk konuyu takip etmek istiyorsanız, biraz daha açıklamanız gerekir, çünkü ne aradığınızı gerçekten anlamıyorum.

Ayarladığım ilk snippet, kodun birden fazla sipariş açmasını engelliyor. Bundan memnun değil gibiydiniz, bu yüzden onu kaldırdınız (veya sadece eklemediniz) ama benzer şeyi BuyTicket ve SellTicket kullanarak yaptınız.
O zaman üçüncü bir düzenden bahsediyorsunuz... Böyle bir şey mi arıyorsunuz?

Al->Sat->Al->Sat->Satın Al
ama önlemek
Al->Satın->Sat->Satın->Satın Al

Başka bir deyişle, son açılan emir bir alış emri ise, bir sonraki emir bir satış olmalı ve tam tersi mi?

Veya EA'nızın açması gereken maksimum sipariş miktarı nedir? 2 mi, bir satış mı ve karşıt bir emir için koşul yerine getirilirse, bir alım mı, ancak tekrar satın alma tetikleyicisinden geri dönerse artık satış değil mi?
Bu doğruysa, başlangıç kodunuza eklediğim OpenOpposite sayacıyla ilgili sorun neydi?

Düzenle:

Aklıma gelen üçüncü seçenek, eğer birinci karşı sıra durdurulmuşsa başka bir karşı sıra açmak istiyor musunuz?
Yani şöyle:

Al->Sat->Satış durdurulmuşsa->Sat->Satış durdurulmuşsa->Sat

 
kronin :

Anladığım kadarıyla ilk konuyu biraz değiştirmişsiniz ve belki ilk konu sonuna kadar tartışılmıştır (benim için sorun değil)
Yine de ilk konuyu takip etmek istiyorsanız, biraz daha açıklamanız gerekir, çünkü ne aradığınızı gerçekten anlamıyorum.

Ayarladığım ilk snippet, kodun birden fazla sipariş açmasını engelliyor. Bundan memnun değil gibiydiniz, bu yüzden onu kaldırdınız (veya sadece eklemediniz) ama benzer şeyi BuyTicket ve SellTicket kullanarak yaptınız.
O zaman üçüncü bir düzenden bahsediyorsunuz... Böyle bir şey mi arıyorsunuz?

Al->Sat->Al->Sat->Satın Al
ama önlemek
Al->Satın->Sat->Satın->Satın Al

Başka bir deyişle, son açılan emir bir alış emri ise, bir sonraki emir bir satış olmalı ve bunun tersi de geçerli mi?

Veya EA'nızın açması gereken maksimum sipariş miktarı nedir? 2 mi, bir satış mı ve karşıt bir emir için koşul yerine getirilirse, bir alım mı, ancak tekrar satın alma tetikleyicisinden geri dönerse artık satış değil mi?
Bu doğruysa, başlangıç kodunuza eklediğim OpenOpposite sayacıyla ilgili sorun neydi?

Düzenle:

Aklıma gelen üçüncü seçenek, eğer birinci karşı sıra durdurulmuşsa başka bir karşı sıra açmak istiyor musunuz?
Yani şöyle:

Al->Sat->Satış durdurulmuşsa->Sat->Satış durdurulmuşsa->Sat


Merhaba Kronin,

Bu konuda bana destek olmak için zaman ayırdığınız için şimdiden tanklayın.

Strateji bu mantığı gözlemler;

Açılacak ilk emrin bir satın alma olduğunu ve ardından TrailingStop aracılığıyla kapanıyor gibi göründüğünü söyleyin, ancak Teklif OrderOpenPrice (ReturnDistance) altında bazı pipler aşağı inerse, bir Sell açılacak ve TrailingStop aracılığıyla kapanacak gibi görünüyor. Ask, OrderOpenPrice'ın biraz üzerinde bir miktar yukarı sıçradığında, bir satın alma açılacaktır. Bu pinpon süreci, açılacak son sipariş TrailingStop aracılığıyla kapandığında veya maksimum sipariş ayarları olan 7'ye ulaştığında sona erecektir (bunu harici olarak ayarlayabilirsiniz).

Birden fazla açılışla ilgili sorun, fiyat OrderOpenPrice'ı geçerken yükselip düştüğünde ortaya çıkar. yani, eğer bir satın almamız varsa, bir sonraki sipariş sadece bir satış ve benzeri olabilir.

Önceki yardımınızla ilgili olarak, sorunumun ne olduğunu tam olarak açıklayamadım. Sağlanan herhangi bir yardım benim için en büyük değere sahiptir.

Saygılarımla

Luis

 

Luis, kodunuz üzerinde oldukça fazla zaman harcadım ama dürüst olmak gerekirse, istediğinizi yaptığımdan gerçekten emin değilim.

Eke bakınız. Sonlandır/Değiştir, test et, anla... ve en azından aradığın şeye yakın, benzer veya eksiksiz çalıştığını söyle. Henüz stratejiden tam olarak emin değilim.
Lütfen henüz yeni işlev eklemeyin (martingale'yi yeniden eklemeyin). Kod yeterince büyük ve güvenilir çalışmasını sağlamak için önünüzde hala çok iş var.
Kodun çok daha net bir şekilde düzenlenmediğini söylemeliyim. Çalışan parçalarınızı değiştirmek istemedim (hatta daha iyi bir hata işlemeye ihtiyacınız var). Parçaları yorumladım ve parçaları taşıdım, ama hepsi hala orada ...


İyi eğlenceler...

 
kronin :

Luis, kodunuz üzerinde oldukça fazla zaman harcadım ama dürüst olmak gerekirse, istediğinizi yaptığımdan gerçekten emin değilim.

Eke bakınız. Sonlandır/Değiştir, test et, anla... ve en azından aradığın şeye yakın, benzer veya eksiksiz çalıştığını söyle. Henüz stratejiden tam olarak emin değilim.
Lütfen henüz yeni işlev eklemeyin (martingale'yi yeniden eklemeyin). Kod yeterince büyük ve güvenilir çalışmasını sağlamak için önünüzde hala çok iş var.
Kodun çok daha net bir şekilde düzenlenmediğini söylemeliyim. Çalışan parçalarınızı değiştirmek istemedim (hatta daha iyi bir hata işlemeye ihtiyacınız var). Parçaları yorumladım ve parçaları taşıdım, ama hepsi hala orada...


İyi eğlenceler...


Merhaba Kronin,

Her şeyden önce, sorunlarımı desteklemek için harcadığınız zaman için çok teşekkür ederim.

Stratejiyi anlamak için elinizden gelenin en iyisini yaptığınıza inanıyorum, ancak bazı şeyler tam olarak yanıt vermiyor (elbette bu konudaki anlayış eksikliğimden dolayı).

Tavsiyenizi satın almak için bazı değişiklikler yaptım, ancak doğru yapılıp yapılmadığından emin değilim.

İki konu;

1 - Buradaki fikir, ticaret TrailingStop aracılığıyla kapatıldığında, kalan tüm açık siparişlerin kapanması gerektiğidir. Siparişler TakeProfit'te kapatılmayacak (TakeProfit sadece orada çünkü ben bunun Donma Bölgesi'ne konduğundan emin olmak istiyorum). Bu yüzden CloseAll işlevini çalıştırmak için son siparişin kapanışını kullanarak bunu yapmayı düşündüm (bunu denemek için bazı aptalca şeyler geliyor ...). Raybalanan açık siparişlerin kapanışını çalıştırmak için Son Kapanan Bilet'i kullanıyorsunuz, ancak ticaret TrailingStop aracılığıyla kapandığında bunun olup olmadığını anlamıyorum...

2 - En azından Tester'da "ping pong" çalışmıyor.

Ekte, anladığım kadarıyla değişikliklerin yapıldığı dosyadır.

Sabrınız ve harcadığınız zaman için şimdiden teşekkür ederiz. (daha fazlası özel mesajda )

Saygılarımla

Luis

 

Tamam, TP yerine SL'deki tüm siparişleri kapatmak için algoritmayı değiştirdim. (Değişiklik '<' ile değiştirildi '>' - nerede olduğunu öğrenmelisiniz)

Ping pong benim için çalışıyor ve test cihazında yalnızca Görsel Modda çalışmasına izin verdim. Ancak giriş parametrelerini, tüm siparişlerin hemen hemen aynı anda açılmaması için ayarladım. Belki de varsayılan parametreleri doğrulamanız gerekir.

İlk sıra ile başlar (print() deyimini değiştirdim) ve sonra zıt emirleri yapar.

EURUSD,M1: açık #1, 0.01 EURUSD'yi 1.43310'dan satın alın tamam
EURUSD,M1: İlk Satın Alma siparişi verildi #1
EURUSD,M1: 1.43310 sl'de 0.01 EURUSD satın al: 1.42810 tp: 1.43510 tamam
EURUSD,M1: açık #2, 0.01 EURUSD'yi 1.43200'den sat
EURUSD,M1: Karşı Satış emri verildi # 2
EURUSD,M1: 2'yi değiştir 0.01 EURUSD'yi 1.43200 sl'de sat: 1.43700 tp: 1.43000 tamam
EURUSD,M1: açık #3 0.01 EURUSD'yi 1.43300'den satın alın tamam
EURUSD,M1: Karşı Satın Alma emri verildi # 3
EURUSD,M1: #3'ü değiştir 1.43300 sl'de 0.01 EURUSD satın al: 1.42800 tp: 1.43500 tamam

Bir sipariş açtığımda OpenOppositeOrder() öğesine geri dönüş ekledim. Ayarlarla birlikte bir alış emri açmak ve aynı zamanda bir satış emri açmak mümkün oldu. MaxOrder'a giden bu müşteri adayı güvenilir değil.
Belki daha iyi bir yaklaşım, onu 2 fonksiyona bölmek veya fonksiyona sadece satış emirleri veya satın alma emirleri için çalışacak bir parametre vermektir.

btw. yüklediğiniz kod takas olmadı! 'Geçersiz LotSize' nedeniyle tüm işlemler başarısız oldu....

 

Merhaba Kronin,

Bana destek olmak için harcadığınız zaman için teşekkür ederim.

" Yüklediğiniz kod işlem görmedi! MM kodunun dosyanın sonuna taşınmasından sonra meydana gelen 'geçersiz LotSize' nedeniyle tüm işlemler başarısız oldu.... " sorunu ile ilgili. MM() kullanarak işlevin çağrısını yaptım; kodun başlangıcında, bu tür bir eylemin işe yaramadığı görülüyor, ancak gönderdiğiniz son kod çalışıyor ve MM() işlevi hala aynı yerde ve çalışıyor, bu yüzden burada kayboldum....

Aynı tık ile açılan emir hakkında;

EA grafiğe girdiğinde, fiyatın o andaki fiyattan daha fazla (veya daha az) olması gerekir, yani fiyat yükseldiğinde (veya düştüğünde) Açık Mesafede bir alım (veya satış) emri gerçekleşir. Buradan sonraki açılış, OrderOpenPrice eksi ReturnDistance'dan fiyat düştüğünde (son sipariş bir satın alma ise) gerçekleşebilir. Satışın son sipariş olması durumunda aynı mantık. Belki de bu mantığın dışında herhangi bir düzenin açılmasını önlemek için bir sınırın olması gerekir.

Saygılarımla

Luis

 
//mine
LotSize = (RiskAmount / StopLoss) / TickValue;               //Phil: LotSize is defined in global scope

//yours
double LotSize = (RiskAmount / StopLoss) / TickValue;


LotSize'ı global kapsamda tanımladınız ve 0 ile sıfırladınız. void MM() fonksiyonunda , sadece o fonksiyonda geçerli olan bir LotSize hesaplarsınız. Yalnızca başlatmayı kaldırdım, bu nedenle global kapsamdaki değişken güncellendi.

Bu değerlerin her biri için yorum yapar mısınız, Pip cinsinden değer lütfen?

 extern double StopLoss       =   50 ;
extern double TakeProfit     =   20 ;
extern double TrailingStop   =   2 ;
extern int     MinimumProfit  =   3 ;
extern int     Slippage       =   3 ;
extern double OpenDistance   =   2 ;
extern double ReturnDist     =   1 ;
extern double MinStop        =   1 ;

EA'yı çalıştırmak istediğiniz Sembolün yayılması nedir?

Ancak giriş parametrelerini, tüm siparişlerin hemen hemen aynı anda açılmaması için ayarladım. Belki de varsayılan parametreleri doğrulamanız gerekir.

Deneyin ve aynısını yapın ve test cihazında görsel modda çalışmasına izin verin.

 
kronin :


LotSize'ı global kapsamda tanımladınız ve 0 ile sıfırladınız. void MM() fonksiyonunda, sadece o fonksiyonda geçerli olan bir LotSize hesaplarsınız. Yalnızca başlatmayı kaldırdım, bu nedenle global kapsamdaki değişken güncellendi.

Bu değerlerin her biri için yorum yapabilir misiniz, lütfen Pip cinsinden değer?

EA'yı çalıştırmak istediğiniz Sembolün yayılması nedir?

Ancak giriş parametrelerini, tüm siparişlerin hemen hemen aynı anda açılmaması için ayarladım. Belki de varsayılan parametreleri doğrulamanız gerekir.

Deneyin ve aynısını yapın ve test cihazında görsel modda çalışmasına izin verin.


Merhaba Kronin,

Evet, öğrenecek çok şeyim var.... Şimdi, Global'de olması gereken bir fonksiyona dışarıdan erişilmesi gereken bir değere ihtiyaç olduğunu anlayın.

EA'nın 5 basamaklı aracılarda da çalışması gerektiğinden, harici değerler 10 ile çarpılır. Bunu otomatik olarak almak için bu kod bloğunu kullanıyorum, ancak WHRoeder'dan metallerle uyumlu olmayan bir tavsiye alıyorum.

 int init () // Adjust for 4 or 5 digits.
   {
   if ( Digits == 2 || Digits == 4 ) <------- not compatible with metals
      {
      pt = Point ;
      RealSlippage = Slippage;
      }    
   if ( Digits == 3 || Digits == 5 ) 
      {
      pt = Point * 10 ;
      RealSlippage = Slippage * 10 ;
      }

Paritenin yayılması değişken olabilir. Bu yüzden Stop Level'dan çıkmak için kod kullanıyorum.

Bu sorunla ilgili olarak " Ancak giriş parametrelerini, tüm siparişlerin hemen hemen aynı anda açılmaması için ayarladım. Belki de varsayılan parametreleri doğrulamanız gerekiyor."

Görebildiğim kadarıyla (olmadığım için üzgünüm ...), OpenDistance 2 pip olarak devam ediyor ve ReturnDistance şimdi 2 ile de. Şu anda gördüğüm şey, siparişin açıldığı ancak 2 pip farkla açılmadığı. Bu, bir ECN komisyoncusu (IC Markets) platformundaki bir test cihazı ile çalışır. Bunun bir önemi olabilir mi?

Aslında siparişler aynı anda açılmıyor, ancak açık siparişlere doğru mesafeyi elde etmek için Açık Mesafe ve ReturnDist'in dikkate alınmadığı görülüyor.

Şu kodda var;

OTLastTick=OTCurrentTick;                       //shift OrderTotal
  OTCurrentTick= OrdersTotal ();                   //reinit OrderTotal
   if (OTCurrentTick> 0 )Trail();                     //Trail
   if (OTLastTick>= 2                                //if OrderTotal has changed
     &&OTCurrentTick<OTLastTick
     &&OTCurrentTick> 0 ){CloseAllOnSL(); return ;}   //Check order closed on SL level
   if (OTCurrentTick>=MaxOrders) return ;             //Dont open more orders. Trail and return.
                                                 //Actually we have nothing more to do.
                                                 //Only call opposite if the initial order of the serie is open
   if (OTCurrentTick> 0 )OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
  MM();                 //<--------------------- include this line to call function (not sure if this the right method to do it...)
                        
   if (OTCurrentTick== 0 ){ //init serie
     BuyAllowed= true ;
     SellAllowed= true ; 

OpenOppositeOrder işlevini çağırmak için satırı kalın harflerle ekledim ve burada bunun doğru olup olmadığından emin değilim. Diğer taraf için, 2 pip önce (OpenDistance) olan son tik ile mevcut tik karşılaştırmasının nerede olduğunu göremiyor.

Sorunlarımla sizi sıkmaya başladıysam özür dilerim.

Saygılarımla

Luis

Neden: