KimIV'ten faydalı özellikler - sayfa 18

 
rid писал (а):
MA. Hızlı. Tam olarak bir gün tutacağım - sonra sileceğim!

Silmeye gerek yok! Bırak kalsın...

 

Igor, her şeyden önce, işlevleriniz için teşekkür ederim ve bu konu için profesyonel olmayan birçok programcıya yardımcı oluyorlar. Ama size NumberOfOrders() işlevi hakkında bir soru sormak istiyorum. Bir türlü çalıştıramıyorum. Nasıl kullandığımın bir örneği olarak, onu standart bir MACD Expert Advisor'a dahil ettim. Kodu ekliyorum:

Kısaca açıklanan, orada değiştirilir:

 // в стандартной версии  
total = OrdersTotal () ;
   if ( total < 1 ) 
     {
// бла бла бла ...
 // в моей версии эксперта
   total = OrdersTotal () ; // total я оставил т.к. он используется дальше
   if ( NumberOfOrders ( NULL ,- 1 ,- 1 ) < 1 ) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders () ниже
Doğal olarak, bu işe yaramaz. Neyin yanlış olduğunu açıklayabilir misiniz? Şimdiden teşekkürler.
Dosyalar:
 
seifer писал (а):
Neyin yanlış olduğunu açıklayabilir misiniz? Şimdiden teşekkürler.

İki açıklama:

1. Ben şöyle yapardım:

 total = NumberOfOrders ( NULL ) ;
if ( total < 1 ) {
  ...
}
2. NumberOfOrders() işlevi emirlerin sayısını döndürür - BuyLimit, BuyStop, SellLimit ve SellStop türlerinin alım satım işlemleri. Emirlerle değiştirdiğiniz Expert Advisor çalışmıyor. Piyasa fiyatlarından pozisyon açar, yani Al-Sat gibi ticari işlemler yapar. Bir sonraki gönderide paylaşacağım NumberOfPositions() fonksiyonunu kullanmanız gerekiyor.
 

NumberOfPositions() işlevi.

Bu işlev, o anda açık olan pozisyonların sayısını döndürür. Sayılan konumları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.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   int i , k = OrdersTotal () , kp = 0 ;

   if ( sy == " 0 " ) sy = Symbol () ;
   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 ) kp ++;
           }
         }
       }
     }
   }
   return ( kp ) ;
}
ZY Ekli, NumberOfPositions() işlevini test etmek için bir komut dosyasıdır.
Dosyalar:
 

Vay! Bu tasarımı düşündüm:

       ...
       ot = OrderType () ;
       if ( ot > 1 && ot < 6 ) {
      ...
tüm pozisyonları yineleyin (OP_SELL ve OP_BUY dahil). Şimdi her şey çalışıyor. Tekrar teşekkürler!
 

GetProfitFromDateInCurrency() işlevi.

Bu fonksiyon, belirli bir tarihten itibaren kapatılan pozisyonların mevduat para birimi cinsinden toplam kârını döndürür. 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.
  • dt - 1970'den bu yana saniye cinsinden tarih ve saat. Varsayılan değer - 0 , geçmişte mevcut olan tüm pozisyonların dikkate alınması anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency ( string sy = "" , int op =- 1 , int mn =- 1 , datetime dt = 0 )
{
   double p = 0 ;
   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 == "" ) && ( op < 0 || OrderType () == op )) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( mn < 0 || OrderMagicNumber () == mn ) {
             if ( dt < OrderCloseTime ()) {
               p += OrderProfit () + OrderCommission () + OrderSwap () ;
             }
           }
         }
       }
     }
   }
   return ( p ) ;
}

not. GetProfitFromDateInCurrency() işlevini test etmek için bir komut dosyası ektedir.

Farklı zaman dilimleri için mutlak ve yüzde kâr değerlerini gösteren i-Profit göstergesi örneğini kullanarak bu işlevin kullanımında ustalaşmak daha pratiktir.

 

Merhaba Igor.

Korelasyondaki f-th için teşekkür etmek istiyorum. Bazı seçeneklerim vardı, onları netleştirmek istedim)

Burada başka bir soru var. Testte çok sık ve hatta danışmanı gerçek zamanlı olarak test ederken bile 130 hatasıyla karşılaşıyorum - yanlış durma. Analiz etmediğim için, neden şu veya bu durumda ortaya çıktığını anlayamıyorum. Böyle bir yapı kullanmaya başladım

   double md = MarketInfo ( Symbol () , MODE_TICKSIZE ) ;
   return ( NormalizeDouble ( Value / md , 0 ) * md ) ;

tabiri caizse dur kalk değerleri normalleştirmek ama bu durumu çözmedi. Belki buna benzer bir şeyle karşılaşmışsınızdır. bana bununla nasıl başa çıkacağımı söyle) ve en iyi nasıl analiz edeceğimi

Açıklama: Açık fiyattan +1 p'de bir durdurma belirlemeye çalıştığımda bu çok sık başıma geliyor

 
scorpionk писал (а):
131 hatasıyla karşılaşıyorum - geçersiz durdurma.

131 - Yanlış hacim, hacim granülasyonunda hata. Bu işlem gören lot büyüklüğüdür.

 
KimIV :
scorpionk yazdı:
131 hatasıyla karşılaşıyorum - geçersiz durdurma.

131 - Yanlış hacim, hacim granülasyonunda hata. Bu işlem gören lot büyüklüğüdür.

kodda hata yaptı, 131 değil 130

 
scorpionk :

kodda hata yaptı, 131 değil 130

Apaçık...

Bu şekilde normalleştirmeyi deneyin:

 int dg = MarketInfo ( Symbol () , MODE_DIGITS ) ;
return ( NormalizeDouble ( Value , dg )) ;
Bunu yapıyorum ve 130 hatasıyla karşılaşmıyorum.