English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
MQL5 program yapısı hakkında bilmeniz gereken her şey

MQL5 program yapısı hakkında bilmeniz gereken her şey

MetaTrader 5Alım-satım |
216 3
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Giriş

Tüm programlama dillerinde programların belirli bir yapısı vardır. Bu yapıyı öğrendikten sonra kendi programlarımızı rahat bir şekilde geliştirebiliriz. MQL5 programlarının da kendi yapısı vardır ve bir geliştirici, projesinin hedeflerine sorunsuz ve verimli bir şekilde ulaşmasını sağlamak için bu yapıyı öğrenmelidir. Aşağıdaki konular aracılığıyla MQL5 program yapısını inceleyeceğiz:

Bu makaleyi okuduktan sonra, herhangi bir MQL5 programının yapısını çok iyi anlayacak ve bu yapıya dayalı kendi yazılımınızı sorunsuz ve verimli bir şekilde geliştirebileceksiniz.

Sorumluluk reddi: Sağlanan tüm bilgiler ‘olduğu gibi’ yalnızca bilgilendirme amaçlıdır, alım-satım tavsiyesi değildir. Bu bilgiler herhangi bir sonucu garanti etmemektedir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.


Önişlemci

Bu bölümde, bir programlama kavramı olarak önişlemci hakkında ayrıntılı bilgi edineceğiz. Önişlemci, derleme sürecinde önemli bir adımdır. Programın derlemesinden önce gerçekleşir. Ön işleme adımı, dosyaların dahil edilmesi, yazılım özelliklerinin tanımlanması, sabitlerin tanımlanması ve fonksiyonların içe aktarılması gibi çeşitli faaliyetleri içerir.

Tüm önişlemci yönergeleri “#” ile başlar.  Bu yönergeler dil ifadeleri olarak kabul edilmez. Yani, noktalı virgül (;) ile bitmemelidirler. Bir önişlemci yönergesinin sonuna noktalı virgül eklenmesi yönergenin türüne bağlı olarak hatalara neden olabilir.

