Kapanış pozisyonları. Göstergeye göre. - sayfa 5

 
komposter :
kurtulmak :

Sonuç yine aynı! Son seçenek ile sadece son açık pozisyon kapatılır.!

Ve şimdi OrderClose'dan sonraki dönüşü kaldırıyoruz ve sonucu gözlemliyoruz;)

 //----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal () - 1 ; v >= 0 ; v -- )                  {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic )     { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( RVI_1 >= Up_lim &&  RVI_0 < Up_lim )     {
         OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if (( RVI_1_ <= Low_lim ) && ( RVI_0_ > Low_lim ))    {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Belirtildiği gibi kaldırıldı. Ve bir mucize gerçekleşti. Tüm açık pozisyonlar, göstergenin sinyaliyle kapanmaya başladı! Ama neden bu?
 
rid :
kompost :
kurtulmak :

Sonuç yine aynı! Son seçenek ile sadece son açık pozisyon kapatılır.!

Ve şimdi OrderClose'dan sonraki dönüşü kaldırıyoruz ve sonucu gözlemliyoruz;)

 //----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal () - 1 ; v >= 0 ; v -- )                  {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic )     { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( RVI_1 >= Up_lim &&  RVI_0 < Up_lim )     {
         OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if (( RVI_1_ <= Low_lim ) && ( RVI_0_ > Low_lim ))    {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Belirtildiği gibi kaldırıldı. Ve bir mucize gerçekleşti. Tüm açık pozisyonlar, göstergenin sinyaliyle kapanmaya başladı! Ama neden bu?
Dönüşünüz işleme döngüsünü kırıyordu.
 
Anladım. Cevap veren herkese teşekkürler!
 
KimIV :

Genellikle böyle bir şey uygularım:

 //+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions () {
  double sl = 0 , tp = 0 ;
  int    ms [ 2 ] ;
 
  ArrayInitialize ( ms , 0 ) ;
  GetTradeSignal ( ms ) ;
  if ( ExistPositions ( "" , - 1 , Magic )) {
    if ( ms [ 1 ] > 0 ) ClosePositions ( "" , OP_BUY , Magic ) ;
    if ( ms [ 1 ] < 0 ) ClosePositions ( "" , OP_SELL , Magic ) ;
  } else {
    if ( ms [ 0 ] > 0 ) {
      if ( StopLoss > 0 ) sl = Ask - StopLoss * Point ; else sl = 0 ;
      if ( TakeProfit > 0 ) tp = Ask + TakeProfit * Point ; else tp = 0 ;
      OpenPosition ( OP_BUY , sl , tp , Magic ) ;
    }
    if ( ms [ 0 ] < 0 ) {
      if ( StopLoss > 0 ) sl = Bid + StopLoss * Point ; else sl = 0 ;
      if ( TakeProfit > 0 ) tp = Bid - TakeProfit * Point ; else tp = 0 ;
      OpenPosition ( OP_SELL , sl , tp , Magic ) ;
    }
  }
}
Gördüğünüz gibi, oldukça spesifik eylemler gerçekleştiren işlevler yazılmıştır. Daha sonra bu işlevler, pozisyonlarla çalışmak için istenen taktikleri uygulayacak şekilde birleştirilir.
Lütfen, Igor, kısaca, işlevselliğini biraz daha ayrıntılı olarak tanımla. Derine inmek isterdim, ama mütevazı bilgi nedeniyle, en başından beri düşüncemi kaybediyorum.
 
rid писал (а):
Lütfen, Igor, kısaca, işlevselliğini biraz daha ayrıntılı olarak tanımla. Derine inmek isterdim, ama mütevazı bilgi nedeniyle, en başından beri düşüncemi kaybediyorum.

Çalışan bir Uzman Danışmandan alınmış bir örnekti. İşlevlerin amacı:

  1. GetTradeSignal() işlevi, ms[] dizisini ticaret sinyalleriyle doldurur. Elbette her Uzman Danışmanın kendi GetTradeSignal() işlevi doldurması vardır.
  2. ExistPositions() işlevi, konum varlığı bayrağını döndürür.
  3. ClosePositions() işlevi, ms[] dizisinde karşılık gelen bir sinyal varsa bir veya daha fazla konumu kapatır. Kapatmadan önce, bir pozisyonun varlığı if (ExistPositions("", -1, Magic) koşuluyla kontrol edilir).
  4. OpenPosition() işlevi, ms[] dizisinde karşılık gelen bir sinyal varsa, geçerli fiyattan bir konum açar. Bir pozisyon ancak müsait olmadığında açılabilir.

taktikler:

  1. Pozisyonlar varsa ve kapanma sinyali varsa pozisyonları kapatın .
  2. Pozisyon yoksa ve açılma sinyali varsa pozisyonları açın.

Ne kadar basit olduğunu görüyor musun? :-)

 
Evet teşekkür ederim. Çözmeye çalışacağım.
 

Merhaba! Mutlu Noeller!

İşte başka bir sorun geliyor. Teoriyi inceledi. parçası, ama henüz bir çıkış yolu bulamadı. Birkaç nedenden dolayı, EA'daki açık pozisyonları stoplarla (zararı durdur ve kar al) kapatmam gerekiyor, ancak . Yapılmış. Kazanıldı! Yine de...

Expert Advisor'a lot hesaplama kitaplığını (B-lots) eklemeye çalışırken, Expert Advisor'ın anlaşılmaz bir şekilde çalışmaya başladığı ortaya çıktı! MM olmadan denge eğrisi (optimizasyondan sonra) yetersiz bir Düşüş ile güvenle yükseldi, o zaman MM'yi açtıktan sonra - keskin bir düşüş! Üstelik! B-lot kitaplığını koddan kaldırsanız ve parti boyutunu 0,1'den 0,2'ye çıkarsanız bile, o zaman yine keskin bir boşaltma olur. Hatta birkaç ilk mevduat bir artış ile. kez .... yani kütüphanede değil ve depozito boyutunda değil - düşüş başlangıçta yetersiz ... . Pazara şöyle giriyorum:

 //---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if ( Long )    {  //выключатель вкл   
if ( ! ExpertOrder ( MagicLong ))     { //если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "  " , MagicLong , 0 , Blue ) ; 
    if ( ticket < 0 ){ Print ( " Ошибка открытия ордера BUY # " , GetLastError ()) ; return ( 0 ) ; }
              }
              }
Burada her şey açık ve anlaşılır. Daha sonra OrderClose fonksiyonu ile pozisyonları kapatıyorum (... .. Bunun gibi:
 for ( int v = 0 ; v < OrdersTotal () ; v ++ )               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))  {           
        if ( OrderSymbol () == Symbol () )                   { 
//-----------------------------------------------------             
if ( ExpertOrder ( MagicLong ))  {
  if ( OrderProfit () > tp )   { OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; return ( 0 ) ; }
  if ( OrderProfit () <= - sl ) { OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; return ( 0 ) ; }
                               }
}}}
İlk parti = 0.1 ile inşaat iyi çalışıyor! Parti boyutunu değiştirmeye (arttırmaya) veya MM kitaplığını dahil etmeye çalıştığınızda - iş bozulur! Neden olduğunu anlayamıyorum? OrderLots() yerine "Lots"u değiştirdim ama hiçbir şey değişmedi. ... Lütfen söyle bana.?
 
rid :
İlk parti = 0.1 ile inşaat iyi çalışıyor! Parti boyutunu değiştirmeye (arttırmaya) veya MM kitaplığını dahil etmeye çalıştığınızda - iş bozulur! Neden olduğunu anlayamıyorum? OrderLots () yerine "Lots"u değiştirdim ama hiçbir şey değişmedi. ... Lütfen söyle bana.?
Bir uzmanın eylemleri arasındaki farka bakmak gerekir.
Emirler eskisi gibi aynı anda açılıyor/kapanıyor mu?
 

Numara. Partide 0,1'den 0,2'ye bir artışla, işlemler 2 kattan fazla, daha sık gerçekleşmeye başlar! Aynı harici parametrelerle... Garip. Ama tembel olmayın! Böyle mi yaptı:

OrderClose işlevi tarafından kaldırılan pozisyon kapatma ve bilet=OrderSend(... ... ...) işlevinde zararı durdur ve kar al ile normal kapatma sağlandı. Bu durumda, MM bloğu olması gerektiği gibi çalıştı! Her şeyin işlevle ilgili olduğunu görebilirsiniz.

 if ( OrderProfit () > tp )    { OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ;  }
Belki lotu arttırırken "tp" değerini buna göre değiştirmeniz gerekir?
 
Parmağımızı gökyüzüne doğrultalım mı? ;)

Hata kodda. Nerede - bilmiyorum, çünkü. bir kod bile yok. Bir sonraki şubeden falcılara sesleniyoruz ;)
Neden: