KimIV'ten faydalı özellikler - sayfa 12

 

IndexByTicket() işlevi.

Bilete göre emrin veya pozisyonun indeksini (verilen emirlerin veya açık pozisyonların genel listesindeki seri numarası) verir. IndexByTicket() işlevi gerekli biletle bir emir veya pozisyon bulamazsa, -1 değerini döndürür. Kontrol edilen emirlerin veya pozisyonların listesini fonksiyon parametreleriyle sınırlayabilirsiniz:

  • sy - Araç adı. Bu parametreyi ayarlarsanız, fonksiyon sadece belirtilen enstrüman için siparişleri ve pozisyonları kontrol edecektir. NULL , geçerli araç anlamına gelir ve "" (varsayılan) herhangi bir araç anlamına gelir.
  • op - Ticaret işlemi, bekleyen emir veya pozisyon türü. Geçerli değerler OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP veya -1'dir . Varsayılan değer -1 , herhangi bir sipariş veya pozisyon anlamına gelir.
  • mn - Sipariş veya konum kimliği (MagicNumber). Varsayılan değer -1 - herhangi bir büyü.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket ( int ti , string sy = "" , int op =- 1 , int mn =- 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 == "" ) && ( op < 0 || OrderType () == op )) {
         if (( mn < 0 || OrderMagicNumber () == mn ) && OrderTicket () == ti ) return ( i ) ;
       }
     }
   }
   return ( - 1 ) ;
}
 

IndexByTicket() işlevini özel bir Uzman Danışmanda yazdım. Onsuz yapmanın imkansız olduğunu hatırlıyorum, yoksa neden yazmaya başlayayım? Ama işte orada nasıl kullanıldı ve neden prensipte yazdım, hayatım boyunca hatırlamıyorum :-) Danışmanın kaynak koduna bak kırıldı. Yüzlerce var.

Genel olarak, daha önce verdiğim örneklere benzer örnekler vermenin bir anlamı görmüyorum. Bilgili kişiler, hangi parametreleri nereye koyacaklarını tahmin edeceklerdir. IndexByTicket() işlevini kullanmak için iyi bir fikri olan varsa, lütfen buraya gönderin. uygulamaya çalışacağım.


Kısa duyuru.

SelectByTicket() ve SelectByTicketFromHistory() işlevlerini kullanımdan kaldırdım. Artık onları kullanmayacağım, bu yüzden yayınlamak için bir neden göremiyorum. Bu konuyu tartışmak isteyenler her zaman beklerim. Tüm sanrılarımı OLDUĞU GİBİ göster.

 

NumberOfOrders() işlevi.

Bu işlev, siparişlerin sayısını döndürür ve işlevsel olarak ExistOrders() öğesini tamamen geçersiz kılar. ExistOrders() işlevini NumberOfOrders () işleviyle değiştirmek için, sıfırdan büyük olduğundan emin olmak için dönüş değerini kontrol etmek gerekli ve yeterlidir. Kontrol edilen siparişlerin listesini fonksiyon parametreleriyle sınırlayabilirsiniz:

  • sy - Araç 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 - bekleyen emir türü. Geçerli değerler OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP veya -1 şeklindedir. Varsayılan değer -1 , herhangi bir sipariş anlamına gelir.
  • mn - Sipariş Kimliği (MagicNumber). Varsayılan değer -1 - herhangi bir büyü.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   int i , k = OrdersTotal () , ko = 0 , ot ;

   if ( sy == " 0 " ) sy = Symbol () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
       ot = OrderType () ;
       if ( ot > 1 && ot < 6 ) {
         if (( OrderSymbol () == sy || sy == "" ) && ( op < 0 || ot == op )) {
           if ( mn < 0 || OrderMagicNumber () == mn ) ko ++;
         }
       }
     }
   }
   return ( ko ) ;
}
 

NumberOfOrders() işlevini kullanma örnekleri.

  1. Tüm siparişlerin toplam sayısını alın
     NumberOfOrders () ;
  2. Mevcut enstrüman için verilen siparişlerin sayısını alın
     NumberOfOrders ( NULL ) ;
  3. Herhangi bir enstrüman için BuyLimit siparişlerinin sayısını alın
     NumberOfOrders ( "" , OP_BUYLIMIT ) ;
  4. EURUSD'de sihirli 123456 ile SellStop siparişlerinin sayısını alın
     NumberOfOrders ( " EURUSD " , OP_SELLSTOP , 123456 ) ;
  5. Mevcut enstrüman için sihirli 2345 ile sipariş sayısını alın
     NumberOfOrders ( NULL , - 1 , 2345 ) ;

Ekte, yine yukarıdaki örneklerle çalışan bir komut dosyası.

Dosyalar:
 
KimIV :

NumberOfOrders() işlevi.

Bu işlev, siparişlerin sayısını döndürür ve işlevsel olarak ExistOrders() öğesini tamamen geçersiz kılar. ExistOrders() işlevini NumberOfOrders () işleviyle değiştirmek için, sıfırdan büyük olduğundan emin olmak için dönüş değerinin kontrol edilmesi gerekli ve yeterlidir. Kontrol edilen siparişlerin listesini fonksiyon parametreleriyle sınırlayabilirsiniz:

  • sy - Araç 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 - bekleyen emir türü. Geçerli değerler OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP veya -1 şeklindedir. Varsayılan değer -1 , herhangi bir sipariş anlamına gelir.
  • mn - Sipariş Kimliği (MagicNumber). Varsayılan değer -1 - herhangi bir büyü. eCO

biraz kafam karıştı. Nedense bazı çelişkiler görüyorum. Burada:

"... dönüş değerinin sıfırdan büyük olduğunu kontrol etmek gerekli ve yeterlidir ."

"Bu ve sadece bunu" işaretlerseniz, sipariş sayısı işlevi anlamını kaybeder!

Bu yüzden konuya girmeye başladım. Bu işlevi Uzman Danışmanıma ekledim. Parametrelerde m=1 ayarladım ve pozisyon açma koşulu

 if ( NumberOfOrders ( "" , - 1 , MagicNumber ) < m ) { //если открытых позиций МЕНЬШЕ m

Ancak uzman bu sınırlamayı görmüyor gibi görünüyor! Ve her sinyal için tekrar tekrar emirler açar...

Buradaki sorun ne olabilir?

 
rid писал (а):
biraz kafam karıştı. Nedense bazı çelişkiler görüyorum. Burada:
"... dönüş değerinin sıfırdan büyük olduğunu kontrol etmek gerekli ve yeterlidir ."
"Bu ve sadece bunu" işaretlerseniz, sipariş sayısı işlevi anlamını kaybeder!

hmm... Görünüşe göre ExistOrders() ve NumberOfOrders() işlevlerinin her biri tarafından döndürülen bilgi miktarına dikkat etmemişsiniz. ExistOrders() işlevi yalnızca siparişlerin varlığı hakkında bilgi döndürürken NumberOfOrders() işlevi sipariş sayısı hakkında bilgi verir. Sipariş sayısı ile ilgili bilgiler, siparişlerin varlığı hakkında bilgi içerir. Bir sipariş var mı yok mu sorusuna cevap vermeniz gerektiğinde, sayıları hakkında bilgi gereksizdir. Bu nedenle ExistOrders() işlevini NumberOfOrders() işleviyle değiştirmek için NumberOfOrders ( ) işlevi tarafından döndürülen değerin sıfırdan büyük olduğundan emin olmak için kontrol edilmesi gerekli ve yeterli dedim. Sonuçta, bu değer sıfıra eşitse sipariş olmadığı ve sıfırdan büyükse sipariş olduğu açıktır. ExistOrders() işlevi, sipariş sayısıyla ilgili bilgilere ihtiyaç duyulmadığında kullanılabilir ve NumberOfOrders() işlevi, sipariş sayısıyla ilgili bilgilere ihtiyaç OLMADIĞINDA ve gerektiğinde kullanılabilir. Bu anlamda NumberOfOrders() işlevi, ExistOrders() işlevinin yerini tamamen alır.

kurtulmak :

Bu yüzden konuya girmeye başladım. Bu işlevi Uzman Danışmanıma ekledim. Parametrelerde m=1 ayarladım ve pozisyon açma koşulu

 if ( NumberOfOrders ( "" , - 1 , MagicNumber ) < m ) { //если открытых позиций МЕНЬШЕ m

Ancak uzman bu sınırlamayı görmüyor gibi görünüyor! Ve her sinyal için tekrar tekrar emirler açar...

Buradaki sorun ne olabilir?

Yani... ve burada pozisyonlarla emirleri karıştırıyor gibisin. Benim için bunlar farklı şeyler. pozisyonlar nelerdir? Bunlar OP_BUY ve OP_SELL alım satım işlemleridir ve anladığım kadarıyla emirler OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT ve OP_SELLSTOP alım satım işlemleridir. Pozisyonlar açarım ve sipariş veririm. ne açtın NumberOfOrders() işlevi, siparişlerle çalışmak üzere tasarlanmıştır.
 

Sayesinde. Anladım . Hem birinci soruda hem de ikinci soruda.

Başka bir deyişle, "genişletilmiş" NumberOfOrders() işlevi, aslında IndexByTicket() işlevini zaten içerir.

Evet kesinlikle. OP_BUY ve OP_SELL'i açtım !

Geriye bir sonraki işlevinize bir örnek vermek kalıyor, kedi. pozisyonlarla çalışır. (siparişlerle değil)

Forumda bir yere yazmıştın diye hatırlıyorum. Bir şey bulamıyor.

 
rid писал (а):
Geriye bir sonraki işlevinize bir örnek vermek kalıyor, kedi. pozisyonlarla çalışır. (siparişlerle değil)

Sipariş fonksiyonlarıyla işim bitti. Ayrıca pozisyonlar için fonksiyonlar olacaktır. Yaklaşık 30 adet.


kurtulmak yazdı:
Forumda bir yerde paylaştığını hatırlıyorum. Bir şey bulamıyor.

Aramak

 

Sevgili Igor, senden yardım istiyorum! Birkaç enstrümanda pozisyon alabilmesi için bir danışman eklemem gerekiyor. 2 Expert Advisor, standart MACD ve Ema var, her biri 6 pozisyonlu ama sadece bir pozisyon açılıyor... Dile hakim değilim, nereye ekleyeceğimi bulamıyorum... Eğer senin için zor değilse, o zaman yardım et... Ema danışmanını kopyaladım... Teşekkürler!



//+------------------------------------------- --------------------+
//| Parabolik.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------- --------------------+
dış çift Lot = 0.1;
dış çift Pip=5;
harici çift MoveBack=3;
harici int chk=0;
dış çift SL=20;
//+------------------------------------------- --------------------+
//| |
//+------------------------------------------- --------------------+
int başlangıç()
{
double hi=Yüksek[1];
double lo=Düşük[1];
çift EMA, EMA1, EMA2, EMA3;
int cnt=0, bilet, toplam;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1);
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
toplam=SiparişToplam();
if(toplam<1)
{
if(AccountFreeMargin()<(1000*Lots))
{
Print("Paran yok. Bedava para = ", AccountFreeMargin());
dönüş(0);
}
if(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3)))
{
chk=1;
Print("Konum mümkün!");
}
if(chk==1)
{
if(EMA3-EMA2>2*Puan && Bid>=(lo+MoveBack*Puan))
{
bilet=SiparişGönder(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA konumu:",16385,0,Kırmızı);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))
Print("SAT emri açıldı: ",OrderOpenPrice());
chk=0;
}
başka
{
Print("SATIŞ emrini açarken hata: ",GetLastError());
dönüş(0);
}
}
if(EMA2-EMA3>2*Puan && Sor<=(hi-MoveBack*Puan))
{
bilet=SiparişGönder(Symbol(),OP_BUY,Lots,Sor,3,0,0,
"EMA konumu:",16385,0,Yeşil);
if(bilet>0)
{
if(OrderSelect(bilet,SELECT_BY_TICKET,MODE_TRADES))
Print("Satın alma emri açıldı: ",OrderOpenPrice());
chk=0;
}
başka
{
Print("SATIN AL emri açılırken hata oluştu : ",GetLastError());
dönüş(0);
}
}
}
dönüş(0);
}
for(cnt=0;cnt<toplam;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // bu açık bir pozisyon mu? OP_BUY veya OP_SELL
OrderSymbol()==Symbol()) // alet eşleşiyor mu?
{
if(OrderType()==OP_BUY) // uzun pozisyon açık
{
// kapanma zamanının gelip gelmediğini kontrol et?
if(Teklif>=(OrderOpenPrice()+Pip*Puan))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // pozisyonu kapat
dönüş(0); // çıkış
}
if(Teklif<=(OrderOpenPrice()-SL*Puan))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // pozisyonu kapat
dönüş(0); // çıkış
}
}
else // aksi takdirde bu bir kısa pozisyondur
{
// kapanma zamanının gelip gelmediğini kontrol et?
if(Sor<=(OrderOpenPrice()-Pip*Puan))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // pozisyonu kapat
dönüş(0); // çıkış
}
if(Sor>=(OrderOpenPrice()+SL*Puan))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // pozisyonu kapat
dönüş(0); // çıkış
}
}
}
}
dönüş(0);
}
//+------------------------------------------- --------------------+
 

Igor, 'INI dosyalarıyla çalışmak için işlevler kitaplığındayım.' Sana bir soru sordum ama cevap alamadım :(

Neden: