KimIV'ten faydalı özellikler - sayfa 62

 

Cevap için teşekkürler, Igor, anlaşıldı. Ben de sizin fonksiyonlarınızı ayrı ayrı kullanıyorum ama uzman geliştirme aşamasında kütüphaneden faydalanmak istedim.

komposter'ın trade_lib&info_lib dosyasına baktım ve kendi kullanımım için sizinkinde bazı değişiklikler yaptım.

1. Tüm kitaplıklardaki # özellik kitaplığı kaldırıldı ve kitaplıkların çapraz bağlantılarını içerir, karıştırılmaması için kitaplıklar yeniden adlandırıldı.

2. EA'ya tüm kitaplıkların doğrudan çağrılarından oluşan bir blok eklendi.

 #include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

Artık tüm kütüphanelerin tüm işlevleri kullanılabilir durumda, derleme sırasında normal "referans verilmez.." dışında hiçbir hata ve suç mesajı yoktur.

Tüm harici danışmanlar mevcuttur, sorun yok.

Daha fazlasını yazın, bağlanıp kullanalım. Her şeyden önce, toplam kâr için takip fonksiyonunu görmek istiyorum.

 

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:

  • dt - Tarih, saat. Varsayılan değer - 0 - ticaret sunucusunun güncel tarihi ve saati.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 ) ;
}

not. Ekli, WeekOfMonth() işlevini test etmek için bir komut dosyasıdır.

Dosyalar:
 
Igor, daha büyük lotlu pozisyonlardan başlayarak tüm pozisyonları kapatacak bir fonksiyon var mı?
 

Merhaba Igor! faydalı özellikleriniz için çok teşekkür ederim! Onları en kısa sürede kullanıyorum! Son zamanlarda kendim buna kapıldım, bu yüzden size bir soru ... dün İnternet periyodik olarak döküldü, bundan sonra danışmanım çalışmak istemiyor lanet olsun ... memnun bir yüz yerine bir çarpı işareti koyuyor! OpenPosition işlevinizi kullanıyorum, belki hangi iş parçacığı tarafından işlenen bir hataya tepki verdi? İşte dünün günlüğü, ondan önce her şey yolundaydı! Bir demo hesabında test ediyorum... 220 hatasıyla ilgili hiçbir yerde bulamıyorum ........

07:47:28 MetaTrader 4.00 build 220 başladı (MetaQuotes Software Corp.)
07:47:28 Uzman açık prob USDJPY EURUSD,M1: başarıyla yüklendi
07:47:32 '1262868': giriş
07:47:44 '1262868': giriş
07:49:40 '1262868': giriş
07:49:46 '1262868': giriş
07:54:44 '1262868': bağlanılamadı [Bağlantı yok]
11:38:16 Uzman açık prob USDJPY EURUSD,M1: kaldırıldı
11:38:18 MetaTrader 4.00 build 220 durduruldu
14:05:05 MetaTrader 4.00 build 220 başladı (MetaQuotes Software Corp.)
14:05:05 Uzman açık prob USDJPY EURUSD,M1: başarıyla yüklendi
14:05:10 '1262868': giriş
14:05:31 '1262868': giriş
14:06:39 '1262868': giriş
14:06:46 '1262868': giriş
15:57:06 '1262868': bağlanılamadı [Bağlantı yok]
18:30:46 Uzman açık prob USDJPY EURUSD,M5: kaldırıldı
18:30:49 Ana pompalama: duruşta zaman aşımı
18:30:52 Ana pompalama: duruşta zaman aşımı
18:30:55 Ana pompalama: duruşta zaman aşımı
18:30:58 Ana pompalama: duruşta zaman aşımı
18:31:01 Ana pompalama: duruşta zaman aşımı
18:31:01 Ana pompalama: sonlandırıldı
18:31:02 MetaTrader 4.00 build 220 durduruldu
18:31:02 MetaTrader 4.00 build 220 sistem kapandığı için durduruldu
18:47:57 MetaTrader 4.00 build 220 başladı (MetaQuotes Software Corp.)
18:47:58 Uzman açık prob USDJPY EURUSD,M5: başarıyla yüklendi
18:48:01 '1262868': bağlanılamadı [Bağlantı yok]
18:48:10 '1262868': giriş
18:48:20 '1262868': giriş
20:19:00 '1262868': giriş
20:19:07 '1262868': giriş
20:20:05 '1262868': giriş
20:20:13 '1262868': giriş
20:59:29 '1262868': giriş
20:59:39 '1262868': giriş
21:02:16 '1262868': giriş
21:02:41 '1262868': DataCenter bağlantısı başarısız oldu [6]
22:08:40 '1262868': ping başarısız oldu
22:08:43 '1262868': giriş
22:08:49 '1262868': DataCenter bağlantısı başarısız oldu [6]
22:10:01 '1262868': giriş
22:10:05 '1262868': DataCenter bağlantısı başarısız oldu [6]
22:14:59 '1262868': giriş
22:15:13 '1262868': giriş
22:15:22 '1262868': DataCenter bağlantısı başarısız oldu [6]
22:37:16 '1262868': giriş
22:37:27 '1262868': DataCenter bağlantısı başarısız oldu [6]
22:40:51 '1262868': giriş
22:41:04 '1262868': DataCenter bağlantısı başarısız oldu [6]
23:17:14 Uzman açık prob USDJPY EURUSD,M5: kaldırıldı
23:17:16 Uzman açık prob USDJPY EURUSD,M5: başarıyla yüklendi
23:25:52 Uzman açık prob USDJPY EURUSD,M5: kaldırıldı
23:25:55 MetaTrader 4.00 build 220 durduruldu
23:25:59 MetaTrader 4.00 build 220 başladı (MetaQuotes Software Corp.)
23:26:05 '1262868': giriş
23:26:05 Uzman açık prob USDJPY EURUSD,M5: başarıyla yüklendi
23:26:15 '1262868': giriş
23:27:19 '1262868': giriş
23:27:34 '1262868': giriş
23:28:20 Uzman açık prob USDJPY EURUSD,M5: kaldırıldı
23:28:25 Uzman açık prob USDJPY USDCHF,H4: başarıyla yüklendi
23:28:33 Uzman açık prob USDJPY USDCHF,H4: kaldırıldı

Şimdiden çok teşekkür ederim!

 
khorosh писал(а) >>
Igor, daha büyük lotlu pozisyonlardan başlayarak tüm pozisyonları kapatacak bir fonksiyon var mı?

değildi ... yazdı ...

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

not. Ekli, ClosePosBySortLots() işlevini test etmek için bir komut dosyasıdır.

 

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

not. Ekli, AddLeadingZero() işlevini test etmek için bir komut dosyasıdır.

Dosyalar:
 

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

not. Ekli, toTime() işlevini test etmek için bir komut dosyasıdır.

Dosyalar:
 

İgor, söyle bana, eğer zor değilse, fiyat değişkenlerden biriyle çakışırsa, karşılık gelen sinyali verecek bir fonksiyon, diyelim ki b=1.2400, s=1.2300;

b=fiyat sig=1 ise, s=fiyat sig=-1 ise.

özensiz olduğum için özür dilerim.)

 
Prival >> :
Üzgünüm, ben Igor değilim. Ama belki bu yardımcı olur.

Ben de özür dilerim. daha doğru olacak

 //+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign ( double b , double s )
   {
   double var , e ; var = Close [ 0 ] ; e = 0.000001 ;
   if ( var < b + e & & var > b - e ) return ( 1 ) ;
   if ( var < s + e & & var > s - e ) return ( - 1 ) ; 
   return ( 0 ) ;
   }
 
Prival >> :

..akşama şubeyi dağıtmamak için mesajlarımı sileceğim ..

Gerek yok. Bir göz atmak faydalı olacaktır, fiyatın tam değerinin tutarlı bir şekilde yakalanmadığı fikrini uyandırır.