English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
MetaTrader 5 Emirler, Pozisyonlar ve Yatırımlar

MetaTrader 5 Emirler, Pozisyonlar ve Yatırımlar

MetaTrader 5Ticaret | 9 Aralık 2021, 11:18
1 025 0
MetaQuotes
MetaQuotes

Alım satım şartları

Bir yatırımcının nihai amacı, finansal piyasalarda alım satım işlemleri yoluyla kar elde etmektir. Bu makale MetaTrader 5 alım satım platformunun şartlarını ve süreçlerini açıklamaktadır ve bu bilgiler MQL5 dilinin alım satım fonksiyonlarının işleyişini doğru bir şekilde anlamak için gereklidir.

  • Emirler — MetaTrader 5 platform gereksinimlerine uygun olarak formüle edilmiş olup alım satım sunucusu tarafından alınan alım satım işlemi talepleridir. Talep yanlışsa, alım satım platformunda emir şeklinde görünmeyecektir. Emirler, belirli bir finansal enstrümandan cari piyasa fiyatı üzerinden belirli bir hacmi almak veya satmak eyleminde olduğu gibi anında icra edilebilir. Başka bir emir türü de bekleyen emirlerdir; bunlar belirli bir koşul altında bir alım satım işlemi gerçekleştirme emrini içerir. Bekleyen emirler, eyleme geçmeye yönelik bir zaman kısıtlaması da içerebilir; bu örneğin emrin sona erme tarihi olabilir.

    MetaTrader 5 terminalinde emirler ve pozisyonlar

    Gerçekleşme veya iptal edilme koşullarını bekleyen verilmiş (bekleyen) emirler terminalde "Alım Satım" sekmesinde gösterilir. Bu emirler değiştirilebilir veya iptal edilebilir. Emirlerin yerleştirilmesi, iptali ve değiştirilmesi OrderSend() fonksiyonu kullanılarak yapılır. İptal edilen, sona erme zamanına ulaşan veya gerçekleştirilen bir emir, emir geçmişine geçer. Gerçekleştirilen ve iptal edilen emirler, müşteri terminalinin "Geçmiş" sekmesinde gösterilir. Geçmişten gelen siparişler değiştirilemez.

  • Yatırımlar - Bir emrin yürütülmesinin sonucudur (yatırımı gerçekleştirme komutu). Her yatırım belirli bir emire dayanır, ancak tek bir emir bir dizi yatırım oluşturabilir. Örneğin, 10 lot satın alma emri, kısmi doldurma ile birkaç ardışık yatırım yoluyla gerçekleştirilebilir. Yatırımlar her zaman alım satım geçmişinde saklanır ve değiştirilemez. Terminalde, yatırımlar "Geçmiş" sekmesinde görüntülenir.

    MetaTrader 5 terminalinde işlemler

  • Pozisyonlar, bir finansal enstrümanda satın alınan veya satılan sözleşmelerdir. Bir fiyat artışı beklentisiyle yapılan alımların sonucunda bir uzun pozisyon (Long) oluşur, bir kısa pozisyon (Short) ise gelecekteki fiyat düşüşü beklentisiyle varlığın satışı sonucu oluşur. Her hesapta, her bir finansal enstrüman için yalnızca bir pozisyon olabilir. Her sembol için, herhangi bir zamanda uzun veya kısa olmak üzere yalnızca bir açık pozisyon olabilir.

    MetaTrader 5 terminalinde geçmiş emirler

    Aynı yönde yeni bir alım satım işlemi sonucunda pozisyon hacmi artabilir. Bu, uzun pozisyonların hacminin yeni alımdan (Alım yatırımı) sonra artacağı ve satıştan (Satış yatırımı) sonra azalacağı anlamına gelir. Alım satım işlemi sonucunda taahhüt hacmi sıfıra eşit olursa pozisyon kapatılır. Böyle bir işleme pozisyonu kapatma denir.

Not: Aktif emirler ve pozisyonlar her zaman "Alım Satım" sekmesinde görüntülenir; geçmişteki fırsatlar ve emirler ise her zaman "Geçmiş" sekmesinde gösterilir. "Alım Satım" sekmesindeki aktif emirler, "Geçmiş" sekmesindeki geçmiş emirlerle karıştırılmamalıdır.


Terminal, alım satım bilgilerini sunucudan nasıl alır ve saklar?

Terminal, alım satım geçmişini özel bir tabanda saklar ve alım satım sunucusuna her bağlantıda alım satım hesabında yalnızca eksik anlaşma geçmişini ve tamamlanmış emirleri alır. Bu trafikten tasarruf etmek için yapılır. MetaTrader 5 müşteri terminali kapatılırken veya mevcut aktif hesap değiştirilirken, tüm geçmiş sabit diske kaydedilir ve terminalin bir sonraki açılışından itibaren okunur.

Tüm veritabanları diske şifreli bir biçimde kaydedilir ve şifreleme anahtarı, terminalin kurulu olduğu bilgisayara bağlıdır. Bu, kopyalama durumunda terminal kullanıcısının verilerinin yetkisiz erişime karşı korunmasını sağlar.

Hesaba bağlantı sırasında, terminal kayıtlı hesap tabanını hesabın geçmişiyle yükler ve alım satım sunucusuna, kendi geçmiş veritabanını alım satım sunucusundaki hesabın geçmişiyle senkronize etmesi için bir istek gönderir. Ayrıca, hesaba başarılı bir şekilde bağlandıktan sonra alım satım sunucusu, terminale bu hesapla ilgili devam eden alım satım olayları hakkında bir rapor gönderir.

Alım satım olayı, hesapta aşağıdaki değişiklikleri kapsar:

  • Para çekme ve bakiye işlemleri.
  • Komisyon alma, swaplar ve vergiler.
  • Emirlerin verilmesi, silinmesi ve değiştirilmesi.
  • Yatırımların emirlere dayalı olarak yürütülmesi.
  • Pozisyonların açılıp kapanması.
  • Pozisyonların hacminde ve yönünde değişiklik.

Alım satım sunucusuyla bağlantının kesilmesi durumunda, terminal periyodik olarak yeniden bağlanmayı dener. Sunucuyla yeniden bağlantı kurulduktan sonra terminal, kendi geçmiş veritabanındaki verilerin bütünlüğünü korumak için alım satım geçmişindeki tüm son değişiklikleri ister.

Terminalin "Geçmiş" sekmesinde görüntülenen alım satım geçmişi, terminal geçmişinin tabanından alınır ve geçmiş terminalinde görüntülenen dönem değişiklikleri, yalnızca bu veritabanında saklanan geçmişin aralığını büyütebilir. Görüntülenen geçmişin süresinin azaltılması, geçmişin terminal tabanından fiziksel olarak kaldırılmasına yol açmaz.

Görüntülenen alım satım geçmişi aralığının kurulumu

Buradan, görüntülenen geçmişin daha kısa bir aralığının yüklenmesinin, saklanan alım satım geçmişinin derinliğini azaltmadığını anlamamız gerekir. Ancak, "Geçmiş" sekmesinde görüntülenmesi için daha büyük bir aralık genişliği belirlersek ve terminalin kendi üssünde henüz o dönem için istenen veriler yoksa, böyle bir eylem daha derin bir geçmişin talep edilmesine sebep olabilir.

Terminal ile MetaTrader 5 alım satım sunucusu arasındaki genel etkileşim şeması aşağıdaki Şekilde gösterilmektedir:

Müşteri terminali; terminalin başlatılması sırasında, bir bağlantı hatasından sonra sunucuyla yeniden bağlantı kurulması sırasında, bir hesaptan diğerine geçiş sırasında ve eksik alım satım geçmişi için doğrudan gönderilen talep sırasında kendi alım satım geçmişi tabanına bir senkronizasyon talebi gönderir.

Buna karşılık, alım satım sunucusu, terminalden herhangi bir talep olmaksızın, hesapta gerçekleşen alım satım olayları hakkında bağımsız olarak müşteri mesajları gönderir: emirlerin ve pozisyonların durumlarının değişmesi, emirlere dayalı yatırımların yapılması, komisyonların alınması, bakiye ve para çekilmesi vb.


MQL5 programından alım satım geçmişine erişim

Terminal, bir dizi gösterge, betik ve Uzman Danışman ile aynı anda çalışabilir ve bu programların tümü, emirler, yatırımlar ve pozisyonlar dahil olmak üzere alım satım hakkında ihtiyaç duydukları bilgileri talep edebilir. mql5 programının terminalin veritabanı ile doğrudan çalışması, genel stabilite, güvenlik ve performansa olan etkileri nedeniyle hariç tutulmuştur.

İstek üzerine her mql5 programı, çalışması için önbelleğinde alım satım ortamının bir "modelini" alır. Önbellek, verilere hızlı erişim imkanı sunan özel bir bellek alanıdır. Örneğin, emiri işlemeye başlamadan önce, gerekli emir mql5 programının önbelleğinde alınmış olmalıdır. Emire başvurulurken tüm diğer çalışmalar, emrin önbelleğe alınmış kopyası ile yapılacaktır.

Geçmişten gelen pozisyonlar, yatırımlar ve emirler ile yapılan çalışmalar da benzer şekilde yürütülür. MQL5 programından alım satım bilgilerini almanın genel şeması, şekilde gösterilmiştir:

Alım satım geçmişi hakkındaki veriler mql5 programının işlenmesi için kullanılabilir hale gelmeden önce, terminal veri tabanından talep edilmelidir. Talepten sonra elde edilen veriler mql5 programının kendi önbelleğine yerleştirilecektir.

Not: Önbellekteki veriler, terminal veritabanı ile otomatik olarak senkronize edilmez ve bu nedenle, önbellekteki verilerin uygun durumda korunmasını sağlamak için bunlar sürekli olarak güncellenmelidir.

Önbelleğin yanlış kullanılması durumunda bazı sonuçların oluşması muhtemeldir.

  • İstenen veriler elde edilemezse önbellek boş kalacak ve gerekli verileri içermeyecektir.
  • Önbellekteki veriler güncelleme gerektiriyorsa, ancak güncelleme talep edilmemişse, bu tür verilerle çalışmak öngörülemeyen sonuçlara yol açabilir. Örneğin, mevcut pozisyon hakkındaki veriler güncellenmemiştir ve program, verilen sembol için açık pozisyona ve bunun için artan kayba dair hiçbir şey bilmez.


Önbellekle çalışma fonksiyonu

Alım satım geçmişi, mql5 programının mevcut çalışması için gerekli olmayan binlerce gerçekleştirilmiş emir ve yatırım içerebilir. Bu nedenle önbellekle çalışma, önbelleğin her zaman terminalin veritabanına son bağlantıda yüklenen bilgileri içermesini talep etme ilkesi üzerine kuruludur. Tüm emir ve yatırım geçmişini elde etmeniz gerekiyorsa, istediğiniz aralığı belirterek bunu açıkça talep etmeniz gerekir.

Her bir bilgi türü için bağımsız bir önbellek oluşturulur. Emirlerle ilgili veriler emrin önbelleğinde saklanır; pozisyonlarla ilgili bilgiler pozisyonun önbelleğinde saklanır; yatırımlar ve emirlerle ilgili veriler önbellek geçmişinin ilgili örneklerinde saklanır.

Önbellekten bilgi talep edilmeden önce, bunun doldurulması gerekir.

Not: Önbelleği doldurmaya yönelik herhangi bir istek, isteklerin yürütülmesinin sonucundan bağımsız olarak, önbelleği önceden temizler.

Alım satım fonksiyonları iki kategoriye ayrılabilir: Önbelleği doldurma fonksiyonları ve önbellekten bilgi okuma fonksiyonları.


Önbelleği doldurma fonksiyonu

Alım satım geçmişinin işlenmesi için, bunun öncelikle uygun önbellekte alınması ve bulunması gerekir. Bir önbellek oluşturan fonksiyonlar iki alt gruba ayrılabilir.

Alım satım önbelleğini doldurma fonksiyonu (aktif emirler ve pozisyonlar):

  • OrderSelect(ticket) - Özellik talebinin devamı için aktif emiri fişine göre (terminal tabanından) mevcut emirin önbelleğine kopyalar; bunun için OrderGetDouble(), OrderGetInteger() ve OrderGetString() fonksiyonları kullanılır.
  • OrderGetTicket(index) - Özellik talebinin devamı için emir listesinde terminal tabanını, indeksine göre aktif emirin terminal tabanından mevcut emirlerin önbelleğine kopyalar ;bunun için OrderGetDouble(), OrderGetInteger() ve OrderGetString() fonksiyonları kullanılır. Terminalin tabanındaki toplam emir sayısı OrdersTotal() fonksiyonu kullanılarak elde edilebilir.
  • PositionSelect(symbol) - Özellik talebinin devamı için açık pozisyonu, sembol adına göre (terminalin tabanından) önbelleğe kopyalar; bunun için PositionGetDouble(), PositionGetInteger() ve PositionGetString() fonksiyonları kullanılır.
  • PositionGetSymbol(index) - Özellik talebinin devamı için açık pozisyonu, terminal tabanının pozisyon listesindeki indeksine adına göre (terminalin tabanından) önbelleğe kopyalar; bunun için PositionGetDouble(), PositionGetInteger() ve PositionGetString() fonksiyonları kullanılır. Terminalin tabanındaki toplam pozisyon sayısı, PositionsTotal() fonksiyonuyla elde edilebilir.

Geçmiş önbelleğini doldurma işlevi:

  • HistoryOrderSelect(ticket) - Özellik çağrılarının devamı için geçmiş emri biletine göre (terminalin tabanından) geçmiş emirlerin önbelleğine kopyalar; bunun için HistoryOrderGetDouble(), HistoryOrderGetInteger() ve HistoryOrderGetString() fonksiyonlarını kullanır.
  • HistoryDealSelect(ticket) - HistoryDealGetDouble(), HistoryDealGetInteger() ve HistoryDealGetString() fonksiyonları ile özelliklerine yapılan diğer çağrılar için yatırımı biletine bağlı olarak (terminalin tabanından) yatırımlar önbelleğine kopyalar.

Önbellekte, genel olarak mevcut alım satım geçmişini etkileyen iki fonksiyonu ayrı ayrı ele almamız gerekir:

  • HistorySelect(start, end) sunucunun belirtilen zaman aralığı için yatırımlar ve emirlerle geçmiş önbelleğini doldurur. Bu fonksiyonun yürütülmesinin sonuçları, HistoryDealsTotal() ve HistoryOrdersTotal()'dan döndürülen değerlere bağlıdır.
  • HistorySelectByPosition (position_ID) - Geçmiş önbelleğini belirtilen tanımlayıcı pozisyonuna sahip olan yatırımlar ve emirlerle doldurur. Bu fonksiyonun yürütülmesinin sonucu aynı zamanda HistoryDealsTotal() ve HistoryOrdersTotal() öğelerini de etkiler.


OrderSelect ve OrderGetTicket

OrderSelect(ticket) ve OrderGetTicket() genel fonksiyonları aynı şekilde çalışır; aktif emirlerin önbelleğini tek bir emirle doldururlar. OrderSelect(ticket), bir bilet emrinin önceden bilindiği durumlar için tasarlanmıştır. OrderGetTicket(), OrdersTotal() ile birlikte, temel emir terminalindeki mevcut tüm emirlerin incelenebilmesini sağlar.

Bu fonksiyonlardan herhangi birine yapılan bir çağrıdan sonra, emir başarıyla seçilirse, etkin emirlerin önbelleği yalnızca bir emrin bilgilerini içerir. Aksi takdirde, aktif emirlerin önbelleğinde hiçbir şey bulunmaz. OrdersTotal() fonksiyonunun yürütülmesinin sonucu değişmez; önbelleğin dolu olup olmadığına bakılmaksızın her zaman terminalin tabanındaki aktif emirlerin gerçek sayısını döndürür.


PositionSelect ve PositionGetSymbol

Tıpkı emirlerde olduğu gibi, bu iki fonksiyon da pozisyonlar için aynı şekilde çalışır; pozisyonların önbelleğini tek bir pozisyonla doldururlar. PositionGetSymbol(index), bir parametre olarak pozisyon tabanı listesindeki sayıyı gerektirir ve PositionSelect(sembol), pozisyonun açıldığı sembol adına göre önbelleği doldurur. Sembolün adı da PositionGetSymbol(index) fonksiyonu ile elde edilebilir.

Fonksiyon başarılı bir şekilde yürütülürse, bu fonksiyonlardan herhangi biri çalıştırıldıktan sonra pozisyon önbelleği yalnızca bir pozisyondaki verileri içerir. Aksi takdirde, pozisyonların önbelleğinde hiçbir şey bulunmaz. PositionsTotal() fonksiyonunun yürütülmesinin sonucu, önbelleğin doldurulup doldurulmamasına bağlı değildir; tüm semboller için her zaman temel terminaldeki gerçek açık pozisyon sayısı döndürülür.


HistoryOrderSelect

HistoryOrderSelect(ticket), geçmiş emiri biletine göre terminalin tabanından önbelleğe seçer. Fonksiyon, gerekli emirin bileti önceden bilindiğinde kullanılmak üzere tasarlanmıştır.

Yürütme başarılı olursa, önbellek tek bir emir içerir ve HistoryOrdersTotal() fonksiyonu tek bir ünite döndürür. Aksi takdirde, geçmiş emirlerin önbelleği boş olur ve HistoryOrdersTotal() fonksiyonu, sıfır döndürür.


HistoryDealSelect

HistoryDealSelect(ticket), yatırımı biletine göre taban terminalinden seçer. Fonksiyon, yatırımın bileti önceden bilindiğinde kullanılmak üzere tasarlanmıştır.

Yürütme başarılı olursa, önbellek tek bir yatırımı içerecek ve HistoryDealsTotal() fonksiyonu, 1 değerini döndürecektir. Aksi takdirde, yatırım önbelleği boş olacak ve HistoryDealsTotal() fonksiyonu, sıfır değerini döndürecektir.


Önbellekten bilgi alma fonksiyonu

Pozisyonun, yatırımın veya emrin özellikleri hakkında bilgi talep etmeden önce, mql5-programının ilgili önbelleğini güncellemek gerekir. Bunun nedeni, istenen bilgilerin önceden güncellenmiş olma ihtimalidir ve bu, önbellekte saklanan kopyanın halihazırda eskimiş olduğu anlamına gelir.

  • Emirler

    Aktif emirler hakkında bilgi almak için, bunların önce aşağıdaki iki fonksiyondan biri kullanılarak aktif emirlerin önbelleğine kopyalanması gerekir: OrderGetTicket() veya OrderSelect(). Önbellekte saklanan emir için, ilgili fonksiyonlar çağrıldığında özellik değerleri verilecektir:

    1. OrderGetDouble(type_property)
    2. OrderGetInteger(type_property)
    3. OrderGetString(type_property)

Bu fonksiyonlar tüm verileri önbellekten alır, bu nedenle emir için doğru verilerin elde edilmesini garanti etmek adına önbelleği dolduran fonksiyonun çağrılması önerilir.

  • Pozisyonlar

    Bir pozisyon hakkında bilgi almak için, pozisyon aşağıdaki iki fonksiyondan biri kullanılarak önceden seçilmeli ve önbelleğe kopyalanmalıdır: PositionGetSymbol veya PositionSelect. İlgili fonksiyonlar çağrıldığında pozisyonun özellik değerleri bu önbellekten verilecektir:

    1. PositionGetDouble(type_property)
    2. PositionGetInteger(type_property)
    3. PositionGetString(type_property)

Bu fonksiyonlar tüm verilerini önbellekten aldığından, pozisyon için doğru verilerin elde edilmesini garanti etmek adına, pozisyon önbelleğini dolduran fonksiyonun çağrılması önerilir.

  • Geçmiş emirler

    Geçmişten bir emir hakkında bilgi almak için, önce şu üç fonksiyondan birini kullanarak geçmiş emirlerin önbelleğini oluşturmak gerekir: HistorySelect(start, end), HistorySelectByPosition() veya HistoryOrderSelect(ticket). Uygulama başarılı olursa önbellek, HistoryOrdersTotal() fonksiyonu tarafından döndürülen sayıda emiri depolar. Bu emirlerin özelliklerine erişim, bilet üzerindeki her bir öğe tarafından uygun fonksiyonun kullanılmasıyla gerçekleştirilir:

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

Geçmiş emrin bileti, HistoryOrderGetTicket(index) fonksiyonu kullanılarak, geçmiş emirlerin önbelleğindeki indeksine göre bulunabilir. Emirle ilgili doğru verilerin alınmasını garanti etmek adına, geçmiş emirlerin önbelleğini dolduran fonksiyonu çağırmanız önerilir.

  • Yatırımlar

    Geçmişteki belirli bir yatırım hakkında bilgi almak için, önce şu üç işlevden birini kullanarak yatırımların önbelleğini oluşturmak gerekir: HistorySelect (start, end), HistorySelectByPosition() veya HistoryDealSelect (ticket). Fonksiyon uygulaması başarılı olursa önbellek, HistoryDealsTotal() işlevi tarafından döndürülen sayıda yatırımı depolar. Bu yatırımların özelliklerine erişim, uygun fonksiyonların kullanılmasıyla bilete göre gerçekleştirilir:

    1. HistoryDealGetDouble(ticket_deals, type_property)
    2. HistoryDealGetInteger(ticket_deals, type_property)
    3. HistoryDealGetString(ticket_deals, type_property)

Yatırımların bileti, HistoryDealGetTicket(index) fonksiyonu kullanılarak, yatırımların önbelleğindeki indeksine göre elde edilebilir. Yatırımlarla ilgili doğru verilerin alınmasını garanti etmek adına, yatırım önbelleğini dolduran fonksiyonu çağırmanız önerilir.


Önbellek geçmişinden bilet alma fonksiyonu

HistoryOrderGetTicket (index), geçmiş emrin biletini, geçmiş emirlerin önbelleğindeki indeksine göre döndürür (terminal tabanından değil!). Başarılı olması durumunda, elde edilen bilet, önbelleği temizleyen ve yalnızca bir siparişle yeniden dolduran HistoryOrderSelect (ticket) fonksiyonunda kullanılabilir. HistoryOrdersTotal() fonksiyonundan döndürülen değerin önbellekteki emirlerin sayısına bağlı olduğunu hatırlayalım.

HistoryDealGetTicket(index), yatırımın biletini, yatırımların önbelleğindeki indeksine göre döndürür. Yatırımın bileti, önbelleği temizleyen ve başarılı olması durumunda önbelleği yalnızca bir yatırım ile yeniden dolduran HistoryDealSelect(ticket) fonksiyonu tarafından kullanılabilir. HistoryDealsTotal() fonksiyonu tarafından döndürülen değer, önbellekteki yatırımların sayısına bağlıdır.

Not: HistoryOrderGetTicket (index) ve HistoryDealGetTicket (index) fonksiyonlarını çağırmadan önce, geçmiş önbelleğini geçmiş emirler ve yatırımlarla yeterli bir hacimde doldurmanız gerekir. Bunu yapmak için şu fonksiyonlardan birini kullanın: HistorySelect (start, end), HistorySelectByPosition (position_ID), HistoryOrderSelect (ticket) ve HistoryDealSelect (ticket).


Aktif emirleri kullanarak bilgi edinme

Mevcut aktif emirleri kontrol etmek standart bir prosedürdür. Belirli bir emir hakkında bilgi almak gerekiyorsa ve bileti de biliniyorsa OrderSelect(ticket) fonksiyonu kullanılarak bilgi alınabilir.

bool selected=OrderSelect(ticket);
if(selected)
  {
   double price_open=OrderGetDouble(ORDER_PRICE_OPEN);
   datetime time_setup=OrderGetInteger(ORDER_TIME_SETUP);
   string symbol=OrderGetString(ORDER_SYMBOL);
   PrintFormat("Ордер #%d for %s was set at %s",ticket,symbol,TimeToString(time_setup));
  }
else
  {
   PrintFormat("Error selecting order with ticket %d. Error %d",ticket, GetLastError());
  }

Yukarıdaki örnekte, emrin biletinin önceden bilindiği varsayılmaktadır, örneğin global değişkenden elde edilmiştir. Bununla birlikte genel durumlarda, bilet bilgisi mevcut değildir ve bu nedenle, bir emri seçip önbelleğe yerleştiren OrderGetTicket(index) fonksiyonundan yardım almamız gerekir; ancak sadece mevcut emirler listesindeki emir numarası parametre olarak belirtilmelidir.

Emirlerle çalışmak için genel algoritma (yatırımlar ve pozisyonlarla benzer) aşağıdaki gibidir:

  1. OrdersTotal() fonksiyonunu kullanarak toplam sipariş sayısını alın.
  2. Listedeki indekslerine göre tüm emirleri aratarak döngüyü düzenleyin.
  3. OrderGetTicket() fonksiyonunu kullanarak her emri tek tek önbelleğe kopyalayın.
  4. OrderGetDouble(), OrderGetInteger() ve OrderGetString() fonksiyonlarını kullanarak önbellekten doğru emir verilerini alın. Gerekirse, elde edilen verileri analiz edin ve uygun eylemleri uygulayın.

İşte böyle bir algoritmanın kısa bir örneği:

input long my_magic=555;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- obtain the total number of orders
   int orders=OrdersTotal();
//--- scan the list of orders
   for(int i=0;i<orders;i++)
     {
      ResetLastError();
      //--- copy into the cache, the order by its number in the list
      ulong ticket=OrderGetTicket(i);
      if(ticket!=0)// if the order was successfully copied into the cache, work with it
        {
         double price_open  =OrderGetDouble(ORDER_PRICE_OPEN);
         datetime time_setup=OrderGetInteger(ORDER_TIME_SETUP);
         string symbol      =OrderGetString(ORDER_SYMBOL);
         long magic_number  =OrderGetInteger(ORDER_MAGIC);
         if(magic_number==my_magic)
           {
            //  process the order with the specified ORDER_MAGIC
           }
         PrintFormat("Order #%d for %s was set out %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
        }
      else         // call OrderGetTicket() was completed unsuccessfully
        {
         PrintFormat("Error when obtaining an order from the list to the cache. Error code: %d",GetLastError());
        }
     }
  }


Açık pozisyonlar hakkında bilgi edinme

Açık pozisyonların sürekli izlenmesi standart bir prosedürden ibaret değildir, her durumda kesinlikle uygulanmalıdır. Belirli pozisyonlar hakkında bilgi almak için, pozisyonun açık olduğu enstrümanın adını bilmek yeterlidir. Bunun için PositionSelect(sembol) fonksiyonunu kullanın. Uzman Danışmanın yalnızca bir sembol üzerinde çalıştığı durumlarda (ekli olduğu grafiğin sembolü üzerinde), sembolün adı bir Symbol() fonksiyonuyla veya önceden tanımlanmış bir _Symbol değişkeninden elde edilebilir.

//--- we will look for the position by the symbol of the chart, on which the EA is working
   string symbol=Symbol();
//--- attempt to get the position
   bool selected=PositionSelect(symbol);
   if(selected) // if the position is selected
     {
      long pos_id            =PositionGetInteger(POSITION_IDENTIFIER);
      double price           =PositionGetDouble(POSITION_PRICE_OPEN);
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      long pos_magic         =PositionGetInteger(POSITION_MAGIC);
      string comment         =PositionGetString(POSITION_COMMENT);
      PrintFormat("Position #%d by %s: POSITION_MAGIC=%d, price=%G, type=%s, commentary=%s",
                 pos_id, symbol, pos_magic, price,EnumToString(type), comment);
     }

   else        // if selecting the position was unsuccessful
     {
      PrintFormat("Unsuccessful selection of the position by the symbol %s. Error",symbol,GetLastError());
     }
  }

Genel bir durumda, bir pozisyon seçen ve onu önbelleğe yerleştiren PositionGetSymbol (index) fonksiyonu kullanılarak sembol hakkındaki bilgiler elde edilebilir. Parametre olarak, açık pozisyonlar listesinde pozisyon indeksinin belirtilmesi gerekmektedir. Bunu yapmanın en iyi yolu döngüdeki tüm pozisyonların aranmasıdır.

Pozisyonlarla çalışmak için genel algoritma:

  1. PositionsTotal() fonksiyonunu kullanarak toplam pozisyon sayısını alın.
  2. Listedeki indekslerine göre tüm pozisyonları aratarak döngüyü düzenleyin.
  3. PositionGetSymbol() fonksiyonunu kullanarak her pozisyonu tek tek önbelleğe kopyalayın.
  4. PositionGetDouble(), PositionGetInteger() ve PositionGetString() fonksiyonlarını kullanarak gerekli pozisyon verilerini önbellekten alın. Gerekirse, elde edilen verileri analiz edin ve uygun eylemleri uygulayın.

Böyle bir algoritma örneği:

#property script_show_inputs

input long my_magic=555;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- obtain the total number of positions
   int positions=PositionsTotal();
//--- scan the list of orders
   for(int i=0;i<positions;i++)
     {
      ResetLastError();
      //--- copy into the cache, the position by its number in the list
      string symbol=PositionGetSymbol(i); //  obtain the name of the symbol by which the position was opened
      if(symbol!="") // the position was copied into the cache, work with it
        {
         long pos_id            =PositionGetInteger(POSITION_IDENTIFIER);
         double price           =PositionGetDouble(POSITION_PRICE_OPEN);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         long pos_magic         =PositionGetInteger(POSITION_MAGIC);
         string comment         =PositionGetString(POSITION_COMMENT);
         if(pos_magic==my_magic)
           {
           //  process the position with a specified POSITION_MAGIC
           }
         PrintFormat("Position #%d by %s: POSITION_MAGIC=%d, price=%G, type=%s, commentary=%s",
                     pos_id,symbol,pos_magic,price,EnumToString(type),comment);
        }
      else           // call to PositionGetSymbol() was unsuccessful
        {
         PrintFormat("Error when receiving into the cache the position with index %d."+
                     " Error code: %d", i, GetLastError());
        }
     }
  }


Geçmiş önbelleğiyle çalışma kuralları

Geçmiş önbelleğiyle çalışma kodu, genellikle geçmişin yalnızca 5-10 yatırım ve emir içermesi halinde sorunsuz çalışacak şekilde yazılır. Yanlış bir yaklaşıma tipik bir örnek şudur: Tüm alım satım geçmişinin önbelleğe yüklenmesi ve bir döngü içinde işlenmesi, tüm emir ve işlemlerin aranması:

//---
   datetime start=0;           // initial time set to 1970 year
   datetime end=TimeCurrent();  // the ending time set to the current server time
//--- request into the cache of the program the entire trading history
   HistorySelect(start,end);
//--- obtain the number of all of the orders in the history
   int history_orders=HistoryOrdersTotal();
//--- now scan through all of the orders
   for(int i=0;i<history_orders;i++)
     {
     //  processing each order in the history
     }   

    ...
       
//--- obtain the number of all deals in the history
   int deals=HistoryDealsTotal();
//--- now scan through all of the deals
   for(int i=0;i<deals;i++)
     {
     //  process each deal in the history
     }

Çoğu durumda, tüm alım satım geçmişini işleme girişimi yanlıştır. İşlenen yatırımların/emirlerin sayısı binler veya on binlerce civarında olduğunda, programın çalışması büyük ölçüde yavaşlar.

Not: HistorySelect() fonksiyonunun çağrılmasıyla ilgili tüm durumları her zaman dikkatle inceleyin! mql5 programının önbelleğine tüm mevcut alım satım geçmişinin düşüncesizce aşırı şekilde yüklenmesi, programın performansını düşürür.

Bu öncelikle sınama için önemlidir; kullanıcı, sınama aracının aniden düşünceli hale geldiğini keşfeder ve bunun nedenlerini müşteri terminalinde aramaya başlar. Bu nedenle, öncelikle her zaman MQL5 programının kodunu (Uzman Danışman ve Uzman Danışmandan çağrılan göstergeler) optimize etmeyi düşünün. Bilgisayarın demirden yapılmış olmasına ve çok sayıda çekirdeğe sahip olmasına güvenmeyin.

Uzman Danışmanın ve göstergenin çevrimiçi olarak düzgün çalışması için bu aynı derecede önemlidir. Optimum olmayan bir program kodu, en güçlü bilgisayarı bile felç edebilir.

Alım satım geçmişiyle çalışmak için doğru algoritma:

  1. Alım satım geçmişini önbelleğe isteme ihtiyacını belirleyin. Bu gerekli değilse, aşağıdaki işlemleri yapmayın.
  2. Alım satım geçmişinin son tarihini belirleyin (belki de o ana kadarki geçmiş gerekli değildir).
  3. Bitiş tarihinden başlayarak alım satım geçmişinin başlangıç tarihini hesaplayın. Genellikle Uzman Danışmanlar tek bir gün veya haftadan daha derin olmayan bir alım satım geçmişi gerektirir.
  4. Bilinen biletlerle, özellikleri elde etmek için yatırımların ve geçmiş emirlerin biletlerini alın:
    • HistoryOrderGetDouble()
    • HistoryOrderGetInteger()
    • HistoryOrderGetString()
    • HistoryDealGetDouble()
    • HistoryDealGetInteger()
    • HistoryDealGetString()
  5. Biletler bilinmiyorsa ve gerekliyse, sıralama yoluyla bir döngü düzenleyin.
  6. Döngüde, alım satım geçmişinin önbelleğinden indekse göre her yatırım/emir için bileti alın (HistoryOrderGetTicket(Index) ve HistoryDealGetTicket(Index)).
  7. Bilinen biletle, emirlerin ve yatırımların gerekli özelliklerini elde edin (4. maddeye bakın).

Bu algoritma için bir kod örneği:

//--- the variable, which is set in true only during the change in the trading history
   bool TradeHistoryChanged=false;
//--- here we check for the changes in the history and put out the TradeHistoryChanged=true if needed
//... the needed code

//--- check  if there are changes in the trading history or not
   if(!TradeHistoryChanged) return;

//--- if the history has changed, then it makes sense to load it into the cache 
//--- the ending time set for the current server time
   datetime end=TimeCurrent();
//--- the beginning time is set to 3 days ago
   datetime start=end-3*PeriodSeconds(PERIOD_D1);
//--- request in the cache of the program, the trading history for the last 3 days
   HistorySelect(start,end);
//--- obtain the number of orders in the cache of the history
   int history_orders=HistoryOrdersTotal();
//--- now scan through the orders
   for(int i=0;i<history_orders;i++)
     {
      //--- obtain the ticket of the historical order
      ulong ticket=HistoryOrderGetTicket(i);
      //--- work with this order - receive its problems
      long order_magic=HistoryOrderGetInteger(ticket,ORDER_MAGIC);
      // obtain the rest of the properties for the order by the ticket
      // ...
     }

Bu örnekte sunulan temel fikir, öncelikle alım satım geçmişinde meydana gelen değişikliklerin gerçekliğini doğrulamanız gerektiğidir. Seçeneklerden biri, OnTrade() fonksiyonunun içinde TradeHistoryChanged global değişkeni için “true” değerini ayarlamaktır, çünkü Alım Satım olayı her zaman herhangi bir alım satım olayı türüyle dönüş yapar.

Alım satım geçmişi değişmediyse, alım satım geçmişini tekrar önbelleğe yüklemeye ve CPU'nun kaynaklarını boşa harcamaya gerek yoktur. Bu mantıklıdır ve herhangi bir açıklama gerektirmez. Alım satım geçmişi değiştiyse, bunun yalnızca gerekli kısmını yükleriz ve her yatırımı/emri yalnızca bir kez inceleriz. Gereksiz tekrar döngülerinden kaçının.

Not: HistorySelect() fonksiyonu tarafından tüm alım satım geçmişinin önbelleğine yapılan her bir istek ve geçmişten yatırım ve siparişlerin her işlenme döngüsü temellendirilmelidir. Aksi takdirde, bilgisayarınızın kaynakları verimsiz bir şekilde harcanacaktır.

Alım atım geçmişiyle ilgili doğru ve yanlış çalışma örnekleri, WrongWorkWithHistory.mq5 ve RightWorkWithHistory.mq5 dosyaları olarak bu makaleye eklenmiştir.


Geçmişten emirlerle bilgi edinme

Bir istisna dışında, geçmiş emirlerle çalışmanın aktif emirlerle çalışmaktan neredeyse hiçbir farkı yoktur. Mql5 programının önbelleğindeki aktif emirlerin sayısı birden fazla olamazsa, HistoryOrdersTotal() sonucu ve önbellekteki geçmiş emirlerin sayısı; HistorySelect(start, end), HistorySelectByPosition() veya HistoryOrderSelection() fonksiyonu tarafından ne kadar alım satım geçmişinin yüklenmiş olduğuna bağlıdır.

Not: Alım satım geçmişi, HistorySelect(), HistorySelectByPosition() veya HistoryOrderSelect() fonksiyonlarından biri tarafından mql5 programının önbelleğine yüklenmediyse, geçmiş emirler ve yatırımlarla çalışmak imkansızdır. Alım satım geçmişine ilişkin verileri almadan önce gerekli yatırım ve emir geçmişini talep ettiğinizden emin olun.

Örneğin, son günün son emrini arayan ve bununla ilgili bilgileri görüntüleyen bir betik sağlıyoruz.

// --- determining the time intervals of the required trading history
   datetime end=TimeCurrent();                // current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning for 24 hours ago
//--- request in the cache of the program the trading history for a day
   HistorySelect(start,end);
//--- receive the number of orders in the history
   int history_orders=HistoryOrdersTotal();
//--- obtain the ticket of the order, which has the last index in the list, from the history
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
   if(order_ticket>0) // obtain in the cache the historical order, work with it
     {
      //--- order status
      ENUM_ORDER_STATE state=(ENUM_ORDER_STATE)HistoryOrderGetInteger(order_ticket,ORDER_STATE);
      long order_magic      =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
      long pos_ID           =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
      PrintFormat("Order #%d: ORDER_MAGIC=#%d, ORDER_STATE=%d, ORDER_POSITION_ID=%d",
                  order_ticket,order_magic,EnumToString(state),pos_ID);
     }
   else              // unsuccessful attempt to obtain the order
     {
      PrintFormat("In total, in the history of %d orders, we couldn't select the order"+
                  " with the index %d. Error %d",history_orders,history_orders-1,GetLastError());
     }

Daha genel durumlarda, döngüdeki emirleri önbellekten sıralamak ve analiz etmek gerekir. Genel algoritma aşağıdaki gibi olacaktır:

  1. Geçmiş, HistorySelect() fonksiyonu tarafından yüklenmişse, yeterli olan geçmişin zaman aralıklarını belirleyin; tüm alım satım geçmişinin önbelleğe yüklenmesi önerilmez.
  2. HistorySelect(), HistorySelectByPosition() veya HistoryOrderSelect (ticket) fonksiyonlarını kullanarak programın önbelleğine alım satım geçmişini yükleyin.
  3. HistoryOrdersTotal()'ı kullanarak önbellekteki toplam emir sayısını alın.
  4. Listedeki dizinlerine göre tüm emirleri aratarak döngüyü düzenleyin.
  5. HistoryOrderGetTicket() fonksiyonunu kullanarak önbellekteki emirlerin bir biletini alın.
  6. HistoryOrderGetDouble(), HistoryOrderGetInteger() ve HistoryOrderGetString() fonksiyonlarını kullanarak emrin verilerini önbellekten alın. Gerekirse, elde edilen verileri analiz edin ve uygun eylemleri uygulayın.

Böyle bir algoritma örneği:

#property script_show_inputs

input long my_magic=999;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// --- setting the time intervals of the required trading history
   datetime end=TimeCurrent();                // the current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning for 24 hours ago
//--- request into the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of orders in history
   int history_orders=HistoryOrdersTotal();
//--- now scroll through all of the orders
   for(int i=0;i<history_orders;i++)
     {
      //--- obtain the ticket of the order by its number in the list
      ulong order_ticket=HistoryOrderGetTicket(i);
      if(order_ticket>0) //  obtain in the cache, the historical order, and work with it
        {
         //--- time of execution
         datetime time_done=HistoryOrderGetInteger(order_ticket,ORDER_TIME_DONE);
         long order_magic  =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
         long pos_ID       =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
         if(order_magic==my_magic)
           {
           //  process the position with the set ORDER_MAGIC
           }
         PrintFormat("Order #%d: ORDER_MAGIC=#%d, time_done %s, ORDER_POSITION_ID=%d",
                     order_ticket,order_magic,TimeToString(time_done),pos_ID);
        }
      else               // unsuccessful attempt to obtain the order from the history
        {
         PrintFormat("we were not able to select the order with the index %d. Error %d",
                     i,GetLastError());
        }
     }
  }
Not: HistorySelect() fonksiyonunun çağrılmasıyla ilgili tüm durumları her zaman dikkatle inceleyin! mql5 programının önbelleğine tüm mevcut alım satım geçmişinin düşüncesizce aşırı şekilde yüklenmesi, programın performansını düşürür.


Geçmişten yatırımlar hakkında bilgi edinme

Yatırımların işlenmesinde, geçmiş emirlerin işlenmesiyle aynı özellikler geçerlidir. Alım satım geçmişindeki yatırım sayısı ve HistoryDealsTotal() uygulamasının sonucu, alım satım geçmişinin ne kadarının HistorySelect(start, end) veya HistorySelectByPosition() fonksiyonu tarafından önbelleğe yüklendiğine bağlıdır.

Önbelleği, biletine göre yalnızca bir yatırım ile doldurmak için HistoryDealSelect(ticket) fonksiyonunu kullanın.

// --- determining the time intervals of the required trading history
   datetime end=TimeCurrent();                // current sever time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning for 24 hours ago
//--- request in the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of deals in history
   int deals=HistoryDealsTotal();
//--- obtain the ticket for the deal, which has the last index in the list
   ulong deal_ticket=HistoryDealGetTicket(deals-1);
   if(deal_ticket>0) // we obtained in the cache of the deal, and work with it
     {
      //--- the ticket order, based on which the deal was made
      ulong order     =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
      long order_magic=HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
      long pos_ID     =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
      PrintFormat("Deal #%d for the order #%d with the ORDER_MAGIC=%d  that participated in the position",
                  deals-1,order,order_magic,pos_ID);
     }
   else              // unsuccessful attempt of obtaining a deal
     {
      PrintFormat("In total, in the history %d of deals, we couldn't select a deal"+
                  " with the index %d. Error %d",deals,deals-1,GetLastError());
     }

Daha genel durumlarda, önbellekten yatırım döngüsünde arama yapmak ve bunları analiz etmek gerekir. Genel algoritma aşağıdaki gibi olacaktır:

  1. Geçmiş, HistorySelect(start, end) fonksiyonu tarafından yükleniyorsa, yeterli olan geçmişin sınırlarını belirleyin; tüm alım satım geçmişinin önbelleğe yüklenmesi önerilmez.
  2. HistorySelect() veya HistorySelectByPosition() fonksiyonları ile programın önbelleğine, alım satım geçmişini yükleyin.
  3. HistoryDealsTotal() fonksiyonunu kullanarak geçmişteki toplam yatırım sayısını elde edin.
  4. Tüm yatırımları listedeki numaralarına göre aratarak döngüyü düzenleyin.
  5. HistoryDealGetTicket()'i kullanarak önbellekteki bir sonraki yatırımın biletini belirleyin.
  6. HistoryDealGetDouble(), HistoryDealGetInteger() ve HistoryDealGetString() fonksiyonlarını kullanarak yatırımla ilgili bilgileri önbellekten alın. Gerekirse, elde edilen verileri analiz edin ve uygun eylemleri uygulayın.

Kâr ve zararları hesaplamaya yönelik bu türden bir algoritma örneği:

input long my_magic=111;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// --- determine the time intervals of the required trading history
   datetime end=TimeCurrent();                 // current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning time to 24 hours ago

//--- request in the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of deals in the history
   int deals=HistoryDealsTotal();

   int returns=0;
   double profit=0;
   double loss=0;
//--- scan through all of the deals in the history
   for(int i=0;i<deals;i++)
     {
      //--- obtain the ticket of the deals by its index in the list
      ulong deal_ticket=HistoryDealGetTicket(i);
      if(deal_ticket>0) // obtain into the cache the deal, and work with it
        {
         string symbol             =HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
         datetime time             =HistoryDealGetInteger(deal_ticket,DEAL_TIME);
         ulong order               =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
         long order_magic          =HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
         long pos_ID               =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
         ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);

         //--- process the deals with the indicated DEAL_MAGIC
         if(order_magic==my_magic)
           {
            //... necessary actions
           }

         //--- calculate the losses and profits with a fixed results
         if(entry_type==DEAL_ENTRY_OUT)
          {
            //--- increase the number of deals 
            returns++;
            //--- result of fixation
            double result=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
            //--- input the positive results into the summarized profit
            if(result>0) profit+=result;
            //--- input the negative results into the summarized losses
            if(result<0) loss+=result;
           }
        }
      else // unsuccessful attempt to obtain a deal
        {
         PrintFormat("We couldn't select a deal, with the index %d. Error %d",
                     i,GetLastError());
        }
     }
   //--- output the results of the calculations
   PrintFormat("The total number of %d deals with a financial result. Profit=%.2f , Loss= %.2f",
               returns,profit,loss);
  }
Not: HistorySelect() fonksiyonunun çağrılmasıyla ilgili tüm durumları her zaman dikkatle inceleyin! mql5 programının önbelleğine tüm mevcut alım satım geçmişinin düşüncesizce aşırı şekilde yüklenmesi, programın performansını düşürür.


Pozisyon tanımlayıcısı (POSITION_IDENTIFIER) ile geçmişin önbelleğinde elde etme işlemi

HistorySelectByPosition (position_ID) fonksiyonu, tıpkı HistorySelect (start, end) fonksiyonu gibi, önbelleği geçmişteki yatırımlar ve emirlerle doldurur, ancak bunlar mutlaka belirtilen konum tanımlayıcısına (POSITION_IDENTIFIER) sahip olmalıdırlar. Pozisyon tanımlayıcısı, her yeniden açılan pozisyona otomatik olarak atanan ve kullanım ömrü boyunca değişmeyen benzersiz bir sayıdır. Bu sırada pozisyon değişikliğinin (pozisyon tipinin POSITION_TYPE_BUY'dan POSITION_TYPE_SELL'e kayması) pozisyonun tanımlayıcısını değiştirmediği unutulmamalıdır.

Her açık pozisyon, o enstrümandaki bir veya daha fazla yatırımın sonucudur. Bu nedenle, kullanım ömrü boyunca pozisyon değişikliklerini analiz etmek için, yatırımın yapılırken temel alınan her yatırım ve emirde, bu yatırımın katıldığı pozisyona bir tanımlayıcı atanır. Böylece, mevcut açık pozisyonların tanımlayıcısını bilerek tüm geçmişi yeniden oluşturabiliriz ve onu değiştiren tüm emirleri ve yatırımları bulabiliriz.

HistorySelectByPosition(position_ID) fonksiyonu, programcıyı bu tür bilgileri aramak üzere tüm alım satım geçmişi boyunca yineleme yapması için kendi kodunu yazma zahmetinden kurtarır. Bu fonksiyonla çalışmak için tipik bir algoritma:

  1. Doğru pozisyon tanımlayıcısını edinin.
  2. HistorySelectByPosition() fonksiyonunu kullanarak, tanımlayıcısı mevcut pozisyonun tanımlayıcısına eşit olan tüm emirleri ve yatırımları ticaret geçmişinin önbelleğine alın.
  3. Algoritmaya göre alım satım geçmişini işleyin.


Sonuç

Bütünsel bir alım satım alt sistemi platformu olarak MetaTrader 5 etraflıca düşünülmüştür ve kullanıcı dostudur; ayrıca alım satım fonksiyonlarının bolluğu, tüm sorunları en verimli şekilde çözmemizi sağlar.

Standart kütüphaneden özel alım satım dersleri nüanslara fazla kafa yormadan, uygulamaya geçmeksizin yüksek düzeyde programlar yazabilmemizi sağlasa da, temellerin anlaşılması daha güvenilir ve verimli alım satım Uzman Danışmanları oluşturabilmemizi mümkün kılacaktır.

Verilen örneklerin tümü bu makaleye eklenen dosyalarda bulunabilir.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/211

MetaTrader 5 Alım Satım Olayları MetaTrader 5 Alım Satım Olayları
Bir alım satım hesabının mevcut durumunun izlenmesi, açık pozisyonların ve emirlerin kontrol edilmesini gerektirir. Bir alım satım sinyali bir yatırım haline gelmeden önce, müşteri terminalinden alım satım sunucusuna bir istek olarak gönderilmeli ve işlenmeyi bekleyen emir kuyruğuna yerleştirilmelidir. Alım satım sunucusundan gelen bir isteği kabul etmek, süresi dolduğunda silmek veya bir anlaşma yürütmek - tüm bu eylemlerin ardından alım satım etkinlikleri gelir ve alım satım sunucusu, terminali onlar hakkında bilgilendirir.
MQL5'te Uzman Danışmanları Test Etme ve Optimize Etme Kılavuzu MQL5'te Uzman Danışmanları Test Etme ve Optimize Etme Kılavuzu
Bu makale, adım adım kod hatalarını belirleme ve çözme sürecini ve ayrıca Uzman Danışman girdi parametrelerinin sınanması ve optimize edilmesi adımlarını açıklamaktadır. Uzman Danışmanınız için en iyi sembolü ve girdi parametreleri setini bulmak için MetaTrader 5 müşteri terminalinin Strateji Sınama Aracını nasıl kullanacağınızı öğreneceksiniz.
MetaTrader 5'de Sınamanın Temelleri MetaTrader 5'de Sınamanın Temelleri
MetaTrader 5'deki üç test modu arasındaki farklar nelerdir ve özellikle nelere dikkat edilmelidir? Birden fazla enstrüman üzerinde aynı anda işlem gören bir EA'nın testi nasıl yapılır? Test sırasında gösterge değerleri ne zaman ve nasıl hesaplanır ve olaylar nasıl ele alınır? Bir "yalnızca açılış fiyatı" modunda test yaparken farklı enstrümanlardan çubukları nasıl senkronize edebilirim? Bu makale, bunlara ve diğer birçok soruya cevap vermeyi amaçlamaktadır.
Uyarlanabilir Alım Satım Sistemleri ve Bunların MetaTrader 5 Müşteri Terminalinde Kullanımları Uyarlanabilir Alım Satım Sistemleri ve Bunların MetaTrader 5 Müşteri Terminalinde Kullanımları
Bu makale, her biri kendi "sanal" alım satım işlemlerini gerçekleştiren birçok stratejiden oluşan uyarlanabilir bir sistemin bir varyantını önermektedir. Şu anda gerçek alım satım en kârlı stratejinin sinyallerine göre gerçekleştirilir. Nesne yönelimli yaklaşımın kullanılması, verilerle çalışmak için sınıfların olması ve Standart kütüphanenin alım-satım sınıfları sayesinde sistemin mimarisi basit ve ölçeklenebilir görünüyordu; Artık yüzlerce alım satım stratejisini içeren uyarlanabilir sistemleri kolayca oluşturmak ve analiz etmek mümkün.