Kapanış pozisyonları. Göstergeye göre.

 

İyi akşamlar! Bir problem vardı.

Pozisyonu kapatmam gerekiyor. Göstergeye göre. Ayrıca. Pozisyonun zarar durdur veya kar al ile de kapatılabilmesi gerekir. (Gösterge sinyalinin çok geç olması durumunda. - Sıklıkla olur) Pozisyonları açarım:

 if                    ( ... ... ...  )         
   {
  ticket = OrderSend ( Symbol () , 0 , Lot , Ask , Slippage , Bid - SL * Point , Ask + TP * Point ,
                                               NULL , MAGIC , 0 , CLR_NONE ) ;

Gelecekte, açık pozisyonları kapatmak için şunları sağlarım:

 for ( int v = 0 ; v < OrdersTotal () ; v ++ )                          {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))             {           
        if ( OrderSymbol () == Symbol ()) && OrderMagicNumber () == MAGIC )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY )                   { 
      if ( Stochast_1 > 75 &&  Stochast_0 < 75 )     {
                   OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; 
                 return ( 0 ) ; // выходим
                }       
               }   
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { ... .... ....

Ancak, pozisyonlar hala sadece zararı durdur veya kârı al ile kapatılır. (çok nadir - tek bir istisna ile!)

Grafikteki gösterge, neredeyse tüm açık pozisyonların tam olarak göstergenin sinyalinde kapatılması gerektiğini gösterse de. Lütfen. hata nerede olabilir söyler misiniz...?

 

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.
 
muhtemelen Stochast_1, Stochast_0 ile ilgili bir şey, diğer her şey yolunda
 
Teşekkürler, Kim IV. Çözmeye çalışacağım.
 
Integer :
muhtemelen Stochast_1, Stochast_0 ile ilgili bir şey, diğer her şey yolunda


Hayır..... Stokastik ile - her şey yolunda. ( açılış fiyatlarında çalışmak)

 double Stochast_0 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double Stochast_1 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
 
Bai bir teklifle kapatır. Bu durumda, kapanış yalnızca son alıntıların akışı yanlışlıkla belirtilenden yayılma ile farklı bir fiyat teklifi içeriyorsa tetiklenir. Böyle bir teklif henüz (yaşlılık nedeniyle) komisyoncu tarafından değerlendirilen teklifler listesinden çıkmayı başaramadıysa, kapatma emrinin uygulanma şansı vardır.
 

Seni doğru anladım mı? Bai pozisyonu kapatılmalı

OrderClose (OrderTicket(),OrderLots(),Bid,3,Yeşil);

Ve Satış pozisyonu kapatılmalıdır:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Yeşil); ?
 
rid :

Seni doğru anladım mı?

Genel olarak doğru.

 
Aynen öyle! Sor'da Sorun
 

Yine de, stokastiklere göre pozisyonları kapatmak istemiyorlar! Hepsini çalıştırdı! Harici parametrelere bir anahtar ekledim. Kodun sonunda - pozisyonları kapatmak için ayrı bir blok! Kapatma yeşil bir üçgen tarafından sağlandı.

Taktik basittir - hızlı MA, yavaş MA tarafından oluşturulan kanalın sınırlarını yukarı ve aşağı sapma ile geçer. Kod basit. Danışman İndirmede - aşağıda.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
 //********* Закрытие позиций ****************************************
if ( AutoClose ) {  
//----переменные для закрытия позиций ----
double Stochast_0 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double Stochast_1 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
//----------------------------------------------------------------------
  for ( int v = 0 ; v < OrdersTotal () ; v ++ )                             {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == MagicNum )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( Stochast_1 > 75 && Stochast_0 < 75 )     {
           OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим
                }       
     }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if ( Stochast_1 < 25 && Stochast_0 > 25 )    {
                 OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Yapabilir. kim bakacak? Ve bana neler olduğunu söyle...

Belki de emirleri açarken büyükler ve talepler yanlış yerleştirilmişti? Her zaman bununla karıştırılır:

bilet= SiparişGönder (Symbol(),... ....
Dosyalar:
 
Koda bakmadım.
Ama bir şeyi kesin olarak düzeltirdim: "if(Stochast_1>75 && Stochast_0<75)" yerine "if(Stochast_1>75 && Stochast_0 <= 75)" yapardım.
Neden: