English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
HTML'de grafikler ve şemalar

HTML'de grafikler ve şemalar

MetaTrader 5Örnekler | 16 Aralık 2021, 15:05
432 0
Victor
Victor


Giriş

MetaTrader 5 tamamen kendine yetebilen ve ek uzantılar gerektirmeyen bir üründür. MetaTrader 5 broker ile bağlantı sağlar, fiyatları gösterir, piyasa analizi için çeşitli göstergeleri kullanmamıza olanak sağlar ve tabii ki ticaretle uğraşan kişiye alım satım işlemleri yapma fırsatı sunar. MetaTrader 5 ana olarak alım satımı kolaylaştırmaya odaklı bir ürün olduğundan araştırma, matematiksel yöntemlerin analizi, multimedya içeriklerinin oluşturulması ve benzeri işlerde evrensel olarak geçerli bir ürün olarak kullanılamaz ve teknik olarak kullanılmamalıdır.

Dahası, bir yazılım ürününün gereğinden fazla evrensel olması verimliliğinde, güvenirliğinde ve güvenliğinde kaçınılmaz olarak bir düşüşe yol açar. Diğer yandan, bazı durumlarda kullanıcının bazı ek özelliklere ihtiyacı olabilir, örneğin ticaretle uğraşan kişiler genellikle çeşitli uzmanlık alanlarına ve eğitim geçmişlerine sahip kişilerdir. Bu nedenle ek özelliklerin eklenmesi ticaret platformunu daha çekici kılabilir. Tabii ki bunun olması bu ek özelliklerin platformun güvenirliğini ve güvenliğini tehlike atmayacak şekilde eklenmesine bağlıdır.

Bu makalede platformdan alınan verilere dayanarak grafikler ve şemalar oluşturma ve görüntüleme fırsatını sunan bu eklerden birini ele alacağız.

Her program uzmanlık alanı ne ise onu yapmalıdır. Bu ilkeye sadık kalacaksak, o zaman MetaTrader 5’i aracı ile ticaret yapma, bilgi toplama ve işleme görevlerinden sorumlu tutalım ve bu bilgilerin grafik biçimde görüntülenmesi için bu amaçla kullanmaya uygun farklı bir program kullanalım.


Ağ tarayıcısı

Günümüzde içinde halihazırda ağ tarayıcısı yüklü olmayan bir bilgisayar bulmak zordur. Ağ tarayıcıları uzun zamandır evrimleşip iyileşiyorlar. Modern tarayıcılar oldukça güvenilir ve istikrarlı şekilde çalışırlar ve en önemlisi ücretsizdirler. Bir ağ tarayıcısının internete erişim için kullanılan en temel araç olduğunu, çoğu kullanıcının bu araçla aşina olduğunu ve kullanırken ufak sıkıntılar yaşadıklarını da hesaba katalım.

Modern tarayıcıların özellikleri o kadar geniş ki video izlemek, müzik dinlemek, oyun oynamak ve daha birçok aktiviteyi ağ tarayıcılarını kullanarak yapmaya alıştık. Dolayısıyla bir ağ tarayıcısı çeşitli şekillerde sunulabilecek birçok çeşit bilgiyi görüntülemek için kullanılan fazlasıyla gelişmiş bir araçtır.

Şu anda yaygın olarak kullanılan birkaç ağ tarayıcısı olduğundan da bahsetmeden geçmeyelim: InternetExplorer, Mozilla Firefox, Google Chrome, ve Opera. Bu tarayıcılar yazılım donanımları ve kullanıcı arayüzleri bakımından birbirlerinden büyük ölçüde farklı olabilirler. Ancak teorik olarak hepsi ana olarak HTML dilinin standartlarıyla ilgili olan bilgi alışverişinde bulunmaya yarayan ağın temel standartlarını destekler.

Pratikte ise, yazılımcıların çabalarına rağmen, tarayıcılar bazı protokollerin veya teknolojilerin uygulanması açısından bireysel farklılıklara sahiptir. Eğer belirli bir tarayıcının bireysel özellikleri dolayısıyla bize uygun olmadığına karar verirsek bu sorun bilgisayarımıza başka bir veya birkaç ağ tarayıcı yükleyerek çözülebilir. Firefox gibi tarayıcıların öne çıkan destekçi sistemlerinde bile aynı şekilde en azından Internet Explorer yüklüdür.

Ağ tarayıcıların sunucuyla uzaktan iletişim kurmak amacıyla istemci bağlantısı olarak geliştirilmelerine rağmen aynı zamanda bilgisayarınızda yerel olarak saklanan bilgileri görüntülemek için de kullanılabilirler. Bilgisayarınıza daha önce kaydedilmiş internet sayfalarının görüntülenmesi buna örnek olarak gösterilebilir. Tarayıcının yerel sayfaları görüntülemek için internet erişimine ihtiyacı yoktur.

Yani, çevrimdışı modunda kullanılan bir tarayıcı, işlem platformu MetaTrader 5’in grafik özelliklerini genişletmek için kullanılacak program rolü için çok çekici bir adaydır. Kullanmak için pahalı şeyler satın almanıza, külfetli ve uzun yüklemeler yapmanıza ya da yeni bir yazılım ürünü kullanmayı öğrenmenize gerek yok.

Bu yüzden, bu makalenin devamında MetaTrader 5’ten alınan verilere dayanarak, ağ tarayıcılarını kullanarak şema ve grafik oluşturma olasılıklarından bahsedeceğiz.


HTML ve JavaScript

Uzantımız için bir ağ tarayıcısı seçerek kendimize buradan itibaren sıkı şekilde uyacağımız temel bir kural belirleyelim, oluşturulan HTML sayfalarının görüntülenmesi yerel veya uzaktan bir ağ sunucusu aracılığıyla yapılmalıdır. Yani, bilgisayarımıza herhangi bir sunucu yazılımı yüklemeyeceğiz ve sayfalarımızın görüntülenmesi için ağ erişimi gerekmeyecek. Oluşturduğumuz HTML sayfaları sadece ağ tarayıcısı aracılığıyla görüntülenmeli ve bilgisayarımızda yerel olarak bulunmalı. Bu kural ağ dışına erişimden kaynaklanabilecek güvenlik açığı riskini en aza indirecektir.

HTML 4’ün sadece bilgi görüntülenmesi için olan özelliklerini kullanarak içinde tablolar, formatlanmış metinler ve resimler bulunan internet sayfaları oluşturabiliriz ancak hedefimiz MetaTrader 5’ten alınan verilere dayanarak tam teşekküllü şemalar ve grafikler oluşturmak olduğundan bu fırsatlar bizi tamamen tatmin etmiyor.

Farklı siteler arasında gezinirken tarayıcımızda gördüklerimiz çoğunlukla HTML uzantılarını kullanarak oluşturulmuştur. Genellikle bu uzantılar sunucu tarafından çalıştırılır ve bu nedenle bizim amaçlarımıza uygun değildir. Tarayıcı tarafında çalışabilen ve sunucu yazılımı gerektirmeyen teknolojiler, örneğin Macromedia Flash, JavaScript ve Java, bizim işimize yarayabilir.

Macromedia Flash ve Java gibi uygulamaların tarayıcıda çalıştırılması için ise eklentilere ihtiyacımız olacak ancak sonrasında JavaScript’te yazılmış olan bu kullanıcı programları direkt olarak tarayıcı tarafından çalıştırılabilirler. Bütün yaygın olarak kullanılan ağ tarayıcılarının içinde halihazırda JavaScript yorumlayıcısı bulunur. Ek yazılımlar ya da eklentiler yüklemek zorunda kalmaktan kaçınmak için JavaScript’i seçelim.

Dolayısıyla makalenin devamında sadece MQL5 içeren MetaTrader 5 ile HTML ve JavaScript içeren bir ağ tarayıcısı kullanacağız. Ek bir yazılıma gerek yok. HTML-sayfasının sadece bir metin dosyası olduğu unutulmamalıdır. Bu yüzden bir HTML belgesi oluşturmak için herhangi bir metin düzenleyiciyi kullanabiliriz. Örneğin, HTML kodunu MetaEditor 5’de oluşturabilir ve düzenleyebiliriz. Bu makaleyi yazarken HTML kodunun düzenlenmesi, sayfa içeriğini düzenlemeye, değişiklik yapılan sayfayı kaydetmeye ve nasıl görüntüleneceğini ön izlemeye olanak sağlayan Opera @ USB v10.63 tarayıcısında yapılmıştır

HTML ve JavaScript dillerine aşina olmayan bir kişi bunlarda uzmanlaşırken karşılaşılabilecek olası sorunları rahatça anlayabilir. Görevimize başlamak ve HTML ve JavaScript konusunda fazla detaya girmekten kaçınmak için bu teknolojiye dayanan hazır çözümleri kullanmaya çalışacağız. Bu makalenin kapsamında hedefimiz sadece şema ve grafiklerin oluşturulmasıyla sınırlı olduğundan bu amaç için özellikle yazılmış hazır JavaScript kütüphanelerini kullanacağız.

Emprise JavaScript Charts( Emprise JavaScript Grafikleri) fazlasıyla ileri düzey bir grafik kütüphanesidir. Okuyucular verdiğimiz link aracılığı ile bu kütüphaneyi daha detaylı incelemek isteyebilirler ancak bu kütüphane tamamen ücretsiz değil. Bu yüzden ücretsiz kütüphanelere bir göz atalım, örneğin Dygraphs JavaScript Visualization Library(Dygraphs JavaScript Görselleştirme Kütüphanesi) ve Highcharts charting library (Highcharts Şema Kütüphanesi). Dygraphs kompaktlığı ve sadeliği yüzünden ilgi çekici bir seçenek ve bunun yanında Highcharts kütüphanesi daha fazla özelliğe sahip ve daha evrensel görünüyor. Highcharts kütüphanesinin yaklaşık 75 KB olması ve ek olarak yaklaşık 70 KB olan jQuery kütüphanesini gerektirmesine rağmen seçimimizi bu kütüphaneden yana kullanıyoruz.

Highcharts kütüphanesini web-sitemizdeki http://www.highcharts.com/ “Demo Galerisi” bölümünden detaylı inceleyebilirsiniz. Örneklerin her birinin kaynak JavaScript kodunu görmek için “Seçenekleri görüntüle” butonuna tıklayabilirsiniz. Kütüphane ile ilgili detaylı belgeler “Belgeler/Seçenekler Referansı” bölümünde bulunur, bu bölümde ayrıca farklı seçeneklerin birçok örneğini bulabilirsiniz. İlk bakışta JavaScript kodunun fazlalığından ve alışılagelmedik MQL programcı söz diziminden dolayı bu kütüphanenin kullanımı çok karışık gibi görünebilir. Ancak durum pek öyle değil. Kütüphane aracılığıyla, grafik görüntüleyecek olan basit bir HTML dosyasının ilk örneğini düşünün.

Örnek olarak Not Defteri düzenleyicisinde Test_01.htm isimli bir metin dosyası oluşturalım ve kütüphaneyi kullanarak aşağıdaki basit örneği kopyalayalım.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Example</title>
<!-- - -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"
             type="text/javascript"></script>
<script src="/js/highcharts.js" type="text/javascript"></script>
<!-- - -->
<script type="text/javascript">
var chart1;
$(document).ready(function(){
  chart1 = new Highcharts.Chart({
    chart: {renderTo: 'container1'},
    series: [{data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]}]
  });
});
</script>
<!-- - -->
</head>
<body>
<div id="container1" style="width: 700px; height: 400px "></div>
</body>
</html>

Örnek kod yorumlar ile dört kısma ayrılır.

Kodun ilk baştaki üst kısmı klasik HTML sayfası etiketlerini içerir. Kodun bu kısmı bizi şuan çok fazla ilgilendirmiyor.

Bu kısmın ardından iki <script> etiketi içeren başka bir kısım gelir. İlk durumda, tarayıcıya ajax.googleapis.com web-sitesinden jquery.min.js kütüphane kodunu indirmesi komutunu veriyoruz. İkinci durumda tarayıcının indirmesi gereken highcharts.js kütüphanesinin sunucu tarafındaki /js/ kataloğunda bulunduğu varsayılır. Önceden sayfamızın görüntülenme sürecinin hiçbir kısmında dış kaynaklara erişim olmamasına karar verdiğimiz için kodun bu kısmını değiştirmemiz gerekecek.

Değişiklikleri yaptıktan sonra kodun bu kısmı şu şekilde görünecek

<script src="jquery.min.js" type="text/javascript"></script>
<script src="highcharts.js" type="text/javascript"></script>

Bu durumda ,güncel katalogdan olmak üzere, HTML dosyamızı bulunduran katalogdan iki kütüphaneyi de indirme komutunu veriyoruz. Kütüphanelerin tarayıcı tarafından indirilebilmesi için öncelikle sırasıyla ajax.googleapis.com ve http://www.highcharts.com’dan indirilmeleri ve HTML dosyamızın bulunduğu kataloğun içine kopyalanmaları gerekmektedir. Bu kütüphanelerin ikisi de bu makalenin sonunda, ekler kısmında bulunabilir.

Kodun bir sonraki kısmında Highcharts.Chart isimli bir nesne sınıfı oluşturulur. "renderTo: 'container1'" parametresi grafiğin “container1” adlı bir HTML unsurunun içinde gösterileceğini belirtir ve “data” parametresi grafikte görüntülenecek olan verileri tanımlar. Bu örnekte de görebileceğimiz gibi veriler parametreler ile aynı şekilde, yani Highcharts.Chart obje sınıfının yaratılması sırasında, tanımlanır. Basit değişiklikler yaparak görüntülenen verilerin tanımını kodun ayrı bir kısmına taşıyoruz, bu bizim ,birden fazla grafiğin görüntülenmesini gerektiren durumlarda, bu grafiklerin verilerini gruplara ayırmamıza olanak verecek.

Örneğimizin son kısmındaki <div> etiketi “container1” isimli HTML unsurunu beyan eder ve bu ögenin boyutları belirtilir. Daha önce de bahsedildiği üzere bu, grafiği oluşturmak için kullanılacak olan HTML unsurudur ve boyutu “container1” unsurunun <div> etiketinde belirtilen boyutuna göre belirlenir.

Yapılan değişiklikleri de göz önünde bulundurursak örneğimizdeki kod aşağıdaki gibi gözükecektir:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Example</title>
<!-- - -->
<script src="jquery.min.js" type="text/javascript"></script>
<script src="highcharts.js" type="text/javascript"></script>
<!-- - -->
<script type="text/javascript">
var dat1 = [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4];
</script>
<!-- - -->
<script type="text/javascript">
var chart1;
$(document).ready(function(){
  chart1 = new Highcharts.Chart({
    chart: {renderTo: 'container1'},
    series: [{data: dat1}]
  });
});
</script>
<!-- - -->
</head>
<body>
<div id="container1" style="width: 700px; height: 400px "></div>
</body>
</html>

Bu test dosyası ve bütün kütüphaneler makalenin sonundaki ekler kısmından kopyalanabilir. Test_01.htm örnek dosyası ve kütüphanelerin dosyaları da aynı \Test dosyasında bulunur bu yüzden çalışmalarımızın sonucunu görmek için sadece HTML-dosyası Test_01.htm’ ye çift tıklamamız yeterli olacaktır.

Bu test sayfasının normal şekilde görüntülenmesi için ağ tarayıcısında JavaScript’in çalışmasına izin verilmesi gerektiği unutulmamalıdır. Tarayıcılar güvenlik sebebiyle bu seçeneği devre dışı bırakmanıza olanak sağladığından kapalı durumda olabilir. Sonuç olarak aşağıdaki grafiği görürüz:

Test_01.htm

Şekil 1. Test_01.htm 

Bu bizim ilk test grafiğimiz ve bu teknolojinin karmaşıklığına rağmen oluşturması çok zaman almadı.

Görüntülenen grafiklerin bazı özelliklerinin bu şekilde oluşturulduğunu da belirtmekte fayda var. Kopyalanan katalogda, Test_01.htm dosyasını açın ve ağ tarayıcı görüntülenen sayfalarda yakınlaştırmaya izin veriyorsa büyük ölçüde bir büyütmenin bile grafiğin kalitesini düşürmediğini göreceksiniz.

Bu durumun nedeni bu grafiğin PNG ya da JPEG dosyaları gibi sabit bir görüntü olmaması ve yakınlaştırma ya da uzaklaştırma sonrasında çizimi için ayrılan alanın sınırları içerisinde yeniden çizilmesidir. Bu yüzden, böyle bir görüntü, beğendiğimiz bir resmi kaydettiğimiz gibi, bir diske kaydedilemez Grafik JavaScript aracılığıyla oluşturulduğu için farklı tarayıcıların, içlerinde bu dil için kendilerine özel yorumlayıcılar bulunduğundan dolayı, her zaman aynı şekilde işlemeyebileceğini de söylemekte fayda var.

JavaScript kullanılarak oluşturulan grafikler bazen farklı tarayıcılarda farklı şekilde görünebilirler. Çoğunlukla bu farklar diğer tarayıcılara kıyasla en çok Internet Explorer’da olur.

Biz yine de JavaScript kütüphanelerinin yaratıcılarının, kodlarının en popüler ağ tarayıcılarıyla uyumluluğunu mümkün olan en yüksek seviyeye çıkartma konusunu halledeceklerini umuyoruz.


MetaTrader 5 ve MQL5

Yukarıdaki örnekte, grafikte görüntülenmesi amaçlanan verilerin girişi HTML sayfasını oluştururken manuel olarak yapılmıştır. Verilerin MetaTrader 5’ten oluşturulan grafiğe aktarılmasını ayarlamak için çok basit bir yöntem kullanacağız. MetaTrader 5’in grafiği görüntülerken tarayıcıya yüklenecek olan farklı bir dosyaya veri kaydetmesine izin verin. Bir dosyadan ve MQL5’ten bir komut dizisi indirerek grafiği görüntüleyecek bir HTML sayfası içeren, bu dosyayı oluşturacak bir örnek yazalım.

HTML dosyası olarak ,üzerinde bazı değişiklikler yaptıktan sonra, önceden oluşturduğumuz Test_01.htm dosyasını kullanacağız. Değişiklik yapılmış bu dosyayı example1.htm olarak adlandırdık. Yapılan bütün değişiklikler satırların aşağıdakilerle

<script type="text/javascript">
var dat1 = [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4];
</script>
değiştirilecek olmasına
<script type="text/javascript">
var dat1=[0];
</script>
<script src="exdat.txt" type="text/javascript"></script>
indirgenecek:

İlk olarak tarayıcının HTML sayfasını indirirken ayrıca içerisinde bulunan grafikte görüntülenmesi amaçlanan değerlerin dat1 dizinine koyulacağı exdat.txt dosyasını da yüklemesi gerekecek. Bu dosya bir parça JavaScript kodu içermelidir. Bu dosya ilgili komut dizisini kullanarak kolayca MetaTrader 5’te oluşturulabilir.

Bu çeşit bir komut dizisi örneği aşağıda verilmiştir.

//+------------------------------------------------------------------+
//|                                                     Example1.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  int i,n,fhandle;
  double gr[25];
  string str;
  
  n=ArraySize(gr);
  for(i=0;i<n;i++)
    {
    gr[i]=NormalizeDouble(MathSin(i*3*2*M_PI/n),4);
    }

  str=DoubleToString(gr[0],4);
  for(i=1;i<n;i++)
    {
    str+=","+DoubleToString(gr[i],4);
    }
  
  ResetLastError();
  fhandle=FileOpen("exdat.txt",FILE_WRITE|FILE_TXT|FILE_ANSI);
  if(fhandle<0){Print("File open failed, error ",GetLastError());return;}
  
  FileWriteString(fhandle,"dat1=["+str+"];\n");
  
  FileClose(fhandle);
  }
//+------------------------------------------------------------------+

Bu komut dizisi, görüntülenen verileri depolamak için 25 öge barındıran gr [] dizinini kullanır. Bu dizin, örneğin, yuvarlama dört ondalık basamağa kadar yapılmış şekilde sinüs fonksiyonunun değerleri ile doldurulur. Bu dizin tabii ki daha kullanışlı herhangi bir veri ile doldurulabilir.

Dahası, bu veriler tek bir metin dizisi olacak şekilde düzenlenir ve birleştirilir. Oluşturulan metin dosyasının hacmini azaltmak için gr[] dizini unsurlarından sadece dört ondalık noktalı olan değerler dizilime yerleştirilir. Bu amaç için DoubleToString() fonksiyonunu kullandık.

str isimli metin dizilimi oluşturulduktan sonra exdat.txt dosyasında depolanır. Komut dizisinin başarılı bir şekilde çalıştırılması durumunda texdat.txt metin dosyası işlem platformunun \MQL5\Files alt klasöründe oluşturulacaktır, eğer bu dosya zaten mevcutsa üstüne yazılacaktır.

The jquery.min.js, highcharts.js, Example1.mq5, Example1.htm ve exdat.txt dosyaları bu makalenin sonundaki ekler bölümünde verilmiştir. Bu beş dosya \Example1 kataloğunda bulunur. Sonuçları kolayca görüntüleyebilmek için bu örneği kopyalayın ve \Example1 kataloğundaki Example1.htm dosyasını açın. Grafik exdat.txt dosyasındaki verilere göre oluşturulacaktır.

Example1.htm 

Şekil 2. Example1.htm

Tabii ki Example1.mq5 komut dizisini çalıştırmak için dosyanın işlem platformunun \MQL5\Scripts(komut dosyaları) klasöründe olması ve sıkıştırılmış olması gerekir.

Daha önce bahsedildiği üzere komut dizisinin çalıştırılmasından sonra exdat.txt dosyası \MQL5\Files klasöründe oluşturulacaktır ancak bizim örneğimizde HTML dosyasının, kütüphanelerden alınan dosyaların ve verilerin hepsinin aynı klasörde bulunması gerekmektedir. Bu yüzden ya jquery.min.js, highcharts.js ve Example1.htm dosyalarını \MQL5\Files klasörüne kopyalamamız ya da exdat.txt dosyasını yukarıdaki dosyaların bulunduğu klasöre kopyalamamız gerekir.

Bu örnekte HTML sayfası ve kütüphaneler farklı dosyalarda depolanmıştır. Tasarım aşamasında projenin farklı kısımlarının ayrı dosyalarda depolanmasının faydası olabilir. Örneğin, HTML dosyasını düzenlerken kütüphanelerden alınan kodlarda rastgele değişikliklerin meydana gelmesini önleyebilir. HTML sayfası tamamen düzenlendikten sonra, yani planlanan değişikliklerin hepsi yapıldıktan sonra kütüphaneler direkt olarak HTML kod dosyasının içine eklenebilir.

Bunu mümkün kılan şey JavaScript kütüphanelerinin temelde sadece metin dosyaları olmasıdır. Eğer jquery.min.js ya da highcharts.js dosyalarını bir metin düzenleyicisiyle açarsak anlaşılır bir şey göremeyiz çünkü kütüphanelerin kaynak kodu olabildiği kadar sıkıştırılmıştır.

Sıkıştırma hizmet sembollerini, örneğin satır atlatmaları ya da bir dizi boşluğu, çıkartarak yapılır. Bu sıkıştırma sonrası format tamamen bozulur ancak dosya biçimi değişmediğinden dolayı metin, metin olarak kalır. Bu yüzden tarayıcının kütüphane kodunu .js uzantılı bir dış dosyadan alması ile ,bakıldığında aynı şekilde bir metin formatı olan, mevcut HTML dosyasından okuması arasında bir fark yoktur.

Dosyaları birleştirmek için Example1.htm içindeki şu satırları

<script src="jquery.min.js" type="text/javascript"></script>
<script src="highcharts.js" type="text/javascript"></script>

bu şekilde değiştirin

<script type="text/javascript">

</script>

Daha sonra, Not Defteri gibi bir metin düzenleyicisini kullanarak jquery.min.js kütüphanesi dosyasını açıyoruz ve “Hepsini seç” komutunu kullanarak dosyanın içeriğini kopyalıyoruz. Daha sonra Example1.htm dosyasını açın ve kütüphaneden kopyalanan metni <script type=\"text/javascript\"> ve </script> etiketleri arasına yapıştırın. Elde edilen dosyayı Example2.htm olarak kaydedin. Aynı şekilde, highcharts.js kütüphanesinin içeriğini bu dosyanın içine kopyalayın ve önceden kopyalanan kütüphanenin metni ile </script> etiketinin arasına yerleştirin.

Bu kopyalama sonucunda HTML dosyasının boyutu artacaktır ancak şuan kütüphanelerin dosyalarını doğru şekilde görüntülenmeleri için ayırmamıza gerek yok. Bu makalenin sonundaki ekler kısmında verilmiş olan Example2.htm ve exdat.txt dosyalarını içeren exdat.txt dosyasının Folder\Example2 dosyasında bulunması yeterlidir.


Grafik biçimdeki işlem geçmişi üzerine bir rapor

Grafiksel bilgilerin görüntülenmesi için önerilen yöntemin daha kapsamlı biçimde gösterilmesi için ticari hesabın belirli bir zaman aralığındaki işlem geçmişini gösteren bir rapor oluşturacağız. MetaTrader 5’te içerik menüsündeki “History” (Geçmiş) sekmesinde bulunan “Report” (Rapor) komutunu seçtiğinizde oluşturulan HTML temelli rapor prototip görevi görecek. Bu tek bir tabloda özetlenen çok sayıda farklı özelliği içerir. Grafik ve şema biçiminde sunulduğunda bu özelliklerin daha görsel olacağını varsayarak bunları highcharts.js grafik kütüphanesini kullanarak gösterelim.

Yukarıdaki örneklerde grafiğin oluşturulmasında highcharts.js kütüphanesinin bu versiyonunda ayarlanmış olan varsayılan görüntüleme parametrelerini kullandık.

Kullanışlı olması açısından bu seçenek fazlasıyla işlevsizdir çünkü grafiğin görüntüsünü her farklı durumda bireysel, belirli gerekliliklere göre ayarlamamız gerekir Highcharts.js kütüphanesi grafik ve şemalara uygulanabilecek çok sayıda seçenek sunarak bu amaç doğrultusunda geniş olanaklar sağlıyor. Daha önce de belirtildiği üzere, seçenekler listesi, detaylı açıklamaları ile örnekleriyle beraber http://www.highcharts.com’da bulunabilir.

Grafik kütüphanesinde bulunan seçeneklerin açıklamaları üzerinde durmayacağız çünkü bu makalenin amacı sadece MetaTrader 5’ten alınan bilgileri görüntülemek için bir ağ tarayıcısı kullanmayı önermek ve bunun nasıl yapılacağını göstermektir. Bunun sebebi de özellikle de bir internet sayfasının oluşturulmasındaki özel gereksinimlere göre başka bir JavaScript kütüphanesinin gerekmesi ihtimalidir. Okuyucu bireysel olarak kullanılacağı alana bağlı olarak en uygun kütüphaneyi seçebilir ve detaylıca inceleyebilir

Ticari hesabın işlem geçmişini görüntülemek için ProfitReport.htm dosyasını oluşturduk. Eklerde bulunabilir.  \Report klasörü görüntülenecek verileri içeren data.txt dosyasını içerir. Data.txt dosyası klasöre örnek olarak yerleştirilir.

\Report klasörünü kopyalayıp ProfitReport.htm’yi açtığımızda bu örnek için oluşturulan test hesabımızın ticari özelliklerini grafik biçiminde görebiliriz.

ProfitReport.htm

Şekil 3. ProfitReport.htm

ProfitReport.htm’i oluştururken ilk önce sayfanın kaba bir taslağını oluşturduk ve hangi bilginin aşağı yukarı nerede bulunacağını belirledik.

Sonra da grafikleri varsayılan seçenekleri ile sayfaya yerleştirdik.

Bu taslağı oluşturduktan sonra her grafik için o grafiğe uygun seçenekleri ayarladık. Düzenlemeyi bitirdikten sonra bu kütüphanelerin metinlerini sayfaya kopyaladık. Daha önce de bahsedildiği üzere, sayfanın doğru görüntülenmesi için, görüntülenmesi amaçlanan verileri içeren data.txt dosyasıyla aynı katalogda bulunmalıdır.

Data.txt dosyası ProfitReport.mq5 komut dizisini kullanarak MetaTrader 5’te oluşturulmuştur. Bu komut dizisi başarılı şekilde çalıştırılırsa \MQL5\Files klasöründe cari aktif hesabın ticari özelliklerini içeren data.txt dosyası oluşturulur.

Komut dizisinin sıkıştırılması ve \MQL5\Scripts klasörüne yerleştirilmesi gerektiği unutulmamalıdır.

//-----------------------------------------------------------------------------------
//                                                                   ProfitReport.mq5
//                                          Copyright 2011, MetaQuotes Software Corp.
//                                                                https://www.mql5.com
//-----------------------------------------------------------------------------------
#property copyright   "Copyright 2011, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version     "1.00"
#property script_show_inputs

#include <Arrays\ArrayLong.mqh>
#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayString.mqh>
#include <Arrays\ArrayInt.mqh>

//--- input parameters
input int nD=30;               // Number of days
//--- global
double   balabce_cur=0;        // balance
double   initbalance_cur=0;    // Initial balance (not including deposits to the account)
int      days_num;             // number of days in the report (including the current day)
datetime tfrom_tim;            // Date from
datetime tend_tim;             // Date to
double   netprofit_cur=0;      // Total Net Profit
double   grossprofit_cur=0;    // Gross Profit
double   grossloss_cur=0;      // Gross Loss
int      totaltrades_num=0;    // Total Trades
int      longtrades_num=0;     // Number of Long Trades
double   longtrades_perc=0;    // % of Long Trades
int      shorttrades_num=0;    // Number of Short Trades
double   shorttrades_perc=0;   // % of Short Trades
int      proftrad_num=0;       // Number of All Profit Trades
double   proftrad_perc=0;      // % of All Profit Trades
int      losstrad_num=0;       // Number of All Loss Trades
double   losstrad_perc=0;      // % of All Loss Trades
int      shortprof_num=0;      // Number of Short Profit Trades
double   shortprof_perc=0;     // % of Short Profit Trades
double   shortloss_perc=0;     // % of Short Loss Trades
int      longprof_num=0;       // Number of Long Profit Trades
double   longprof_perc=0;      // % of Long Profit Trades
double   longloss_perc=0;      // % of Long Loss Trades
int      maxconswins_num=0;    // Number of Maximum consecutive wins
double   maxconswins_cur=0;    // Maximum consecutive wins ($)
int      maxconsloss_num=0;    // Number of Maximum consecutive losses
double   maxconsloss_cur=0;    // Maximum consecutive losses ($)
int      aveconswins_num=0;    // Number of Average consecutive wins
double   aveconswins_cur=0;    // Average consecutive wins ($)
int      aveconsloss_num=0;    // Number of Average consecutive losses
double   aveconsloss_cur=0;    // Average consecutive losses ($)
double   largproftrad_cur=0;   // Largest profit trade
double   averproftrad_cur=0;   // Average profit trade
double   larglosstrad_cur=0;   // Largest loss trade
double   averlosstrad_cur=0;   // Average loss trade
double   profitfactor=0;       // Profit Factor
double   expectpayoff=0;       // Expected Payoff
double   recovfactor=0;        // Recovery Factor
double   sharperatio=0;        // Sharpe Ratio
double   ddownabs_cur=0;       // Balance Drawdown Absolute
double   ddownmax_cur=0;       // Balance Drawdown Maximal
double   ddownmax_perc=0;      // % of Balance Drawdown Maximal
int      symbols_num=0;        // Numbre of Symbols
  
string       Band="";
double       Probab[33],Normal[33];
CArrayLong   TimTrad;
CArrayDouble ValTrad;
CArrayString SymNam;
CArrayInt    nSymb;

//-----------------------------------------------------------------------------------
// Script program start function
//-----------------------------------------------------------------------------------
void OnStart()
  {
  int         i,n,m,k,nwins=0,nloss=0,naverw=0,naverl=0,nw=0,nl=0;
  double      bal,sum,val,p,stdev,vwins=0,vloss=0,averwin=0,averlos=0,pmax=0;
  MqlDateTime dt;
  datetime    ttmp,it;
  string      symb,br;
  ulong       ticket;
  long        dtype,entry;
  
  if(!TerminalInfoInteger(TERMINAL_CONNECTED)){printf("Terminal not connected.");return;}
  days_num=nD;
  if(days_num<1)days_num=1;             // number of days in the report (including the current day)
  tend_tim=TimeCurrent();                                                // date to
  tfrom_tim=tend_tim-(days_num-1)*86400;
  TimeToStruct(tfrom_tim,dt);
  dt.sec=0; dt.min=0; dt.hour=0;
  tfrom_tim=StructToTime(dt);                                            // date from
//---------------------------------------- Bands
  ttmp=tfrom_tim;
  br="";
  if(dt.day_of_week==6||dt.day_of_week==0)
    {
    Band+=(string)(ulong)(ttmp*1000)+",";
    br=",";ttmp+=86400;
    }
  for(it=ttmp;it<tend_tim;it+=86400)
    {
    TimeToStruct(it,dt);
    if(dt.day_of_week==6){Band+=br+(string)(ulong)(it*1000)+","; br=",";}
    if(dt.day_of_week==1&&br==",") Band+=(string)(ulong)(it*1000);
    }
  if(dt.day_of_week==6||dt.day_of_week==0) Band+=(string)(ulong)(tend_tim*1000);

//----------------------------------------
  balabce_cur=AccountInfoDouble(ACCOUNT_BALANCE);                          // Balance

  if(!HistorySelect(tfrom_tim,tend_tim)){Print("HistorySelect failed");return;}
  n=HistoryDealsTotal();                                           // Number of Deals
  for(i=0;i<n;i++)
    {
    ticket=HistoryDealGetTicket(i);
    entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
    if(ticket>=0&&(entry==DEAL_ENTRY_OUT||entry==DEAL_ENTRY_INOUT))
      {
      dtype=HistoryDealGetInteger(ticket,DEAL_TYPE);
      if(dtype==DEAL_TYPE_BUY||dtype==DEAL_TYPE_SELL)
        {
        totaltrades_num++;                                          // Total Trades
        val=HistoryDealGetDouble(ticket,DEAL_PROFIT);
        val+=HistoryDealGetDouble(ticket,DEAL_COMMISSION);
        val+=HistoryDealGetDouble(ticket,DEAL_SWAP);
        netprofit_cur+=val;                                         // Total Net Profit
        if(-netprofit_cur>ddownabs_cur)ddownabs_cur=-netprofit_cur; // Balance Drawdown Absolute
        if(netprofit_cur>pmax)pmax=netprofit_cur;
        p=pmax-netprofit_cur;
        if(p>ddownmax_cur)
          {
          ddownmax_cur=p;                                 // Balance Drawdown Maximal
          ddownmax_perc=pmax;
          }
        if(val>=0)              //win
          {
          grossprofit_cur+=val;                            // Gross Profit 
          proftrad_num++;                                  // Number of Profit Trades
          if(val>largproftrad_cur)largproftrad_cur=val;    // Largest profit trade
          nwins++;vwins+=val;
          if(nwins>=maxconswins_num)
            {
            maxconswins_num=nwins;
            if(vwins>maxconswins_cur)maxconswins_cur=vwins;
            }
          if(vloss>0){averlos+=vloss; nl+=nloss; naverl++;}
          nloss=0;vloss=0;
          }
        else                    //loss
          {
          grossloss_cur-=val;                                   // Gross Loss
          if(-val>larglosstrad_cur)larglosstrad_cur=-val;       // Largest loss trade
          nloss++;vloss-=val;
          if(nloss>=maxconsloss_num)
            {
            maxconsloss_num=nloss;
            if(vloss>maxconsloss_cur)maxconsloss_cur=vloss;
            }
          if(vwins>0){averwin+=vwins; nw+=nwins; naverw++;}
          nwins=0;vwins=0;
          }
        if(dtype==DEAL_TYPE_SELL)
          {
          longtrades_num++;                          // Number of Long Trades
          if(val>=0)longprof_num++;                  // Number of Long Profit Trades
          }
        else if(val>=0)shortprof_num++;               // Number of Short Profit Trades

        symb=HistoryDealGetString(ticket,DEAL_SYMBOL);   // Symbols
        k=1;
        for(m=0;m<SymNam.Total();m++)
          {
          if(SymNam.At(m)==symb)
            {
            k=0;
            nSymb.Update(m,nSymb.At(m)+1);
            }
          }
        if(k==1)
          {
          SymNam.Add(symb);
          nSymb.Add(1);
          }
        
        ValTrad.Add(val);
        TimTrad.Add(HistoryDealGetInteger(ticket,DEAL_TIME));
        }
      }
    }
  if(vloss>0){averlos+=vloss; nl+=nloss; naverl++;}
  if(vwins>0){averwin+=vwins; nw+=nwins; naverw++;}
  initbalance_cur=balabce_cur-netprofit_cur;
  if(totaltrades_num>0)
    {
    longtrades_perc=NormalizeDouble((double)longtrades_num/totaltrades_num*100,1);     // % of Long Trades
    shorttrades_num=totaltrades_num-longtrades_num;                                 // Number of Short Trades
    shorttrades_perc=100-longtrades_perc;                                           // % of Short Trades
    proftrad_perc=NormalizeDouble((double)proftrad_num/totaltrades_num*100,1);         // % of Profit Trades
    losstrad_num=totaltrades_num-proftrad_num;                                      // Number of Loss Trades
    losstrad_perc=100-proftrad_perc;                                                // % of All Loss Trades
    if(shorttrades_num>0)
      {
      shortprof_perc=NormalizeDouble((double)shortprof_num/shorttrades_num*100,1);     // % of Short Profit Trades
      shortloss_perc=100-shortprof_perc;                                            // % of Short Loss Trades
      }
    if(longtrades_num>0)
      {
      longprof_perc=NormalizeDouble((double)longprof_num/longtrades_num*100,1);        // % of Long Profit Trades
      longloss_perc=100-longprof_perc;                                              // % of Long Loss Trades
      }
    if(grossloss_cur>0)profitfactor=NormalizeDouble(grossprofit_cur/grossloss_cur,2);  // Profit Factor
    if(proftrad_num>0)averproftrad_cur=NormalizeDouble(grossprofit_cur/proftrad_num,2);// Average profit trade
    if(losstrad_num>0)averlosstrad_cur=NormalizeDouble(grossloss_cur/losstrad_num,2);  // Average loss trade
    if(naverw>0)
      {
      aveconswins_num=(int)NormalizeDouble((double)nw/naverw,0);
      aveconswins_cur=NormalizeDouble(averwin/naverw,2);
      }
    if(naverl>0)
      {
      aveconsloss_num=(int)NormalizeDouble((double)nl/naverl,0);
      aveconsloss_cur=NormalizeDouble(averlos/naverl,2);
      }
    p=initbalance_cur+ddownmax_perc;
    if(p!=0)
      {
      ddownmax_perc=NormalizeDouble(ddownmax_cur/p*100,1); // % of Balance Drawdown Maximal
      }
    if(ddownmax_cur>0)recovfactor=NormalizeDouble(netprofit_cur/ddownmax_cur,2); // Recovery Factor

    expectpayoff=netprofit_cur/totaltrades_num;                    // Expected Payoff
    
    sum=0;
    val=balabce_cur;
    for(m=ValTrad.Total()-1;m>=0;m--)
      {
      bal=val-ValTrad.At(m);
      p=val/bal;
      sum+=p;
      val=bal;
      }
    sum=sum/ValTrad.Total();
    stdev=0;
    val=balabce_cur;
    for(m=ValTrad.Total()-1;m>=0;m--)
      {
      bal=val-ValTrad.At(m);
      p=val/bal-sum;
      stdev+=p*p;
      val=bal;
      }
    stdev=MathSqrt(stdev/ValTrad.Total());
    if(stdev>0)sharperatio=NormalizeDouble((sum-1)/stdev,2);    // Sharpe Ratio

    stdev=0;
    for(m=0;m<ValTrad.Total();m++)
      {
      p=ValTrad.At(m)-expectpayoff;
      stdev+=p*p;
      }
    stdev=MathSqrt(stdev/ValTrad.Total());                      // Standard deviation
    if(stdev>0)
      {
      ArrayInitialize(Probab,0.0);
      for(m=0;m<ValTrad.Total();m++)                           // Histogram
        {
        i=16+(int)NormalizeDouble((ValTrad.At(m)-expectpayoff)/stdev,0);
        if(i>=0 && i<ArraySize(Probab))Probab[i]++;
        }
      for(m=0;m<ArraySize(Probab);m++) Probab[m]=NormalizeDouble(Probab[m]/totaltrades_num,5);
      }
    expectpayoff=NormalizeDouble(expectpayoff,2);                  // Expected Payoff  
    k=0;
    symbols_num=SymNam.Total();                                  // Symbols
    for(m=0;m<(6-symbols_num);m++)
      {
      if(k==0)
        {
        k=1;
        SymNam.Insert("",0);
        nSymb.Insert(0,0);
        }
      else
        {
        k=1;
        SymNam.Add("");
        nSymb.Add(0);
        }
      }
    }
  p=1.0/MathSqrt(2*M_PI)/4.0;
  for(m=0;m<ArraySize(Normal);m++)                             // Normal distribution
    {
    val=(double)m/4.0-4;
    Normal[m]=NormalizeDouble(p*MathExp(-val*val/2),5);
    }

  filesave();
  }
//-----------------------------------------------------------------------------------
// Save file
//-----------------------------------------------------------------------------------
void filesave()
  {
  int n,fhandle;
  string loginame,str="",br="";
  double sum;
  
  ResetLastError();
  fhandle=FileOpen("data.txt",FILE_WRITE|FILE_TXT|FILE_ANSI);
  if(fhandle<0){Print("File open failed, error ",GetLastError());return;}
  
  loginame="\""+(string)AccountInfoInteger(ACCOUNT_LOGIN)+", "+
                        TerminalInfoString(TERMINAL_COMPANY)+"\"";
  str+="var PName="+loginame+";\n";
  str+="var Currency=\""+AccountInfoString(ACCOUNT_CURRENCY)+"\";\n";
  str+="var Balance="+(string)balabce_cur+";\n";
  str+="var IniBalance="+(string)initbalance_cur+";\n";
  str+="var nDays="+(string)days_num+";\n";
  str+="var T1="+(string)(ulong)(tfrom_tim*1000)+";\n";
  str+="var T2="+(string)(ulong)(tend_tim*1000)+";\n";
  str+="var NetProf="+DoubleToString(netprofit_cur,2)+";\n";
  str+="var GrossProf="+DoubleToString(grossprofit_cur,2)+";\n";
  str+="var GrossLoss="+DoubleToString(grossloss_cur,2)+";\n";
  str+="var TotalTrad="+(string)totaltrades_num+";\n";
  str+="var NProfTrad="+(string)proftrad_num+";\n";
  str+="var ProfTrad="+DoubleToString(proftrad_perc,1)+";\n";
  str+="var NLossTrad="+(string)losstrad_num+";\n";
  str+="var LossTrad="+DoubleToString(losstrad_perc,1)+";\n";
  str+="var NLongTrad="+(string)longtrades_num+";\n";
  str+="var LongTrad="+DoubleToString(longtrades_perc,1)+";\n";
  str+="var NShortTrad="+(string)shorttrades_num+";\n";
  str+="var ShortTrad="+DoubleToString(shorttrades_perc,1)+";\n";
  str+="var ProfLong ="+DoubleToString(longprof_perc,1)+";\n";
  str+="var LossLong ="+DoubleToString(longloss_perc,1)+";\n";
  FileWriteString(fhandle,str); str="";
  str+="var ProfShort="+DoubleToString(shortprof_perc,1)+";\n";
  str+="var LossShort="+DoubleToString(shortloss_perc,1)+";\n";
  str+="var ProfFact="+DoubleToString(profitfactor,2)+";\n";
  str+="var LargProfTrad="+DoubleToString(largproftrad_cur,2)+";\n";
  str+="var AverProfTrad="+DoubleToString(averproftrad_cur,2)+";\n";
  str+="var LargLosTrad="+DoubleToString(larglosstrad_cur,2)+";\n";
  str+="var AverLosTrad="+DoubleToString(averlosstrad_cur,2)+";\n";
  str+="var NMaxConsWin="+(string)maxconswins_num+";\n";
  str+="var MaxConsWin="+DoubleToString(maxconswins_cur,2)+";\n";
  str+="var NMaxConsLos="+(string)maxconsloss_num+";\n";
  str+="var MaxConsLos="+DoubleToString(maxconsloss_cur,2)+";\n";
  str+="var NAveConsWin="+(string)aveconswins_num+";\n";
  str+="var AveConsWin="+DoubleToString(aveconswins_cur,2)+";\n";
  str+="var NAveConsLos="+(string)aveconsloss_num+";\n";
  str+="var AveConsLos="+DoubleToString(aveconsloss_cur,2)+";\n";
  str+="var ExpPayoff="+DoubleToString(expectpayoff,2)+";\n";
  str+="var AbsDD="+DoubleToString(ddownabs_cur,2)+";\n";
  str+="var MaxDD="+DoubleToString(ddownmax_cur,2)+";\n";
  str+="var RelDD="+DoubleToString(ddownmax_perc,1)+";\n";
  str+="var RecFact="+DoubleToString(recovfactor,2)+";\n";
  str+="var Sharpe="+DoubleToString(sharperatio,2)+";\n";
  str+="var nSymbols="+(string)symbols_num+";\n";
  FileWriteString(fhandle,str);

  str="";br="";
  for(n=0;n<ArraySize(Normal);n++)
    {
    str+=br+"["+DoubleToString(((double)n-16)/4.0,2)+","+DoubleToString(Normal[n],5)+"]";
    br=",";
    }
  FileWriteString(fhandle,"var Normal=["+str+"];\n");

  str="";
  str="[-4.25,0]";
  for(n=0;n<ArraySize(Probab);n++)
    {
    if(Probab[n]>0)
      {
      str+=",["+DoubleToString(((double)n-16)/4.0,2)+","+DoubleToString(Probab[n],5)+"]";
      }
    }
  str+=",[4.25,0]";
  FileWriteString(fhandle,"var Probab=["+str+"];\n");

  str=""; sum=0;
  if(ValTrad.Total()>0)
    {
    sum+=ValTrad.At(0);
    str+="["+(string)(ulong)(TimTrad.At(0)*1000)+","+DoubleToString(sum,2)+"]";
    for(n=1;n<ValTrad.Total();n++)
      {
      sum+=ValTrad.At(n);
      str+=",["+(string)(ulong)(TimTrad.At(n)*1000)+","+DoubleToString(sum,2)+"]";
      }
    }
  FileWriteString(fhandle,"var Prof=["+str+"];\n");
  FileWriteString(fhandle,"var Band=["+Band+"];\n");

  str="";br="";
  for(n=0;n<SymNam.Total();n++)
    {
    str+=br+"{name:\'"+SymNam.At(n)+"\',data:["+(string)nSymb.At(n)+"]}";
    br=",";
    }
  FileWriteString(fhandle,"var Sym=["+str+"];\n");

  FileClose(fhandle);
  }

Gördüğümüz gibi bu komut dizisi fazlasıyla külfetli ancak bu, işin karmaşıklığından değil belirlenmesi gereken değer olan ticari özelliklerin çokluğundan kaynaklanıyor. Bu değerlerin depolanması için komut dizisinin başlangıcı küresel değişkenleri ve ilgili yorumları beyan eder.

OnStart() işlevi platformun ticari sunucuya bağlı olup olmadığını belirler, değilse de komut dizisinin işini bitirmesini onaylar. Sunucu bağlantısının olmaması durumunda aktif bir hesap tanımlayıp bu hesapla ilgili bilgi alamayız.

Bir sonraki adım cari aktif hesaptan alınan verilerin içinden alınan hangi tarihler arasındaki verilerin rapora dahil edileceğini belirlemektir. Bitiş tarihi olarak komut dizisinin oluşturulduğu zamandaki mevcut tarih ve saat değerini kullanıyoruz. Rapora dahil edilecek gün sayısı komut dizisini yüklerken ,varsayılan olarak 30 gün olan, “Gün sayısı” girdi parametresini değiştirerek ayarlanabilir. Raporun bitiş ve başlangıç zamanını dizi değişkeni bandında belirledikten sonra hafta sonunun başlangıcı ve bitişine denk gelen bir çift zaman değeri oluşturulur. Bu bilgi hesap grafiğinde Cumartesi ve Pazar günlerine denk gelen zaman aralıklarını sarı işaretlemek için kullanılır.

Daha sonra, HistorySelect() işlevini kullanarak belirlenen bir zaman aralığındaki alışverişler ve siparişlere ulaşabiliyoruz, HistoryDealsTotal() işlevini kullanarak da işlem geçmişinde görüntülenecek alışveriş sayısını belirliyoruz. Bundan sonra, işlemlerin sayısına bağlı olarak ticari özelliklerin hesaplanabilmesi için gerekli istatistikleri toplayan bir döngü ayarlanır, bu döngünün sonunda da bu özelliklerin değerleri belirlenir.

Bu komut dizisini oluştururken görevimiz ticari özelliklerin anlamını MetaTrader 5’te oluşturulan rapora uygun olacak şekilde koruyabilmekti. Komut dizisi tarafından hesaplanan özelliklerin platformun Help (Yardım) dosyasında verilen açıklamalar ile uyumlu olduğu varsayılır. 

Hesap geçmişine erişim ile ilgili bilgiler ve ticari özelliklerin hesaplamaları aşağıdaki makalelerde bulunabilir:

Özelliklerin çoğu kolayca hesaplanabilir, bu yüzden bu makalede bütün özelliklerle ilgili işlemleri incelemeyeceğiz ve sadece mevcut rapor ile ekleri arasındaki farkları göz önünde bulunduracağız.

Platform tarafından oluşturulan raporda hesap grafiği, bakiye her değiştiğinde alınan değerlerin sırasıyla gösterilmesi ile oluşturulur ve X ölçeği bu değişikliklerin sayısını yansıtır. Bizim durumumuzda grafiği oluşturmak için bir zaman ölçeği kullanıyoruz.

Bu nedenle kâr grafiği platform tarafından oluşturulan grafikten çok farklıdır. Grafik oluşturmak için bu yolu seçmemizin nedeni pozisyon kapatmalarını gerçek zaman ölçeğinde görüntülemek istemememiz. Bu sayede bir rapor döneminde ticari etkinliğin ne zaman düşüp ne zaman yükseldiğini görebiliriz.

Bir grafik oluştururken, MQL5’in 1 Ocak 1970’ten beri geçen saniye sayısı şeklinde sunulan tarih değerini kullanırken grafik kütüphanesinin bu değeri 1 Ocak 1970’ten beri geçen milisaniyeler olarak kullanılmasını gerektirdiği unutulmamalıdır. Bu nedenle komut dizisindeki tarih değerleri doğru şekilde görüntülenmeleri için bin ile çarpılmalıdır.

Komut dizisi, kâr değerini ve alışverişin bitiş saatini depolamak için Standart Kütüphane’den CArrayDouble ve CArrayLong sınıflarını kullanır. Döngüde sonuçlanan bir işlem saptandığında hakkındaki bilgi Add() yöntemini kullanarak unsurun içine yerleştirilir, bu bilgi dizinin sonuna eklenir. Bu sayede gerekli unsur sayısını önceden belirlememize gerek kalmaz. Bu dizinin boyutu işlem geçmişinde bulunan işlem sayısı arttıkça artar.

Yapılan her işlemin hangi sembolde gerçekleştiği kontrol edilir, bunu yaparken sembolün adı ve o sembolle yapılan işlem sayısı da korunur. Kâr grafiğinde olduğu gibi, bu veri geçmişi görüntülerken de dizinin sonuna eklenen bir unsur ile kaydedilip birikir. Sembolün adını ve yapılan işlem sayısını depolamak için standart kütüphaneden CArrayString ve CArrayInt sınıflarını kullanıyoruz.

Eğer işlemler tek sembolden yapılmış ise bu durumda grafikteki tek sütun fazla geniş olacaktır. Bunu önlemek için veri dizini her zaman en az 7 unsur içerir. Kullanılmayan unsurlar sıfır değer barındırdıklarından şemada gösterilmezler ve bu sayede sütunun fazla geniş olması önlenir. Az sayıda sembol olduğunda sütunların X ekseninin ortasına uygun şekilde yerleştirilmesini sağlamak için dizinin önemsiz unsurları ardışık olarak dizinin başına ya da sonuna konur.

Standart rapordan bir diğer farkı ise her işlemin kâr değerleri dizisi için olasılık dağılımı grafiğini oluşturmaya çalışmaktır.

Olasılık yoğunluğu

Şekil 4. Olasılık yoğunluğu

Genellikle bu tür grafik sütun grafiği şeklinde verilir. Bizim durumumuzda olasılık grafiği, sütun grafiğinde bulunan sütunların değerlerine dayanan bir eğri oluşturarak oluşturulur. Olasılık yoğunluğunun hesaplanan değerleri grafiğin dışında olmak üzere sağda ve solda sıfır değerleriyle tamamlanır. Bu, oluşturulan eğim grafiğinin bilinen son değerde kesintiye uğramaması ve grafiğin dışına devam edip sıfıra düşmesi için gereklidir.

Karşılaştırmak istersek, olasılık yoğunluğu grafiğinde gri renk, içindeki değerlerin toplamı bire eşit olacak şekilde normalleştirilmiş olan ve sütun grafiğindeki değerlerle oluşturulan normal dağılım grafiğine vurgu yapmak için kullanılmıştır. Verilen rapor örneğindeki işlem sayısı, kâr ticaretindeki olasılık dağılımına dair aşağı yukarı da olsa güvenilir bir ortalama vermek için yeterli değildir. İşlem geçmişinde çok sayıda işlem bulunduğu zaman bu grafiğin daha gerçekçi görüneceğini varsayabiliriz.

Bütün ticari özellikler hesaplandığında, komut dizisinin sonunda filesave() işlevi kullanılır. Bu işlev, değişkenlerin isimlerinin ve değerlerinin metin formatında kaydedildiği data.txt dosyasını açar. Bu değişkenlerin değerleri hesaplanan parametreler ile isimleri de isimlerle uyumludur ve bunlar parametrelerin grafik kütüphanesinin işlevlerine aktarılması sırasında HTML dosyasında kullanılır.

Dosyanın yazılımı sırasında yapılan disk erişimlerinin sayısını azaltmak için kısa satırlar tek bir uzun satır haline getirilip dosyaya o şekilde kaydedilirler. Data.txt dosyası, MetaTrader 5’te de olduğu gibi, MQL5\Files kataloğuna kaydedilir, bu dosya zaten varsa üstüne yazılır. Kullanım kolaylığı için ProfitReport.htm dosyasını bu kataloğa kopyalayıp buradan çalıştırabilirsiniz.

MetaTrader 5 platformunda bir raporu HTML formatında kaydederken bu dosya varsayılan tarayıcı olarak ayarlanmış olan tarayıcıda otomatik olarak açılır. Bu olanak bu makalede verilen örneğe eklenmemiştir.

Otomatik oynatmayı eklemek için aşağıdaki satırları ProfitReport.mq5 komut dizisinin başına ekleyin

#import "shell32.dll"
int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,
                  string lpDirectory,int nShowCmd);
#import

ve en sonunda filesave() işlevinin çalıştırılmasından sonra, şunu ekleyin

string path=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\ProfitReport.htm";
ShellExecuteW(NULL,"open",path,NULL,NULL,1);

Eğer ProfitReport.htm belirlenen değişken yolunda varsa o zaman ShellExecuteW() işlevi başlatılır ve dosya bir tarayıcı tarafından açılır. ShellExecuteW() işlevi shell32.dll sistem kütüphanesinde bulunur, bu işlevin beyanı işleve erişim sağlamak için dosyanın başına eklenir.


Sonuç

Ağ tarayıcısının kullanımı birçok farklı bilginin aynı anda göstermemize olanak sağlar. Bu da, örneğin, işlem platformunda çalışan Expert Advisor’ın modüllerinin her birinin iç durumunun görsel kontrol düzenlemesi gibi durumlarda faydalı olabilir

Sermaye yönetimi verileri, ticari belirteçler, takip durdurma ve diğer modüllerin verileri kolayca ve eşzamanlı olarak görüntülenebilir. Aşırı derecede fazla bilginin görüntülenmesi gerektiği durumlarda da çok sayfalı HTML raporları kullanılabilir.

JavaScript dilinin özelliklerinin sadece grafik çizmekten çok daha geniş olduğunu belirtmekte fayda var. Bu dili kullanarak gerçekten etkileşimli internet sayfaları oluşturabiliriz. İnternette, bu sayfadaki kaynaklar da dahil, çok sayıda hazır JavaScript kodu ve bu dilin çeşitli kullanım örneklerini bulabilirsiniz.

Örneğin, platform ve tarayıcı arasında iki yönlü veri alışverişi sağlanırsa platform direkt olarak tarayıcı penceresinden yönetilebilir.

Bu makalede gösterilen yöntemlerin kullanışlı olmasını umuyoruz.


Dosyalar

JS_Lib.zip            - highcharts.js ve jquery.min.js
librariesTest.zip   - highcharts.js, jquery.min.js ve Test_01.htm
Example1.zip       - highcharts.js, jquery.min.js, Example1.htm, Example1.mq5 ve exdat.txt
Example2.zip       - Example2.htm ve exdat.txt
Report.zip           - ProfitReport.htm ve data.txt
ProfitReport.mq5 - İstatistiklerin toplanması ve data.txt dosyasının oluşturulması için komut dizisi

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

Ekli dosyalar |
js_lib.zip (53.99 KB)
test.zip (54.53 KB)
example1.zip (55.31 KB)
example2.zip (54.3 KB)
report.zip (57.25 KB)
profitreport.mq5 (17.12 KB)
MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur MQL5 Sihirbazı: Açık Pozisyonların İzlenme Modülü Nasıl Oluşturulur
MQL5 Sihirbazının alım satım stratejileri üreticisi, alım satım fikirlerinin test edilmesini büyük ölçüde basitleştirir. Bu makale MQL5 Sihirbazının alım satım stratejileri üreticisine nasıl bağlanılacağını ve alım satım yaparken kârınızı korumaya izin veren ve düşüşleri azaltan, fiyat pozisyon yönünde gittiğinde Zarar Durdur seviyesini kayıpsız bir bölgeye taşıyarak açık pozisyonları yöneten sınıfınızı nasıl yazacağınızı ele alır. Ayrıca MQL5 Sihirbazı için oluşturulan sınıfın tanımının yapısı ve formatı hakkında bilgi verir.
Zigzag ve ATR örneklerini Kullanarak Göstergelerin Sınıflara Uyarlanması Zigzag ve ATR örneklerini Kullanarak Göstergelerin Sınıflara Uyarlanması
Göstergeleri hesaplamanın en iyi yolunun ne olduğu hakkındaki tartışmalar asla bitmez. Gösterge değerlerini nerede hesaplamalıyız - göstergenin kendi içinde mi yoksa bütün mantığı kullanacak bir Expert Advisor’a (Uzman Danışman) mı yüklenmeli? Bu makale özel bir gösterge olan iCustom’ın kaynak kodunu bir Expert Advisor’ın koduna taşımak ile hesaplamaları optimize edilmiş bir komut dizisi oluşturmak ve prev_calculated (daha önce hesaplanmış) değeri örnek almak arasındaki değişkenlerden biri hakkındadır.
MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması
Uzun zamandır çoklu para birimi analizi ve çoklu para birimi alım satımı insanların ilgisini çekmiştir. Tam teşekküllü bir çoklu para birimi rejimi uygulama fırsatı MetaTrader 5'in ve MQL5 programlama dilinin herkese açılmasıyla mümkün olmuştur. Bu makalede çeşitli sembollere yönelik gelen tüm tikleri analiz etmenin ve işlemenin bir yolunu öneriyoruz. Örnek olarak USDx dolar endeksinin çoklu para birimli RSI göstergesini ele alalım.
C++ Şablonlarına Alternatif Olarak Sahte Şablonları Kullanma C++ Şablonlarına Alternatif Olarak Sahte Şablonları Kullanma
Makale, şablonları kullanmadan, ancak şablonlarda iherenet programlama stilini koruyarak programlamanın bir yolunu açıklar. Özel yöntemler kullanarak şablonların uygulanmasını anlatır ve belirtilen şablonlar temelinde bir kod oluşturmak için eklenmiş hazır bir komut dosyasına sahiptir.