English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Alım Satımlar MetaTrader 5'ten MetaTrader 4'e Nasıl Kopyalanır?

Alım Satımlar MetaTrader 5'ten MetaTrader 4'e Nasıl Kopyalanır?

MetaTrader 5Ticaret | 13 Ocak 2022, 08:58
415 0
Mykola Demko
Mykola Demko

Giriş

Çok da uzun olmayan bir zaman önce, birçok yatırımcı MetaTrader 5'in gerçek zamanlı alım satım için uygun olmayan ham bir platform olduğuna inanıyordu. Ancak şimdi, bundan çok kısa bir süre sonra, insanlar gerçek zamanlı alım satımın ne zaman kullanıma sunulacağını merak ediyor. Birçok yatırımcı MetaTrader 5'te uygulanan faydaları şimdiden takdir etti. Ayrıca MetaQuotes Software Corp. tarafından gerçekleştirilen Championship (Şampiyonluk), geliştiricilerin MQL5 diline olan ilgisini artırdı. Ve şimdi bu ilginç istekler, alım satımdan kâr sağlama şeklinde hayata geçirilecek. "Gerçek zamanlı alım satım ne zaman kullanıma sunulacak?" sorusu yanlış adrese soruluyor. Bunun cevabı özel olarak aracıya bağlıdır. Yeni platforma geçiş zamanına dair nihai kararı veren onlardır.

Yalnız bir yatırımcı bu durumda ne yapabilir? Cevap açıktır: MetaTrader 5 için bir geçiş olarak, MetaTrader 4 ile sağlanan gerçek zamanlı alım satım imkanlarını kullanmalısınız. Yani bir kopyalayıcı yazmalısınız. Web üzerinden iki MetaTrader 4'ü birbirine bağlamak bir yenilik değil. Şimdi, MetaTrader 5 ile bu bağlanmayı uygulama zamanı.


Önsöz

Konuya dair belirtilen fikirleri uygulamak için soruları netleştirmek gerekir: "Kâr nereden geliyor?" ve "Bir yatırımcı kârının artmasını nasıl kontrol edebilir?" İlk bakışta cevaplar açıktır. Düşükten al, yüksekten sat. Ama hadi kârın bileşenlerini bir düşünelim. Kâr, alım ve satım farkının bahis oranı ile çarpımıdır. Yani kârın iki bileşeni vardır: bir alım satım pozisyonunun kotasyonları ve hacmi.

Yatırımcı neyi/neleri yönetebilir? Bu iki bileşenden hangisi alım satımda bir direksiyon simididir? Tabii ki, bir alım satım pozisyonunun hacmi. Kotasyonlar aracıdan alınır ve yatırımcı tarafından değiştirilemez. İşte ilk çıkarım: Alım satımın bir kopyasını oluşturmak için alım satım pozisyonlarının hacmini senkronize tutmak gerekir.


1. İki platformu karşılaştırma


1.1 Hesaplama sistemindeki farklılıklar

Karşılaştırılan platformların farklı ticari hesaplama sistemleri vardır ve bu, kopyalama konusunu karmaşıklaştırabilir. Ancak bu bağlama işinde öncelikli olanın MetaTrader 5 olduğunu unutmamalıyız. Bunun anlamı, aynı hesaplama sistemini sanal olarak MetaTrader 4'te tekrarlamamız gerektiğidir.

MetaTrader 5'teki bir alım satım pozisyonu, MetaTrader 4'te benimsenen emir hesaplaması ile çelişmeyen bireysel alım satım emirlerinin sonucudur. Bir pozisyon için ortak Zarar Durdur ve Kâr Al, her açık emir için aynı Zarar Durdur ve Kâr Al komutu verilerek uygulanabilir. Platformlar arasındaki ciddi farklar sadece MetaTrader 4'te hangi emrin kapatılacağı sorusunda ortaya çıkar. MetaTrader 5'te bir alım satım pozisyonunda emirlerin ayrı bir hesaplaması olmadığından, bu sorun bir engel bloğu haline gelebilir.


1.2 Alım satım pozisyonlarının hacimleri

Hangi emrin kapatılacağı konusunda herhangi bir fark olup olmadığını ayrıntılı olarak ele alalım. Bu kârı etkiler mi? Örneğin, farklı zamanlarda açılan ve aynı şekilde farklı zamanlarda kapanan, ancak bir süre boyunca birlikte var olan iki emriniz var. Yani, emir hesaplama sisteminde bir alım satım pozisyonunu taklit etmeye çalışıyoruz.

Emirlerin kapanış seviyelerini değiştirirsek kâra ne olacağının farklı varyantlarını hesaplayalım:

Tür Hacim Açılış seviyesi Kapanış seviyesi
satış 0,1 1,39388 1,38438
satış 0,1 1,38868 1,38149

Bir hesaplayıcı kodu yazalım:

void OnStart()
  {
   double open1=1.39388,close1=1.38438,
         open2=1.38868,close2=1.38149;
   Print("total  ",n1(profit((open1-close1),0.1)+profit((open2-close2),0.1)));
   Print("order2  pp=",ns(open2-close2),"  profit=",n1(profit((open2-close2),0.1)));
   Print("order1  pp=",ns(open1-close1),"  profit=",n1(profit((open1-close1),0.1)));
  }
string ns(double v){return(DoubleToString(v,_Digits));}
string n1(double v){return(DoubleToString(v,1));}
double profit(double v,double lot){return(v/_Point*lot);}
Hesaplama şu şekildedir:
order1  pp=0.00950  profit=95.0
order2  pp=0.00719  profit=71.9
total  166.9

Şimdi close1 ve close2 değerlerini değiştiriyoruz.

order1  pp=0.01239  profit=123.9
order2  pp=0.00430  profit=43.0
total  166.9

Şekil 1. Kapanış emri varyantları

Şekil 1, AB ve CD alanlarının her iki sürümde de 0,1'e eşit hacimlere sahip olduğunu, BC'nin ise 0,2 hacmine sahip olduğunu ve hangi emirlerin hacminin kapatılacağına bağlı olmadığını gösterir.

Ayrı emirlerin kârlarında farklılıklarımız vardır, ancak pozisyonların toplam kârı eşittir. Bu örneğin eşit hacimlerdeki emirler için hesaplandığına dikkatinizi çekmek istiyorum. Yani, aynı seviyelerde, bir emrin değil, aynı hacmin kapanışını uyguladık. Ve hacmi kapatma ilkesine sıkı sıkıya bağlı kalırsak, emrin hacminin ne olduğu hiç önemli değildir. Kapanış hacmi emir hacminden büyükse, kısmi bir kapanış olacaktır.

Bu yüzden, buradaki ana çıkarım şudur: Toplam pozisyon için hangi emrin kapatıldığı önemli değildir, önemli olan kapatılan hacimlerin belirli bir seviyede eşit olması gerektiğidir.


1.3 Alım satımları kopyalama

Yukarıdaki örneklerden, aynı kârı elde etmek için MQL5'te yazılmış Uzman Danışman tarafından oluşturulan sinyallerin iletilmesinin gerekli olmadığını görüyorsunuz. Yalnızca alım satım pozisyonlarının hacimlerini tekrar etmeniz gerekir. Ancak, daha sonra tartışılacak bazı nedenlerden dolayı, bu tamamıyla aynı alım satım işlemi olmayacaktır. Bununla birlikte, bu nedenler MQL5'te yazılmış kârlı bir EA kullanılarak gerçek kâr elde etmenin önünde bir engel olamaz.

Kârdaki düşüşün ilk nedeni kotasyonlardaki farktır. Bazı aracılar ile bu, spread’i aşabilir. Gerçek şu ki, kotasyonlar gerçek zamanlı olarak çevrilmektedir. Bir EA MetaTrader 5'te bir pozisyon açmaya karar verdiğinde, MetaTrader 4'ün bağlı olduğu aracının fiyatı farklı olabilir. Bu durumda fiyat daha kötü veya daha iyi olabilir.

Kâr düşüşünün ikinci nedeni zaman faktörüdür. Bir pozisyon, MetaTrader 5'te göründükten sonra kopyalanır ve bu nedenle gecikme kaçınılmazdır.

Bu iki neden, tüm scalping stratejilerini gölgede bırakır. Bu nedenle, MetaTrader 5'te gerçek zamanlı alım satım kullanılabilir olana kadar, bu stratejiler uygulanamayacaktır.

Belirli bir aracının kotasyonlarına duyarsız olan ve spread’i çok fazla aşan bir kârını (bir alım satımdan) belirten sistem, pozisyon kopyalayıcıyı kullanarak gerçek zamanlı para kazanmak için kullanılabilir.


2. Sorunu belirleme

  1. MetaTrader 5 ve MetaTrader 4 arasında sinyal aktarmak için bağlama
  2. MetaTrader 5'ten pozisyonların çevirisi
  3. MetaTrader 4'te sinyalleri alma
  4. MetaTrader 4'te alım satım pozisyonlarının tekrarı


2.1. MetaTrader 5 ve MetaTrader 4 arasında sinyal aktarmak için bağlama

İlk varyant, sinyalleri paylaşılan bir dosya üzerinden aktarmaktır. Soru şu: Dosyaya sık kayıt yapılması donanıma zarar vermez mi? Sadece pozisyon değiştiğinde yeni veri yazarsanız, bu kayıtlar çok sık olmayacaktır. Bu, Windows geliştiricilerinin disk belleği dosyasını değiştirmesinden daha sık olmaz. Bu da donanıma zarar vermeyen kanıtlanmış bir prosedürdür. Paylaşılan bir dosyaya yazmak, çok sık olmayan istekler için kabul gören bir uygulamadır. Bu, önceki sınırlamadan daha az önemli olmasına rağmen, scalping stratejileri için başka bir sınırlamadır.

Bağlamanın zıddı olarak, MetaTrader 5'in alt dizinleri herhangi bir derinliğe yazma özelliğini kullanabilirsiniz. Bunlardan "herhangi birini" kontrol etmedim, ancak 10'a kadar alt dizin yazıldı, orası kesin. Zaten daha fazlasına ihtiyacımız yok. Erişim sağlamak için bir DLL'yi tabii ki kullanabilirsiniz, ancak benim temel görüşüm sorun DLL olmaksızın çözülebiliyorsa bunu kullanmamaktır. Bu sorunu DLL'siz çözmek için MetaTrader 4'ü MetaTrader 5 terminalinin \Files\ dizinine kurmanız yeterlidir (bakınız, Dosyalar ile çalışma).

Böylece, paylaşılan dosyanın yolu aşağıdaki gibi görünecektir:

C:\Program Files\MetaTrader 5\MQL5\Files\MetaTrader 4\experts\files\xxx      //where xxx is the name of the shared file.

Bu konumda dosya, hem MetaTrader 4'te hem de MetaTrader 5'te bulunacak ve MQL5'in fonksiyonları ile dosya paylaşımı imkanı sağlanacaktır.


2.2. MetaTrader 5'ten pozisyonların çevirisi

Pozisyonları çevirmek ve kaynakların ekonomik kullanımı için, tüm enstrümanlar için bir alım satım pozisyonunun görünümünü/değiştirilmesini/kapanışını izleyecek bir fonksiyona ihtiyacımız vardır. Yukarıda, bir alım satımı transfer etmek için sadece bir alım satım pozisyonunun hacmini bilmemiz gerektiği bulunmuştur. Hacme enstrüman sembolünü ve SL ve TP seviyelerini ekleyin.

Değişiklikleri izlemek için bir pozisyonun önceki durumunu bilmemiz gerekir. Eğer önceki ve şimdiki durumlar eşit değilse (ve dolayısıyla pozisyon değişmişse), bunun dosyada görüntülenmesi gerekir. Bu bilgiyi dosyaya yazacak bir fonksiyona da ihtiyacımız var. Dosya, birden fazla program tarafından eş zamanlı olarak kullanılabilir olacak şekilde açılmalıdır.

Pozisyon değişikliği anını kaçırmamak için, izleme sistemi OnTimer() fonksiyonuna uygulanmalıdır, çünkü tüm enstrümanları aynı anda izlememiz gerekmektedir ve tikler farklı semboller için farklı zamanlarda gelmektedir. Ayrıca dosyanın içeriğindeki değişikliğe dair bir sinyal göndermemiz gerekir.


2.3. MetaTrader 4'te sinyalleri alma

Dosya güncelleme sinyalini izlemek gereklidir. Bu, pozisyon değişikliği bölgesine giriş için durumu izlenen bir değişken aracılığıyla düzenlenebilir. Pozisyonların durumunu içeren bir dosyayı okumak için bir fonksiyona ihtiyacımız var. Bu yalnızca standart bir fonksiyondur.

Hesaplama için dosya içeriklerini dizilere aktarma. Burada ayrıştırıcıya ihtiyacımız var. Hem sayılar hem de semboller aktarılacağından, MetaTrader 5'ten aktarım yaparken her şeyi dizeye yeniden kodlamak uygun olacaktır. Ek olarak, tek bir sembol için tüm verileri tek bir dizeye yazarak veri karmaşasını ortadan kaldırırız.


2.4. MetaTrader 4'te alım satım pozisyonlarının tekrarı

Bu, en büyük fonksiyon kümesidir. Birkaç alt sınıfa ayrılmalıdır:

  1. sanal pozisyonları karşılaştırma;
  2. emirleri seçme fonksiyonu;
  3. emir açma fonksiyonu;
  4. emir kapatma fonksiyonu;
  5. emir değişikliği fonksiyonu.


2.4.1. Sanal pozisyonları karşılaştırma

Pozisyonların uygun olduğundan emin olmak için sanal pozisyonların karşılaştırılması gerekir. Fonksiyon, her bir sembol için pozisyonu ayrı ayrı hesaplamalı ve ayrıca alım satımın yasak olduğu pozisyonları (varsa) filtreleyebilmelidir.

Pratikte, aracının sembolünün olmadığı durumlar olabilir, bunun için MetaTrader 5'ten bir sinyal aktarılır. Ancak bu, bir uyarı verilmesi gerekliliğine rağmen, genel olarak alım satımı engellememelidir. Kullanıcının böyle bir durumu bilmeye hakkı vardır.


2.4.2. Emirleri seçme fonksiyonu

Bu fonksiyon, emirleri bunlarla daha fazla çalışacak sembole göre seçmelidir. Bu durumda sadece açık pozisyonları yayınladığımız için emirlerin bekleyen emirler olmaması için filtrelenmesi de gerekir.


2.4.3. Emir açma fonksiyonu

Maksimum hesaplama sayısı içermelidir. Dolayısıyla, hacmi ve türü aktarmak yeterlidir.


2.4.4. Emir kapatma fonksiyonu

Bir önceki gibi bu da, kapatma için bir komut vermeden önce her şeyi hesaplamalıdır.


2.4.5. Emir değişikliği fonksiyonu

Fonksiyon, piyasaya yakınlık durumu için bir kontrol içermelidir. Ayrıca, açılış sırasında stop seviyelerinin yerleştirilmesine tüm aracılarda izin verilmediğinden, emirlerin ve stop seviyelerinin zaman içinde yerleştirilmesi istenir. Ek olarak, ortak emir açma ve stop seviyesi ayarlama yeniden kotasyon olasılığını artırır.

Böylece pozisyon hızlı bir şekilde tekrarlanacaktır. Durdurma seviyelerinin yerleştirilmesi de, daha az önemli olmasa da, küçük bir noktadır.


3. Uygulama

Kodlar ayrıntılı olarak, neredeyse satır satır yorumlanır. Bu nedenle, kodları açıklarken, sadece en zor anlar üzerinde duracağım.


MetaTrader 5 ve MetaTrader 4 arasında sinyal aktarmak için bağlama

Bağlama MetaTrader 5'te şu fonksiyon ile uygulanır:

void WriteFile(string folder="Translator positions") // by default it is the name of the shared file

Açılış bayrakları şu anlama gelir:

FILE_WRITE|FILE_SHARE_READ|FILE_ANSI

Dosya yazmaya açıktır | okuma için farklı programlar tarafından ortak kullanıma izin verilir | ANSI kodlaması

MetaTrader 4'te bağlama şu fonksiyon ile uygulanır:

int READS(string files,string &s[],bool resize)

resize parametresi, alınan veri dizisinin belleğinin yeniden dağıtılmasını engeller. Bir geliştirici satır sayısını tahmin edemediğinden, bu dizi için bellek kodda her yineleme ile ayrılır. Bu, MetaTrader 5'te seçilen sembollerin sayısına bağlıdır. Dolayısıyla bu, MetaTrader'da önceden hesaplanamaz.

Bu nedenle, dizi her adımda bir kademe artırılmalıdır. Ancak dizinin uzunluğu halihazırda tanımlanmış olduğundan ve değişmeyeceğinden bu işlem ikinci fonksiyon çağrısında engellenmelidir. Bunun için bool resize değişkenini kullanın.


MetaTrader 5'ten pozisyonların çevirisi

OnTimer içinde çeviriyi düzenlemek için, tüm pozisyonlara dair 1 saniyelik veri sıklığına sahip fonksiyonu aşağıdaki fonksiyonda alınır:

void get_positions()

Ardından pozisyonların önceki değeri ile fonksiyonun mevcut değeri karşılaştırılır:

bool compare_positions()

En az bir hücrenin eşleşmemesi durumunda geri dön (return) (true) ile çıkış gerçekleşir. geri dön (return) (true) ile çıkış, pozisyonların eşit olmadığı ve dosyanın yeniden yazılması gerektiği anlamına gelir. Dosyayı yeniden yazarken, cnt_command sayacı bir kademe artırılır.


MetaTrader 4'te sinyalleri alma

Dosyayı READS() fonksiyonunu kullanarak okuduktan sonra, doldurulmuş bir dizi s[] elde ederiz.

Bu dizelerin faydalı bilgilere dönüşmesi için bir ayrıştırıcıya ihtiyacımız vardır.

Fonksiyon:

int parser(int Size)

sadece satır tanımlama fonksiyonu çağrısı için bir sarmalayıcıdır:

void parser_string(int x)

Fonksiyon semboller hariç tüm hücreleri tanır.

Sembol, aşağıdaki fonksiyon kullanılarak bir algoritmanın başlangıcında bir döngüde tanınır:

void parser_string_Symbols(int x)

Bundan sonra, özellikle belirtilmedikçe, MQL5'teki koda başvurmayacağız ve sadece MQL4'teki kodu tartışacağız.


Sanal pozisyonları karşılaştırma

Pozisyonların karşılaştırılması iki kısma ayrılır. Hacim ve pozisyon türü karşılaştırması fonksiyona uygulanır:

bool compare_positions()

Bu kabukta, pozisyonların gerçek zamanlı durumunu elde etme çağrısı fonksiyona uygulanır:

void real_pos_volum()

ve karşılaştırma, yukarıda belirtilen "hep veya hiç" ilkesine göre çalışır. Bunun anlamı, en az bir hücre aynı değilse, tüm pozisyonların farklı kabul edilmesidir. real_pos_volum() içinde, kodda ayrıntılı olarak açıklanan ve diğer fonksiyonlarda tekrar tekrar kullanılacak olan birçok filtre uygulanır.

Bu özellikle, tek bir semboldeki tüm emirlerin hacimlerinin sanal bir pozisyona toplanması için kullanılacaktır. Kilit pozisyonların (varsa) doğru şekilde işlenmesi için, Alış emirlerinin hacmi bir eksi, Satış emirlerinin ise bir artı olacaktır.

Karşılaştırmanın ikinci kısmı, stop seviyelerini (stop seviyeleri Zarar Durdur ve Kâr Aldır) karşılaştırmaktır, fonksiyonda yukarıdakine benzer şekilde uygulanır:

bool compare_sl_tp_levels()
Hacimlerde olduğu gibi, kabuğun içinde, fonksiyondaki stop seviyeleri hakkında bilgi edinmek için bir çağrı vardır:
void real_pos_sl_tp_levels()


Emirleri seçme fonksiyonu

Emirler yalnızca hacmi kapatmak amacıyla seçilmelidir, bu nedenle karmaşık özel seçim fonksiyonu yalnızca kapatma için uygulanır:

void close_market_order(string symbol,double lot)

Kapatılması gereken sembol ve hacim parametrelerine sahiptir. Emirleri mümkün olduğunca az bozmak için, fonksiyonun ilk döngüsünde, garanti aranmakta olan parametrede aktarılan kaybeden emir hacmine eşit olan emri arar, bu da parametrede aktarılan kapanış hacmine eşit olan emirdir.

Böyle bir emir yoksa (FlagLot kapanış bayrağının true durumundan bilinir), döngüde ilk sıradaki emirde belirtilen hacim kapatılır (emir hacminin fazlalık kontrolü Closes() kapatma fonksiyonuna uygulanır).

Stop seviyelerinin değiştirilmesi için emirlerin seçimi aşağıdaki fonksiyona uygulanır:

void modification_sl_tp_levels()

Emirler sadece sembole göre filtrelenir, çünkü bir sembol içindeki tüm stop seviyeleri eşittir.


Emir açma fonksiyonu

Bu, aşağıdaki fonksiyona uygulanır:

int open_market_order(string symbol,int cmd,double volume,
                     int stoploss=0,int takeprofit=0,int magic=0)

Belirtilen verileri kullanarak bir emrin rahatça açılması için gerekli tüm kontrolleri içerir.


Emir kapatma fonksiyonu

Bu, aşağıdaki fonksiyona uygulanır:

bool Closes(string symbol,int ticket,double lot)

Kod, lot parametresinin daha önce seçilen emrin gerçek hacmini aşması durumunda bir kontrol içerir.


Emir değişikliği fonksiyonu

Bu, aşağıdaki fonksiyona uygulanır:

bool OrderTradeModif(int ticket,string symbol,int cmd,double price,
                    double stoploss=0,double takeprofit=0,int magic=0)

Kodun kontrolleri vardır, stop seviyelerinin emir türüne uymaması durumunda değerler değiştirilecektir. Bu aynı zamanda, seviyelerin halihazırda istenen değere sahip olup olmadığını kontrol eder.


4. Mantık fonksiyonları

Önceden çizilen plan tamamlandı, ancak kodun hala açıklanamayan bazı fonksiyonları var. Bunlar mantık fonksiyonlarıdır, bunların süreci yönlendiren temel fonksiyonlar olduğunu söyleyebiliriz.

void processing_signals()
void processing_sl_tp_levels()

Her iki özellik de koşullu break (kesme) ile çıkışa sahip sonsuz döngülerdir. Burada betiğin kendisinin sonsuz bir döngü olarak uygulandığına dikkat etmeliyiz. Kullanıcının programı rahatça kaldırmasını sağlamak için, döngünün ana koşulunda yerleşik IsStopped() fonksiyonu vardır.

Kod, bir Uzman Danışmandan döngülü betiğe aşağıdaki şekilde aktarılır:

// Init()
 while(!IsStopped())
    {
     // Start()
     Sleep(1000);
    }
 // Deinit()

Bütün betik mantığı, standart start() fonksiyonunda aynı sonsuz döngüde açıklanır.

start () içinde bulunan döngü kodu şu şekilde görünecektir:

If the trade flow is not busy
          Read the file and save data in an array (not changing the array size);
          if there have been changes in the file
               write new comments;
               remember the time when cycles of compliance check start (located below);
               if the positions whose volumes are being compared are not equal
                    process the positions by volumes;
               if the positions whose stops are being compared are not equal
                    process the positions by stops;
               calculate the end time of checks;
          If time is not exceeded
               make a pause for the remaining time;

En karmaşık mantık yapıları, processing_signals() ve processing_sl_tp_levels() fonksiyonlarında bulunur.

Fonksiyonları "basitten karmaşığa" ilkesine göre tanımlamaya başlıyoruz. Ancak, koddaki çağrı bunun tam tersidir.

//+------------------------------------------------------------------+
//| processing stop levels                                           |
//+------------------------------------------------------------------+
void processing_sl_tp_levels()
  {
//--- remember the time of entering the cycle   
   int start=GetTickCount();
   while(!IsStopped())
     {
      //--- if the trade flow is not busy
      if(Busy_and_Connected())
        {
         //--- select the order and modify stop levels           
         modification_sl_tp_levels();
        }
      //--- if the delay time is over, update information from the file  
      if(GetTickCount()-start>delay_time)READS("Translator positions",s,false);
      //--- if the update counter has changed in the file, exit the cycle      
      if(cnt_command!=StrToInteger(s[0]))break;
      //--- micro-pause      
      Sleep(50);
      //--- if real stop levels and those in the file are equal, exit the cycle     
      if(!compare_sl_tp_levels())break;
     }
   return;
  }

Daha önce bahsedildiği gibi, fonksiyon iki koşulda çıkışı olan sonsuz bir döngüdür:

Döngüden çıkışın ilk koşulu, cnt_command değeri dosyada aynı değere eşit olmadığında gerçekleşir. Bundan önce, döngü işleminin zamanının delay_time global değişkeninde ayarlanan gecikmeyi aşması koşuluyla, dosyaya dair en son bilgileri elde ederiz.

Tüm değişiklikler Busy_and_Connected() filtresi ile korunduğu için bu süre aşılabilir. Yani, yalnızca alım satım akışı serbest ise girin.

Burada, sunucuya bir dizi komut göndermenin MetaTrader 4'te (MetaTrader 5'in aksine) bir yeniden kotasyon olmadan imkansız olduğu açıklanmalıdır. Sunucu yalnızca ilk isteği kabul edebilir, gerisi kaybolur. Bu nedenle sunucuya bir komut vermeden önce alım satım akışının serbest olup olmadığını kontrol etmemiz gerekir.

Döngüden çıkmak için ikinci kontrol, stop seviyeleri compare_sl_tp_levels() ile yukarıda açıklanan pozisyon karşılaştırma fonksiyonudur: Pozisyon eşitse döngüden çıkın.

Şimdi karmaşık olana gelelim:processing_signals() fonksiyonu benzer bir şekilde düzenlenmiştir, ancak mantıksal kısım fonksiyonelliği bakımından oldukça farklıdır.

Bu kısmı ayrıntılı olarak analiz edelim:

//--- convert the direction of the position stored in the file to the form -1,+1            
int TF=SymPosType[i]*2-1;
//--- convert the direction of the real position to the form -1,+1
int TR=realSymPosType[i]*2-1;
//--- save the volume of the position stored in the file                     
double VF=SymPosVol[i];
//--- save the volume of the real position 
double VR=realSymPosVol[i];
double lot;
//--- if the positions for the current symbol are nor equal
if(NormalizeDouble(VF*TF,8)!=NormalizeDouble(VR*TR,8))
  {
//--- if the real volume is not equal to zero and the directions are not equal or
//--- if the directions are equal and the real volume is larger than that in the file                              
   if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))
     {
      //--- if the directions are equal and the real volume is larger than that in the file 
      if(TF==TR && VF<VR)lot=realSymPosVol[i]-SymPosVol[i];
      //--- if the real volume is not equal to zero and the directions are not equal
      else lot=realSymPosVol[i];
      //--- close the calculated volume and exit the cycle                  
      close_market_order(Symbols[i],lot);
      break;
     }
   else
     {
      //--- if the directions are equal and the real volume is less than that in the file 
      if(TF==TR && VF>VR)lot=SymPosVol[i]-realSymPosVol[i];
      //--- if the directions are not the same and the volume is equal to zero                  
      else lot=SymPosVol[i];
      //--- open the calculated volume and exit the cycle 
      open_market_order(Symbols[i],SymPosType[i],lot);
      break;
     }
  }

TF ve TR değişkenleri pozisyon türünün değerini alış=-1, satış=1 şeklinde saklar. Buna göre, TF ​​dosyada saklanan değerdir ve TR sanal pozisyonun gerçek değeridir. Aynısı VF,VR hacimleri için de geçerlidir.

Böylece eşitsizlik:
if(VF*TF!=VR*TR)

hacimlerin veya pozisyon türlerinin eşit olmaması durumunda true olacaktır.

Ardından mantıksal bağlaç gelir:

if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))

bunun anlamı, gerçek hacim sıfıra eşit değilse ve türler eşit değilse, bütün pozisyonu kapatmanız gerekmesidir.

Bu, dosyadaki hacmin sıfır olduğu seçenekleri ve pozisyonun ters yöne çevrildiği seçenekleri içerir. Varyantta, pozisyon tersi yöne çevrildiğinde, ilk olarak pozisyonu açmaya hazırlamanız, yani önceki hacmi kapatmanız gerekir. Daha sonra, bir sonraki yineleme ile mantık diğer kola, açılışa gider.

Mantıksal bağlacın ikinci karmaşık koşulu, tür doğruysa, ancak gerçek hacim dosyada saklanandan daha fazlaysa, gerçek birimi azaltmanız gerektiği anlamına gelir. Bunun için, ilk olarak hacmi azaltmak için gerekli olan lotun boyutunu hesapladık.

Bu duruma uygun bir kapanış koşulu yoksa ve pozisyonlar (birinci filtrede keşfettiğimiz gibi) eşit değilse yeni bir emir açılmalıdır. Burada da iki varyant vardır: dosyadaki pozisyonun bütün boyutu için bir emir açmak veya mevcut emirlere ekleme yapmak. Burada şunu belirtmek isterim ki, limit hacmin fazlasının kontrolü açılış fonksiyonunda mevcuttur, yani eksik hacim (eğer kontrol ile mümkün değilse) algoritmanın bir sonraki yinelemesinde açılacaktır. İlk olarak kapanış durumunun ve ancak bundan sonra açılışın ele alınması nedeniyle Kilit (Lock) durumu neredeyse imkansızdır.

Bir ince kod noktasından bahsetmek istiyorum. MetaTrader 4'te yeni kapanan emrin stop noktaları ile tekrar açılması durumu. Daha önce kotasyonların tutarsızlığının genellikle 5 basamaklı 2-3 puan dahilinde olduğundan bahsetmiştim. 15'e eşit spread ile bu fark anlamlı değildir. Ancak bu fark ile birlikte, zarar durdur veya kâr al MetaTrader 4'te MetaTrader 5'ten daha önce tetiklenirse, algoritma henüz kapatılmış pozisyonu yeniden oluşturmaya çalışırken bir durum ortaya çıkar ve ardından MetaTrader 5'te tetiklenen stop noktaları kaldırılır.

Büyük kayıplara yol açmamıştır, ancak bir spread boşa gitmiştir. Bu nedenle algoritma, bir pozisyonun kaldırılmasından sonra MetaTrader 4'ün bunu geri yüklemeyeceği ve dosya durumu değişene kadar bekleyeceği şekilde yeniden tasarlanmıştır. Ancak o zaman yeniden çalışmaya başlayacaktır. Bu durumda, yatırımcı yanlış olduğunu düşünüyorsa pozisyonu manuel olarak kaldırabilir. Ve bu, MetaTrader 5 dosyada değişiklik yapana kadar geri yüklenmeyecektir.

Tek zayıf nokta, MetaTrader 4 stop noktalarının pozisyonu kaldıracağı, ancak MetaTrader 5'te pozisyonun kapatılmayacağı nadir durumdur. Bu durumda, Kopyalayıcı pozisyonları betiğini yeniden başlatmanızı tavsiye edebilirim. Ve son madde: Kod çalışmayı hafta sonu kontrol etmez. Ciddi bir durum değil, sadece günlük değersiz yeniden kotasyonlarla dolu olacaktır.


5. Uygulamanın pratikte kontrol edilmesi

MetaTrader 4'ü C:\Program Files\MetaTrader 5\MQL5\Files\ dizinine yükleyin

MetaTrader 5'teki herhangi bir grafikte derlenmiş Uzman Danışman Çevirmen pozisyonlarını çalıştırın (Uzman Danışmanın çalışması üzerinde çalıştığı grafiğe bağlı değildir).

Şekil 2. MetaTrader 5'te çevirmen pozisyonları

İlk satırda sayaç durumu ve tüm pozisyonların satır satır günlüğünü içeren çok satırlı bir yorum görüyoruz.

Derlenmiş Kopyalayıcı pozisyonları betiğini MetaTrader 4'teki herhangi bir grafikte çalıştırın (döngülenmiş betiğin çalışması üzerinde çalıştığı grafiğe bağlı değildir).

Şekil 3. MetaTrader 4'te kopyalayıcı pozisyonları

Ardından herhangi bir Uzman Danışmanı MetaTrader 5'te çalıştırabiliriz. İşlem sonuçları MetaTrader 4'e hızlı bir şekilde kopyalanacaktır.

Şekil 4. MetaTrader 4 (üstte) ve MetaTrader 5'teki (altta) pozisyonlar ve emirler

Bu arada, MetaTrader 5'te hesap yönetimi manuel olarak gerçekleştirilebilir veya hesaba yatırımcı parolası ile giriş yapılabilir.

Örneğin, kopyalayıcıyı herhangi bir Championship (Şampiyona) hesabında başlatabilirsiniz.


Sonuç

Bu makale, yatırımcıların yeni platforma geçişini hızlandırmayı ve MQL5 çalışmasını teşvik etmeyi amaçlar.

Sonuç olarak, bu kodun MetaTrader 5'te gerçek bir hesaptaki doğrudan alım satımın yerini tam olarak alamayacağını söylemek isterim. Herhangi bir alım satım sistemi için evrensel bir kod olarak mantık hesaba katılmadan yazılmıştır, bu nedenle evrensel olan her şey gibi ideal değildir. Ancak buna dayanarak, belirli bir strateji için bir sinyal çevirmeni yazabilirsiniz. Programlamadan uzak birçok yatırımcı için, sürümü beklerken bir geçiş aşaması görevi görebilir.

Programlama konusunda bilgili olanlara, kodu, emirleri sihirli numaralarına göre tanıması için değiştirmelerini ve bekleyen emirlerin transferini ve yerleştirmesini yapmasını tavsiye ederim. Sunucuya sabit bir bağlantı olması koşuluyla, bekleyen emirlerin verilmesi kârı etkilemeyecektir. Bağlantı kaybı sık yaşanıyorsa, bekleyen emirler dahil olmak üzere tüm sunucu yolu kopyalanmalıdır.

Yeni dili öğrenin ve bunu sağlam bir sistem geliştirmek için kullanın. Alım satımlarınızda iyi şanslar!

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

Ekli dosyalar |
Alım Satım Fikirlerinin Grafik Üzerinde Hızlı Testi Alım Satım Fikirlerinin Grafik Üzerinde Hızlı Testi
Makale, alım satım fikirlerinin hızlı görsel test yöntemini açıklar. Yöntem bir fiyat grafiği, bir sinyal göstergesi ve bir bakiye hesaplama göstergesinin kombinasyonuna dayanır. Alım satım fikirleri için arama yöntemimi ve bu fikirleri hızlı bir şekilde test etmek için kullandığım yöntemi paylaşmak istiyorum.
MetaTrader 5 Terminalinin Strateji Test Cihazında Tik Oluşturma Algoritması MetaTrader 5 Terminalinin Strateji Test Cihazında Tik Oluşturma Algoritması
MetaTrader 5, Uzman Danışmanlar ve MQL5 dilini kullanarak gömülü bir strateji test cihazı içinde otomatik alım satımı simüle etmemizi sağlar. Bu tarz bir simülasyon, Uzman Danışmanların test edilmesi olarak adlandırılır ve çok sayıda aletin yanı sıra çok sayıda aletin kullanıldığı optimizasyon kullanılarak da uygulanabilir. Kapsamlı bir test sağlamak için, mevcut dakika tarihine dayanan bir tik jenerasyonu yapılmalıdır. Bu makalede MetaTrader 5 istemci terminalindeki geçmiş testi için tiklerin oluşturulduğu algoritmanın ayrıntılı bir açıklaması sunulur.
MetaTrader 5 için Alım Satım Sinyalleri: PAMM Hesaplarına Daha İyi Bir Alternatif! MetaTrader 5 için Alım Satım Sinyalleri: PAMM Hesaplarına Daha İyi Bir Alternatif!
MetaTrader 5'in artık Alım Satım Sinyalleri içerdiğini ve böylece yatırımcılara ve yöneticilere güçlü bir araç sağladığını duyurmaktan mutluluk duyuyoruz. Siz başarılı bir yatırımcının alım satımlarını takip ederken, terminal otomatik olarak bunları hesabınıza kopyalayacaktır!
2013'ün Üçüncü Çeyreği için MetaTrader AppStore Sonuçları 2013'ün Üçüncü Çeyreği için MetaTrader AppStore Sonuçları
Yılın bir çeyreği daha geçti ve MetaTrader platformları için en büyük alım satım robotları ve teknik göstergeler mağazası olan MetaTrader AppStore için sonuçlarını özetlemeye karar verdik. Raporlanan çeyreğin sonuna kadar 500'den fazla geliştirici Market'a 1.200'ün üzerinde ürün ekledi.