KimIV'ten faydalı özellikler - sayfa 21

 

isCloseLastPosByStop() işlevi.

Bu işlev, durarak son konumu kapatmak için bayrağı döndürür. İşaret kaldırıldı - Doğru - StopLoss tetiklendi. Bayrak atlandı - Yanlış - pozisyon başka bir nedenle kapatıldı. Dikkate alınacak pozisyonların daha doğru seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer "" herhangi bir piyasa aracı anlamına gelir. NULL , geçerli enstrüman anlamına gelir.
  • op - Ticaret işlemi, pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   double    ocp , osl ;
   int        dg , i , j =- 1 , k = OrdersHistoryTotal () ;

   if ( sy == " 0 " ) sy = Symbol () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol () == sy || sy == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( t < OrderCloseTime ()) {
                 t = OrderCloseTime () ;
                 j = i ;
               }
             }
           }
         }
       }
     }
   }
   if ( OrderSelect ( j , SELECT_BY_POS , MODE_HISTORY )) {
     dg = MarketInfo ( sy , MODE_DIGITS ) ;
     if ( dg == 0 ) if ( StringFind ( OrderSymbol () , " JPY " ) < 0 ) dg = 4 ; else dg = 2 ;
     ocp = NormalizeDouble ( OrderClosePrice () , dg ) ;
     osl = NormalizeDouble ( OrderStopLoss () , dg ) ;
     if ( ocp == osl ) return ( True ) ;
   }
   return ( False ) ;
}
PS Ekli, isCloseLastPosByStop() işlevini test etmek için bir komut dosyasıdır.
 
Lukyanov :
Kim IV :

Çevrimiçi için OpenPosition() işlevi.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition ( string sy , int op , double ll , double sl = 0 , double tp = 0 , int mn = 0 ) {
//-- skip --
  string   lsComm = WindowExpertName () + " " + GetNameTF ( Period ()) ;
//-- skip -- 
Canlı bir EA'da OpenPosition() işlevi bağlandı, hata 4059, NULL olarak Symbol() olarak değiştirildi, kayboldu, sonra bir mesaj belirdi
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: uzman durduruldu
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: uzman fonksiyon çağrılarına izin verilmez; 'stdlib'-'Hata Açıklaması'
orijinale döndü, her şey çalışıyor... (include klasöründeki stdlib.mqh && stderror.mqh temel MT dağıtımından alınmıştır)
 
teraptor2 писал (а):
Canlı EA'da OpenPosition() işlevi bağlandı, hata 4059

Hata 4059 , özelliğin test modunda kullanılamadığı anlamına gelir. Hata kimliği ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. Aşağıdaki işlevler bir hata oluşturur: MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.

teraptor2 yazdı:
NULL'u Symbol() olarak değiştirdi, kayboldu, sonra mesaj belirdi
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: uzman durduruldu
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: uzman fonksiyon çağrılarına izin verilmez; 'stdlib'-'Hata Açıklaması'
 

isCloseLastPosByTake() işlevi.

Bu fonksiyon, son pozisyonu al ile kapatmak için bayrağı döndürür. Bayrak kaldırıldı - Doğru - TakeProfit çalıştı. Bayrak atlandı - Yanlış - pozisyon başka bir nedenle kapatıldı. Dikkate alınacak pozisyonların daha doğru seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer "" herhangi bir piyasa aracı anlamına gelir. NULL , geçerli enstrüman anlamına gelir.
  • op - Ticaret işlemi, pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   double    ocp , otp ;
   int        dg , i , j =- 1 , k = OrdersHistoryTotal () ;

   if ( sy == " 0 " ) sy = Symbol () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol () == sy || sy == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( t < OrderCloseTime ()) {
                 t = OrderCloseTime () ;
                 j = i ;
               }
             }
           }
         }
       }
     }
   }
   if ( OrderSelect ( j , SELECT_BY_POS , MODE_HISTORY )) {
     dg = MarketInfo ( sy , MODE_DIGITS ) ;
     if ( dg == 0 ) if ( StringFind ( OrderSymbol () , " JPY " ) < 0 ) dg = 4 ; else dg = 2 ;
     ocp = NormalizeDouble ( OrderClosePrice () , dg ) ;
     otp = NormalizeDouble ( OrderTakeProfit () , dg ) ;
     if ( ocp == otp ) return ( True ) ;
   }
   return ( False ) ;
}
not. Ekli, isCloseLastPosByTake() işlevini test etmek için bir komut dosyasıdır.
 

isLossLastPos() işlevi.

Bu işlev, son kapatılan pozisyonun kârsızlık bayrağını döndürür. Bayrak kaldırıldı - Doğru - son pozisyon bir kayıpla kapatıldı. Bayrak atlandı - Yanlış - son pozisyon ya sıfırdan ya da kârla kapatıldı. İşlev, takasları ve komisyonu hesaba katmaz. Konum seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer "" herhangi bir piyasa aracı anlamına gelir. NULL , geçerli enstrüman anlamına gelir.
  • op - Ticaret işlemi, pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   int        i , j =- 1 , k = OrdersHistoryTotal () ;

   if ( sy == " 0 " ) sy = Symbol () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol () == sy || sy == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( t < OrderCloseTime ()) {
                 t = OrderCloseTime () ;
                 j = i ;
               }
             }
           }
         }
       }
     }
   }
   if ( OrderSelect ( j , SELECT_BY_POS , MODE_HISTORY )) {
     if ( OrderProfit () < 0 ) return ( True ) ;
   }
   return ( False ) ;
}
PS Ekli, isLossLastPos() işlevini test etmek için bir komut dosyasıdır.
Dosyalar:
 

isTradeToDay() işlevi.

Bu işlev, bugünün ticari bayrağını döndürür. Bayrak kaldırdı - Doğru - pozisyonlar bugün açıldı. Bayrak atlandı - Yanlış - bugün hiç pozisyon açılmadı. Dikkate alınacak pozisyonların seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer "" herhangi bir piyasa aracı anlamına gelir. NULL , geçerli enstrüman anlamına gelir.
  • op - Ticaret işlemi, pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   int i , k = OrdersHistoryTotal () ;

   if ( sy == " 0 " ) sy = Symbol () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol () == sy || sy == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( TimeDay    ( OrderOpenTime ()) == Day ()
              &&   TimeMonth ( OrderOpenTime ()) == Month ()
              &&   TimeYear ( OrderOpenTime ()) == Year ()) return ( True ) ;
             }
           }
         }
       }
     }
   }
   k = OrdersTotal () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
       if ( OrderSymbol () == sy || sy == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( TimeDay    ( OrderOpenTime ()) == Day ()
              &&   TimeMonth ( OrderOpenTime ()) == Month ()
              &&   TimeYear ( OrderOpenTime ()) == Year ()) return ( True ) ;
             }
           }
         }
       }
     }
   }
   return ( False ) ;
}
not. Ekli, isTradeToDay() işlevini test etmek için bir komut dosyasıdır.
Dosyalar:
 
KimIV :

isCloseLastPosByStop() işlevi.

Bu işlev, durarak son konumu kapatmak için bayrağı döndürür. İşaret kaldırıldı - Doğru - StopLoss tetiklendi. Bayrak atlandı - Yanlış - pozisyon başka bir nedenle kapatıldı. Dikkate alınacak pozisyonların daha doğru seçimi harici parametreler tarafından belirlenir:

().

Tünaydın . Kodu bu işlevle uygularken anlaşılmazlık ortaya çıktı. Bu işlevi şu şekilde uyguladım:

 if ( isCloseLastPosByStop ( NULL , OP_BUY , MagicLong1 ))                {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
   for ( int rb_ = OrdersTotal () - 1 ; rb_ >= 0 ; rb_ -- )                  {        
       if ( OrderSelect ( rb_ , SELECT_BY_POS , MODE_TRADES ))                  { 
       //выбираем среди открытых и отложенных ордеров          
       if ( ( OrderSymbol () == Symbol ()) && ( OrderMagicNumber () == MagicLong1 ))    {
         //закрываем все остальные позиции BUY
         OrderClose ( OrderTicket () , OrderLots () , Bid ,ОтклонениеЦены, Black ) ;
       OrderDelete ( OrderTicket ()) ; // и удаляем BUY-отложки   
         //  return(0); // выходим     
         }}}}

Bu noktaya kadar her şey yolunda gidiyor! Bayrak göründüğünde, istediğim gibi tüm AL pozisyonları kapatılır ve AL pozisyonları silinir! Ancak daha sonra uzman, giriş sinyallerine göre tekrar bekleyen emirler verir. Beklenildiği gibi.

Ancak bu siparişler hemen silinir! Görünüşe göre bayrak hala duruyor. Neden asılı? Ne de olsa, son pozisyonlar artık zararı durdurarak değil, zorla kapatılmıştı!

Böyle bir durumda nasıl olmalıyım? Böylece, bu algoritmayı kapatma komutunu yürüttükten sonra, uzman normal olarak diğer emirlerini verebilir mi?

 
rid писал (а):
Böyle bir durumda nasıl olmalıyım? Kapatma komutunun yerine getirilmesinden sonra, uzman normalde başka emirler verebilir mi?

Bu konunun tüm görev bağlamında ele alınması gerekir, çünkü bu sadece ayrı bir eylem değil, etkileşim ve belirli bir sırayla anlamına gelir. Bu nedenle, sorunu tam olarak tanımlayın. Kod gerekmez. Sadece görevi kelimelerle tanımlayın.

Isınma sorusu. Neden siparişleri silip tekrar yerleştirmeniz gerekiyor? Değiştirilmesi daha uygun bence.

 

Kar, zarar ve zararı durdurmaya göre dizilere ayrılmış emirler ve pozisyonlarım var. ve lim. ve benzeri. sebepler.

Bu özel durumda, stop ile açılan ve toplamda belirtilen karı elde ettiğim ALIŞ pozisyonları dizisini kapatıyorum. Ve kalan, işlenmemiş stop mevduatlarını siliyorum.

//------------------------------------------------ -------------------------------------------------- --

 

Şimdi yoruma bir fonksiyon ekledim - Comment (isCloseLastPosByStop());

İzliyorum. Başlangıçta işlev =0. İlk stop kaybından sonra Yorum (isCloseLastPosByStop()); bir değişir ve sonra - diğer pozisyonların zorla kapatılmasından sonra sıfıra dönmez, ancak bir kalmaya devam eder!

Neden: