Ticaret ortamıyla çalışırken yaygın hatalar ve bunları ortadan kaldırmanın yolları - sayfa 2

 

fxsaber :

Bir işlev, bir sarmalayıcıya olan ihtiyacı gösteren kırmızı ile işaretlenmiştir. Onun sorunu burada anlatılıyor. Birisi bunun, eski zamanlarda Uyku yoluyla çözülen, OrderSend'den sonra bir pozisyonun açılmasını bekleyen eski bir pozisyon yeniden açma sorunu olduğunu hatırlayacaktır. Ama aslında bu sorunun OrderSend ile alakası yok. Ticaret ortamını doğru okuyabilmeniz gerekir.

Basit bir örnek için doğru seçenek...

Pozisyon listesi gibi emir listesi de anında güncellenmez. Uyku koltuk değneği olmadan yapmayacağım.

Muhtemelen daha doğru bir şekilde OnTicaretİşlem

 
Aleksey Lebedev :

Pozisyon listesi gibi emir listesi de anında güncellenmez. Uyku koltuk değneği olmadan yapmayacağım.

Muhtemelen daha doğru bir şekilde OnTicaretİşlem

Ticaret ortamının güncellemesini beklemekle ilgili bir sorun varsa, Uyku nasıl yardımcı olabilir? Ya yardım eder ya da etmez.

Bu yüzden yaklaşım diğer tarafta olmalıdır: bir pozisyon açmak için bir emir gönderin veya bekleyen bir emir verin - sonucu beklemeniz ve daha fazla açmak veya yerleştirmek için emir göndermemeniz gerekir. Bu, kendimiz yönettiğimiz ve yalnızca programın yürütülmesini geciktiren, ancak programın kendisi tarafından gönderilen ticaret talebinin sonucunu kontrol etmeyen ve sonrasında ne yapacağını bilmesi gereken Sleep'e güvenmediğimiz bir bayrağa ihtiyacımız olduğu anlamına gelir. bu - bayrağı ayarlayın ve sonucu bekleme mantığı üzerinde zaten çalışın. Sonucu bekledik - bayrağı kaldırdılar.

 
Artyom Trishkin :

Soru: Bir ticaret talebi gönderdikten sonra, bir sonraki tıklamaya kadar sunucu tarafından bir piyasa emri verilmezse ne olur?

MT4'tekiyle tamamen aynı olacak - hiçbir şey yoksa, sayılmaz.


Böyle bir ticaret emrinin ortaya çıkmasının birkaç nedeni hakkında konuşabiliriz.

  1. Üçüncü taraf OrderSend veya OrderSendAsync - ticaret ortamını okuduğumuz programdan değil. Belki programın çalıştığı Terminalden bile değil. Bu durumda hiçbir şey yapılamaz. Bu gibi durumlarda her şey MT4'teki ile tamamen aynıdır.
  2. Kendi OrderSend veya OrderSendAsync - ticaret ortamını da okuyan bir programdan başlatıldı. OrderSend durumunda her şey açıktır, çünkü OrderSend, yürütmesini net bir sonuçla tamamlayacaktır. OrderSendAsync durumunda, iki şey yapabilirsiniz - verileri ilk paradigmaya göre sonraki olaylara iletin veya MT4'te düzenli asenkron veri aktarımını simüle ederken yapıldığı gibi OrdersAsyncWait() yapın (koda sahip değilim). (birkaç ticaret dizisi aracılığıyla uygulama).
Muhtemelen MT4'te OrderSendAsync hakkında birkaç söz söylemeye değer. Orada, programın yürütülmesinin herhangi bir aşamasında, ilgili ticaret akışının istihdamını ve tam olarak neyle meşgul olduğunu görebilirsiniz. Bu anlamda, MT4'teki bu tür özel eşzamansızlık, MT5'teki standart olandan çok daha fazla fırsat sunar. Ancak MT4'te, her çizelgede "müşterilerin" başlatılmasıyla uygulanır, yani. masraflı. MT5'te aynı işlevselliği ve hatta çok fazla çizelge olmadan yazmak mümkündür - bir OBJ_CHART nesnesi üzerinde bir komut dosyası çalıştırın, ancak yine de hafif bir gecikme olacaktır. Onlar. OrderSendAsyncCustom, yürütme hızı açısından normal OrderSendAsync'e göre biraz kaybedecek, ancak yine de OrderSend'den çok daha hızlı olacak + bonus olarak özel bir uygulamanın tüm avantajları.
 
Aleksey Lebedev :

Pozisyon listesi gibi emir listesi de anında güncellenmez. Uyku koltuk değneği olmadan yapmayacağım.

Muhtemelen daha doğru bir şekilde OnTicaretİşlem

MqlTradeTransaction, yalnızca OrderSendAsync ile çalışırken uygun paradigmayı seçerseniz gerekli olabilir. Diğer durumlarda, OnTradeTransaction == OnTrade, anlamıyla, OnTick veya OnTimer'dan daha fazla rol oynamaz.


OnTradeTransaction içinde kullanmanız gerekir. Önbellekler zorunlu bilgi DEĞİLDİR ve yalnızca hızlandırma için kullanılır. Bu nedenle, onları hemen dikkate almıyoruz.

  • Olay girişleri (OnTick, OnTimer, vb.) birbirine bağlı DEĞİLDİR. Her giriş temiz bir sayfadır. Yaklaşık olarak her olay için kendi başınıza çalıştırdığınız bir komut dosyası gibi.
  • Vurgulu, aynı işlem kodunun her Açık işlevinde çalıştırıldığı anlamına gelir. Uygun ticari olmayan kod gerisini halleder.

     
    fxsaber :

    MT4'tekiyle tamamen aynı olacak - hiçbir şey yoksa, sayılmaz.

    Eh, yani - bir sonraki onay işaretinde, program açmak için yeni bir istek gönderir. Sonuç olarak, aynı sorunu yaşıyoruz - çoklu açıklıklar.

    Mantık, EA'da şöyle bir şey olmalıdır:

    1. Bir pozisyon açmak veya bekleyen bir emir vermek için bir sinyal aldı
    2. Yeni bir tane açmak için uygun olmayan emir/pozisyon sayısı kontrol edildi - çıkış (1. adıma)
    3. Bir sunucu yanıtı beklemek için bayrağı kontrol ettik:
      1. Bayrak açık - çıkış (1. maddeye)
      2. İşaretle - devam et
    4. Bekleme bayrağı atlanmıştır - bir ticaret talebi göndeririz (deneme sayısı sınırlıdır) ve iade kodunu kontrol ederiz
      1. Emir yürütülür - bekleme bayrağını koyarız
      2. Emir yerine getirilmedi - işlem emrini ayarlama fonksiyonunu çağırıyoruz ve 4. adıma geçiyoruz.
    5. Bekleme bayrağı kaldırılır - ticaret ortamındaki değişikliğin kontrol edilmesi
      1. Ticaret ortamı değişmedi - çıkış (1. maddeye)
      2. İşlem ortamı değişti - bekleyen bir emir verildi veya bir pozisyon açıldı - bekleyen bayrağı kaldırın ve çıkın (1. adıma)
     
    Artyom Trishkin :

    Eh, yani - bir sonraki onay işaretinde, program açmak için yeni bir istek gönderir. Sonuç olarak, aynı sorunu yaşıyoruz - çoklu açıklıklar.

    Yazının tamamını okumak güzel olurdu.

    Mantık, EA'da şöyle bir şey olmalıdır:

    1. Bir pozisyon açmak veya bekleyen bir emir vermek için bir sinyal aldı
    2. Yeni bir tane açmak için uygun olmayan emir/pozisyon sayısı kontrol edildi - çıkış (1. adıma)
    3. Sunucu yanıtı bekleme bayrağını kontrol ettik:
      1. Bayrak açık - çıkış (1. maddeye)
      2. İşaretle - devam et
    4. Bekleme bayrağı atlanmıştır - bir ticaret talebi göndeririz (deneme sayısı sınırlıdır) ve iade kodunu kontrol ederiz
      1. Emir yürütülür - bekleme bayrağını koyarız
      2. Emir yerine getirilmedi - işlem emrini ayarlama fonksiyonunu çağırıyoruz ve 4. adıma geçiyoruz.
    5. Bekleme bayrağı kaldırılır - ticaret ortamındaki değişikliğin kontrol edilmesi
      1. Ticaret ortamı değişmedi - çıkış (1. maddeye)
      2. İşlem ortamı değişti - bekleyen bir emir verildi veya bir pozisyon açıldı - bekleyen bayrağı kaldırın ve çıkın (1. adıma)

    Bekleme bayrağı yalnızca ikinci durum ve OrderSendAsync için mümkündür. OrderSend'in bir bekleme bayrağına ihtiyacı yoktur. Bekleme bayrağı olmadan OrderSendAsync - OrdersAsyncWait().

    Herhangi bir teori pratikte test edilebilir.

    Pratik sonuçlar tarafından yönlendiriliyorum.
     
    fxsaber :

    Yazının tamamını okumak güzel olurdu.

    Bekleme bayrağı yalnızca ikinci durum ve OrderSendAsync için mümkündür. OrderSend'in bir bekleme bayrağına ihtiyacı yoktur. Bekleme bayrağı olmadan OrderSendAsync - OrdersAsyncWait().

    Herhangi bir teori pratikte test edilebilir.

    Pratik sonuçlar tarafından yönlendiriliyorum.

    Ben de bir asenkron mod için yazdım. Senkron ile beklemenize gerek yoktur - sonuç zaten isteğe yanıttır.

     
    Artyom Trishkin :

    Ben de bir asenkron mod için yazdım.

    Ayrıntılı cevap başlangıçta verildi.

     
    fxsaber :

    Ayrıntılı cevap başlangıçta verildi.

    yanlış okumuş olmalıyım :)

    Birden çok açıklık hatasını atlamak için adımlar görmedim. Sadece genel "paradigmalar";)

    Bu yüzden gereksiz olan örnek bir mantık verdim - pozisyon açmak/bekleyen emirleri ayarlamak için fonksiyonda (sarmalayıcı) bayrak kontrol edilir. Veya sinyal izleme işlevinde olabilir.

    En iyisinin ne olduğunu düşünmelisin.

     
    Artyom Trishkin :

    bayrak, pozisyon açmak/bekleyen emirleri ayarlamak için fonksiyonda (sarmalayıcı) kontrol edilir. Veya sinyal izleme işlevinde olabilir.

    Açık işlevinden çıkış her zaman askıya alınmış bir durum olmadan gerçekleştirildiğinde OrdersAsyncWait () çözümünü çok daha fazla seviyorum. Ardından, ticaret ortamının sıfırdan bir sonraki okuması mümkün olduğu kadar alakalıdır.

    OrderSendAsync kullanmak her zaman mantıklı olmalıdır. Bunun gerçekleştiği tek durum, birden fazla (> 1) bağımsız işlem emrinin tek bir sinyalle gönderilmesidir. Bu nedenle, diğer tüm durumlarda OrderSendAsync'i çitlemek hiçbir zaman mantıklı değildir.


    Tehdit OrderSendAsync'in çok alakalı olduğu ayrı bir konu var - çoklu danışmanlar: bir danışmanda birkaç bağımsız TS. OrderSend burada nadiren uygundur ve prensipte hiçbir Uykuya izin verilmediğinden OrderAsyncWait( const string Symb ) bile uygun değildir.