Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1220

 
HistorySelect (xxx, TimeCurrent () + 1 )

Bir saniye, gerçek hayatta son anlaşmanın/siparişin sık sık kaybedilmesidir. Örneğin, birçok köprüde, bir emrin yürütülmesi beş saniyeye kadar sürebilen bir TTL süresi alır. Beş saniye içinde yerine getirilmezse - reddedin. Veya yerine getirildi, ancak üç saniye içinde.

Kabulden yürütmeye kadar hiçbir onay işareti olmasaydı , HistorySelect'e yapılan böyle bir çağrı bu konuda bilgi almaz.


Belki de TimeCurrent, MathMax'e (LastOrder_time, MarketWatch_Time) eşit olmalıdır. O zaman HistorySelect doğru olacaktır. Ancak TimeCurrent belki de çok pahalıdır.


ZY Bu arada, HistorySelect'in bu tür çalışma planı, müzayede tarihinin bir bölümünü geçecek.

 void OnStart ()
{
   static MqlTick PrevTick = { 0 };
  
   MqlTick Tick;
  
   if ( SymbolInfoTick ( _Symbol , Tick))
  {
     if ( HistorySelect (PrevTick.time, INT_MAX ))
       // Учитываем новые ордера/сделки в Истории торгов

    PrevTick = Tick;  
  }
}

Her ne kadar ilk bakışta her şey temiz olsa da.


MT5'te ucuz DealsTotal() yazmak kolay değildir. Bu, MT4'teki temel (ve ücretsiz) OrdersHistoryTotal() değildir.

 

yüksek sesle düşünerek, ilgili ve yetkin olduğumu iddia etmiyorum:


fxsaber :

Kabulden yürütmeye kadar hiçbir onay işareti olmasaydı , HistorySelect'e yapılan böyle bir çağrı bu konuda bilgi almaz.

Bu sorunu çözmeyeceksiniz, sunucu-terminal-MQL etkileşim modeli orijinal olarak böyle ortaya çıktı.

MT5'te henüz kontrol anına ulaşmadım, ancak MT4'te, bir sembol üzerinde piyasaya genel bakış penceresinde sembolümüz için fiyatların değiştiği durumlar olduğunu biliyorum, ancak EA onay veya daha az onay alamayabilir


tamam, mesele bu değil, böyle çalışıyor, sadece TS'de bir çözüm seçmeniz gerekiyor, siparişin gönderildiği andan itibaren sunucudan bilgi gelmediğinde siparişe ne oluyor - yani. a priori, sipariş verilecek veya reddedilecek ve bu ön kararı onaylamak veya iptal etmek için bir yanıt aldıktan sonra - yani. onaylanmamış bilgilerle çalışın veya sunucudan yanıt gelmesini bekleyin - bu MQ tarafından sunulur ve büyük olasılıkla memnun kalmazsınız


fxsaber :

MT5'te ucuz DealsTotal() yapmak kolay değildir. Bu, MT4'teki temel (ve ücretsiz) OrdersHistoryTotal() değildir.

yazma ;)

ya da daha doğrusu, büyük olasılıkla yaz ve EA kaynaklarını algoritmayı sürdürmek için harcayacaksın, bence SQLite'ın nasıl çalıştığını öğrenmen gerekiyor, belirtilen MQ performans testleri, büyük tablolar ve seçimlerle çalışmak sadece veritabanının amacı - EA kodu minimalist olacak, veritabanının tüm işleri sizin tarafınızdan yapılacak, tüm iş sipariş verirken verileri doldurmak ve sunucu yanıt verdiğinde güncellemek olacak (senkronizasyon, elbette, EA başlatıldığında, veritabanı bellekte)

 
Igor Makanu :

yazma ;)

ya da daha doğrusu, büyük olasılıkla yaz ve EA kaynaklarını algoritmayı sürdürmek için harcayacaksın, bence SQLite'ın nasıl çalıştığını öğrenmen gerekiyor, belirtilen MQ performans testleri, büyük tablolar ve seçimlerle çalışmak sadece veritabanının amacı - EA kodu minimalist olacak, veritabanının tüm işleri sizin tarafınızdan yapılacak, tüm iş sipariş verirken verileri doldurmak ve sunucu yanıt verdiğinde güncellemek olacak (senkronizasyon, elbette, EA başlatıldığında, veritabanı bellekte)

Orijinal olarak yazılmış ve yayınlanmıştır. Daha hızlı olması pek olası değil.

 
fxsaber :

Orijinal olarak yazılmış ve yayınlanmıştır. Daha hızlı olması pek olası değil.

yani sorunu doğru görmedim

OnTradeTransaction() ve OnTick() olmak üzere iki noktadan sipariş listesini güncellemenin gerekli olduğunu düşündüm, bu yüzden bunu veritabanında yapmayı önerdim

 
void OnTradeTransaction ( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if (trans.type== TRADE_TRANSACTION_DEAL_ADD )
     {
       if (! HistoryDealSelect (trans.deal))
         return ;
       bool time_to_sum_up= false ;
       if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY )== DEAL_ENTRY_OUT )
        {
         time_to_sum_up= true ;
        }
       if (!time_to_sum_up)
         return ;
       HistorySelect ( 0 , TimeCurrent ());
       int deals= HistoryDealsTotal ();
       for ( int i=deals- 1 ; i>= 0 ; i--)
        {
         if ( HistoryDealGetTicket (i)==trans.deal)
           {
             Print ( "Found!" );
             return ;
           }
        }
       Print ( "Not Found!" );
     }
   return ;
  
Bu kod, EA'mın basitleştirilmiş bir pasajıdır.
Birkaç durumda, bu kodu çalıştırmanın sonucunun "Bulunamadı" sonucunu verdiğini varsayalım.
Nedenini pek anlamıyorum.
Tetiklediği olaylarda neden kendini bulamıyor?
Sunucu tarafından terminale gönderilen işlem olayı geldi, ancak sunucu aynı anda terminale doğru zamanı senkronize edemiyor mu?
Anladığım kadarıyla TimeCurrent() değerindeki bir saniyelik artış fazlasıyla yeterli.
Önemli bir şeyi kaçırıyor olmalıyım, değil mi?
Anlayışımdaki hataları belirtirseniz çok minnettar olurum.
Объем импорта г/г - экономический индекс Японии
Объем импорта г/г - экономический индекс Японии
  • www.mql5.com
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
 
Mql5'te bazı sembollerin Market Deep'ini açmak için bir yöntem oluşturabilir misiniz lütfen? bu, birden çok sembolle çalışırken önemlidir .
 
Dmitri Custurov :

İşte kodum. Başlatmada, tabloda bir giriş oluşturur. OnTick gövdesinde, aynı PRIMARY KEY ile bir kayıt eklemeye çalıştığım için hemen bir hata döndürmesi gerekir ve bundan sonra veritabanı hemen kapatılır. Ama aynı zamanda, açtığımda, en azından ilk girişi görmeliydim, ancak test cihazında çalıştırdığımda orada değil. Ve masa bile oluşturulmadı. Ve sadece terminalde çalıştırırsam, her şey yolunda. İlk giriştir.

Üssün konumuyla, umarım ortalığı karıştırmamışsınızdır?

 
Aleksey Mavrin :

Üssün konumuyla, umarım ortalığı karıştırmamışsınızdır?

Tabii ki değil. Her şey Dosyalarda yazılmıştır. Tester modunda veri tabanının bellekte oluşturulup testten sonra yok edildiğini düşünüyorum.

 
Igor Makanu :

yüksek sesle düşünerek, ilgili ve yetkin olduğumu iddia etmiyorum:

...

ya da daha doğrusu, büyük olasılıkla yaz ve EA kaynaklarını algoritmayı sürdürmek için harcayacaksın, bence SQLite'ın nasıl çalıştığını öğrenmen gerekiyor, belirtilen MQ performans testleri, büyük tablolar ve seçimlerle çalışmak sadece veritabanının amacı - EA kodu minimalist olacak, veritabanının tüm işleri sizin tarafınızdan yapılacak, tüm iş sipariş verirken verileri doldurmak ve sunucu yanıt verdiğinde güncellemek olacak (senkronizasyon, elbette, EA başlatıldığında, veritabanı bellekte)

Ve tüm işleri sizin için hangi veritabanı yapacak? Bana söyleyecek misin?

 

Bir terminalde sadece emir verme, diğerinde (aynı broker ve hesapla) yürütme kontrolü. DB veya PUB/SUB ZMQ aracılığıyla iletişim. DB kesinlikle SQLite değildir. Bu amaçlar için en uygunu Redis'tir, tabii ki kişisel bir görüş.

İyi şanlar