Çoklu sipariş sorunu - sayfa 5

 
RaptorUK :

Yürütme hata kodlarını okuyun ve kodunuzu burada verilen bilgilerle uyumlu hale getirin, örneğin . . .

ERR_TRADE_TIMEOUT 128 İşlem için zaman aşımına ulaşıldı. Yeniden denemeden önce ( en az 1 dakikalık süre içinde ), alım satım işleminin gerçekten başarılı olmadığından (yeni bir pozisyon açılmadığından veya mevcut emrin değiştirilmediğinden veya silinmediğinden veya mevcut pozisyonun mevcut olmadığından emin olunmalıdır) kapatılmadı)


Merhaba RaptorUK,

İpucu için teşekkürler.

Başka bir konu (bir tane daha.....);

ECN Broker'da bir işlemin açık olduğunu ve " İşlem Yapma Gereksinimleri ve Sınırlamalar " uyarınca bir Piyasa emrinin Dondurma mesafesi içinde Stoploss durumunda kapatılamayacağını söyleyin, bu durumda CloseAll işlevi Dondurma içindeki emirleri bile kapatır Mesafe ?

Saygılarımla

Luis

 void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory( Symbol (),MagicNumber);  
   if (LastClosedTicket> 0 )                                          
   { //28                                                  
       Print ( "LastClosedTicket=" ,LastClosedTicket);                   
       if ( OrderSelect (LastClosedTicket,SELECT_BY_TICKET))             
      { //29        
         if ( MathAbs (OrderTakeProfit()-OrderClosePrice())>            
             MathAbs (OrderStopLoss()-OrderClosePrice()))              
            { //30        
             Print ( "Order with ticketnr: " , LastClosedTicket,
                   " hit SL! Close all open orders" );

       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      
         } //28 
      } //29     
   } //30 
 
   if (GLError > 0 ) Print ( "Error Closing/Deleting Order, error # " , GLError, " for ticket: " , OrderTicket());           
}
 
luisneves :


Merhaba RaptorUK,

İpucu için teşekkürler.

Başka bir konu (bir tane daha.....);

ECN Broker'da bir işlemin açık olduğunu ve " İşlem Yapma Gereksinimleri ve Sınırlamalar " uyarınca bir Piyasa emrinin Dondurma mesafesi içinde Stoploss durumunda kapatılamayacağını söyleyin, bu durumda CloseAll işlevi Dondurma içindeki emirleri bile kapatır Mesafe ?

Hayır, başarısız olacak, muhtemelen hata 130
 

Merhaba RaptorUK,

Mümkünse bu konuda sizden yardım rica ediyorum;

Bu kod parçası son OrderLots() öğesini bulur ve çarpan faktörü ile çarpar, ancak bazen bu faktörü geçer ve bu şekilde siparişlerim var; 0.01, 196,83, 590,49, vb.

Bu durumda 5 emir açma limitim olduğunu söylemem lazım. havuz 5 ile sınırlıdır, bu nedenle kod havuzda sadece 5 sipariş görüyorsa, bu siparişler için lot büyüklüğü; 0.01, 0.02, 0.04, 0.08, 0.16. Bu kodda benim bilmediğim bir yanlışlık mı var?

(umarım girinti iyidir...)

 for ( int cnt = 0 ; cnt < OrdersTotal (); cnt++)
   { //11
  if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))
   { //12
  if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
   { //13
     LastLot = OrderLots();
   } //13              
     MLots = 0 ;                       
     MLots = LastLot * Multiplier;        
   } //12
  else MLots = LotSize;
   } //11 
 return ( 0 );
 } //0 

Saygılarımla

Luis

 
luisneves :

Merhaba RaptorUK,

Mümkünse bu konuda sizden yardım rica ediyorum;

Bu kod parçası son OrderLots() öğesini bulur ve çarpan faktörü ile çarpar, ancak bazen bu faktörü geçer ve bu şekilde siparişlerim var; 0.01, 196,83, 590,49, vb.

Bu durumda 5 emir açma limitim olduğunu söylemem lazım. havuz 5 ile sınırlıdır, bu nedenle kod havuzda sadece 5 sipariş görüyorsa, bu siparişler için lot büyüklüğü; 0.01, 0.02, 0.04, 0.08, 0.16. Bu kodda benim bilmediğim bir yanlışlık mı var?

(umarım girinti iyidir...)

ben böyle yapıyorum . .

 for ( int cnt = 0 ; cnt < OrdersTotal (); cnt++)
   { //11
   if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))
      { //12
       if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
         { //13
         LastLot = OrderLots();
         } //13              
      MLots = 0 ;                       
      MLots = LastLot * Multiplier;        
      } //12
   else MLots = LotSize;
   } //11 
return ( 0 );
} //0 

OrderSelect() başarısız olursa MLots = LotSize ?? niye ya ? girintiniz, if ifadelerinizde ve parantezlerinizde neler olduğunu görmenize yardımcı olmaz. . . bunu mu yapmak istedin

 for ( int cnt = 0 ; cnt < OrdersTotal (); cnt++)
   { //11
   if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))
      { //12
       if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
         { //13
         LastLot = OrderLots();
         MLots = 0 ;                       
         MLots = LastLot * Multiplier; 
         } //13              
      } //12
   } //11 
