Yalnızca "KimIV'ten Faydalı özellikler". - sayfa 8

 

TakeProfitLastClosePos() işlevi.

Son kapatılan pozisyonun TakeProfit fiyat seviyesini veya -1 döndürür. TakeProfitLastClosePos() 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.
  • op - Ticaret işlemi. Geçerli değerler: -1 , OP_BUY , OP_SELL . Varsayılan değer -1 - herhangi bir işlemdir.
  • mn - Ticaret işlemlerinin tanımlayıcısı, MagicNumber. Varsayılan değer -1 - herhangi bir büyü.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.10.2008                                                     |
//|  Описание : Возвращает цену TakeProfit последней закрытой позиций или -1.  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double TakeProfitLastClosePos( string sy= "" , int op=- 1 , int mn=- 1 ) {
   datetime t;
   double    r=- 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 (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
   return (r);
}

MovingInWL() işlevi.

Açık pozisyonların StopLoss fiyat seviyesini başa baş noktasına taşır. MovingInWL() 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.
  • op - Ticaret işlemi. Geçerli değerler: -1 , OP_BUY , OP_SELL . Varsayılan değer -1 - herhangi bir işlemdir.
  • mn - Ticaret işlemlerinin tanımlayıcısı, MagicNumber . Varsayılan değer -1 - herhangi bir büyü.

Ek olarak, MovingInWL() işlevi, global değişkenlerin (bir komut dosyasının veya bir Uzman Danışmanın harici parametreleri) varlığını varsayar:

  • int LevelProfit - Duruşunun başabaş seviyesine taşınması için pozisyonun ulaşması gereken puan cinsinden kar seviyesi.
  • int LevelWLoss - Karı puan olarak LevelProfit düzeyine ulaştıktan sonra pozisyonun durdurulacağı noktalarda başabaş düzeyi.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double po, pp;
   int     i, k= OrdersTotal ();

   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
       if (OrderType()==OP_BUY) {
         if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
           if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(- 1 , OrderOpenPrice()+LevelWLoss*po, - 1 );
          }
        }
      }
       if (OrderType()==OP_SELL) {
         if (OrderStopLoss()== 0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
           if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(- 1 , OrderOpenPrice()-LevelWLoss*po, - 1 );
          }
        }
      }
    }
  }
}
 

SimpleTrailing() işlevi.

Açık pozisyonların StopLoss fiyat seviyesini TrailingStop algoritmasına göre hareket ettirir. SimpleTrailing() işlevi aşağıdaki isteğe bağlı parametreleri alır:

  • sy - Araç adı. "" - herhangi bir karakter, NULL - geçerli karakter. Varsayılan değer "" dir.
  • op - Ticaret işlemi. Geçerli değerler: -1 , OP_BUY , OP_SELL . Varsayılan değer -1 - herhangi bir işlemdir.
  • mn - Ticaret işlemlerinin tanımlayıcısı, MagicNumber. Varsayılan değer -1 - herhangi bir büyü.

Ayrıca SimpleTrailing() işlevi, global değişkenlerin (bir komut dosyasının veya bir Uzman Danışmanın harici parametreleri) varlığını varsayar:

  • bool TSProfitOnly - Trolün çalışmaya başladığı bölgeyi değiştir. True ise, takip yalnızca pozisyon karı TStop.Buy/Sell+TrailingStep puanlarının değerine ulaştıktan sonra çalışmaya başlar. False ise, EA, pozisyonun mevcut fiyata göre durmasının her zaman TStop.Buy/Sell+TrailingStep puanlarından daha fazla olmamasını sağlayacaktır. Başka bir deyişle, True ise EA yalnızca pozisyonun kar bölgesinde, False ise negatif bölgede çalışır.
  • int TStop.Buy - Satın almalar için puan cinsinden trol boyutu.
  • int TStop.Sell - Satış için puan olarak trolün boyutu.
  • int TrailingStep - Nokta cinsinden takip eden adım. Satıcıyı sık sık taleplerle eziyet etmemek için gereklidir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Сопровождение позиций простым тралом                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void SimpleTrailing( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double po, pp;
   int     i, k= OrdersTotal ();

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
         if (mn< 0 || OrderMagicNumber()==mn) {
           if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
             if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) {
               if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep- 1 )*po) {
                ModifyOrder(- 1 , pp-TStop.Buy*po, - 1 );
              }
            }
          }
           if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
             if (!TSProfitOnly || OrderOpenPrice()-pp>TStop.Sell*po) {
               if (OrderStopLoss()>pp+(TStop.Sell+TrailingStep- 1 )*po || OrderStopLoss()== 0 ) {
                ModifyOrder(- 1 , pp+TStop.Sell*po, - 1 );
              }
            }
          }
        }
      }
    }
  }
}

ArrayZ() işlevi.

Bu işlev, dizide geçen sayı serisinin Z-skorunu başvuruya göre hesaplar ve döndürür.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.10.2008                                                     |
//|  Описание : Возвращает Z-счёт числового ряда.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    arr - массив значений числового ряда                                    |
//+----------------------------------------------------------------------------+
double ArrayZ( double & arr[]) {
   double x, z;
   int     i, l= 0 , n= ArraySize (arr), r= 1 , w= 0 ;

   for (i= 0 ; i<n; i++) {
     if (i== 0 ) r= 1 ;
     else {
       if (arr[i- 1 ]*arr[i]< 0 ) r++;
    }
     if (arr[i]> 0 ) w++; else l++;
  }

   if (n> 2 ) {
     if (w> 0 && l> 0 ) {
      x= 2 *w*l;
       if (x!=n) z=(n*(r- 0.5 )-x)/ MathSqrt (x*(x-n)/(n- 1 ));
    } else {
       if (l== 0 ) z= 100 ; else z=- 100 ;
       Print ( "ArrayZ(): Нет чередования серий!" );
    }
     return (z);
  } else {
     Print ( "ArrayZ(): В массиве недостаточно элементов!" );
     return ( 0 );
  }
}
 

ArrayDeleteInt() işlevi

Verilen dizindeki dizi öğesini siler. Yeni dizinin boyutunu veya hiçbir şey kaldırılamıyorsa -1'i döndürür. ArrayDeleteInt() işlevi, aşağıdaki gerekli parametreleri alır:

  • m - Bir dizi öğe.
  • i - Dizi öğesinin dizini.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteInt( int & m[], int i) {
   int j, k= ArraySize (m);

   if (i>= 0 && i<k) {
     for (j=i; j<k; j++) m[j]=m[j+ 1 ];
    k= ArrayResize (m, k- 1 );
     return (k);
  } else Print ( "ArrayDeleteInt(): Неверный индекс элемента массива! i=" , i);

   return (- 1 );
}

ArrayDeleteDouble() işlevi

Verilen dizindeki dizi öğesini siler. Yeni dizinin boyutunu veya hiçbir şey kaldırılamıyorsa -1'i döndürür. ArrayDeleteDouble() işlevi, aşağıdaki gerekli parametreleri alır:

  • m - double türünde bir dizi öğe.
  • i - Dizi öğesinin dizini.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteDouble( double & m[], int i) {
   int j, k= ArraySize (m);

   if (i>= 0 && i<k) {
     for (j=i; j<k; j++) m[j]=m[j+ 1 ];
    k= ArrayResize (m, k- 1 );
     return (k);
  } else Print ( "ArrayDeleteDouble(): Неверный индекс элемента массива! i=" , i);

   return (- 1 );
}
 

ArrayDeleteString() işlevi

Verilen dizindeki dizi öğesini siler. Yeni dizinin boyutunu veya hiçbir şey kaldırılamıyorsa -1'i döndürür. ArrayDeleteString() işlevi, aşağıdaki gerekli parametreleri alır:

  • m - string türünde bir dizi eleman.
  • i - Dizi öğesinin dizini.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteString( string & m[], int i) {
   int j, k= ArraySize (m);

   if (i>= 0 && i<k) {
     for (j=i; j<k; j++) m[j]=m[j+ 1 ];
    k= ArrayResize (m, k- 1 );
     return (k);
  } else Print ( "ArrayDeleteString(): Неверный индекс элемента массива! i=" , i);

   return (- 1 );
}

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 );
}
 

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;
          }
        }
      }
    }
  }
}

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);
}
 

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);
}

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:

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

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);
}

NameDayOfWeek() işlevi

Parametre olarak geçirilen sayıya göre haftanın gününün adını döndürür:

  • ndw - Haftanın gün sayısı. Gerekli parametre.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование дня недели                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ndw - номер дня недели                                                  |
//+----------------------------------------------------------------------------+
string NameDayOfWeek( int ndw) {
   if (ndw== 0 ) return ( "Воскресенье" );
   if (ndw== 1 ) return ( "Понедельник" );
   if (ndw== 2 ) return ( "Вторник" );
   if (ndw== 3 ) return ( "Среда" );
   if (ndw== 4 ) return ( "Четверг" );
   if (ndw== 5 ) return ( "Пятница" );
   if (ndw== 6 ) return ( "Суббота" );
}
 

NormalizeLot() işlevi.

Bu fonksiyon, işlem gören lotun normalleştirilmiş değerini döndürür. Normalleştirmeye ek olarak, fonksiyon parti büyüklüğünü de işlem merkezi tarafından belirlenen limitler dahilinde tutar (minimum ve maksimum parti değerlerinin yanı sıra parti değiştirme adımı kontrol edilir). NormalizeLot() işlevi aşağıdaki parametreleri alır:

  • lo - Normalleştirilecek lot değeri. Gerekli parametre.
  • ro - Yuvarlama yöntemi. Yanlış - aşağı, Doğru - yukarı. Varsayılan değer False - down şeklindedir.
  • sy - İşlem aracının adı. NULL veya "" geçerli karakterdir. Varsayılan değer "" dir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot( double lo, bool ro=False, string sy= "" ) {
   double l, k;
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double ls=MarketInfo(sy, MODE_LOTSTEP);
   double ml=MarketInfo(sy, MODE_MINLOT);
   double mx=MarketInfo(sy, MODE_MAXLOT);

   if (ml== 0 ) ml= 0.1 ;
   if (mx== 0 ) mx= 100 ;

   if (ls> 0 ) k= 1 /ls; else k= 1 /ml;
   if (ro) l= MathCeil (lo*k)/k; else l= MathFloor (lo*k)/k;

   if (l<ml) l=ml;
   if (l>mx) l=mx;

   return (l);
}

NormalizePrice() işlevi.

Bu işlev, normalleştirilmiş fiyat değerini döndürür. Normalleştirme, MarketInfo(MODE_TICKSIZE || MODE_DIGITS) fonksiyonunun değerleri kullanılarak gerçekleştirilir. NormalizePrice() işlevi aşağıdaki parametreleri alır:

  • np - Normalleştirilecek parti değeri. Gerekli parametre.
  • sy - İşlem aracının adı. NULL veya "" geçerli karakterdir. Varsayılan değer "" dir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.08.2008                                                     |
//|  Описание : Возвращает нормализованное под размер тика значение цены.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    np - нормализуемое значение цены.                                       |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//+----------------------------------------------------------------------------+
double NormalizePrice( double np, string sy= "" ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double pp, ts=MarketInfo( Symbol (), MODE_TICKSIZE);
   int     di=MarketInfo( Symbol (), MODE_DIGITS);

   if (ts> 0 ) pp= NormalizeDouble (np/ts, 0 )*ts;
   else {
     if (di> 0 ) pp= NormalizeDouble (np*di, 0 )/di; else pp=np;
  }
   return (pp);
}
 

WeekOfMonth() işlevi.

Bu fonksiyon, bir tarih verilen ayın hafta numarasını döndürür. Yalnızca bir isteğe bağlı parametre alır:

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth( datetime dt= 0 ) {
   if (dt<= 0 ) dt= TimeCurrent ();
   datetime d;
   int       i, kd=TimeDay(dt), nn= 1 ;

   for (i= 2 ; i<=kd; i++) {
    d=StrToTime(TimeYear(dt)+ "." +TimeMonth(dt)+ "." +i);
     if (TimeDayOfWeek(d)== 1 ) nn++;
  }
   return (nn);
}

ClosePosBySortLots() işlevi.

Bu fonksiyon, pozisyonları lot büyüklüğüne göre sıralama düzeninde kapatır. Yani bu fonksiyonu kullanarak parti büyüklüğünün artan veya azalan sırasına göre pozisyonları kapatabilirsiniz. ClosePosBySortLots() işlevi, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • sy - İşlem aracının adı. "" - herhangi bir enstrüman, NULL - geçerli enstrüman. Varsayılan değer "" dir.
  • op - Ticaret işlemi türü. Geçerli değerler -1 - herhangi bir pozisyon, OP_BUY - satın alır, OP_SELL - satar. Varsayılan değer -1'dir .
  • mn - MagicNumber, bir ticaret işleminin benzersiz tanımlayıcısı. Varsayılan değer -1 - herhangi bir büyü.
  • sd - Parti büyüklüğü sıralama yönü. MODE_ASCEND için geçerli değerler artıyor, MODE_DESCEND azalıyor . Varsayılan değer MODE_DESCEND'dir .
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots( string sy= "" , int op=- 1 , int mn=- 1 , int sd=MODE_DESCEND) {
   double a[][ 2 ];                   // Массив лотов и тикетов
   int     i, k= OrdersTotal ();       // Счётчик и количество ордеров
   int     p= 0 ;                     // Количество позиций

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (mn< 0 || OrderMagicNumber()==mn) {
            p++;
             ArrayResize (a, p);
            a[p- 1 ][ 0 ]=OrderLots();
            a[p- 1 ][ 1 ]=OrderTicket();
          }
        }
      }
    }
  }

   // вдруг позиций нету, тогда и закрывать нечего
   if (p> 0 ) {
     ArraySort (a, WHOLE_ARRAY , 0 , sd);
     for (i= 0 ; i<p; i++) {
       if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET)) {
         // проверим незакрытость на всякий случай,
         // может какая-то позиция уже закрылась по стопу/тейку
         if (OrderCloseTime()== 0 ) ClosePosBySelect();
      }
    }
  }
}
 

AddLeadingZero() işlevi.

Bu işlev, dizenin uzunluğunun belirtilen bir değere eşit olması için dizeye baştaki (sol) sıfır "0" ekler. AddLeadingZero() işlevi, aşağıdaki gerekli parametreleri alır:

  • s - Başına sıfırlar eklenecek dize.
  • k - Elde edilen S dizisinin uzunluğu.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero( string s, int k) {
   while ( StringLen (s)<k) s= StringConcatenate ( "0" , s);
   return (s);
}

toTime() işlevi.

Bu işlev, iki/üç tamsayıyı zaman biçiminde bir dizeye dönüştürür. İşleve iki sayı iletilirse, bunlardan ilki saat, ikincisi - dakika olarak kullanılır. "HH:MM" biçiminde bir dize döndürülecektir. Üç sayı olması durumunda, üçüncüsü saniye yerine konur ve işlev "SS:DD:SS" biçim dizesini döndürür. toTime() işlevi aşağıdaki isteğe bağlı parametreleri alır:

  • h - Saatler. Varsayılan değer 0'dır .
  • m - Dakika. Varsayılan değer 0'dır .
  • s - Saniye. 0 - kullanmayın. Varsayılan değer 0'dır .
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime( int h= 0 , int m= 0 , int s= 0 ) {
   string st= "" ;

   if (h== 0 ) st= "00:" ;
   else       st= StringConcatenate (AddLeadingZero(h, 2 ), ":" );

   if (m== 0 ) st= StringConcatenate (st, "00" );
   else       st= StringConcatenate (st, AddLeadingZero(m, 2 ));

   if (s!= 0 ) st= StringConcatenate (st, ":" , AddLeadingZero(s, 2 ));

   return (st);
}
Neden: