KimIV'ten faydalı özellikler - sayfa 4

 

SetOrder() işlevini kullanmaya ilişkin daha fazla örnek.

Netlik sağlamak için, puan olarak izin verilen büyük bir minimum zarar durdurma / kâr alma seviyesine sahip bir enstrüman seçmeniz gerekir. Test için seçtiğim DC'deki bu seviyenin 10 puan olduğu AUDCAD'i seçtim.

1. Mevcut fiyatın 0,1 5 puan altında bir BuyLimit emri verin. Hata 130'u (Yanlış duraklar) almak ve SetOrder işlevinin nasıl çalışacağını göstermek için özellikle izin verilen minimum seviyenin altındaki sipariş verme seviyesini seçtim.

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-5*Point);

Protokolün içeriği (aşağıdan yukarıya doğru okuyun):
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: kaldırıldı
2008.03.17 09:06:24 stdlib AUDCAD,M5: kaldırıldı
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit neden 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit sebep 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: açık #21616412 satın alma limiti 0.10 AUDCAD 0.9180'de tamam
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): Düzeltilmiş fiyat seviyeleri
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Sor=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Satın Alma Limiti pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Hata(130) ayar sırası: geçersiz duraklar, 1 deneyin
2008.03.17 09:06:15 stdlib AUDCAD,M5: başarıyla yüklendi
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: başarıyla yüklendi

Protokolden, fonksiyonun 0.9185'te (pp=0.9185) bir emir vermeye çalıştığı, ancak ticaret sunucusunun böyle bir emri kabul etmediği ve 130 hatası verdiği görülüyor. izin verilen minimum seviye ve iyi biten bir sonraki ticaret girişimini yapar. Sıra 0.9180 olarak ayarlandı.

2. 9 pip stop ile mevcut fiyatın 0,3 6 pip üzerinde bir BuyStop emri verin

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

Protokolün içeriği (aşağıdan yukarıya doğru okuyun):
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: kaldırıldı
2008.03.17 09:27:36 stdlib AUDCAD,M5: kaldırıldı
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit sebep 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit sebep 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: açık #21617419 satın alma durağı 0.30 AUDCAD at 0.9209 sl: 0.9195 tamam
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): Düzeltilmiş fiyat seviyeleri
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Sor=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Satın Al Durdur pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Hata(130) ayar sırası: geçersiz duraklar, 1 deneyin
2008.03.17 09:27:26 stdlib AUDCAD,M5: başarıyla yüklendi
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: başarıyla yüklendi

Bu örnek, sipariş verme düzeyinin 0,9204'ten 0,9209'a nasıl değiştiğini gösterir. Aynı zamanda, durma seviyesi aynı sl=0.9195 olarak kaldı. Yani, puanlardaki durma 9'dan 14'e yükseldi.

 

3. 9 pips stop ve 7 pips alım ile mevcut fiyatın 0,5 8 pips çok üzerinde bir SellLimit emri verin

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

Protokol içeriği:
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: kaldırıldı
2008.03.17 10:38:50 stdlib AUDCAD,M5: kaldırıldı
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit neden 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit sebep 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: açık #21620553 satış limiti 0,50 AUDCAD 0.9190 sl: 0.9201 tp: 0.9179 tamam
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): Düzeltilmiş fiyat seviyeleri
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Sor=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Satış Limiti pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Hata(130) ayar sırası: geçersiz duraklar, 1 deneyin
2008.03.17 10:38:40 stdlib AUDCAD,M5: başarıyla yüklendi
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: başarıyla yüklendi

Bu örnekte yine piyasaya çok yakın bir limit emri verilmeye çalışılıyor. Sipariş verme seviyesi 0,9188'den 0,9190'a 2 puan düzeltildi. Durdurma seviyesi de 0,9197'den 0,9201'e 4 puan olmak üzere ayarlandı. Sadece alma seviyesi değişmeden kaldı, bu da puanlarının 9'dan 11'e yükselmesine neden oldu.

Belki yeterli örnek. Onları anlamak oldukça zordur. Hangi sonuçlar çıkarılabilir?
1. İşlev, kendisine atanan görevi tamamlamak için elinden gelenin en iyisini yapacaktır, yani sırayı ayarlamaya çalışacaktır. Değişen pazar için seviyeleri ayarlayacak ve tekrar tekrar işini yapmaya çalışacak.
2. Stop emri verme seviyesinin ayarlanması, stop seviyesinde kurulum fiyatına göre puan artışına neden olur. Bu durum stop emrinin stop seviyesinin yerinde kalması ve emir verme seviyesinin stop seviyesinden uzaklaşmasıyla açıklanmaktadır. BuyStop emri için kurulum seviyesi yükselir ve SellStop emri için aşağı iner. Emir verme seviyesi ile yapılan bu tür manipülasyonlar, emir verme seviyesi ayarlama miktarı kadar durma boyutunu puan olarak arttırır.
3. Limit emirlerinin seviyesinin ayarlanması, alış fiyatının belirlenen fiyata göre puan olarak artmasına neden olur. Bu şekilde olur. Durdurma ve kurulum seviyeleri BuyLimit için yukarı, SellLimit için aşağı hareket ederken yerinde kalır. Alım puanlarının boyutu, sipariş verme düzeyi ayarlamasının miktarı kadar artırılır.

Dikkat! SetOrder işlevinin kodunda değişiklikler yaptım - birkaç satırı yeniden düzenledim. Eski gönderi artık düzenlenemez, bu yüzden düzeltilmiş işlevi buraya gönderiyorum. Fragman ayrıca SetOrder işlevinin çevrimiçi testi için bir komut dosyası içerir.


Dosyalar:
 

ModifyOrder fonksiyonunun yayınını hızlandırmak için bir süre pozisyonlarla çalışmak için fonksiyonlara geçmeye ve ardından tekrar emirler için fonksiyonlara dönüp onlarla bitirmeye karar verdim.

Not!
OP_BUY ve OP_SELL alım satım işlemleri dediğim pozisyonlar . Pozisyonlar açılır ve kapanır.
OP_BUYLIMIT , OP_BUYSTOP , OP_SELLLIMIT ve OP_SELLSTOP alım satım işlemleri dediğim emirler . Siparişler verilir ve kaldırılır. Emir çalışırsa, pozisyon olur.

ExistPositions() işlevi.

Açık alımları veya satımları kontrol etmek için tasarlanmıştır. ExistOrders işlevine benzer. Varsayılan olarak, tüm pozisyonları inceler: mevcut ve diğer enstrümanlar. Seçimi, bir filtre kombinasyonu ile belirtebilirsiniz - fonksiyon parametreleri:

  • sy - Enstrümanın adına bir kısıtlama getirir. Varsayılan olarak, parametre "" - kısıtlama yok, yani herhangi bir araç. NULL'u geçerseniz, konum seçimi mevcut enstrümanla sınırlı olacaktır.
  • op - Pozisyon türünü kısıtlar (Al/Sat). Varsayılan olarak, herhangi bir kısıtlama yoktur, yani herhangi bir türden bir pozisyonun varlığı kontrol edilir. Geçerli parametre değerleri -1, OP_BUY ve OP_SELL'dir.
  • mn - Konumun tanımlama ("sihir") numarasına bir sınır getirir. Varsayılan olarak herhangi bir kısıtlama yoktur, yani herhangi bir sihirli sayıya sahip bir pozisyonun varlığı kontrol edilir.
  • ot - Bir pozisyonun açılış süresine bir sınır getirir. Bu parametrenin değerinden sonra pozisyonun açıldığı kontrol edilir. Varsayılan olarak bir limit yoktur, yani herhangi bir açılış zamanı olan bir pozisyonun varlığı kontrol edilir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions ( string sy = "" , int op =- 1 , int mn =- 1 , datetime ot = 0 ) {
  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 ( ot <= OrderOpenTime ()) return ( True ) ;
            }
          }
        }
      }
    }
  }
  return ( False ) ;
}
 

ExistPositions() işlevini kullanma örnekleri.

1. Herhangi bir pozisyonun uygunluğunu kontrol edin

 ExistPositions () ;

2. Mevcut tablonun enstrümanında herhangi bir pozisyonun varlığını kontrol edin

 ExistPositions ( NULL ) ;

3. Herhangi bir enstrüman için satın alma olup olmadığını kontrol edin

 ExistPositions ( "" , OP_BUY ) ;

4. EURUSD üzerinde sihirli 123456 ile bir satış olup olmadığını kontrol edin

 ExistPositions ( " EURUSD " , OP_SELL , 123456 ) ;

5. Açılış saati 15 dakikadan daha erken olmayan herhangi bir pozisyonun uygunluğunu kontrol edin

 ExistPositions ( "" , - 1 , - 1 , TimeCurrent () - 15 * 60 ) ;

Fragman, ExistPositions işlevini test etmek için bir komut dosyasına sahiptir. İlk dört örnek yorumlanmıştır.

Dosyalar:
 
Maalesef ne OrderSet_1 ne de OrderSet_2 çalışmıyor! Hata veriyor - derlemek istemiyor! Ne yapalım???
 
SoloEgoist :
Üzgünüm, elbette, ama ne OrderSet_1 ne de OrderSet_2 çalışmıyor! Hata veriyor - derlemek istemiyor! Ne yapalım???
OrderSet_1 ve OrderSet_2 dosyaları, OrderSet işlevinin farklı sürümleri için kaynak kodlarıdır. Sadece kaynak kodları ve bu kadar. Derleme yapmazlar veya düzgün çalışmazlar (hatasız). En azından bir sonuç elde etmek için OrderSet işlevini kullanan bir çalışma ortamı da oluşturmanız gerekir. Böyle bir çalışma ortamının örneğini test_SetOrder dosyasında yaptım.
 
Teşekkür ederim Çok açık - Deneyeceğim, sadece dili bilmiyorum.
 

Tarih ve saatle çalışmanın işlevleri ve yolları yararlı olacaktır ...

Örneğin:
- geçerli saatten 2 saat çıkar
- Son kullanma tarihine X gün kaldı...

Ayrıca alakası var mı bilmiyorum... :(

İstatistikler için işlevler. Örneğin:
- her Pazartesi saat 21:00'de kaç saatlik mum
- bunlardan: 215 yükseliş, 245 düşüş
- sığır: min. 12 pip maksimum 54 pip
- vb...

veya
- günün her ilk 15H mumunun düşük, ikinci X sayısının üstünde / altında

Daha önemli olan işlevlerin kendisi değil, onları oluşturmanın yollarıdır, o zaman kendinizinkini uygulamak daha kolaydır,
programlama öğrenirken...
Bir kez daha şikayet edeceğim :))) bazen çok şey çok net değil ve C ile ilgili kitapların yardımcı olacağını belirtiyorlar.
Doğal olarak okuyabilirsiniz, ancak gerekli mi ??? sadece µl4'e odaklanarak kafanızı gereksiz bilgilerle doldurmak için.
Yanlışlıklar nelerdir? örneğin bu: ||

 
kombat :

Tarih ve saatle çalışmanın işlevleri ve yolları yararlı olacaktır ...

Örneğin:
- geçerli saatten 2 saat çıkar
- Son kullanma tarihine X gün kaldı...

...


Böyle bir fonksiyon yazmamalısınız - çok basit bir çözüm var!


int gSaat = 2;
tarihsaat gTwoHoursEat out ;


gTwoHoursEat = TimeCorrent() - ((86400)/24) * gHour ); // 2 saat
gTwoHoursEat = TimeCorrent() - 7200; // aynı ancak hesaplama yükü olmadan

yani günde 86400 zamanlayıcı tik alıyoruz

yani 2 saat = 7200 tik, yani 86400/24 * 2 = 7200
1 saat = 3600; vb
 
kombat :

Tarih ve saatle çalışmanın işlevleri ve yolları yararlı olacaktır ...

İstatistikler için işlevler. Örneğin:
- her Pazartesi saat 21:00'de kaç saatlik mum
- bunlardan: 215 yükseliş, 245 düşüş
- sığır: min. 12 pip maksimum 54 pip
- vb...

veya
- günün her ilk 15H mumunun düşük, ikinci X sayısının üstünde / altında

Daha önemli olan işlevlerin kendisi değil, onları oluşturmanın yollarıdır, o zaman kendinizinkini uygulamak daha kolaydır,
programlama öğrenirken...

Not alınmış... :-)

kombat yazdı:
Bir kez daha şikayet edeceğim :))) bazen çok şey çok net değil ve C ile ilgili kitapların yardımcı olacağını belirtiyorlar.
Doğal olarak okuyabilirsiniz, ancak gerekli mi ??? sadece µl4'e odaklanarak kafanızı gereksiz bilgilerle doldurmak.
Yanlışlıklar nelerdir? örneğin bu: ||

Bu mantıksal bir VEYA'dır . Bir örnekle açıklayayım. MQL4'te "x>2 veya x<-3 ise, x=5" ifadesi şöyle görünecektir

 if ( х> 2 || х<- 3 ) х= 5 ;
Neden: