"MetaTrader 5 Emirler, Pozisyonlar ve Yatırımlar" makalesi için tartışma

 

Yeni makale MetaTrader 5 Emirler, Pozisyonlar ve Yatırımlar yayınlandı:

Güçlü bir alım satım robotu oluşturmak, MetaTrader 5 alım satım sisteminin mekanizmalarını anlamadan yapılamaz. Müşteri terminali, alım satım sunucusundan pozisyonlar, emirler ve yatırımlar hakkında bilgi alır. Bu verileri MQL5 kullanarak düzgün bir şekilde kullanmak için MQL5 programı ve müşteri terminali arasındaki etkileşimin iyi anlaşılması gerekir.

Yazar: MetaQuotes

 

Okuduktan sonra, bu soruya en iyi cevabı bulamadım.

Önbelleğe nasıl yüklenir, örneğin, geçmişten yalnızca 1 son sipariş (görevi karmaşıklaştırmak için, sonuncuyu sembolle bırakın).

Örneğin, danışmanın farklı sipariş sıklığı vardır. Günde 30 sipariş verebilir ve birkaç gün veya hafta boyunca "sessiz" olabilir.

Sunucuya bir sipariş gönderdikten sonra biletini bir yerde hatırlamak ve daha sonra bu siparişi biletle geri almak için varyantlar vardır - sorun değil. Hem global değişkenlerde hem de EA mantığı içinde hafızaya almak mümkündür. Ancak, örneğin Uzman Danışman hesaba başka bir terminalden bağlanırsa ve son siparişin biletine sahip değilse sorun burada.

Geçmişi HistorySelect aracılığıyla yüklemem gerekiyor. Bitiş tarihi aşağı yukarı net, ancak başlangıç tarihini nasıl hesaplayacağım.

Çünkü küçük bir aralıkta bile birkaç sipariş alabilirsiniz - sorun değil, ancak gereksiz veri yükleme açısından optimal değil. Ya da bunlardan biri aralığa girmeyebilir.

Önbelleği doldurmak için daha da küçük bir tarih aralığı alabilir ve döngü oluşturabilirsiniz (aralığı geçmişe kaydırabilirsiniz) - çalışma mantığı açısından optimal değildir - ekstra döngüler, geçmiş veritabanına sorgular.

Öneri - gerekli miktarın yüklenmesini enstrümana göre siparişlere / işlemlere göre organize etmek.

Ve daha fazlası: eğer makalenin amacı emirlere/işlemlere/pozisyonlara erişim için en uygun algoritmaları göstermek olsaydı. Bence: optimizasyon açısından daha ileri gidersek, geçmişten önbelleğe alanlara göre veri yükleme moduna sahip olmak iyi olurdu, örneğin, yalnızca biletler ve siparişin sunucuya gönderilme zamanı gereklidir, o zaman neden bu aralıktaki diğer tüm verileri bu siparişlere yükleyelim (magick, comment ve çok daha fazlası).

select * from HistiryOrder where a_date_send>@datestart and a_date_send<@dateend

DBMS uygulamaları geliştirenler, böyle bir sorgunun üretim kullanımı için onaylanmayacağını düşünüyorum. Doğru, tüm verilerin bazı eylemlere daha fazla dahil olduğu durumlar vardır, ancak bu bir kuraldan ziyade bir istisnadır.


 
olyakish:

Okuduktan sonra, bu soruya en iyi cevabı bulamadım.

Önbelleğe nasıl yüklenir, örneğin, geçmişten yalnızca 1 son sipariş (görevi karmaşıklaştırmak için, sonuncuyu sembolle bırakın).

Örneğin, danışmanın farklı sipariş sıklığı vardır. Günde 30 sipariş verebilir ve birkaç gün veya hafta boyunca "sessiz" olabilir.

Sunucuya bir sipariş gönderdikten sonra biletini bir yerde hatırlamak ve daha sonra bu siparişi biletle geri almak için varyantlar vardır - sorun değil. Hem global değişkenlerde hem de EA mantığı içinde hafızaya almak mümkündür. Ancak, örneğin Uzman Danışman hesaba başka bir terminalden bağlanırsa ve son siparişin biletine sahip değilse sorun burada.

Geçmişi HistorySelect aracılığıyla yüklemem gerekiyor. Bitiş tarihi aşağı yukarı net, ancak başlangıç tarihini nasıl hesaplayacağım.

Çünkü küçük bir aralıkta bile birkaç sipariş alabilirsiniz - sorun değil, ancak gereksiz veri yükleme açısından optimal değil. Ya da bunlardan biri aralığa girmeyebilir.

Önbelleği doldurmak için daha da küçük bir tarih aralığı alabilir ve döngü oluşturabilirsiniz (aralığı geçmişe kaydırabilirsiniz) - çalışma mantığı açısından optimal değildir - ekstra döngüler, geçmiş veritabanına sorgular.

Öneri - gerekli miktarın yüklenmesini enstrümana göre siparişlere / işlemlere göre organize etmek.

Ve daha fazlası: eğer makalenin amacı emirlere/işlemlere/pozisyonlara erişim için en uygun algoritmaları göstermek olsaydı. Bence: optimizasyon açısından daha ileri gidersek, geçmişten önbelleğe alanlara göre veri yükleme moduna sahip olmak iyi olurdu, örneğin, yalnızca biletler ve siparişin sunucuya gönderilme zamanı gereklidir, neden o zaman bu aralıktaki diğer tüm verileri bu siparişlere yükleyelim (magick, comment ve çok daha fazlası).

select * from HistiryOrder where a_date_send>@datestart and a_date_send<@dateend

DBMS uygulamaları geliştirenler, böyle bir sorgunun üretim kullanımı için onaylanmayacağını düşünüyorum. Doğru, tüm verilerin bazı eylemlere daha fazla dahil olduğu durumlar vardır, ancak bu bir kuraldan ziyade bir istisnadır.


Çok büyük bir geçmişin yüklenmesi ve işlenmesi bile fazla zaman almayacaktır. Başka bir şey de, bu tür bir yükleme her tikte gerçekleştirilirse, zaten bir sorundur.

Çok büyük bir geçmiş bile birkaç saniye içinde işlenecektir. Bu nedenle, ilk sonuç tam yüklemelerin sayısını azaltmaktır.

Geçmişin tam yüklenmesini OnInit() içinde başlatın. Gerekli tarihleri hatırlayın. Sonra hikayeyi OnTicket() içinde "güneşi olan bir çingene gibi" döndürebilirsiniz.

 
Urain:

Çok büyük bir geçmişin yüklenmesi ve işlenmesi bile fazla zaman almayacaktır. Başka bir şey de, bu tür bir yükleme her tikte gerçekleştirilirse, zaten bir sorundur.

Çok büyük bir geçmiş bile birkaç saniye içinde işlenecektir. Bu nedenle ilk sonuç, tam yüklemelerin sayısını azaltmaktır.

Geçmişin tam yüklenmesini OnInit() içinde başlatın. Gerekli tarihleri hatırlayın. Bundan sonra hikayeyi OnTicket() içinde "güneşi olan bir çingene gibi" döndürebilirsiniz.

Daha açık olmak gerekirse, geçmiş yalnızca başlatma bloğunda ve hafta sonlarında tam olarak yüklenmelidir (hafta sonlarında parametreleri de optimize etmelisiniz).

 

Kafamı karıştıran bir şey, metinde geçmişin önbelleğe idareli (düşünceli) bir şekilde yüklenmesi gerektiğine dair çok sayıda uyarı bulunması, ancak bu görevin nasıl uygulanacağına dair gerçek bir örnek bulunmamasıydı. Bu açıkçası beni üzdü:

//--- başlangıç sınırını 3 gün öncesine ayarlayın
   datetime start=end-3*PeriodSeconds(PERIOD_D1);

Bu kod (yaklaşım) herhangi bir normal Uzman Danışman'da gerçekten kullanılacak mı? Belirli basit bir görevden bahsetmediğimiz sürece (örneğin, birkaç gün için emir bulmak) ve sonra - çekincelerle (bu örnekte hafta sonları dikkate alınmaz, bu nedenle kod birkaç işlem gününü işlemek için uygun değildir), yaklaşım herhangi bir eleştiriye dayanmaz.

Yine de, ekonomik yüklemeyi uygulamak için tüm araçlar mevcuttur. Ve bana kalırsa, bu tür bir uygulamanın bir örneği makalede yer almalıdır.

Örneğin, bu şablonu kullanarak:

  1. OnInit() - tüm geçmişi önbelleğe yüklemek, Uzman Danışman için önemli olan son emri aramak (örneğin, meijik veya sadece enstrümana göre), zamanını bir değişkene kaydetmek.
  2. OnTrade() - önbelleğe yüklenen geçmişi güncelleyin (hafızaya alınan zamandan başlayarak), son emrin zamanını güncelleyin (yeni bir önemli emir ortaya çıktıysa).
  3. OnTick() - mevcut yüklü önbellekle çalışır veya gerekirse önbelleği hatırlanan zamandan yükler.

Bu yaklaşım zaten istikrar ve evrensellik iddiasındadır. Ayrıca - kaynak kullanımı açısından, "son 3 günü seçmekten" daha ekonomik olduğu ortaya çıkabilir.


Her neyse, makale için tekrar teşekkürler. Bu tür "geliştiricilerden gelen spesifikasyonlar" gereklidir, aksi takdirde normal bir kod olmayacaktır.

 

Makale bir günlük işlem geçmişi yükleme örneği vermektedir (bir kodda 3 günlük geçmiş yükleme örneği vardır). Evet, bu bir sınırlamadır ve örnek evrensel değildir. Ancak okuyucu makaleyi okurken bu özelliği anlarsa, hangi aralıkta ve hangi andan itibaren işlem geçmişini önbelleğe yüklemesi gerektiği sorusuna kendisi karar verebilecektir.

Okuyucu en basit örnekleri ve algoritmaları almıştır ve artık bunları gerekli olay işleme işlevlerinde bağımsız olarak uygulayabilir. Kendi işlem geçmişi tabanını bağımsız olarak oluşturabilir ve bunun başlatma ve senkronizasyonunu yapabilir vb.

Tüm durumlar için ticaret geçmişi ile optimum çalışma için özel tarifler ve işlevler verme girişimi en az bir makale daha gerektirecektir. Daha doğrusu, örneklerin kendileri değil, belirli görevleri çözmeye yönelik yaklaşımlar. Bu makale, alım satım işlevlerinin nasıl çalıştığını ve araştırma için kendi zamanınızı boşa harcamamak için hangi nüanslara dikkat edilmesi gerektiğini anlamayı amaçlıyordu.

Bu makaleyi okuduktan sonra her şeyin basit olacağından eminim.

 

Bir yerlerde OfLine modunda terminal çalışmasının bir açıklaması olup olmadığını bana söyleyebilir misiniz? Mesele şu ki, grafik verilerinin güncellenmemesi nedeniyle terminali yükleyemedim. İş yerinde test etmek istedim (orada internet yok), ancak yapamadım: grafikler güncellenmeyi bekliyor ve test cihazında tek bir sembol yok. Makale, terminali başlattıktan sonra sunucu ile veri senkronizasyonunun gerçekleştirildiğini söylüyor. Ancak bağlantı yoksa ne olur (aslında olması gerekmez). Belki de terminale OfLine'da çalışması gerektiğini ve bu talihsiz çarkı döndürmemesi gerektiğini açıkça söylemek mantıklıdır. Belki de test edenin çalışması için daha az başarısızlık olacaktır. Adil olmak gerekirse, bu sorunu uzun zamandır yaşamadığımı söylemeliyim, ancak insanlar forumda bundan şikayet ediyorlar. Belki de durumu çözmek için bazı hileler vardır (kaldırılacak bir dosya var) (denedim - evdeki sunucuyla bağlantı kurana kadar hiçbir şey yardımcı olmadı).

Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
  • www.mql5.com
Получение рыночной информации / SymbolIsSynchronized - Документация по MQL5
 

Terminal kataloğunu yeni ekipmana aktardıktan sonra, yapılandırma veritabanlarının bir kısmı (semboller, hesap ayarları, işlem geçmişi, vb.) özel olarak silinir, çünkü bunlar sabit anahtarlarla şifrelenmiştir. Grafiklerin geçmişi etkilenmez.

Bu, geçişten sonra terminalin piyasa ortamını ayarlamasına izin vermek için en az bir kez herhangi bir ticaret hesabına bağlanmanız gerektiği anlamına gelir. Bundan sonra şifreyi silebilir, İnternet bağlantısını kesebilir ve test cihazı ile çevrimdışı çalışabilirsiniz.

 
Renat:

Terminal kataloğunu yeni ekipmana aktardıktan sonra, yapılandırma veritabanlarının bir kısmı (semboller, hesap ayarları, işlem geçmişi, vb.) özel olarak silinir, çünkü bunlar sabit anahtarlarla şifrelenmiştir. Grafiklerin geçmişi etkilenmez.

Bu, geçişten sonra terminalin piyasa ortamını ayarlamasına izin vermek için en az bir kez herhangi bir ticaret hesabına bağlanmanız gerektiği anlamına gelir. Bundan sonra şifreyi silebilir, İnternet bağlantısını kesebilir ve test cihazı ile çevrimdışı çalışabilirsiniz.


Hiçbir şeyi taşımadım veya değiştirmedim. Sadece dizüstü bilgisayarımla işe geldim ve Uzman Danışmanı test etmek istedim. Bir hesabım var ve doğal olarak giriş yapmaya çalıştım, ancak günlük sunucu ile bağlantı olmadığını söylüyor. Belki sadece rastgele bir hataydı, ama hiçbir şey yapamadım.

 
Erm955:

Hiçbir şeyi hareket ettirmedim veya değiştirmedim. Sadece dizüstü bilgisayarımla işe geldim ve EA'yı test etmek istedim. Bir hesabım var ve doğal olarak giriş yapmaya çalıştım, ancak günlük sunucu ile bağlantı olmadığını söylüyor. Belki sadece rastgele bir hata, ama hiçbir şey yapamadım.

Lütfen tüm Market Watch, grafik ve test bölgeleri dahil olmak üzere tüm terminal penceresinin tam ekran görüntüsünü sağlayın.

Evdeki hesaba bağlanmayı deneyin, verileri tamamen dışarı pompalayın ve en az bir test çalıştırın. Ardından internet bağlantısını kesin, terminali yeniden başlatın ve tekrar deneyin.

 
Renat:

Lütfen tüm Market Watch, grafik ve test bölgeleri dahil olmak üzere tüm terminal penceresinin tam ekran görüntüsünü sağlayın.

Evdeki hesaba bağlanmayı deneyin, verileri tamamen indirin ve en az bir test çalıştırın. Bundan sonra internet bağlantısını kesin, terminali yeniden başlatın ve tekrar deneyin.

Her şey eskisi gibi çalıştığı için bu hiçbir şey gerektirmez. Görünüşe göre kazara bir hata olmuş. Daha önce terminal yetkilendirme istemişti, şimdi yetkilendirme olmadan başlıyor. Bilgisayarı yeniden başlatarak ve başlatmadan yaklaşık 10 kez kontrol ettim. Her şey yolunda, teşekkürler.