Başka bir deyişle, önişlemcinin derleme işleminden önce programın kaynak kodunun hazırlanması için kullanıldığını söyleyebiliriz. MQL5 programında tanımlamamız gereken parametrelere bağlı olarak birçok önişlemci yönergesi türü vardır:

  • Makro ikamesi (#define)
  • Program özellikleri (#property)
  • Dosyaları dahil etme (#include)
  • Fonksiyonları içe aktarma (#import)
  • Koşullu derleme (#ifdef, #ifndef, #else, #endif)

Makro ikamesi (#define):

Sembolik sabitler oluşturmak veya programda kullanılacak sabitleri tanımlamak için #define önişlemci yönergesi kullanılabilir. Sabit, değeri değişmeyen bir tanımlayıcıdır. Belirli bir tanımlayıcı için bir ikame değer kullanacağımızdan, #define yönergesi sabitlere anımsatıcı adlar atamak için kullanılabilir. Bu önişlemci yönergesinin ilk biçimi aşağıdaki gibidir:

#define identifier replacement-value

Bu kod satırı, program derlenmeden önce tanımlayıcının bir ikame değerle değiştirileceği anlamına gelir. Bu biçim parametresiz bir #define yönergesidir. MQL5'te, aşağıda gösterildiği gibi #define yönergesi ile kullanılabilen maksimum sekiz parametreye izin verilen başka bir parametrik biçim daha vardır:

#define identifier (param1, param2,... param5)

Değişkenler için geçerli olan kuralların aynısı sabitlerin tanımlanması için de geçerlidir:

  • Değer integer, double veya string gibi herhangi bir türde olabilir.
  • İfade birkaç belirteçten oluşabilir. Satır bittiğinde sona erer ve bir sonraki kod satırına taşınamaz.

Aşağıda bir örnek verilmiştir:

//Parameter-free format
#define INTEGER               10                                     //int
#define DOUBLE                10.50                                  //double
#define STRING_VALUE      "MetaQuotes Software Corp."                //str
#define INCOMPLETE_VALUE INTEGER+DOUBLE                              //Incomlete
#define COMPLETE_VALUE (INTEGER+DOUBLE)                              //complete
//Parametic format
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))
double c=MUL(A,B);
//function to print values
void defValues()
  {

   Print("INTEGER Value, ",INTEGER);         //result: INTEGER Value, 10
   Print("DOUBLE Value, ",DOUBLE);           //result: DOUBLE Value, 10.50
   Print("STRING Value, ",STRING_VALUE);     //result: STRING Value, MetaQuotes Software Corp.
   Print("INCOMPLETE Value, ",INCOMPLETE_VALUE*2);     //result: INCOMPLETE Value, 31
   Print("COMPLETE Value, ",COMPLETE_VALUE*2);     //result: STRING Value, 41
   Print("c= ",c);                                  //result: c= 41
  }

Ayrıca, önceden tanımlanmış olanı iptal eden #undef önişlemci yönergesi de vardır.

Program özellikleri (#property):

Yazılımımızı oluştururken ek parametreler belirtmemiz gerektiğini fark edebiliriz, bunu #property kullanarak yapabiliriz. Bu özellikler include dosyasında değil ana MQL5 dosyasında belirtilmelidir ve include dosyalarında belirtilenler göz ardı edilecektir. #property yönergesi program için ek özellikler belirtir. Bu bağlamda neyi belirtmemiz gerektiğini sorarsanız, örneğin gösterge, komut dosyası, açıklayıcı bilgiler ve kütüphane özellikleri gibi birçok şey olduğunu söyleyebilirim. Diğer önişlemci yönergeleri gibi #property de kaynak kodun en üstünde belirtilecek ve program çalıştırılırken program penceresindeki Genel sekmesinde görüntülenecektir.

Aşağıda bu önişlemci yönergesine bir örnek verilmiştir:

#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Property preprocessor"

Bu değerleri program penceresinde görebiliriz:

Özellikler

Yukarıdaki şekilde gördüğümüz gibi, Uzman Danışmanı çalıştırırken Genel sekmesinde, ihtiyacımız olan tanımladığımız özelliklere sahibiz. “Copyright 2023, MetaQuotes Ltd.” metni bir köprüdür. İmleci bu yazının üzerine getirdiğimizde, nereye gittiğini görebiliriz (link özelliği).

Dosyaları dahil etme (#include):

Tüm #include yönergeleri de programın başına yerleştirilir. Değişkenler, fonksiyonlar ve sınıflar gibi içeriğini kullanmak için yazılıma dahil edilmesi gereken dosyayı belirtir.

Dosyaları #include yönergesini kullanarak dahil etmek için iki biçim vardır:

#include <File_Name.mqh>
#include "File_Name.mqh"

Bu iki biçim arasındaki fark, derleyicinin dahil edilecek dosyayı nerede araması gerektiğidir: İlki, derleyicinin dosyayı MetaTrader 5 kurulumunun Include klasöründe veya standart kütüphanenin header dosyasında aramasını sağlar, ikincisi ise derleyicinin dosyayı program dosyasıyla aynı dizinde aramasını sağlar.

Fonksiyonları içe aktarma (#import):

#import yönergesi, derlenmiş MQL5 modüllerinden (*.ex5 dosyaları) ve işletim sistemi modüllerinden (*.dll dosyaları) fonksiyonları yazılıma aktarmak için kullanılır. Fonksiyon tam olarak belirtilmeli ve biçimi aşağıdakiyle aynı olmalıdır:

#import "File_Name"
    func1 define;
    func2 define;
    ...
    funcN define;
#import

Koşullu derleme (#ifdef, #ifndef, #else, #endif):

Koşullu derleme, programın derlenmesine ek olarak ön işleme yönergelerinin yürütülmesini kontrol etmemizi sağlar. Aşağıdaki biçimlerden birinde olabilen belirli bir koşula dayalı olarak program kodunun bir kısmının derlenmesini veya atlanmasını kontrol etmemize olanak sağlar:

#ifdef identifier
   //If the identifier has been defined, the code here will be compiled.
#endif
#ifndef identifier
   // If the identifier is not defined, the code here will be compiled.
#endif

Daha önce de belirttiğimiz gibi, yeni bir satıra geçersek, önişlemci yönergeleri devam etmeyecektir, ancak burada #else ve #endif kullanıldığında bu tür bir yönergeyi herhangi bir sayıda satır izleyebilir. Koşul doğruysa, bu #else ve #endif arasındaki satırlar yoksayılır, ancak koşul karşılanmazsa, kontrol ve #else (veya ilki eksikse #endif) arasındaki satırlar yoksayılır.

MQL5'te önişlemci hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.


Girdi ve global değişkenler

Bu bölümde, önişlemci yönergelerinden sonra MQL5 program yapısının diğer bileşenleri olan girdi ve global değişkenleri tanımlayacağız. Harici bir değişken tanımlayan girdi değişkenleri ile başlayalım. input değiştiricisi veri türünden önce belirtilir. input değiştiricisine sahip bir değişken MQL5 programının içinde değiştirilemez ve değerler yalnızca program kullanıcısı tarafından program çalıştırılırken “Girdiler” sekmesinden değiştirilebilir. Bu harici değişkenleri input değiştiricisini kullanarak tanımladığımızda, OnInIt() çağrılmadan önce her zaman yeniden başlatılırlar.

Giriş değişkenlerinin biçimi aşağıda verilmiştir:

input int            MA_Period=20;
input int            MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;

Kullanıcı tarafından belirlenecek girdi penceresi:

Girdiler sekmesi

Gördüğümüz gibi, hareketli ortalamanın periyodunu, kayma miktarını ve türünü ayarlayabiliriz. Ayrıca, Girdiler sekmesinde girdi parametrelerinin nasıl görüneceğini, pencerede görmek istediklerimizi yorum olarak yerleştirerek tanımlayabiliriz:

input int            MA_Period=20;        //Moving Average Period 
input int            MA_Shift=0;          //Moving Average Shift
input ENUM_MA_METHOD MA_Method=MODE_SMA;  //Moving Average Type

Böylece, Girdiler sekmesinde parametreleri aşağıdaki gibi görebiliriz:

İstediğimiz ifadelerle Girdiler sekmesi

Gördüğümüz gibi, parametreler önceki şekilden farklı görünüyor. MQL5'te girdi değişkenleri hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.

Global değişkenler olay işleyicilerinin ve fonksiyonların dışında oluşturulmalıdır:

int Globalvar;   // Global variable before or outside the event handler and functions
int OnInit()
  {
   ...
  }

Dolayısıyla, global değişkenlerin kapsamının tüm program olduğunu, programdaki tüm fonksiyonlardan kullanılabildiklerini ve program yüklendiğinde, OnInit() veya OnStart() olay işleyicilerinden önce başlatıldıklarını söyleyebiliriz. Olay işleyicileri hakkında daha sonra konuşacağız. MQL5 program yapısında global değişkenlerin konumunu göstermek için bunlardan burada bahsediyorum.

MQL5'te global değişkenler hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.


Fonksiyonlar, sınıflar

Bu bölümde, MQL5 program yapısının diğer bileşenleri olan fonksiyonlar ve sınıflar hakkında konuşacağız. Fonksiyonlar, “MQL5'te fonksiyonları uygulamalarla anlama” başlıklı önceki makalemde ayrıntılı olarak açıklanmıştır. Ayrıca, MQL5'te nesne yönelimli programlama (OOP) bağlamında sınıflar hakkında daha fazla bilgi edinmek istiyorsanız, “MQL5’te Nesne Yönelimli Programlama (Object-Oriented Programming, OOP)” makalemi okumanızı tavsiye ederim. Umarım sizin için faydalı olurlar.

Burada, bu önemli bileşenlerin herhangi bir yazılımdaki konumundan bahsedeceğiz, çünkü bunları #include yönergesi kullanılarak dahil edilebilen include dosyaları da dahil olmak üzere yazılımın herhangi bir yerinde tanımlayabiliriz. Girdi ve global değişkenlerden sonra olmak üzere olay işleyicilerinden önce veya sonra yerleştirilebilirler.

Fonksiyonların biçimi aşağıdaki gibidir:

returnedDataType functionName(param1, param2)
{
        bodyOfFunction
}

Sınıfların biçimi aşağıdaki gibidir:

class Cobject
{
   int var1;       // variable1
   double var2;    // variable1
   void method1(); // Method or function1
};

MQL5'te fonksiyonlar ve sınıflar hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.


Olay işleyicileri

Bu bölümde, MQL5 programlarının çok önemli bileşenleri olan olay işleyicilerini ele alacağız. Olay işleyicisi, çalıştırılabilir bir fonksiyondur. Belirli bir olay meydana geldiğinde, örneğin yeni tik olayını temsil eden yeni bir fiyat oluştuğunda, OnTick() olay işleyicisi çalıştırılabilir hale gelir, çünkü yeni bir fiyat veya tik alındığında çalıştırılabilecek bir kod gövdesine sahiptir.

MQL5 programının türüne bağlı olarak, farklı olay işleyicileri vardır:

Olay işleyicisi Açıklama Biçim 
OnStart Komut dosyalarında, program başlatıldığında çağrılır
  • Geri dönüş değeriyle: 
int  OnStart(void);
  • Geri dönüş değeri olmadan:
void  OnStart(void);
OnInit Uzman Danışmanlar ve göstergelerde, program başlatıldığında çağrılır
  •  Geri dönüş değeriyle:
int  OnInit(void);
  • Geri dönüş değeri olmadan:
void  OnInit(void);

OnDeinit Uzman Danışmanlar ve göstergelerde, program sonlandırıldığında çağrılır
void  OnDeinit(
   const int  reason         // deinitialization reason code
   );
OnTick Uzman Danışmanlar ve göstergelerde, yeni fiyat alındığında çağrılır
void  OnTick(void);
OnCalculate Göstergelerde, Init olayından hemen sonra ve fiyat verilerinde herhangi bir değişiklik olduğunda çağrılır
  • Veri dizisine dayalı hesaplamalar
int  OnCalculate(
   const int        rates_total,       // price[] array size
   const int        prev_calculated,   // number of handled bars at the previous call
   const int        begin,             // index number in the price[] array meaningful data starts from
   const double&    price[]            // array of values for calculation
   );
  • Mevcut zaman diliminin zaman serisine dayalı hesaplamalar
int  OnCalculate(
   const int        rates_total,       // size of input time series
   const int        prev_calculated,   // number of handled bars at the previous call
   const datetime&  time{},            // Time array
   const double&    open[],            // Open array
   const double&    high[],            // High array
   const double&    low[],             // Low array
   const double&    close[],           // Close array
   const long&      tick_volume[],     // Tick Volume array
   const long&      volume[],          // Real Volume array
   const int&       spread[]           // Spread array
   );
OnTimer Uzman Danışmanlar ve göstergelerde, işlem terminali tarafından Timer periyodik olayı oluşturulduğunda çağrılır
void  OnTimer(void);
OnTrade Uzman Danışmanlarda, işlem sunucusunda bir alım-satım işlemi tamamlandığında çağrılır
void  OnTrade(void);
OnTradeTransaction Uzman Danışmanlarda, TradeTransaction olayı gerçekleştiğinde çağrılır (bu fonksiyon aracılığıyla işlem talebi sonuçları kontrol edilebilir)
void  OnTradeTransaction()
   const MqlTradeTransaction&    trans,     // trade transaction structure
   const MqlTradeRequest&        request,   // request structure
   const MqlTradeResult&         result     // response structure
   );
OnBookEvent Uzman Danışmanlarda, piyasa derinliği değiştiğinde çağrılır
void  OnBookEvent(
   const string&  symbol         // symbol
   );
OnChartEvent Göstergelerde, kullanıcı grafik üzerinde çalışırken çağrılır
void  OnChartEvent()
   const int       id,       // event ID 
   const long&     lparam,   // long type event parameter
   const double&   dparam,   // double type event parameter
   const string&   sparam    // string type event parameter
   );
OnTester Uzman Danışmanlarda, Uzman Danışmanın geçmiş veriler üzerinde test edilmesi sona erdiğinde çağrılır
double  OnTester(void);
OnTesterInit Uzman Danışmanlarda, ilk optimizasyon geçişinden önce strateji sınayıcıda optimizasyon başladığında çağrılır
  • Geri dönüş değeriyle:
int  OnTesterInit(void);
  • Geri dönüş değeri olmadan:
void  OnTesterInit(void);
OnTesterDeinit Uzman Danışmanlarda, strateji sınayıcıda Uzman Danışmanın optimizasyonu sona erdiğinde çağrılır
void  OnTesterDeinit(void);
OnTesterPass Uzman Danışmanlarda, yeni bir veri çerçevesi alındığında çağrılır
void  OnTesterPass(void);

MQL5'te olay işleme hakkında daha fazla bilgiyi dokümantasyondan edinebilirsiniz.


MQL5 program örnekleri

Bu bölümde, doğru MQL5 yapısını kullanarak basit bir uygulama oluşturmak için edindiğimiz bilgileri uygulayacağız. Programın türüne ve gerekli göreve bağlı olarak MQL5 yapısının bileşenlerini kullanabileceğimizden bahsetmiştik. Bu bileşenlerden #include önişlemcisi gibi bazılarını kullanma zorunluluğu yoktur, çünkü herhangi bir harici dosyanın dahil edilmesi gerekli olmayabilir. Aynı durum #property için de geçerlidir. Programda özel sınıflar veya fonksiyonlar oluşturmak da gerekli olmayabilir. Her durumda, programınız için gerekli olanı kullanacaksınız. Aşağıda, farklı program türlerine göre gerekli tüm yapısal bileşenlerin uygulanmasına ilişkin basit bir örnek yer almaktadır.

Komut dosyası türü

Aşağıda, girdi değişkenlerini kullanarak kullanıcı tarafından girilen iki sayıyı toplayabilen ve sonucu Print fonksiyonunu kullanarak Uzmanlar sekmesinde yazdırabilen basit bir MQL5 komut dosyası programı örneği bulunmaktadır. Kullanıcının sayıları girmesi için komut dosyasının girdi değişkenlerinin görüntülenmesini sağlayan #property özelliğini ekleyelim.

//+------------------------------------------------------------------+
//|                                       Script program example.mq5 |
//|                                   Copyright 2023, MetaQuotes Ltd.|
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//property preprocessor
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//inputs
input int userEntryNum1;
input int userEntryNum2;
//global variable
int result;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
//event handler
void OnStart()
  {
   result=userEntryNum1+userEntryNum2;
   Print("Result: ", result);
  }
//+------------------------------------------------------------------+

Başka bir Uzman Danışman veya gösterge oluşturmak istiyorsak, programın türüne bağlı olarak farklı olay işleyicileri kullanmamız gerekir. Örneğin, bir Uzman Danışman, OnTick() işleyicisini kullanarak yeni bir tik alındığında bir eylem gerçekleştirebilir.

Artık MQL5 program yapısını tanımladığımıza göre, bazı bileşenlerin programın türüne ve hedeflerine bağlı olarak farklılık gösterdiğini biliyoruz. Bu anlayış, her bir bileşenin yazılımdaki konumunu belirlememize yardımcı olur.

Bu bilgiyi uygulamak için, daha önce de belirtildiği gibi basit bir komut dosyası programı ile başlayabiliriz.


Sonuç

MQL5 program yapısını analiz ettik ve hangi bileşenlerin hangi program türünde kullanıldığını gördük. MQL5 programı bileşenleri:

  • Önişlemci
    • Makro ikamesi (#define)
    • Program özellikleri (#property)
    • Dosyaları dahil etme (#include)
    • Fonksiyonları içe aktarma (#import)
    • Koşullu derleme (#ifdef, #ifndef, #else, #endif)
  • Girdi ve global değişkenler
  • Fonksiyonlar ve sınıflar
  • Olay işleyicileri
    • OnStart
    • OnInit
    • OnDeinit
    • OnTick
    • OnCalculate
    • OnTimer
    • OnTrade
    • OnTradeTransaction
    • OnBookEvent
    • OnChartEvent
    • OnTester
    • OnTesterInit
    • OnTesterDeinit
    • OnTesterPass

Umarım bu makaleyi faydalı bulmuşsunuzdur. Popüler teknik göstergeleri kullanarak bir alım-satım sistemi oluşturma hakkında daha fazla bilgi edinmek istiyorsanız, diğer makalelerimi okuyabilirsiniz.

Ayrıca, Uzman Danışmanlarda özel göstergeler oluşturma ve kullanma, nesne yönelimli programlama (OOP) ve fonksiyonlar gibi diğer önemli MQL5 programlama konuları hakkında da makalelerim var. Bu makalelerin öğrenme ve alım-satım yolculuğunuzda değerli olacağına inanıyorum.

MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/13021

Ekli dosyalar |
Son yorumlar | Tartışmaya git (3)
Valeriy Yastremskiy
Valeriy Yastremskiy | 20 Eki 2023 saat 14:05
Açıklamalar olmadan belgelerin bu tür yeniden basımlarını daha az görmek isterim. Yapı hakkında tek kelime yok)
Aleksandr Slavskii
Aleksandr Slavskii | 20 Eki 2023 saat 15:31
Valeriy Yastremskiy #:
Keşke bu tür belgelerin açıklama yapılmadan yeniden basılması daha az olsaydı.

+

Gerard William G J B M Dinh Sy
Gerard William G J B M Dinh Sy | 20 Ağu 2025 saat 09:29
Tüm iyi kodların başlangıç noktası olmasına rağmen herkesin önemsiz olarak gördüğü konularda söylenecek çok şey ve çok az kelime var...

İsimlendirme kuralları,
hata işleme,
günlük yönetimi,
ve en önemlisi, hızlı ve verimli bir şekilde hata ayıklamanızı sağlayacak bir dizi sürecin uygulanması.
Farklı hareketli ortalama türlerinin performansının test edilmesi Farklı hareketli ortalama türlerinin performansının test edilmesi
Hareketli ortalama göstergesinin birçok yatırımcı için önemini hepimiz biliyoruz. Alım-satımda faydalı olabilecek farklı hareketli ortalama türleri vardır. Bunlara göz atacağız ve hangisinin en iyi sonuçları gösterebileceğini görmek için basit bir karşılaştırma yapacağız.
MQL5'te fonksiyonları uygulamalarla anlama MQL5'te fonksiyonları uygulamalarla anlama
Fonksiyonlar her programlama dilinde kritik bileşenlerdir. Diğer birçok faydasının yanı sıra, geliştiricilerin DRY (Don't Repeat Yourself, kendini tekrar etme) ilkesini uygulamalarına yardımcı olurlar. Bu makalede, fonksiyonlar hakkında çok daha fazla bilgi edinecek ve alım-satım sisteminizi zenginleştiren ancak karmaşıklaştırmayan basit uygulamalar yardımıyla MQL5'te kendi fonksiyonlarınızı nasıl oluşturacağınızı göreceksiniz.
MQL5'te emir yerleştirme MQL5'te emir yerleştirme
Herhangi bir alım-satım sistemi oluştururken, verimli bir şekilde çözülmesi gereken bir görev vardır. Bu görev, emirlerin yerleştirilmesi veya bunların alım-satım sistemi tarafından otomatik olarak yönetilmesidir. Makale, verimli emir yerleştirme açısından bir alım-satım sisteminin oluşturulmasını ele almaktadır.
Python'da bir alım-satım robotu geliştirme (Bölüm 3): Model tabanlı bir alım-satım algoritmasının uygulanması Python'da bir alım-satım robotu geliştirme (Bölüm 3): Model tabanlı bir alım-satım algoritmasının uygulanması
Python ve MQL5'te bir alım-satım robotu geliştirmeye yönelik makale serisine devam ediyoruz. Bu makalede Python'da bir alım-satım algoritması oluşturacağız.