KimIV'ten faydalı özellikler - sayfa 57

 

ArrayInsertDouble() işlevi

Verilen dizine dizinin bir öğesini ekler. Yeni dizinin eleman sayısını (boyut) döndürür. Yerleştirme aşağıdaki gibi gerçekleştirilir. İlk olarak, dizinin boyutu bir artırılır. Ardından, dizini eklenen öğenin dizininden büyük veya ona eşit olan tüm öğeler birer birer dizinin sonuna kaydırılır ve eklenen öğeye yer açılır. Son olarak istenilen hücreye değer yazılır. ArrayInsertDouble() işlevi aşağıdaki parametreleri alır:

  • m - double türünde bir dizi öğe.
  • e - Eklenecek dizi öğesinin değeri.
  • i - Eklenecek dizi öğesinin dizini. Dizin değeri sıfırdan küçük veya dizinin boyutundan büyük veya ona eşitse, öğe dizinin sonuna eklenir. Varsayılan değer -1'dir .
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble ( double & m [ ] , double e , int i = - 1 ) {
   int j , k = ArraySize ( m ) ;

   ArrayResize ( m , k + 1 ) ;
   if ( i > = 0 & & i < k ) {
     for ( j = k ; j > i ; j - - ) m [ j ] = m [ j - 1 ] ;
    m [ i ] = e ;
   } else m [ k ] = e ;

   return ( k + 1 ) ;
}

not. Ekli, ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString() işlevlerini test etmek için komut dosyalarıdır.

ZZY. Sitedeki b-Array kitaplığı güncellendi.

 

Igor dizileri yeni aldı, belki dizileri sıralamakla ilgili eski isteğime geri dönelim ( 'KimIV'ten Faydalı işlevler' ). Daha önce yapılan biraz farklı, root olmayan TK için özür dilerim.

İki boyutlu bir diziyi, EXCEL'deki bir işlemin analogu olan belirli bir sütuna (satır) göre sıralamamız gerekiyor. Bu prosedür, korelasyon matrislerinin analizinin bazı varyantlarında Spearman's Rank Correlation istatistiklerini 'Spearman's Rank Correlation' kullanmak için gereklidir. para birimleri (portföyler).

 

BubbleSort2() işlevi.

Bu işlev, rastgele bir sütunla iki boyutlu bir dizinin öğelerinin kabarcık türünü gerçekleştirir. Ayrıca, sıralama yönünü de ayarlayabilirsiniz. BubbleSort2() işlevi aşağıdaki parametreleri alır:

  • a - İki boyutlu bir öğe dizisi. Gerekli parametre.
  • r - Sıralama sütununun (sütun) sayısı (dizin). Varsayılan değer - 0 - ilk sütun (sıfır indeksli sütun).
  • m - Sıralama yönü. Geçerli değerler: MODE_ASCEND - artan, MODE_DESCEND - azalan. Varsayılan değer MODE_ASCEND'dir .
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2 ( double & a [ ] [ ] , int r = 0 , int m = MODE_ASCEND ) {
   double t ;
   int     e , i , j ;
   int     k = ArrayRange ( a , 1 ) ;        // Количество колонок
   int     n = ArrayRange ( a , 0 ) ;        // Количество строк

   if ( r < 0 ) r = 0 ;
   if ( r > k ) r = k ;

   for ( i = n - 1 ; i > 0 ; i - - ) {
     for ( j = 0 ; j < i ; j + + ) {
       if ( m = = MODE_ASCEND ) {
         // по возрастанию
         if ( a [ j ] [ r ] > a [ j + 1 ] [ r ] ) {
           for ( e = 0 ; e < k ; e + + ) {
            t = a [ j ] [ e ] ;
            a [ j ] [ e ] = a [ j + 1 ] [ e ] ;
            a [ j + 1 ] [ e ] = t ;
           }
         }
       } else {
         // по убыванию
         if ( a [ j ] [ r ] < a [ j + 1 ] [ r ] ) {
           for ( e = 0 ; e < k ; e + + ) {
            t = a [ j ] [ e ] ;
            a [ j ] [ e ] = a [ j + 1 ] [ e ] ;
            a [ j + 1 ] [ e ] = t ;
           }
         }
       }
     }
   }
}
not. Ekli, BubbleSort2() işlevini test etmek için bir komut dosyasıdır.
Dosyalar:
 

GetTypeLastDeleted() işlevi.

Bu işlev , son silinen siparişin türünü veya -1'i döndürür. Danışmanın mantığının yeni silinmiş bir siparişin türüne bağlanması gereken durumlar vardır. Örneğin, BuyStop şimdi kaldırılmışsa, bir şey yapın ve BuyLimit ise başka bir şey yapın vb. GetTypeLastDeleted() işlevi, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • sy - Araç adı. "" - herhangi bir karakter, NULL - geçerli karakter. Varsayılan değer "" dir.
  • mn - Özel sipariş kimliği (MagicNumber). Varsayılan değer -1 - herhangi bir büyü.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted ( string sy = "" , int mn = - 1 ) {
   datetime t ;
   int       i , k = OrdersHistoryTotal ( ) , r = - 1 ;

   if ( sy = = "0" ) sy = Symbol ( ) ;
   for ( i = 0 ; i < k ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY ) ) {
       if ( ( OrderSymbol ( ) = = sy | | sy = = "" ) & & ( mn < 0 | | OrderMagicNumber ( ) = = mn ) ) {
         if ( OrderType ( ) > 1 & & OrderType ( ) < 6 & & t < OrderCloseTime ( ) ) {
          t = OrderCloseTime ( ) ;
          r = OrderType ( ) ;
         }
       }
     }
   }
   return ( r ) ;
}
 
beginner писал(а) >>

Evet, şimdi bu

#include "b-KimIV.mqh" // Ek fonksiyonlar kütüphanesi

Merhaba Oleg!

b-Positions.mqh kitaplığını hatasız derlemek için b-kimiv.mqh kitaplığında zaten bu dalda bulunan işlevlere ihtiyacınız olacak:

  • GetNameOP() - Ticari işlem adını döndürür.
  • GetNameTF() - Zaman çerçevesi adını döndürür.
  • IIFc() - Koşullara bağlı olarak iki değerden birini döndürür.
  • Message() - Yorum yapmak ve günlüğe kaydetmek için çıktı mesajı.

Böylece aşağıdakileri yapabilirsiniz:

  1. b-Positions.mqh dosyasının bulunduğu klasörde b-kimiv.mqh adlı boş bir dosya oluşturun.
  2. Yukarıdaki işlevleri içine yapıştırın ve b-Positions.mqh dosyasını derleyin.

İyi şanlar!

 

iBarLargest() işlevi.

Bu işlev, en büyük çubuğun veya -1'in dizinini döndürür. Çubuk boyutu, işlev tarafından, arama öğelerinin türü olan ty giriş parametresi tarafından belirlenen iki yoldan biriyle ölçülür. Ya sadece vücudun büyüklüğü ya da gölgelerle birlikte. iBarLargest() işlevi, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • sy - Araç adı. "" veya NULL geçerli karakterdir. Varsayılan değer "" dir.
  • tf - Zaman çerçevesi. Varsayılan değer - 0 - mevcut zaman dilimi.
  • ty - Arama öğelerinin türü. Geçerli değerler 0 - Yüksek-Düşük, 1 - abs(Aç-Kapat).
  • co - Zaman serisi öğelerinin sayısı. Varsayılan değer 0 - tüm öğeler.
  • in - İlk çubuğun dizini. Varsayılan değer - 0 - geçerli çubuk.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest ( string sy = "" , int tf = 0 , int ty = 0 , int co = 0 , int in = 0 ) {
   if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
   if ( tf < = 0 ) tf = Period ( ) ;
   if ( in < 0 ) in = 0 ;
   if ( co < = 0 ) co = iBars ( sy , tf ) - in ;

   double r , rb = 0 ;        // размер бара
   int     i , nb = - 1 ;        // счётчик и номер бара

   for ( i = co + in ; i > = in ; i - - ) {
     if ( ty > 0 ) r = MathAbs ( iOpen ( sy , tf , i ) - iClose ( sy , tf , i ) ) ;
     else r = iHigh ( sy , tf , i ) - iLow ( sy , tf , i ) ;
     if ( rb < r ) {
      rb = r ;
      nb = i ;
     }
   }

   return ( nb ) ;
}
not. Ekli, iBarLargest() işlevini test etmek için bir komut dosyasıdır.
Dosyalar:
 

iBarOfDayCalc() işlevi.

Bu işlev, günün başlangıcından itibaren hesaplanan çubuk sayısını döndürür. Barlar birden başlayarak numaralandırılır, yani belirli bir günde en kısa açılış süresine sahip bar bir numara, bir sonraki bar iki numara vb. Bu özellik, giriş/çıkış zamanlarını optimize ederken kullanışlıdır. Ayrıntılarla ilgilenen varsa, lütfen soru sorun. cevaplamaya çalışacağım. iBarOfDayCalc() işlevi, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • tf - Zaman çerçevesi. Varsayılan değer - 0 - mevcut zaman dilimi.
  • dt - Çubuğun açılış tarihi ve saati. Varsayılan değer - 0 - geçerli saat.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc ( int tf = 0 , datetime dt = 0 ) {
   if ( tf < = 0 ) tf = Period ( ) ;
   if ( dt < = 0 ) dt = TimeCurrent ( ) ;
   if ( tf > PERIOD_D1 ) {
     Print ( "iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1" ) ;
     return ( 0 ) ;
   }
   double ms = MathMod ( dt / 60 , 1440 ) ;        // количество минут от начала суток
   int     bd = MathFloor ( ms / tf ) + 1 ;          // номер бара от начала суток

   return ( bd ) ;
}

not. Ekli, iBarOfDayCalc() işlevini test etmek için bir komut dosyasıdır. Aşağıdaki şekil, komut dosyasının nasıl kullanıldığını gösterir.

Dosyalar:
 

iBarOfDayReal() işlevi.

Bu işlev, günün başlangıcından itibaren gerçek çubuk numarasını döndürür. Barlar birden başlayarak numaralandırılır, yani belirli bir günde en kısa açılış süresine sahip bar bir numara, bir sonraki bar iki numara vb. Henüz bu işlevin pratik bir uygulamasını bulamadım. Ve :-) iBarOfDayCalc() işleviyle eşleştirilmek için yazdım. iBarOfDayReal() işlevi, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • sy - İşlem aracının adı. NULL veya "" geçerli karakterdir. Varsayılan değer "" dir.
  • tf - Zaman çerçevesi. Varsayılan değer - 0 - mevcut zaman dilimi.
  • dt - Çubuğun açılış tarihi ve saati. Varsayılan değer - 0 - geçerli saat.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal ( string sy = "" , int tf = 0 , datetime dt = 0 ) {
   if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
   if ( tf < = 0 ) tf = Period ( ) ;
   if ( dt < = 0 ) dt = TimeCurrent ( ) ;
   if ( tf > PERIOD_D1 ) {
     Print ( "iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1" ) ;
     return ( 0 ) ;
   }

   int cd = TimeDay ( dt ) ;                        // текущий день месяца
   int nb = iBarShift ( sy , tf , dt , False ) ;        // номер текущего бара
   int bd = 0 ;                                  // номер бара от начала суток

   while ( TimeDay ( iTime ( sy , tf , nb ) ) = = cd ) {
    nb + + ;
    bd + + ;
   }

   return ( bd ) ;
}

not. Ekli, iBarOfDayReal() işlevini test etmek için bir komut dosyasıdır. Aşağıdaki şekil, komut dosyasının nasıl kullanıldığını gösterir.

Dosyalar:
 
KimIV писал(а) >>

iBarOfDayReal() işlevi.

Henüz bu işlevin pratik bir uygulamasını bulamadım.

yy... :)

Burada bir eğitim olarak kat edilen mesafeyi hesaplayacak bir senaryo yazmaya karar verdim.

Bilen varsa farenin monitörde kaç kilometre koştuğunu sayan bir program var.

Yani burada, mevcut günün (hafta, ay veya yıl) açma-kapama çubuklarını ekleyin veya hayal ediyorsanız

farklı olarak, bir kürk manto diken iğneli bir iplik gibi: program boyunca aç-kapa-aç-kapa-aç-kapat ....

Aynı şey ama yüksek-düşük...

*

Takma ilk adımlardan itibaren başladı.

Hesaplama için geçerli günün çubukları nasıl filtrelenir...

Bu şımartma için senin fonksiyonlarını uygulamaya çalışacağım.

 

Igor. Güzel gün.

Belki kendiniz için basit bir görev çizebilirsiniz: ve görev (benim için) şudur:

görev şu şekildedir: sinyal hattının MACD'yi hangi fiyat değerinde geçeceğini veya başka bir deyişle MACD histogramının sıfıra eşit olacağını belirlemek.

Böyle bir sorunun çözümü, örneğin, bu göstergeyi kullanarak bir ticaret sisteminin sinyallerinde bir sonraki çubuk için stop fiyatını veya emir limitini hesaplamak için gereklidir,

MACD histogramının sıfır çizgisini geçeceği fiyat seviyesini görsel olarak gösterecek (yani, bir çizginin fiyatla kesişimi - grafikteki çizgi)

bu, M AC D = (FastEMA/SlowEMA - 1) formülüyle hesaplanan MACD yüzdesi için geçerlidir, buna atıfta bulunur. Periyot 12, 26, sinyal 9.

Omega ve metstock için kodlar var. ama bunu MT4'te nasıl uygulayacağımı henüz hiçbir yerde bulamadım.

Teşekkür ederim