KimIV'ten faydalı özellikler - sayfa 2

 
Bu seçenek hakkında ne düşünüyorsunuz:
eğer (hata==146)
{
while (IsTradeContextBusy())
{
(IsTradeAllowed()) bozulursa;
başka
uyku (1000*1.1);
}}
Bana öyle geliyor ki bu daha hızlı bir çözüm, ben böyle çalışıyorum. Yorum.
Teşekkür ederim.
 
Red.Line писал (а): Yararlı konu için teşekkürler, yanmış turtalardan bahsediyor olmama rağmen, yine de birileri büyük veri dizilerini μl'de saklama ve örnekleme sorunuyla karşılaşmış olabilir. Mkl ve veritabanı? Bu yönde kimse düşünmedi mi?
Elbette basit bir çözüm ama bir şey.. https://forum.mql4.com/ru/9377
 
zhuki :
Bu seçenek hakkında ne düşünüyorsunuz:
 if ( err == 146 )
{
  while ( IsTradeContextBusy ())
  {
    if ( IsTradeAllowed ()) break ;
    else 
    Sleep ( 1000 * 1 , 1 ) ;
  }
}
Bana öyle geliyor ki bu daha hızlı bir çözüm, ben böyle çalışıyorum. Yorum.
Teşekkür ederim.

Normal olarak alacağım. Anlayışla. Duraklama daha kısa, daha hızlı çalışıyor... Ama sürümünüzde haksız bir fazlalık var.

IsTradeContextBusy işlevi, ticaret akışı meşgul bayrağını döndürür. 195. yapıdan önce bu özellik hiç yoktu. Ve Expert Advisor'ın ticaret yapmasına izin verildiğine ve ticaret akışının serbest olduğuna dair bir işaret döndüren IsTradeAllowed işlevini kullandık.

Expert Advisor'ın özellikleri iletişim kutusundaki (F7 tuşu) "Uzman Danışmanın işlem yapmasına izin ver" onay kutusunu işaretleyerek Expert Advisor'ın işlem yapmasına izin verilir.

Hata 146 (Ticari iş parçacığı meşgul), EA'nın ticaret yapmasına izin vermekle hiçbir ilgisi yoktur. Bu nedenle, sadece ticaret akışı ile ilgili kısımda IsTradeAllowed fonksiyonunun özelliklerini ele alalım.

Böylece ticaret akışı serbesttir, IsTradeAllowed işlevi True değerini döndürür. İşlem akışı meşgul, IsTradeAllowed işlevi False değerini döndürür. Şimdi IsTradeContextBusy işlevi tarafından döndürülen değerleri göz önünde bulundurun. Ticaret akışı ücretsizdir, IsTradeContextBusy işlevi False değerini döndürür. Ticaret akışı meşgul, IsTradeContextBusy işlevi True değerini döndürür. Aynı ticaret akışı durumları için IsTradeAllowed ve IsTradeContextBusy fonksiyonlarının değerlerinin zıt olduğunu görüyoruz. Ayrıca, ticaret akışının durumuna ilişkin bu işlevler birbirini tamamlamaz, birbirinin kopyasıdır. Bu nedenle, bunlardan biri hariç tutulabilir. Ne? IsTradeAllowed işlevi, daha önce de belirttiğim gibi, ticaret akışı durum bayrağına ek olarak, bu durumda ihtiyacımız olmayan, yani 146 numaralı işleme hatasında (Ticaret akışı meşgul) EA için ticaret izni bayrağını da döndürür. . Bu nedenle, yalnızca bir IsTradeContextBusy işlevi kullanmak gerekli ve yeterli olacaktır. Yukarıdaki kısaltmaları yaparsanız, kodunuz benimkine indirgenecektir:

 if ( err == 146 ) while ( IsTradeContextBusy ()) Sleep ( 1000 * 1 , 1 ) ;
tek fark duraklama boyutudur. Ancak bu zaten bir zevk meselesi, kişisel tercihler, ticaret tarzı ve diğer şeyler. 0.1 saniyelik bir duraklama ayarlayabilirsiniz. İlkesiz ... Ben sadece 11 saniyeyi tercih ederim.
 
Ayrıntılı cevabınız için teşekkür ederim, bayrağı bilmiyordum, görünüşe göre açıklamada bir yerde onu kaçırdım.Ancak doğruluk için, yine de, akış serbest bırakılıncaya kadar 5 saniyeden itibaren her türlü ticaret işlemi arasında duraklamayı tercih ediyorum. Bunun doğru olduğunu ve birkaç Uzman Danışmanla birlikte doğru ve güvenli olduğunu düşünün. Teşekkür ederim.
 

SetOrder işlevinde iki hata var:

  1. MarketInfo işlevinin yanlış kullanımı. ÖNCE değil, sy parametresini kontrol ettikten SONRA çağrılmalıydı.
  2. Sipariş verme düzeylerinin düzeltilmesi düzgün çalışmadı. Ayrıca, stop ve take fiyat seviyelerinde düzenleme yapılmadı. Şimdi düzeltildi ve harika çalışıyor. Bu vakayı uzun bir süre, biraz sonra yayınlayacağım bir test betiği ile kontrol ettim.

Dikkat! Çevrimiçi ticaret için SetOrder işlevine sahip gönderi düzeltildi. İşlev biraz daha uzun. Tam olarak gönderiye dahil edilmedi, bu yüzden karavana çıkarılması gerekiyordu.

 

Bu yazımda SetOrder fonksiyonunun nasıl çalıştığını anlatan ana noktaları vermeye karar verdim. Ben kendim emirlerle çalışmıyorum, yani burada yabancı topraklardayım. Belki SetOrder işlevini anlayan biri iyileştirmeler önerir veya hatalar bulur.

1. Kodun ilk satırlarında yerel değişkenlerin bildirilmesi ve bazılarının başlatılması. Örneğin, lsComm, Uzman Danışmanın adını ve GetNameTF işlevi tarafından döndürülen zaman çerçevesinin adını içerir. Bu arada, GetNameOP , GetNameTF , Message ve diğer küçük işlevler gibi işlevler üzerinde durmayacağım, yalnızca birinin onlar hakkında soruları varsa.

 string   lsComm = WindowExpertName () +" "+ GetNameTF ( Period ()) ;

2. Alınan parametrelerin kontrol edilmesi. sy boşsa, mevcut enstrümanın adıyla başlatılır. İşlem türüne göre, grafikteki simgenin rengi için bir değişken başlatılır. Sıfır olmayan sipariş sona erme süresi mevcut zamandan daha az ise, sıfırlanır.

 if ( sy == "" || sy == " 0 " ) sy = Symbol () ;
msl = MarketInfo ( sy , MODE_STOPLEVEL ) ;
if ( op == OP_BUYLIMIT || op == OP_BUYSTOP ) clOpen = clOpenBuy ; else clOpen = clOpenSell ;
if ( ex > 0 && ex < TimeCurrent ()) ex = 0 ;

3. Sayısı global NumberOfTry değişkeninin değeri ile sınırlanan alım satım girişimleri döngüsünün gövdesi. Sırada SetOrder fonksiyonunun ana döngüsü içinde gerçekleştirilen işlemler yer almaktadır.

 for ( it = 1 ; it <= NumberOfTry ; it ++ )

4. SetOrder işlevi test cihazında yürütülmezse, çalışmasını kesmek mümkündür. Hemen, ticaret akışının serbest bırakılması için bir bekleme döngüsü yürütülür. Piyasa ortamı değişkenleri güncellenir ve mevcut saat sabitlenir.

 if ( ! IsTesting () && ( ! IsExpertEnabled () || IsStopped ())) {
  Print ( " SetOrder(): Остановка работы функции " ) ;
  break ;
}
while ( ! IsTradeAllowed ()) Sleep ( 5000 ) ;
RefreshRates () ;
ot = TimeCurrent () ;

5. Ticaret sunucusuna bir istek gönderme. Bilet pozitifse, SetOrder işlevi sona erer.

 ticket = OrderSend ( sy , op , ll , pp , Slippage , sl , tp , lsComm , mn , ex , clOpen ) ;
if ( ticket > 0 ) {
  if ( UseSound ) PlaySound ( NameFileSound ) ; break ;
 

6. Negatif bilet ile yürütme hataları işlenir .
7. 128 (Anlaşma yürütme zaman aşımı süresi doldu), 142 (Sipariş kuyruğa alındı) ve 143 (Sipariş, bayi tarafından yürütülmek üzere kabul edildi) hataları durumunda, 66 saniye boyunca bir duraklama gerçekleştirilir. Bir duraklamadan sonra ExistOrders işlevi kullanılarak (biraz sonra üzerinde duracağız), siparişin sunucuya yapılan istek ile içinde bulunulan an arasındaki zaman aralığında verilip verilmediği kontrol edilir. Sıra ayarlanmışsa, fonksiyondan çıkın.

 err = GetLastError () ;
if ( err == 128 || err == 142 || err == 143 ) {
  Sleep ( 1000 * 66 ) ;
  if ( ExistOrders ( sy , op , mn , ot )) {
    if ( UseSound ) PlaySound ( NameFileSound ) ; break ;
  }
  Print ( " Error( " , err , " ) set order: " , ErrorDescription ( err ) , " , try " , it ) ;
  continue ;
}

8. Puan boyutu ve Alış ve Satış fiyatları yerel değişkenlerde saklanır.

 mp = MarketInfo ( sy , MODE_POINT ) ;
pa = MarketInfo ( sy , MODE_ASK ) ;
pb = MarketInfo ( sy , MODE_BID ) ;

9. Hata 130 (Yanlış duraklar) ile, mümkünse, emir verme, durdurma ve alma fiyat seviyeleri ayarlanır.

 // Неправильные стопы
if ( err == 130 ) {
  switch ( op ) {
    case OP_BUYLIMIT :
      if ( pp > pa - msl * mp ) pp = pa - msl * mp ;
      if ( sl > pp - ( msl + 1 ) * mp ) sl = pp - ( msl + 1 ) * mp ;
      if ( tp > 0 && tp < pp + ( msl + 1 ) * mp ) tp = pp + ( msl + 1 ) * mp ;
      break ;
    case OP_BUYSTOP :
      if ( pp < pa + ( msl + 1 ) * mp ) pp = pa + ( msl + 1 ) * mp ;
      if ( sl > pp - ( msl + 1 ) * mp ) sl = pp - ( msl + 1 ) * mp ;
      if ( tp > 0 && tp < pp + ( msl + 1 ) * mp ) tp = pp + ( msl + 1 ) * mp ;
      break ;
    case OP_SELLLIMIT :
      if ( pp < pb + msl * mp ) pp = pb + msl * mp ;
      if ( sl > 0 && sl < pp + ( msl + 1 ) * mp ) sl = pp + ( msl + 1 ) * mp ;
      if ( tp > pp - ( msl + 1 ) * mp ) tp = pp - ( msl + 1 ) * mp ;
      break ;
    case OP_SELLSTOP :
      if ( pp > pb - msl * mp ) pp = pb - msl * mp ;
      if ( sl > 0 && sl < pp + ( msl + 1 ) * mp ) sl = pp + ( msl + 1 ) * mp ;
      if ( tp > pp - ( msl + 1 ) * mp ) tp = pp - ( msl + 1 ) * mp ;
      break ;
  }
  Print ( " SetOrder(): Скорректированы ценовые уровни " ) ;
}

10. Günlükte, daha sonra sorunu çözmenize veya bir hata bulmanıza yardımcı olabilecek bilgiler görüntülenir.

 Print ( " Error( " , err , " ) set order: " , ErrorDescription ( err ) , " , try " , it ) ;
Print ( " Ask= " , pa , "  Bid= " , pb , "  sy= " , sy , "  ll= " , ll , "  op= " , GetNameOP ( op ) ,
      "  pp= " , pp , "  sl= " , sl , "  tp= " , tp , "  mn= " , mn ) ;
if ( pa == 0 && pb == 0 ) Message ( " SetOrder(): Проверьте в обзоре рынка наличие символа " + sy ) ;

11. Ve sonunda diğer hatalar işlenir. Bazıları uzun bir duraklama (5 dakika) üzerine tökezler, diğerleri danışmanın çalışmasını engeller, diğerleri ticaret girişimlerine devam etmelerine izin verir, vb.

Her şey! Açıklamanın sonu!

 

ExistOrders() işlevi.

Sipariş varlığı bayrağını döndürür. Sıralamanın yapılıp yapılmadığı sorusuna cevap verecektir. Bu işlevi kullanarak, herhangi bir siparişin yanı sıra daha spesifik bir sipariş talep edebilirsiniz. İstek filtresi, işlev parametreleri kullanılarak yapılandırılır:

  • sy - Aracın adına bir kısıtlama getirir. Varsayılan olarak, parametre "" - kısıtlama yok, yani herhangi bir araç. NULL'u geçerseniz, sipariş seçimi mevcut enstrümanla sınırlı olacaktır.
  • op - Emir türüne bir sınır koyar. Varsayılan olarak, herhangi bir kısıtlama yoktur, yani herhangi bir tür siparişin varlığı kontrol edilir. Geçerli parametre değerleri -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT ve OP_SELLSTOP'tur.
  • mn - Siparişin 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 siparişin varlığı kontrol edilir.
  • ot - Sipariş verme süresine bir sınır getirir. Kontrol. böylece sipariş bu parametrenin değerinden daha sonra verilir. Varsayılan olarak, herhangi bir sınır yoktur, yani herhangi bir ayar süresine sahip bir siparişin varlığı kontrol edilir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders ( string sy = "" , int op =- 1 , int mn =- 1 , datetime ot = 0 ) {
  int i , k = OrdersTotal () , ty ;
 
  if ( sy == " 0 " ) sy = Symbol () ;
  for ( i = 0 ; i < k ; i ++ ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
      ty = OrderType () ;
      if ( ty > 1 && ty < 6 ) {
        if (( OrderSymbol () == sy || sy == "" ) && ( op < 0 || ty == op )) {
          if ( mn < 0 || OrderMagicNumber () == mn ) {
            if ( ot <= OrderOpenTime ()) return ( True ) ;
          }
        }
      }
    }
  }
  return ( False ) ;
}
 

ExistOrders() işlevini kullanma örnekleri.

1. Herhangi bir sipariş olup olmadığını kontrol edin

ExistOrders();

2. Mevcut tablonun enstrümanı için herhangi bir siparişin olup olmadığını kontrol edin.

ExistOrders(NULL);

3. Herhangi bir enstrüman için BuyLimit siparişini kontrol edin

ExistOrders("", OP_BUYLIMIT);

4. EURUSD üzerinde sihirli 123456 ile bir SellStop siparişini kontrol edin

ExistOrders("EURUSD", OP_SELLSTOP, 123456);

5. Kurulum süresi en geç 2 saat olan herhangi bir sipariş olup olmadığını kontrol edin.

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);
Fragmanda ExistOrders işlevini test etmek için bir komut dosyası var. Komut dosyasındaki ilk 4 örnek yorumlanmıştır.

Dosyalar:
 

Dikkat! 12.03.2008 07:24 tarihli bir gönderide SetOrder.mq4 eklentisini değiştirdim.

Neden: