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

 

Lütfen bana söyleyin, OrderSend işlevi true döndürürse ve result.order'ın bir emir bileti varsa (result.order!=0), emrin aracı tarafından kabul edildiğini ve işlem sekmesinde olduğunu garanti eder mi yoksa bu aşamada istek yalnızca aracının sunucusu tarafından kabul edilir, ancak borsa tarafından kabul edilmez mi?

Ve ikinci soru, OrderSend true döndürdüğünde ve result.order==0 olduğunda bir durum olabilir mi?

 
Aleksey Gunin:

OrderSend fonksiyonu true döndürürse ve result.order bir emir biletine sahipse (result.order!=0), emrin aracı tarafından kabul edildiğini ve işlem sekmesinde olduğunu garanti eder mi yoksa bu aşamada istek yalnızca aracının sunucusu tarafından kabul edilir, ancak borsa tarafından kabul edilmez mi?

Garantilidir.

Ve ikinci soru, OrderSend true döndürdüğünde ve result.order==0 olduğunda bir durum olabilir mi?

Hayır.

 
fxsaber:

Garantiler.

Hayır.

Daha geçen gün OrderSend işlevi için bir açıklama eklediler, çevrimiçi yardıma bakın.

 
Rashid Umarov:

Geçen gün OrderSend işlevi için bir açıklama eklediler, çevrimiçi yardıma göz atın.

Bu piyasa emirleri için de geçerli mi?

Kabul edilen her emir, gerçekleştirilmesi için gereken koşullardan biri gerçekleşene kadar işlenmeyi beklemek üzere işlem sunucusunda saklanır:

  • Son kullanma tarihi,
  • bir sayaç talebinin gerçekleşmesi,
  • Gerçekleştirme fiyatının alınması üzerine emrin tetiklenmesi,
  • siparişi iptal etmek için bir talebin alınması.
Terminalin kendisinin her zaman OrderSendAsync'ten önce OrderCheck'i çağıracağına dair bir şartname yoktur ve OrderSend, OrderSendAsync üzerine bir eklentidir

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

Ticaret ortamı ile çalışırken yapılan tipik hatalar ve bunları ortadan kaldırmanın yolları

fxsaber, 2018.02.20 12:23 pm.

Standart OrderSend uygulamasının koşullu şeması (zaman aşımı olmadan)
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Standart OrderSend'i uygulamak için koşullu algoritma
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // şematik çağrı
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


Bu şemadan açıkça görebiliyoruz ki, aynı MetaQuotes-Demo üzerinde OrderSendAsync aracılığıyla bir piyasa emri verirken, emir gerçekleşene veya reddedilene kadar ilgili emrin verilmesi olayını yakalamayı garanti etmek imkansızdır. Yani, MT5, OrderSendAsync'in ara sonuçlarını değerlendirmek için herhangi bir basit mekanizmaya sahip değildir.


OrderSend, Result.request_id, OnTradeTransaction'daki OrderSendAsync'in aynı değerine eşit olana kadar yürütülür. Ya da zaman aşımı ile sonlandırılır. Bu nedenle, OrderSend'in sonucu yalnızca ilgili request_id ile OnTradeTransaction'daki mesaj türüne bağlıdır.

Request_id'nin kendisinin oluşumu hakkında bilgi almak faydalı olacaktır. Eğer doğru anladıysam, Terminal/Hesabın başlatıldığı/bağlandığı andan itibaren işlem sunucusuna gönderilen emirlerin bir sayacıdır. Terminalin kendisi ticaret sunucusundan gelen mesajları analiz eder ve gerekli request_id'yi yalnızca birine atar (ki bu şüphelidir) veya request_id'yi belirli bir mesaja sıfırlar (büyük olasılıkla). Bu davranış, bir süre önce Teklif Geçmişinin OrderSend çıktısıyla eşleşmesini mümkün kılmıştır. Ancak OnTradeTransaction'da doğru request_id ile yalnızca bir mesaj göründüğünden, yukarıdaki alıntıda asenkron modda hoş olmayan durum ortaya çıkar.

 

İyi günler, MqlTradeResult.deal ve MqlTradeResult.order için tutarsızlıklar buldum

1) Açıklama (MQL5 Referans Kılavuzu)


2) Gerçek zamanlı ticaret

Piyasa emirleri veriyorum (TRADE_ACTION_DEAL). Print fonksiyonunu kullanarak MqlTradeResult değerlerinin çıktısını alıyorum:


ve işlem günlükte görünüyor:

Uyku işlevi ile birkaç saniye "uykuya dalmayı" ve verileri tekrar çıkarmayı denedim (anlaşma zaten tam olarak yapıldığında ve pozisyon açık olduğunda), anlaşma numarası görünmedi.


3) Strateji Test Cihazı

Tüm alanlar burada doldurulur:



Bu farklılıklara ne sebep olur?

 
Konstantin Kulikov:

İyi günler, MqlTradeResult.deal ve MqlTradeResult.order için tutarsızlıklar buldum




https://www.mql5.com/tr/docs/trading/ordersend

Bir piyasa emri gönderirken (MqlTradeRequest.action=TRADE_ACTION_DEAL), OrderSend() işlevinin başarılı sonucu emrin gerçekleştirildiği anlamına gelmez (ilgili işlemler gerçekleştirilmiştir): bu durumda true değeri yalnızca emrin daha sonra gerçekleştirilmek üzere işlem sistemine başarıyla yerleştirildiği anlamına gelir. İşlem sunucusu , OrderSend() çağrısına yanıt oluştururken bu verilerin kendisi tarafından bilinmesi halinde, döndürülen sonuç yapısındaki anlaşma veya emir alanlarının değerlerini doldurabilir .Genel olarak, emre karşılık gelen işlemlerin gerçekleştirilmesi olayı veya olayları OrderSend() çağrısına yanıt gönderildikten sonra meydana gelebilir. Bu nedenle, her tür işlem talebi için, OrderSend() uygulamasının sonucunu alırken, öncelikle işlem sunucusunun retcodedönüş kodunu ve harici işlem sisteminin retcode_external (gerekirse) yanıt kodunu kontrol etmek gerekir , bunlar döndürülen sonuç yapısında mevcuttur.


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

Böyle bilgilendirici bir makale için teşekkürler. @MetaQuotes

Sorgu: Tek bir for() döngüsünde hem açık emirler hem de açık pozisyonlar arasında toplu olarak nasıl döngü yapabilirim (MQL4'teki tüm emirleri nasıl döngüye aldığımıza ve ardından bir emrin zaten gerçekleştirilip gerçekleştirilmediğini veya bekleyen bir emir olup olmadığını kontrol ettiğimize benzer şekilde)?

 
Rahul Dhangar :

Böyle bilgilendirici bir makale için teşekkürler. @MetaQuotes

Sorgu: Tek bir for() döngüsünde hem açık emirler hem de açık pozisyonlar arasında toplu olarak nasıl döngü yapabilirim (MQL4'teki tüm emirleri döngüye alıp ardından bir emrin zaten gerçekleştirilmiş olup olmadığını veya bekleyen bir emir olup olmadığını kontrol etmemize benzer şekilde)?

POZİSYONLARI ve BEKLEYEN SİPARİŞLERİ hesaplamak için iki bağımsız döngü kullanmanız gerekir. Bir döngü POZİSYONLARI numaralandırır ve ikinci döngü BEKLEYEN SİPARİŞLERİ numaralandırır. Örnek: Pozisyonları ve Bekleyen Siparişleri Hesaplama

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

Birçok eleştiriye rağmen, sahip olduğunuz güçlü topluluk göz önüne alındığında, mql5 diline yeni başlayanlar için gerçekten endişelenen biri olmadığınızı biliyorum, işte bir tane daha:

Metnin çevirisi ve üslubu anlamayı engelliyor... Terledim, kimin önce gelmesi gerektiğini bulmak için çok yol kat etmem gerekti, çünkü belgelerin kendisi metinde kendisiyle çelişiyor:

  • Sipariş geçmişi

    Geçmişten bir sipariş hakkında bilgi almak için öncelikle üç fonksiyondan birini kullanarak sipariş geçmişi önbelleğini oluşturmanız gerekir: HistorySelect(start, end), HistorySelectByPosition() veya HistoryOrderSelect(ticket). Yürütme başarılı olursa, önbellekHistoryOrdersTotal() fonksiyonu tarafından döndürülen sipariş sayısını depolayacaktır. Bu siparişlerin özelliklerine erişim, uygun fonksiyon kullanılarak bilet içindeki her bir eleman tarafından gerçekleştirilir:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, type_property)
    3. HistoryOrderGetString(ticket_order, type_property)


Aksine: https: //www.mql5.com/pt/docs/trading/historyorderstotal aşağıda transkribe edilmiştir.



HistoryOrdersTotal

Geçmişteki emirlerin sayısını döndürür. HistoryOrdersTotal() işlevini çağırmadan önce,HistorySelect() işlevini veya HistorySelectByPosition() işlevini kullanarak işlemlerin ve emirlerin geçmişini almanız gerekir.

int HistoryOrdersTotal();

Dönüş Değeri

Double türünde değer.

Not

İşlem geçmişindeki emirleri Araç Kutusu çubuğunun "İşlem" sekmesinde görünenbekleyen emirlerle karıştırmayın. İptal edilen veya bir işleme yol açanemirlerin listesi, müşteri terminalinin araç kutusundaki "Geçmiş" sekmesinde görülebilir.

Ayrıca bakınız


İlk pasaj kendisiyle çelişiyor, herhangi bir yardıma ihtiyacı yok, ancak ikincisi geliyor ve işleri karmaşıklaştırıyor....: sonuçta kim önce gelir, HistoryOrdersTotal mı yoksa HistorySelect( start, end) HistorySelectByPosition() veya HistoryOrderSelect(ticket), hatta ikinci metinde bahsedilen HistorySelectByPosition () işlevlerinden biri mi?

Bu zordu, daha kolay olabilirdi... ama sanırım akla gelen ilk şey,ikinci metinde bahsedilen üç HistorySelect(start, end) HistorySelectByPosition () veya HistoryOrderSelect(ticket), hatta HistorySelectByPosition()'dan biri...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

İyi günler,
geliştiricilere soru: bana yaklaşık bir bilgi verebilir misiniz, geçmiş önbelleği ne kadar bellek alır? bir anlaşma ve bir sipariş için yaklaşık kbyte.

Komut dosyasını küçük bir geçmişe sahip bir terminalde çalıştırdım ve bu sonucu aldım:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

Bu, birkaç milyon işlem ve bir milyon emirden oluşan bir geçmişle, önbelleğin yaklaşık bir gigabayt alacağı anlamına mı geliyor?

Ve böylece her mql programı için?