if (MLots < 0.001 ) MLots = LotSize;   //   if MLots == 0.0
return ( 0 );
} //0 

Bunu ben yaptım . . .

 if (MLots < 0.001 )

. . ikili karşılaştırma sorunlarını önlemek için hızlı ve kirli bir yöntem olarak, bunu okudunuz mu? Fiyat != Fiyat ?

 
RaptorUK :

ben böyle yapıyorum . .

OrderSelect() başarısız olursa MLots = LotSize ?? niye ya ? girintiniz, if ifadelerinizde ve parantezlerinizde neler olduğunu görmenize yardımcı olmaz. . . bunu mu yapmak istedin

Bunu ben yaptım . . .

. . ikili karşılaştırma sorunlarını önlemek için hızlı ve kirli bir yöntem olarak, bunu okudunuz mu? Fiyat != Fiyat ?


Merhaba RaptorUk,

Hemen yanıt verdiğiniz için teşekkür ederiz.

Yani, sanırım başka bir şey kullanmamak daha iyi çünkü o boşuna orada. Ve verilen bağlantı için teşekkür ederiz.

Saygılarımla

Luis

 

Merhaba RaptorUK,

Bir sorunum var (bir tane daha .....)

Bazı siparişler vaktinden önce kapanıyor, demek istediğim;

Bu emirler açılmıştır ve 6'ya kadar açılma limiti vardır. Tüm emirler TrailingStop ile kapatılmalıdır, ancak 1, 3 ve 5 numaralı emirler, 07:43'ten sonra kapanan diğer emirlerden önce kapatılmıştır.

Bu 3 emir diğerlerinden daha önce kapandığından 7, 8 ve 9 numaralı açık emirlere yer verir ve bunlar son lotta (2.43) lot ile açılır.

Yani anladığım kadarıyla 07:23'teki düzensiz emir kapanışları olmamalıydı ve herhangi bir hata bulunmadı...

1 - 4951819 2013.01.28 19:51 satmak 0.01 eurusdi 1.34547 1.35047 1.34347 2013.01.29 07:23 1.34347 -0.06 0,00 0,00 1.49
2 - 4952036 2013.01.28 20:04 satın almak 0.03 eurusdi 1.34579 1.34079 1.34779 2013.01.29 07:43 1.34421 -0.17 0,00 -0.04 -3.53
3 - 4952074 2013.01.28 20:12 satmak 0.09 eurusdi 1.34548 1.35048 1.34348 2013.01.29 07:23 1.34348 -0.50 0,00 0,00 13.40
4 - 4952093 2013.01.28 20:20 satın almak 0.27 eurusdi 1.34579 1.34079 1.34779 2013.01.29 07:43 1.34421 -1.49 0,00 -0.38 -31.74
5 - 4952110 2013.01.28 20:27 satmak 0.81 eurusdi 1.34548 1.35048 1.34348 2013.01.29 07:23 1.34348 -4.46 0,00 0,00 120.58
6 - 4952150 2013.01.28 20:48 satın almak 2.43 eurusdi 1.34579 1.34079 1.34779 2013.01.29 07:43 1.34421 -13.37 0,00 -3.43 -285.63
7 - 4959337 2013.01.29 07:23 satmak 7.29 eurusdi 1.34351 1.34851 1.34151 2013.01.29 07:43 1.34424 -40.10 0,00 0,00 -395.89
8 - 4959858 2013.01.29 07:40 satın almak 21.87 eurusdi 1.34382 1.34422 1.34582 2013.01.29 07:43 1.34422 -120.29 0,00 0,00 650.79
9 - 4959860 2013.01.29 07:40 satmak 65.61 eurusdi 1.34382 1.34882 1.34182 2013.01.29 07:43 1.34424 -360.86 0,00 0,00 -2 049,95

Hepsini TrailingStop ile kapatacak kod şudur;

Bu kod başarısız olabilir ve siparişleri farklı zamanlarda kapatabilir mi?

 void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory( Symbol (),MagicNumber);  
   if (LastClosedTicket > 0 )                                          
   { //28                                                  
       Print ( "LastClosedTicket=" ,LastClosedTicket);                   
       if ( OrderSelect (LastClosedTicket,SELECT_BY_TICKET))             
      { //29        
         if ( MathAbs (OrderTakeProfit()- OrderClosePrice())>            
             MathAbs (OrderStopLoss()- OrderClosePrice()))             
            { //30        
             Print ( "Order with ticketnr: " , LastClosedTicket,
                   " hit SL! Close all open orders" );

       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
               while (IsTradeContextBusy()) Sleep (SleepTime);  
                   RefreshRates();
               if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError ();
              } //32               
             } //31      
         } //28 
      } //29     
   } //30 

Saygılarımla

Luis

 
luisneves :


Hepsini TrailingStop ile kapatacak kod şudur;

Bu kod başarısız olabilir ve siparişleri farklı zamanlarda kapatabilir mi?

Tamam, bu hiç mantıklı değil. . . takip eden bir SL ayarlanır, böylece fiyat bir Emirle birlikte giderse SL fiyata doğru hareket eder, böylece yeni SL isabet ederse daha az kayıp ve hatta kar olur. Yine de işlemi OrderClose()'a yapacaksanız neden bir SL'niz var? bana göre bu bir takip eden SL değil, herhangi bir türde bir SL değil çünkü ticareti aktif olarak SL değil EA aracılığıyla kapatıyorsunuz.

Belki CloseAllOnSL() işleviniz düşündüğümden farklı bir şey yapar, ancak yine de kazanırsınız, kodunuzun ne yapmaya çalıştığını açıklayan bir yorumunuz yok. OrderModify() olmadığı için izleyen Sl yoktur.

 

Bunu okuyun: İşlev dönüş değerleri nelerdir? Onları nasıl kullanırım?

 if (OrdType == OP_BUY || OrdType==OP_SELL)
              { //32
               while (IsTradeContextBusy()) Sleep (SleepTime);  
                   RefreshRates();
               if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError ();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print ( "OrderClose failed, error# " , GLError);   //<-----  like this  but more info
                 } 
              } //32 

Print ifadesine daha fazla bilgi ekleyin, OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, vb. ekleyin, hata oluştuğunda sorunun ne olduğunu belirlemek için ihtiyacınız olan herhangi bir bilgiyi, kolayca geri dönemezsiniz zaman içinde ve tüm bunları öğrenin, bu yüzden gerçekleştiğinde günlüğe yazdırın.

 
luisneves :


Yani anladığım kadarıyla 07:23'teki düzensiz emir kapanışları olmamalıydı ve herhangi bir hata bulunmadı...

1 - 4951819 2013.01.28 19:51 satmak 0.01 eurusdi 1.34547 1.35047 1.34347 2013.01.29 07:23 1.34347 -0.06 0,00 0,00 1.49
2 - 4952036 2013.01.28 20:04 satın almak 0.03 eurusdi 1.34579 1.34079 1.34779 2013.01.29 07:43 1.34421 -0.17 0,00 -0.04 -3.53
3 - 4952074 2013.01.28 20:12 satmak 0.09 eurusdi 1.34548 1.35048 1.34348 2013.01.29 07:23 1.34348 -0.50 0,00 0,00 13.40
4 - 4952093 2013.01.28 20:20 satın almak 0.27 eurusdi 1.34579 1.34079 1.34779 2013.01.29 07:43 1.34421 -1.49 0,00 -0.38 -31.74
5 - 4952110 2013.01.28 20:27 satmak 0.81 eurusdi 1.34548 1.35048 1.34348 2013.01.29 07:23 1.34348 -4.46 0,00 0,00 120.58
6 - 4952150 2013.01.28 20:48 satın almak 2.43 eurusdi 1.34579 1.34079 1.34779 2013.01.29 07:43 1.34421 -13.37 0,00 -3.43 -285.63
7 - 4959337 2013.01.29 07:23 satmak 7.29 eurusdi 1.34351 1.34851 1.34151 2013.01.29 07:43 1.34424 -40.10 0,00 0,00 -395.89
8 - 4959858 2013.01.29 07:40 satın almak 21.87 eurusdi 1.34382 1.34422 1.34582 2013.01.29 07:43 1.34422 -120.29 0,00 0,00 650.79
9 - 4959860 2013.01.29 07:40 satmak 65.61 eurusdi 1.34382 1.34882 1.34182 2013.01.29 07:43 1.34424 -360.86 0,00 0,00 -2 049,95

Bu olduğunda günlükten çıktıyı göster. . .
 
RaptorUK :

Bunu okuyun: İşlev dönüş değerleri nelerdir? Onları nasıl kullanırım?

Print ifadesine daha fazla bilgi ekleyin, OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, vb. ekleyin, hata oluştuğunda sorunun ne olduğunu belirlemek için ihtiyacınız olan herhangi bir bilgiyi, kolayca geri dönemezsiniz zaman içinde ve tüm bunları öğrenin, bu yüzden gerçekleştiğinde günlüğe yazdırın.


Merhaba RaptorUk,

Zaman ayırdığınız için teşekkürler.

TrailingStop kodu başka bir bölümdedir, gönderilen kod sadece TrailingStop aracılığıyla sipariş kapatıldıktan sonra tümünü kapatmak içindir.

Yine de tavsiyenizin peşinden gidiyorum ve siparişlerin neden diğerlerinden önce kapandığını daha fazla ek bilgi verebilecek herhangi bir hata arıyorum.

Bu arada, aşağıdaki kodda MLots = 0'ın konumunu değiştirmek mantıklıdır; gerçek yerden for döngüsü öncesine kadar?

   MLots = 0 ;  <-----------------------------------------------------------------to here 
   for ( int cnt = 0 ; cnt < OrdersTotal (); cnt++)
      { //11
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))
         { //12
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            { //13
            LastLot = OrderLots();
            } //13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         } //12      
      } //11 
   return ( 0 );
   } //0 

Saygılarımla

Luis

Neden: