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

 

CorrectTF() işlevi.

Bu işlevi, bazen bir göstergenin veya danışmanın giriş parametrelerinde, tam bir dakika sayısına eşit olan yanlış zaman dilimini kolayca belirleyebildiğimi keşfettikten sonra yazdım. Örneğin, saat için 60 yerine 50 girdim. Şey... bir nevi kaçırdım. Böylece, iRSI() işlevinin yanlış zaman çerçevesi için sıfır döndürdüğü ortaya çıktı. Diğer işlevler hakkında hiçbir şey söylemeyeceğim çünkü kontrol etmedim. Ve dikkatsizlikten kaynaklanan kendi hatalarımdan kaynaklanan can sıkıcı yanlış anlamaları önlemek için, bu işlevi "aptallara" karşı temel bir koruma olarak yazdım. Girdi parametresini "en yakın" eşleşen doğru zaman dilimine ayarlar ve değerini döndürür.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF( int TimeFrame= 0 ) {
   if (TimeFrame== 0 ) TimeFrame= Period ();
   if (TimeFrame< PERIOD_M5                          ) return ( PERIOD_M1 );
   if (TimeFrame>= PERIOD_M5   && TimeFrame< PERIOD_M15 ) return ( PERIOD_M5 );
   if (TimeFrame>= PERIOD_M15 && TimeFrame< PERIOD_M30 ) return ( PERIOD_M15 );
   if (TimeFrame>= PERIOD_M30 && TimeFrame< PERIOD_H1 ) return ( PERIOD_M30 );
   if (TimeFrame>= PERIOD_H1   && TimeFrame< PERIOD_H4 ) return ( PERIOD_H1 );
   if (TimeFrame>= PERIOD_H4   && TimeFrame< PERIOD_D1 ) return ( PERIOD_H4 );
   if (TimeFrame>= PERIOD_D1   && TimeFrame< PERIOD_W1 ) return ( PERIOD_D1 );
   if (TimeFrame>= PERIOD_W1   && TimeFrame< PERIOD_MN1 ) return ( PERIOD_W1 );
   if (TimeFrame>= PERIOD_MN1                         ) return ( PERIOD_MN1 );
}

DateBeginQuarter() işlevi.

Bu fonksiyon, çeyreğin başlangıç tarihini numarasına göre döndürür. Örneğin, şimdi 08/27/2008 ise, mevcut çeyreğin başlangıç tarihi 07/01/2008 olacaktır. İşlev yalnızca bir parametre alır - mevcut olana göre çeyreğin sayısı. Örneğin, 0 geçerli çeyrek, 1 sonraki ve -1 önceki çeyrektir. Yani, pozitif çeyrek sayıları gelecekten, sıfır ve negatif sayılar geçmişten tarih isteyecektir. Dönüş değeri, 1 Ocak 1970 00:00'dan bu yana geçen saniye sayısıdır.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter( int nq= 0 ) {
   int ye=Year()- MathFloor (nq/ 4 );
  nq= MathMod (nq, 4 );
   int mo=Month()- MathMod (Month()+ 2 , 3 )+ 3 *nq;
   if (mo< 1 ) {
    mo+= 12 ;
    ye--;
  }
   if (mo> 12 ) {
    mo-= 12 ;
    ye++;
  }

   return (StrToTime(ye+ "." +mo+ ".01" ));
}
 

DateOfMonday() işlevi.

Bu işlev, numarasına göre haftanın başlangıç tarihini (Pazartesi tarihi) döndürür. Örneğin, şimdi 08/29/2008 ise, mevcut haftanın başlangıç tarihi 08/25/2008 olacaktır. İşlev yalnızca bir parametre alır - geçerli olana göre haftanın sayısı. Örneğin, 0 geçerli haftadır, 1 sonraki haftadır ve -1 önceki haftadır. Yani, pozitif hafta sayıları gelecekten, sıfır ve negatif olanlar geçmişten tarihler isteyecektir. Dönüş değeri, 1 Ocak 1970 00:00'dan bu yana geçen saniye sayısıdır.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday( int nn= 0 ) {
   datetime dt=StrToTime(TimeToStr( TimeCurrent (), TIME_DATE));

   while (TimeDayOfWeek(dt)!= 1 ) dt-= 24 * 60 * 60 ;
  dt+=nn* 7 * 24 * 60 * 60 ;

   return (dt);
}

Fibonacci() işlevi.

Bu fonksiyon, Fibonacci serisinin elemanını seri numarasına göre döndürür.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci( int n) {
   int a= 0 , b= 0 , i= 1 , s= 0 ;

   if (n== 1 ) s= 1 ;
   if (n> 1 ) {
    s= 1 ;
     while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
   return (s);
}
 

GetNameMA() işlevi.

Bu işlev, tanımlayıcısına göre MA yönteminin adını ( Hareketli Ortalamalar ) döndürür. Bu işlev yorumlarda, gösterge mesajlarında, danışmanlarda kullanım için uygundur.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA( int mm) {
   switch (mm) {
     case MODE_SMA : return ( "SMA" );
     case MODE_EMA : return ( "EMA" );
     case MODE_SMMA : return ( "SMMA" );
     case MODE_LWMA : return ( "LWMA" );
     default        : return ( "Unknown Method" );
  }
}
 

GetPriceDiffInPoint() işlevi.

Bu fonksiyon, sayılarına göre verilen iki çubuk arasındaki fiyat farkını döndürür. Bu işlevi geliştirmenin amacı, parkur hareketinin büyüklüğünü ve yönünü belirlemekti. GetPriceDiffInPoint() işlevi, çubukların hangi pivot noktalarının (Açık veya Yüksek veya Düşük veya Kapalı) dikkate alınacağını bağımsız olarak belirler. İşlev, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • sy - Araç adı. "" veya NULL geçerli karakterdir. Varsayılan değer NULL'dur .
  • tf - Zaman çerçevesi. Varsayılan değer 0 , geçerli karakterdir.
  • n2 - Sol çubuğun numarası. Varsayılan değer 2'dir .
  • n1 - sağ çubuğun numarası. Varsayılan değer 1'dir .

Geri dönüş değeri:

  • pozitif - N2 ve N1 çubukları arasında oranda bir artış oldu.
  • negatif - N2 ve N1 çubukları arasında oranda bir düşüş oldu.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint( string sy= "0" , int tf= 0 , int n2= 2 , int n1= 1 ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double p=MarketInfo(sy, MODE_POINT);
   int     d=MarketInfo(sy, MODE_DIGITS);
   int     dd= 0 , k=iBars(sy, tf);

   if (n1>k || n2>k)
     Print ( "GetPriceDiffInPoint(): Недостаточно баров для " ,sy, " " ,GetNameTF(tf));
   else {
     if (n1> 0 && n2> 0 ) {
       int d1= NormalizeDouble ((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
       int d2= NormalizeDouble ((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

       if ( MathAbs (d1)> MathAbs (d2)) dd=d1;
       if ( MathAbs (d1)< MathAbs (d2)) dd=d2;
       if ( MathAbs (d1)== MathAbs (d2)) {
         if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

   return (dd);
}

GetTypePrice() işlevi

Fiyat türü adını döndürür. İşlev yalnızca bir isteğe bağlı parametre alır. Geçerli değerler: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED. Varsayılan değer 0 - PRICE_CLOSE.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование типа цены.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    Applied_Price - тип цены                                                |
//+----------------------------------------------------------------------------+
string GetTypePrice( int Applied_Price= 0 ) {
   switch (Applied_Price) {
     case PRICE_CLOSE    : return ( "Close" );
     case PRICE_OPEN     : return ( "Open" );
     case PRICE_HIGH     : return ( "High" );
     case PRICE_LOW      : return ( "Low" );
     case PRICE_MEDIAN   : return ( "Median" );
     case PRICE_TYPICAL : return ( "Typical" );
     case PRICE_WEIGHTED : return ( "Weighted" );
     default             : return ( "Unknown Type Price" );
  }
}
 

ArrayLR() işlevi.

Bu işlev, bir dizi doğrusal regresyon değeri üretir. İşlev, aşağıdaki gerekli parametreleri kabul eder:

  • x - sayısal dizi değerleri dizisi. Bu bir giriş parametresidir. Bu dizi, işlevi çağırmadan önce değerleri içermelidir.
  • y , bir doğrusal regresyon değerleri dizisidir. Bu bir çıktı parametresidir, yani fonksiyon tamamlandıktan sonra dizi doldurulacaktır.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.05.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    y - массив значений линейной регрессии                                  |
//+----------------------------------------------------------------------------+
void ArrayLR( double & x[], double & y[]) {
   double a, b, c, sx= 0 , sx2= 0 , sxy= 0 , sy= 0 ;
   int     i, n= ArraySize (x);

   if (n> 1 ) {
     for (i= 0 ; i<n; i++) {
      sx+=i+ 1 ;
      sy+=x[i];
      sxy+=(i+ 1 )*x[i];
      sx2+=(i+ 1 )*(i+ 1 );
    }
    a=sx*sy-n*sxy;
    c=sx*sx-n*sx2;
     if (c!= 0 ) a=a/c; else a= 0 ;
    b=(sy-a*sx)/n;
     ArrayResize (y, n);
     for (i= 0 ; i<n; i++) y[i]=a*(i+ 1 )+b;
  } else Print ( "ArrayLR(): Недостаточное количество элементов ряда! n=" , n);
}

ArrayMo() işlevi.

Modu döndürür - dağıtım yoğunluğu eğrisinin maksimumu. İşlev, aşağıdaki isteğe bağlı parametreleri kabul eder:

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.06.2008                                                     |
//|  Описание : Возвращает Моду - максимум кривой плотности распределения.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    d - точность значений числового ряда, количество знаков после запятой   |
//+----------------------------------------------------------------------------+
double ArrayMo( double & x[], int d= 4 ) {
   double e, s= 0 ;
   double m[][ 2 ];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
   int     i, k= ArraySize (x);
   int     n;                   // номер строки временного массива m
   int     r;                   // количество строк во временном массиве m

   if (k> 0 ) {
     for (i= 0 ; i<k; i++) {
      e= NormalizeDouble (x[i], d);
      n=ArraySearchDouble(m, e);
       if (n< 0 ) {
        r= ArrayRange (m, 0 );
         ArrayResize (m, r+ 1 );
        m[r][ 0 ]++;
        m[r][ 1 ]=e;
      } else m[n][ 0 ]++;
    }
     ArraySort (m, WHOLE_ARRAY , 0 , MODE_DESCEND);
    s=m[ 0 ][ 1 ];
  } else Print ( "ArrayMo(): Массив пуст!" );

   return (s);
}
 

ExistOrdersByPrice() işlevi.

Belirli bir fiyatta bir siparişin varlığının bayrağını döndürür. Doğru - sipariş var (ayarlandı), Yanlış - sipariş yok (ayarlanmadı). Kontrol edilen siparişlerin listesini fonksiyon parametreleriyle sınırlayabilirsiniz:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, fonksiyon sadece belirtilen enstrümanın siparişlerini kontrol edecektir. NULL , geçerli araç anlamına gelir ve "" (varsayılan) herhangi bir araç anlamına gelir.
  • op - İşlem tipi, bekleyen emir tipi. Geçerli değerler OP_BUYLIMIT , OP_BUYSTOP , OP_SELLLIMIT , OP_SELLSTOP veya -1'dir . Varsayılan değer -1 , herhangi bir sipariş türü anlamına gelir.
  • mn - Sipariş Kimliği (MagicNumber). Varsayılan değer -1 - herhangi bir büyü.
  • pp - Sipariş vermek için fiyat seviyesi. Varsayılan değer -1 - herhangi bir fiyattır.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.07.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров по цене установки        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       (-1   - любая цена)                     |
//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice( string sy= "" , int op=- 1 , int mn=- 1 , double pp=- 1 ) {
   int d, 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)) {
         if (OrderType()> 1 && OrderType()< 6 ) {
          d=MarketInfo(OrderSymbol(), MODE_DIGITS);
          pp= NormalizeDouble (pp, d);
           if (pp< 0 || pp== NormalizeDouble (OrderOpenPrice(), d)) {
             if (mn< 0 || OrderMagicNumber()==mn) return (True);
          }
        }
      }
    }
  }
   return (False);
}

Test cihazı için ClosePosBySelect() işlevi.

Önceden seçilmiş bir pozisyonun kapanmasını gerçekleştirir. Bu, daha önce 13. sayfada yayınlanmış olan aynı adlı işlevin hafif bir sürümüdür. Ekstra bir şey yok. Hayır fırfırlar. Benim uygulamamda, test cihazında bir pozisyonun kapatılmadığı hiçbir durum olmadı. Bu nedenle, bu fonksiyonda kontrol yoktur. Test cihazında gereksizdirler.

 //+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
   double pp;

   if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
   if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}
 

Test cihazı için CountOrders() işlevi.

EA'ların testimde (yalnızca MT4 test cihazında kullanılmak üzere tasarlanmış) sürümlerinde, CountOrders() işlevi şu işlevlerin yerini alır: ExistOrders() , ExistPositions() , NumberOfOrders() ve NumberOfPositions() . Yani, herhangi bir türdeki bir pozisyonun veya emrin varlığı hakkında ve ayrıca her türden alım satım işlemlerinin sayısı hakkında bilgi sağlayabilir. Böyle bir değiştirmenin, sipariş veritabanına tek tıklamayla erişimde ve bir seferde gerekli tüm bilgileri elde etmede ifade edilen avantajları vardır. Ve yukarıda belirtilen işlevler, özellikle kombinasyon halinde kullanıldıklarında, her biri aynı sipariş bazında bağımsız olarak çalışır ve dolayısıyla aynı çağrıları tekrar tekrar gerçekleştirir. Sonuç olarak, CountOrders() işlevi, bir geçişin süresini birkaç saniye azaltmanıza olanak tanır ve bu da optimizasyonlarda saatlerce tasarruf sağlar.

CountOrders() işlevi aşağıdaki parametreleri alır:

  • mo - Türe göre sipariş sayısı dizisi. Fonksiyonu çözdükten sonra dizi 6 (altı) elemana sahip olacaktır. Sıfır öğesi Buy tipindeki ticaret işlemlerinin sayısıdır , ilk öğe Sell sayısı , ikincisi BuyLimit , üçüncüsü SellLimit , dördüncüsü BuyStop , beşincisi SellStop'tur .
  • mn - Pozisyon veya emir tanımlayıcısı (MagicNumber). Varsayılan değer -1 - herhangi bir büyü.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders( int & mo[], int mn=- 1 ) {
   int i, k= OrdersTotal ();

   if ( ArraySize (mo)!= 6 ) ArrayResize (mo, 6 );
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (mn< 0 || OrderMagicNumber()==mn) mo[OrderType()]++;
    }
  }
}

Test cihazı için ModifyOrder() işlevi.

Bu, önceden seçilmiş tek bir emir veya pozisyonun mutlak fiyat seviyelerini değiştirmek için sayfa 7'de yayınlanan ModifyOrder() fonksiyonunun basit bir versiyonudur.

ModifyOrder() işlevi aşağıdaki parametreleri alır:

  • pp - Sipariş verme fiyatı. Sıfırdan küçük veya sıfıra eşit bir değer geçerseniz, bu fiyat seviyesinde değişiklik yapılmayacaktır. Varsayılan değer -1'dir .
  • sl - Fiyat seviyesini durdur. Sıfırdan küçük bir değer geçerseniz, bu fiyat seviyesinde değişiklik yapılmayacaktır. Varsayılan değer 0'dır .
  • tp - Fiyat seviyesini alın. Sıfırdan küçük bir değer geçerseniz, bu fiyat seviyesinde değişiklik yapılmayacaktır. Varsayılan değer 0'dır .
  • ex - bekleyen siparişin sona erme tarihi. Varsayılan değer 0'dır .
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder( double pp=- 1 , double sl= 0 , double tp= 0 , datetime ex= 0 ) {
   int     dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
   double op= NormalizeDouble (OrderOpenPrice() , dg);
   double os= NormalizeDouble (OrderStopLoss()  , dg);
   double ot= NormalizeDouble (OrderTakeProfit(), dg);
   color   cl;

   if (pp<= 0 ) pp=OrderOpenPrice();
   if (sl< 0 ) sl=OrderStopLoss();
   if (tp< 0 ) tp=OrderTakeProfit();
  
  pp= NormalizeDouble (pp, dg);
  sl= NormalizeDouble (sl, dg);
  tp= NormalizeDouble (tp, dg);

   if (pp!=op || sl!=os || tp!=ot) {
     if ( MathMod (OrderType(), 2 )== 0 ) cl=clModifyBuy; else cl=clModifySell;
     if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er= GetLastError ();
       Print ( "Error(" ,er, ") modifying order: " ,ErrorDescription(er));
       Print ( "Ask=" ,Ask, " Bid=" ,Bid, " sy=" ,OrderSymbol(),
             " op=" +GetNameOP(OrderType()), " pp=" ,pp, " sl=" ,sl, " tp=" ,tp);
    }
  }
}
 

IIFc() işlevi.

İnşaat çatalları açısından çok kullanışlı bir özellik. Eğer öyleyse, o zaman bu renk. Ve değilse, o zaman başka bir renk. IIFc() işlevi, gerekli üç parametreyi alır:

  • koşul - Boole ifadesi . Doğru veya yanlış olabilir.
  • ifTrue - Koşul ifadesi doğruysa IIFc() işlevi tarafından döndürülecek renk.
  • ifFalse - Koşul ifadesi yanlışsa IIFc() işlevi tarafından döndürülecek renk.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 18.07.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
color IIFc( bool condition, color ifTrue, color ifFalse) {
   if (condition) return (ifTrue); else return (ifFalse);
}

IIFd() işlevi.

Gerçek sayılar için benzer kolaylık. Eğer öyleyse, o zaman böyle gerçek bir sayı. Değilse, o zaman başka bir numara. IIFd() işlevi, gerekli üç parametreyi alır:

  • koşul - Boole ifadesi. Doğru veya yanlış olabilir.
  • ifTrue - Koşul ifadesi doğruysa IIFd() işlevi tarafından döndürülecek gerçek sayı.
  • ifFalse - Koşul ifadesi yanlışsa IIFd() işlevi tarafından döndürülecek gerçek bir sayı.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
double IIFd( bool condition, double ifTrue, double ifFalse) {
   if (condition) return (ifTrue); else return (ifFalse);
}

IIFi() işlevi.

Tamsayılar için benzer kolaylık. Eğer öyleyse, o zaman böyle bir tamsayı. Değilse, o zaman başka bir numara. IIFi() işlevi, gerekli üç parametreyi alır:

  • koşul - Boole ifadesi. Doğru veya yanlış olabilir.
  • ifTrue - Koşul ifadesi doğruysa IIFi() işlevi tarafından döndürülecek bir tam sayı.
  • ifFalse - Koşul ifadesi yanlışsa IIFi() işlevi tarafından döndürülecek bir tam sayı.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
int IIFi( bool condition, int ifTrue, int ifFalse) {
   if (condition) return (ifTrue); else return (ifFalse);
}

IIFs() işlevi.

Dizeler için benzer kolaylık. Eğer öyleyse, o zaman böyle bir çizgi. Ve değilse, o zaman başka bir satır. IIFs() işlevi, gerekli üç parametreyi alır:

  • koşul - Boole ifadesi. Doğru veya yanlış olabilir.
  • ifTrue - Koşul ifadesi doğruysa IIFs() işlevi tarafından döndürülecek dize.
  • ifFalse - Koşul ifadesi yanlışsa IIFs() işlevi tarafından döndürülecek dize.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs( bool condition, string ifTrue, string ifFalse) {
   if (condition) return (ifTrue); else return (ifFalse);
}
 

ExistInHistoryCloseBetween() işlevi.

Tarihler arasında kapatılan (silinen) bir pozisyon veya siparişin geçmişindeki mevcudiyet bayrağını döndürür. ExistInHistoryCloseBetween() işlevi aşağıdaki parametreleri alır:

  • sy - Piyasa aracının 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 , OP_BUYLIMIT , OP_BUYSTOP , OP_SELLLIMIT , OP_SELLSTOP . 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ü.
  • d1 - Pozisyon kapatma süresi (bekleyen bir ipliğin silinmesi). Varsayılan değer 0 - herhangi bir kapatma (silme) zamanı. d1 zamanı d2 zamanından küçük olmalıdır.
  • d2 - Konum kapatma süresi (bekleyen bir ipliğin silinmesi). Varsayılan değer 0 - herhangi bir kapatma (silme) zamanı. d2 zamanı d1 zamanından büyük olmalıdır.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.08.2008                                                     |
//|  Описание : Возвращает флаг существования в истории позиции или ордера,    |
//|           : закрытой (удалённого) между датами.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая операция)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    d1 - время закрытия             ( 0   - любое время закрытия)           |
//|    d2 - время закрытия             ( 0   - любое время закрытия)           |
//+----------------------------------------------------------------------------+
bool ExistInHistoryCloseBetween( string sy= "" , int op=- 1 , int mn=- 1 ,
                                 datetime d1= 0 , datetime d2= 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 (mn< 0 || OrderMagicNumber()==mn) {
           if (d1<=OrderCloseTime() && (d2== 0 || d2>=OrderCloseTime())) return (True);
        }
      }
    }
  }
   return (False);
}

ExistInHistoryOpenBetween() işlevi.

Tarihler arasında açılan (yerleştirilen) bir pozisyonun veya emrin geçmişindeki mevcudiyet bayrağını döndürür. ExistInHistoryOpenBetween() işlevi aşağıdaki 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 , OP_BUYLIMIT , OP_BUYSTOP , OP_SELLLIMIT , OP_SELLSTOP . 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ü.
  • d1 - Pozisyon açılış zamanı ( bekleyen bir emrin verilmesi ). Varsayılan değer 0 - herhangi bir açma (ayar) zamanı. d1 zamanı d2 zamanından küçük olmalıdır.
  • d2 - Bir pozisyon açma zamanı (bekleyen bir emir ayarlama). Varsayılan değer 0 - herhangi bir açma (ayar) zamanı. d2 zamanı d1 zamanından büyük olmalıdır.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.08.2008                                                     |
//|  Описание : Возвращает флаг существования в истории позиции или ордера,    |
//|           : открытой (установленного) между датами.                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    d1 - время открытия             ( 0   - любое время открытия)           |
//|    d2 - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistInHistoryOpenBetween( string sy= "" , int op=- 1 , int mn=- 1 ,
                               datetime d1= 0 , datetime d2= 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 (mn< 0 || OrderMagicNumber()==mn) {
           if (d1<=OrderOpenTime() && (d2== 0 || d2>=OrderOpenTime())) return (True);
        }
      }
    }
  }
   return (False);
}
 

ExistInHistoryToDay() işlevi.

Bugün açılan (yerleştirilen) bir pozisyon veya siparişin geçmişindeki mevcudiyet bayrağını döndürür. ExistInHistoryToDay() işlevi aşağıdaki 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 , OP_BUYLIMIT , OP_BUYSTOP , OP_SELLLIMIT , OP_SELLSTOP . 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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.08.2008                                                     |
//|  Описание : Возвращает флаг наличия ордера или позиции в истории за сегодня|
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool ExistInHistoryToDay( 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 (op< 0 || OrderType()==op) {
           if (mn< 0 || OrderMagicNumber()==mn) {
             if (TimeDay  (OrderOpenTime())==Day()
            &&  TimeMonth(OrderOpenTime())==Month()
            &&  TimeYear (OrderOpenTime())==Year()) return (True);
          }
        }
      }
    }
  }
   return (False);
}

TakeProfitLastPos() işlevi.

Bu fonksiyon, son açık pozisyonun TakeProfit fiyat seviyesini veya -1'i döndürür. TakeProfitLastPos() 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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.08.2008                                                     |
//|  Описание : Возвращает цену TakeProfit последней открытой позиций или -1.  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double TakeProfitLastPos( string sy= "" , int op=- 1 , int mn=- 1 ) {
   datetime t;
   double    r=- 1 ;
   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== "" ) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
               if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
   return (r);
}
Neden: