English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
William Gann yöntemleri (Bölüm I): Gann Açıları göstergesi oluşturma

William Gann yöntemleri (Bölüm I): Gann Açıları göstergesi oluşturma

MetaTrader 5Alım-satım |
151 18
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Giriş

William Delbert Gann, yenilikçi piyasa analizi yöntemleriyle modern yatırımcıların hala ilgisini çeken efsanevi bir yatırımcı ve teknik analisttir. Gann'ın elindeki en önemli araçlardan biri, fiyat hareketlerini tahmin etmek ve potansiyel destek ve direnç seviyelerini belirlemek için kullandığı ünlü açılarıydı.

Bu makalede, MQL5'te Gann Açıları göstergesi oluşturmakla başlayarak William Gann'ın alım-satım yöntemleri dünyasına dalacağız. Bu aracın arkasındaki teoriyi gözden geçireceğiz ve MetaTrader 5 platformu için özel bir gösterge olarak adım adım uygulayacağız.

İster yeni analiz araçları arayan deneyimli bir yatırımcı ister teknik göstergeler cephaneliğini genişletmek isteyen yeni başlayan biri olun, bu makale William Gann'ın en ilgi çekici yöntemlerinden birini daha iyi anlamanıza ve alım-satımınızda uygulamanıza yardımcı olacaktır.


Gann açıları oluşturmanın tarihçesi

William Delbert Gann (1878-1955) 20. yüzyılın başlarında piyasa hareketleri üzerine yıllarca süren araştırmalarına ve zaman ile fiyat arasındaki ilişkiye dair benzersiz anlayışına dayanarak açılar sistemini geliştirmiştir.

Gann, piyasaların öngörülebilir geometrik kalıplar içinde hareket ettiğine ve bu hareketlerin matematik, geometri ve astrolojinin bir kombinasyonu kullanılarak tahmin edilebileceğine inanıyordu. Bir grafik üzerinde zaman ve fiyat hareketi arasındaki mükemmel dengeyi yansıtan çapraz çizgiler olan açılar konseptini geliştirdi.

Gann'ın teorisinin temelinde 45 derecelik bir açının (1x1 açısı olarak bilinir) zaman ve fiyat arasındaki mükemmel dengeyi temsil ettiği fikri yatıyordu. Fiyat bu açıda yukarı veya aşağı hareket ettiğinde, bunun dengeli ve istikrarlı bir trende işaret ettiğine inanıyordu.

Gann ayrıca zaman ve fiyat arasındaki farklı ilişkileri temsil eden 2x1, 3x1, 4x1 ve bunların karşılıkları gibi başka açılar da geliştirmiştir. Bu açılar onun alım-satım sisteminin ve piyasa analizinin temelini oluşturdu.

Gann'ın çalışmalarının bazı yönleri tartışmalı olsa da, Gann açıları da dahil olmak üzere yöntemleri dünyanın dört bir yanındaki yatırımcıların ve analistlerin ilgisini çekmeye ve modern alım-satımda geçerliliğini korumaya devam ediyor.


Gann Açıları Teorisi ve teknik analizdeki önemi

Gann Açıları Teorisi, piyasa hareketlerinin bir grafik üzerindeki özel açı çizimleri kullanılarak tanımlanabilen öngörülebilir geometrik kalıpları takip ettiği konseptine dayanmaktadır. Teori, zaman ve fiyat arasındaki denge fikrine dayanır; 1x1 açısı (45 derece), birim zaman başına bir birimlik fiyat değişikliği olduğunu varsayarak mükemmel bir dengeyi temsil eder.

Gann, her biri zaman ve fiyat hareketi arasındaki belirli bir ilişkiyi yansıtan 2x1, 3x1, 4x1 ve bunların karşılıkları gibi farklı açılardan oluşan bir sistem geliştirmiştir. Bu açılar dinamik destek ve direnç seviyeleri olarak hizmet ederek yatırımcıların bir trendin gücünü ve yönünü belirlemelerine yardımcı olur. Daha dik açılar daha güçlü bir trende işaret ederken, daha düz açılar daha zayıf bir harekete işaret eder.


Gann açıları oluşturmanın temel ilkeleri


Gann açılarının oluşturulması, yatırımcıların bu aracı teknik analizde etkili bir şekilde kullanmalarına olanak tanıyan birkaç temel ilkeye dayanmaktadır. Başlangıç noktasının seçimi (bu genellikle grafikte önemli bir minimum veya maksimum seviyedir) birincil öneme sahiptir. İşte bu noktadan itibaren açıların çizimi başlar.

Taban açısı, grafik üzerinde 45 derecelik bir çizgi oluşturan 1x1 açısı olarak kabul edilir. Bu açı, fiyatın birim zamanda bir birim olarak değiştiği zaman ve fiyat arasındaki mükemmel dengeyi yansıtır. 2x1, 3x1, 4x1 ve bunların karşılıkları gibi diğer açılar bu temel açıya göre oluşturulur.

Çizim yaparken grafik ölçeğini göz önünde bulundurmak önemlidir. Yatırımcılar doğru açıları sağlamak için genellikle özel şablonlar veya araçlar kullanır. Açı çizgileri geleceğe doğru devam ederek potansiyel destek ve direnç seviyelerinin tahmin edilmesini sağlar.


Gann açılarının türleri ve yorumlanması

William Gann, teknik analizde her birinin kendine özgü anlamı ve yorumu olan bir açılar sistemi geliştirmiştir. 1x1 veya 45 derece, zaman ve fiyat arasındaki dengeyi yansıtan ana açı olarak kabul edilir. Bu açı, trendin gücünü değerlendirmek için temel bir kılavuz görevi görür.

2x1 açısı (63.75 derece), fiyatın zamandan iki kat daha hızlı yükseldiği daha güçlü bir fiyat hareketini belirtir. Bu genellikle güçlü bir yükseliş trendinin işareti olarak yorumlanır. Buna karşılık, 1x2 açısı (26.25 derece) zamana göre daha yavaş bir fiyat artışını belirtir ve bu da zayıflayan bir trende işaret edebilir.

3x1 (71.25 derece) ve 4x1 (75 derece) açıları daha da agresif fiyat hareketlerini temsil eder ve genellikle çok güçlü trendlerle veya potansiyel piyasa aşırı ısınmasıyla ilişkilendirilir. Karşılıkları - 1x3 (18.75 derece) ve 1x4 (15 derece) - güçlü direnç veya desteği yansıtabilir.

Gann açılarının yorumlanması yalnızca eğimleriyle sınırlı değildir. Fiyatın bu çizgilerle nasıl etkileşime girdiğini göz önünde bulundurmak da önemlidir. Açı çizgisini çaprazlayan bir fiyat, trendde potansiyel bir değişikliğe işaret edebilir. Fiyat açı çizgisi boyunca hareket ediyorsa, bu genellikle mevcut trendin gücünün teyidi olarak yorumlanır.


Alım-satımda Gann açılarının pratik uygulaması

Yatırımcılar bu araçları trendleri belirlemekten pozisyonlar için giriş ve çıkış noktalarını seçmeye kadar çeşitli amaçlar için kullanır.

Bir trend belirlemek için, genellikle önemli bir minimum veya maksimum seviyeden 1x1'lik bir açı çizerek başlanır. Fiyat bu çizginin üzerinde hareket ederse yükseliş trendi, altında hareket ederse düşüş trendi olarak yorumlanır. Trendin gücünü teyit etmek için 2x1 veya 3x1 gibi daha dik açılar kullanılır.

Giriş noktalarını seçerken, birçok yatırımcı fiyatın Gann açı çizgisinden sıçradığı veya bu çizgiyi kırdığı anları arar. Örneğin, 1x1 çizgisinden trend yönünde bir sıçrama, bir pozisyona girmek için potansiyel bir fırsat olarak görülebilir.

Risk yönetimi için, Gann açıları genellikle Zararı Durdur seviyelerini ayarlamak için kullanılır. Bir yatırımcı, bir alış pozisyonu için en yakın açı çizgisinin hemen altına veya bir satış pozisyonu için hemen üstüne bir Zararı Durdur yerleştirebilir.

Uzun vadeli alım-satımda, Gann açıları piyasanın genel yönünü belirlemeye yardımcı olur. Uzun vadeli trendleri değerlendirmek ve stratejik kararlar almak için 1x2 veya 1x4 gibi daha dar açıları kullanabiliriz.


Gann açılarını kullanan alım-satım stratejilerine örnekler

Gann açıları, yatırımcılara çeşitli alım-satım stratejileri oluşturmak için geniş bir seçenek yelpazesi sunar. İşte gerçek alım-satımda nasıl etkili bir şekilde kullanılabileceklerine dair bazı örnekler.

Açıdan Sıçrama stratejisi, Gann açı çizgilerinin genellikle destek veya direnç seviyeleri olarak işlev gördüğü varsayımına dayanmaktadır. Yatırımcı, fiyatın Gann açı çizgisine (özellikle 1x1 veya 2x1) yaklaştığı ve ondan sıçradığı durumları arar. Bir pozisyona giriş, sıçramanın teyit edilmesinden sonra, örneğin bir terse dönüş mum formasyonunun oluşmasından sonra gerçekleştirilir.

Bir diğer popüler strateji ise Açı Kırılmasıdır. Burada yatırımcı, fiyatın önemli bir Gann açı çizgisini kırmasını bekler, özellikle de buna işlem hacminde bir artış eşlik ediyorsa. Yukarı doğru bir kırılma potansiyel bir alış pozisyonuna işaret edebilirken, aşağı doğru bir kırılma bir satış pozisyonuna işaret edebilir.

Gann Yelpazesi stratejisi, yelpaze şeklinde bir yapı oluşturmak için tek bir noktadan yayılan çoklu açılar kullanır. Yatırımcı, fiyatın çeşitli yelpaze çizgileriyle nasıl etkileşime girdiğini analiz eder ve bunu destek, direnç seviyeleri ve potansiyel terse dönüş noktalarını belirlemek için kullanır.

Açıları ve Zaman Döngülerini Birleştirme, yatırımcının Gann açılarını yine Gann tarafından geliştirilen zaman döngüleri konseptiyle birleştirdiği daha karmaşık bir stratejidir. Burada önemli zaman çizgilerinin Gann açılarıyla kesişme noktaları, piyasaya giriş veya çıkış için kritik anları belirlemek üzere analiz edilir.

Çoklu zaman dilimi stratejisi, Gann açılarının farklı zaman dilimlerinde analiz edilmesini içerir. Örneğin, bir yatırımcı genel trendi belirlemek için günlük bir grafikte 1x1 açı kullanabilir ve ardından daha dik açılar kullanarak giriş noktalarını aramak için saatlik bir grafiğe geçebilir.


MQL5'te Gann Açıları göstergesi oluşturma: Temel adımlar


MQL5'te bir Gann Açıları göstergesi oluşturmak birkaç temel adım içerir. Bu süreç, hem Gann açıları çizme ilkelerinin hem de MetaTrader 5 ortamında programlamanın özelliklerinin anlaşılmasını gerektirir.

İlk adım gösterge yapısını tanımlamaktır. Burada gösterge adı, açıları ayarlamak için girdi parametreleri ve gerekli kütüphaneler gibi temel parametreleri ayarlıyoruz.

Gann açılarını çizmenin ana mantığı OnCalculate() fonksiyonunda bulunur. Burada açıları çizmek için başlangıç noktasını tanımlar, her açı için koordinatları hesaplar ve grafik üzerinde çizgileri çizeriz.

Önemli bir husus, grafiğin ölçeğini ve seçilen zaman aralığını dikkate alarak açıların koordinatlarının doğru hesaplanmasıdır. Bu, hassas bir matematiksel yaklaşım ve Gann açılarının geometrisinin anlaşılmasını gerektirir.

Son aşama göstergenin test edilmesi ve hata ayıklanmasıdır. Farklı zaman dilimlerinde ve enstrümanlarda açıların çiziminin düzgün olup olmadığını kontrol etmek gerekir.


Gösterge kodu yapısı

İşte MetaTrader 5'te kullanılabilen Gann Açıları göstergesinin temel kodu:

#property copyright "Copyright 2024, Evgeniy Shtenco"
#property link      "https://www.mql5.com/en/users/koshtenko"
#property version   "1.00"
#property indicator_chart_window

// Input parameters
input datetime StartDate = D'2023.01.01 00:00'; // Start date for analysis
input datetime EndDate = D'2023.12.31 23:59';   // End date for analysis
input color GannFanColor = clrBlue;             // Color for Gann Fan lines

// Global variables
double extremumPrice;
datetime extremumTime;
double oppositeExtremumPrice;
datetime oppositeExtremumTime;
bool isTrendUp;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0, "GannFan_");
    ObjectsDeleteAll(0, "OppositeGannFan_");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    if(rates_total < 1) return(0);

    // Clear previous objects
    if (prev_calculated == 0)
    {
        ObjectsDeleteAll(0, "GannFan_");
        ObjectsDeleteAll(0, "OppositeGannFan_");
    }

    // Find extremums within the specified date range
    FindExtremums(rates_total, high, low, time);

    // Draw Gann Fans
    DrawGannFan(extremumPrice, extremumTime);
    DrawOppositeGannFan(oppositeExtremumPrice, oppositeExtremumTime);

    return(rates_total);
}

//+------------------------------------------------------------------+
//| Find both extremums within the specified date range              |
//+------------------------------------------------------------------+
void FindExtremums(const int rates_total, const double &high[], const double &low[], const datetime &time[])
{
    int startIndex = -1;
    int endIndex = -1;

    for (int i = 0; i < rates_total; i++)
    {
        if (time[i] >= StartDate && startIndex == -1)
        {
            startIndex = i;
        }
        if (time[i] <= EndDate)
        {
            endIndex = i;
        }
    }

    if (startIndex == -1 || endIndex == -1 || startIndex > endIndex)
    {
        Print("Error: Invalid date range or no data available in the specified range");
        return;
    }

    int highestIndex = ArrayMaximum(high, startIndex, endIndex - startIndex + 1);
    int lowestIndex = ArrayMinimum(low, startIndex, endIndex - startIndex + 1);

    // Determine the most recent extremum
    if (time[highestIndex] > time[lowestIndex])
    {
        extremumPrice = high[highestIndex];
        extremumTime = time[highestIndex];
        oppositeExtremumPrice = low[lowestIndex];
        oppositeExtremumTime = time[lowestIndex];
        isTrendUp = false;
    }
    else
    {
        extremumPrice = low[lowestIndex];
        extremumTime = time[lowestIndex];
        oppositeExtremumPrice = high[highestIndex];
        oppositeExtremumTime = time[highestIndex];
        isTrendUp = true;
    }
}

//+------------------------------------------------------------------+
//| Draw Gann Fan                                                    |
//+------------------------------------------------------------------+
void DrawGannFan(double extremum, datetime extremumTime)
{
    double angles[] = {82.5, 75, 71.25, 63.75, 45, 26.25, 18.75, 15, 7.5};
    string angleNames[] = {"1x8", "1x4", "1x3", "1x2", "1x1", "2x1", "3x1", "4x1", "8x1"};

    datetime endTime = extremumTime + PeriodSeconds() * 300;

    for(int i = 0; i < ArraySize(angles); i++)
    {
        string label = "GannFan_" + angleNames[i];
        double angle = angles[i];
        
        double priceShift = MathTan(angle * M_PI / 180.0) * 300 * _Point;
        double endPrice;
        
        if(isTrendUp)
        {
            endPrice = extremum + priceShift;
        }
        else
        {
            endPrice = extremum - priceShift;
            angle = -angle; // Invert the angle for a downtrend
        }

        if(ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, endTime, endPrice))
        {
            ObjectSetInteger(0, label, OBJPROP_COLOR, GannFanColor);
            ObjectSetInteger(0, label, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSetInteger(0, label, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, label, OBJPROP_RAY_RIGHT, true);
            ObjectSetString(0, label, OBJPROP_TOOLTIP, "Gann Fan " + angleNames[i]);
        }
        else
        {
            Print("Failed to create Gann Fan line: ", GetLastError());
        }
    }
}

//+------------------------------------------------------------------+
//| Draw Opposite Gann Fan                                           |
//+------------------------------------------------------------------+
void DrawOppositeGannFan(double extremum, datetime extremumTime)
{
    double angles[] = {82.5, 75, 71.25, 63.75, 45, 26.25, 18.75, 15, 7.5};
    string angleNames[] = {"1x8", "1x4", "1x3", "1x2", "1x1", "2x1", "3x1", "4x1", "8x1"};

    datetime endTime = extremumTime + PeriodSeconds() * 300;

    for(int i = 0; i < ArraySize(angles); i++)
    {
        string label = "OppositeGannFan_" + angleNames[i];
        double angle = angles[i];
        
        double priceShift = MathTan(angle * M_PI / 180.0) * 300 * _Point;
        double endPrice;
        
        if(!isTrendUp) // Opposite trend
        {
            endPrice = extremum + priceShift;
        }
        else
        {
            endPrice = extremum - priceShift;
            angle = -angle; // Invert the angle for a downtrend
        }

        if(ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, endTime, endPrice))
        {
            ObjectSetInteger(0, label, OBJPROP_COLOR, GannFanColor);
            ObjectSetInteger(0, label, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSetInteger(0, label, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, label, OBJPROP_RAY_RIGHT, true);
            ObjectSetString(0, label, OBJPROP_TOOLTIP, "Opposite Gann Fan " + angleNames[i]);
        }
        else
        {
            Print("Failed to create Opposite Gann Fan line: ", GetLastError());
        }
    }
}

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
    // Redraw objects when chart changes
    if(id == CHARTEVENT_CHART_CHANGE)
    {
        // Find extremums and redraw Gann Fans
        int rates_total = Bars(_Symbol, PERIOD_CURRENT);
        double high[], low[];
        datetime time[];
        ArraySetAsSeries(high, true);
        ArraySetAsSeries(low, true);
        ArraySetAsSeries(time, true);
        CopyHigh(_Symbol, PERIOD_CURRENT, 0, rates_total, high);
        CopyLow(_Symbol, PERIOD_CURRENT, 0, rates_total, low);
        CopyTime(_Symbol, PERIOD_CURRENT, 0, rates_total, time);
        
        FindExtremums(rates_total, high, low, time);
        DrawGannFan(extremumPrice, extremumTime);
        DrawOppositeGannFan(oppositeExtremumPrice, oppositeExtremumTime);
    }
}


Ana fonksiyonlar ve amaçları

Kod, grafikte Gann yelpazesi açılarını çizen bir MetaTrader 5 göstergesidir. Ana fonksiyonlar ve amaçları aşağıda açıklanmıştır:

  1. OnInit() - gösterge başlatma fonksiyonudur. Bu durumda, sadece başarılı başlatma sonucunu geri döndürür.
  2. OnDeinit() - grafikten kaldırıldığında gösterge tarafından oluşturulan tüm nesneleri kaldıran sonlandırma fonksiyonudur.
  3. OnCalculate() - göstergenin ana fonksiyonudur. Her tikte çağrılır. Önceki nesneleri temizler, belirtilen tarih aralığındaki uç noktaları bulur ve Gann açılarını çizer.
  4. FindExtremums() - belirtilen tarih aralığındaki fiyat uç noktalarını (maksimum ve minimum seviye) bulmaya yarayan bir fonksiyondur. Hangi uç noktanın daha yeni olduğunu tespit eder ve trendin yönünü belirler.
  5. DrawGannFan() - bulunan uç noktadan ana Gann yelpazesini çizmek için kullanılan bir fonksiyondur. Dokuz farklı açı için çizgiler oluşturur.
  6. DrawOppositeGannFan() - başka bir uç noktadan zıt Gann yelpazesini çizmek için kullanılan bir fonksiyondur. Bu fonksiyon da dokuz açı için çizgiler oluşturur, ancak zıt yönde.
  7. OnChartEvent() - grafik olaylarına yanıt veren fonksiyondur. Bu durumda, grafik değiştiğinde Gann yelpazelerini yeniden çizer.

Gösterge, analiz tarih aralığını (StartDate ve EndDate) ve çizgilerin rengini (GannFanColor) ayarlamak için girdileri kullanır. Bu aralıktaki fiyat uç noktalarını bulur, trend yönünü belirler ve biri son uç noktadan, diğeri zıt uç noktadan olmak üzere iki Gann yelpazesi çizer. Her bir yelpaze farklı Gann açılarına (82.5°, 75°, 71.25°, 63.75°, 45°, 26.25°, 18.75°, 15° ve 7.5°) karşılık gelen dokuz çizgiden oluşur.

Kod ayrıca hata işleme ve grafik değiştiğinde dinamik güncelleme içerir, bu da onu oldukça sağlam ve farklı piyasa koşullarına uyarlanabilir hale getirir. ArrayMaximum() ve ArrayMinimum() gibi MQL5 fonksiyonlarının kullanılması verimli veri işleme sağlar.

Gann açısı hesaplama algoritması

Bu göstergede Gann açılarını hesaplama algoritması, uç noktadan çizgilerin geometrik çizimine dayanmaktadır. Bu algoritmanın temel unsurları:

  • Uç noktaların belirlenmesi: Gösterge, belirtilen zaman aralığındaki maksimum ve minimum fiyat seviyesini bulur. Bu uç noktalardan daha sonra olanı ana Gann yelpazesi için, daha önce olanı ise zıt yelpaze için başlangıç noktası olarak kullanılır.
  • Açı seti: Sabit bir açı seti kullanılır: 82.5°, 75°, 71.25°, 63.75°, 45°, 26.25°, 18.75°, 15° ve 7.5°. Bu açılar geleneksel Gann oranlarına karşılık gelir: 1x8, 1x4, 1x3, 1x2, 1x1, 2x1, 3x1, 4x1 ve 8x1.
  • Bitiş noktasının hesaplanması: Her açı için çizginin bitiş noktası hesaplanır. Hesaplama şu denkleme dayanmaktadır:
endPrice = extremum + MathTan(angle * M_PI / 180.0) * 300 * Point
  • Burada 300, çizgiyi çizmek için kullanılan geleneksel çubuk sayısıdır.
  • Düşüş trendi için ters çevirme: Düşüş trendinde, açı ters çevrilir (işaret değiştirilir), böylece çizgiler uç noktadan aşağıyı gösterir.
  • Çizgi çizimi: Her açı için, uç noktadan hesaplanan bitiş noktasına kadar bir çizgi nesnesi (OBJ_TREND) oluşturulur. Çizgiler gelecekteki verileri kapsayacak şekilde sağa doğru uzatılır.
  • Çift yelpaze: Algoritma iki kez uygulanır - bir kez son uç noktadan ana yelpaze için, ikinci kez erken uç noktadan zıt yelpaze için. Bu, her iki taraftaki potansiyel destek ve direnç seviyelerini görselleştirmemizi sağlar.
  • Dinamik güncelleme: Grafik değiştiğinde (örneğin, yeni veriler geldiğinde), algoritma uç noktaları yeniden hesaplar ve yelpazeleri yeniden oluşturarak analizin güncel olmasını sağlar.

Algoritma, klasik Gann açılarını bir grafik üzerinde görselleştirmemize olanak tanıyarak yatırımcıya potansiyel destek, direnç seviyeleri ve trend yönünü analiz etmek için bir araç sunar. 


Karlı bir şekilde alım-satım yapmak mümkün mü?

Gann açılarını kullanarak karlı bir şekilde alım-satım yapmak mümkün mü? Bu sorunun net bir cevabı yoktur, ancak doğru yaklaşımla karlı alım-satım yapmak oldukça mümkündür. Başarının anahtarı, bu aracın kapsamlı bir şekilde kullanılmasında yatmaktadır.

Ancak, en dikkatli ve titiz analizlerde bile risk yönetimini unutmamak gerekir. Bu, karlı alım-satımın temel taşıdır. Hiçbir yöntem %100 başarıyı garanti etmez, bu nedenle uygun anapara ve risk yönetimi uzun vadeli karlılıkta önemli bir rol oynar.


Gann açılarına dayalı bir Uzman Danışman oluşturma potansiyeli


Gann açılarına dayalı bir Uzman Danışman oluşturmak, algoritmik alım-satım sistemleri geliştiricileri için ilginç ve umut verici bir görevdir. Böyle bir Uzman Danışman, Gann Teorisinde ortaya konan ilkeleri kullanarak analizi ve alım-satımı otomatikleştirebilir.

Böyle bir Uzman Danışmanın temeli, halihazırda uygulanmış olan Gann Açıları göstergesi olabilir. Uzman Danışman algoritması, fiyatın Gann çizgileriyle etkileşiminin analizini, bu çizgilerin çaprazlamasına dayalı olarak giriş ve çıkış noktalarının belirlenmesini ve ayrıca işlem hacmi ve piyasa volatilitesi gibi ek faktörlerin dikkate alınmasını içerebilir.

Gann açılarına dayalı otomatik bir sistemin en önemli faydalarından biri, duygusallık faktörünü alım-satım karar verme sürecinden çıkarmak olacaktır. Uzman Danışman, genellikle bir insan yatırımcının kararlarını etkileyen korku veya açgözlülüğe teslim olmadan, verilen stratejiyi sıkı bir şekilde takip edebilir.

Ancak böyle bir Uzman Danışmanın geliştirilmesi bir dizi zorlukla karşı karşıyadır. Her şeyden önce, Gann açıları tarafından üretilen sinyallerin doğru yorumlanmasına ihtiyaç vardır. Gann Teorisi büyük ölçüde özneldir ve bir algoritma biçiminde tam olarak uygulanması zor olan piyasanın derinlemesine anlaşılmasını gerektirir.

Elbette, böyle bir Uzman Danışmanın başarısı büyük ölçüde geliştiricinin Gann Teorisini derinlemesine anlamasına ve bu teoriyi modern piyasa analizi ve risk yönetimi yöntemleriyle etkili bir şekilde birleştirme becerisine bağlı olacaktır.


En büyük zorluk: Açıları ölçeklendirme

Gann açılarına dayalı göstergelerin ve Uzman Danışmanların oluşturulması ve kullanılmasıyla ilgili en ciddi sorunlardan biri, bunları ölçeklendirmenin zorluğudur. Bu sorun, Gann yöntemine dayalı alım-satım sistemlerinin doğruluğunu ve verimliliğini önemli ölçüde etkiler.

Sorunun özü, geometrik yapılar olan Gann açılarının büyük ölçüde grafik ölçeğine bağlı olmasıdır. Zaman veya fiyat ekseninin ölçeği değiştirildiğinde, açıların görsel temsili önemli ölçüde bozulabilir. Bir ölçekte mükemmel bir 1x1 (45 derece) açı gibi görünen şey, ölçeği değiştirdiğinizde tamamen farklı bir açıya dönüşebilir.

Bu durum yazılım uygulaması için ciddi zorluklar yaratmaktadır. Gösterge veya Uzman Danışman, grafiğin mevcut ölçeğini sürekli olarak dikkate almalı ve açı hesaplamalarını buna göre ayarlamalıdır. Dahası, Gann açılarının dayandığı "zaman birimi fiyat birimine eşittir" kavramı, farklı finansal enstrümanlar ve zaman dilimleriyle çalışırken belirsizleşir.

Bu sorunu çözme girişimleri genellikle bazı tavizlere yol açar. Bazı geliştiriciler, aracın uygulanabilirliğini sınırlayan ölçeği düzeltmektedir. Diğerleri, açıları yeniden hesaplamak için karmaşık algoritmalar sunar ve bu da göstergenin veya Uzman Danışmanın hızını azaltabilir.

Ayrıca ölçeklendirme sorunu, analiz sonuçlarının farklı enstrümanlar veya zaman dilimleri arasında karşılaştırılmasını zorlaştırmaktadır. Bir döviz paritesinin günlük grafiğinde etkili bir şekilde çalışan bir açı, saatlik bir grafikte veya başka bir alım-satım enstrümanı için tamamen farklı sonuçlar üretebilir.

Bu sorun, otomatik alım-satımda Gann açılarının evrensel uygulanabilirliğini sorgulatmaktadır. Geliştiricilerin yalnızca Gann Teorisini değil, aynı zamanda işlem platformlarında grafiklerle çalışmanın özelliklerini de derinlemesine anlamalarını gerektirir.


Sonuç

Gann açıları, yatırımcıların ve alım-satım sistemi geliştiricilerinin dikkatini çekmeye devam eden benzersiz bir teknik analiz aracıdır. Yaptığımız araştırma, MQL5'te Gann Açıları göstergesi oluşturmanın oldukça uygulanabilir olduğunu ve sağlanan kodun daha fazla geliştirme için iyi bir başlangıç noktası olarak hizmet ettiğini gösterdi.

Bununla birlikte, otomatik alım-satımda Gann açılarını kullanmak bir dizi önemli zorlukla birlikte gelir. Bunlardan en önemlisi, bu yönteme dayalı evrensel ve güvenilir bir alım-satım Uzman Danışmanı oluşturmayı çok daha zor hale getiren ölçeklendirme sorunudur.

Bu zorluklara rağmen, Gann açılarının bir piyasa analiz aracı olarak potansiyeli hala yüksektir. Doğru kullanıldığında, diğer teknik analiz yöntemleri ve uygun risk yönetimi ile birlikte, bir yatırımcının araç setine etkili bir katkı sağlayabilir.

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

Ekli dosyalar |
Son yorumlar | Tartışmaya git (18)
Bogard_11
Bogard_11 | 15 Ağu 2024 saat 18:56
Eva-oren #:
Gunn parlak bir tüccar, astrolog ve numerolog, sihirli sayılara inanan bir matematikçiydi. Birinci ve İkinci Dünya Savaşlarının başlangıcını ve sonunu tahmin eden büyük bir kahindi. Çok sayıda öğrencisi vardı, ancak takipçilerinin iddia ettiği gibi, stratejisini kimseye vermedi. Büyük bir para cirosuna sahipti ve hayatının sonunda 100000 $ gibi mütevazı bir meblağa sahip oldu. Gunn'ın dahi kişiliği hakkındaki sonraki makaleleri dört gözle bekleyeceğim, çok ilginç.

Söylemeyi unuttum, o günlerde nadir bulunan özel bir jeti vardı. Artı o zamanlar 100,000 dolar, şimdi 10 kat değilse bile en az bir kat yeşil eder.

Not: Stratejiden bahsetti. Yazılarında. İsteyenler, TC'nin farklı bölümlerinden topladı. Gunn hepsini dağıttı, böylece kimse bedavaya alamadı.

Ivan Butko
Ivan Butko | 21 Ağu 2024 saat 17:11
Google'da ticaret yapmanın bir yolunu buldum

Maxim Kuznetsov
Maxim Kuznetsov | 22 Ağu 2024 saat 03:16
Ivan Butko #:
Google'da işlem yapmanın bir yolunu buldum

ikinci resimdeki - prensibi anlamıyorum :-(

Bogard_11
Bogard_11 | 22 Ağu 2024 saat 06:58

Size bir resim vereceğim. Gunn'ı anlayanlar, köşelerle çalışma prensibini, uzun bir giriş için nereye bakacaklarını ve nerede yuvarlanacaklarını hemen anlayacaklardır.


Avatar2025
Avatar2025 | 25 Haz 2025 saat 09:50
Sorumluluk Reddi: Göstergeler için MQL5 programlama sözdizimini bilmiyorum.

Ancak açı çizgisi algoritmasının doğru olmadığını düşünüyorum (başka bir yazılımda yazdığım ekli açı çizgisi göstergesine bakın), işte DeepSeek ile diyaloğum:

下面代码是通达信的代码,里面计算斜率的方法才是正确的,请阅读理解后,把上面priceShift 的计算方法改为下列代码正确的范式:

涨周期数:= IF(低点k位置 > 高点k位置, 低点k位置 - 高点k位置 + 1, 低点k位置), NODRAW;
跌周期数:= IF(高点k位置 > 低点k位置, 高点k位置 - 低点k位置 + 1, 高点k位置), NODRAW;

天线:= CONST(IF(高点k位置 = 1, H, REF(H, 高点k位置 - 1))), NODRAW;
地线:= CONST(IF(低点k位置 = 1, L, REF(L, 低点k位置 - 1))), NODRAW;

上涨天数:= IF(ISVALID(地线), BARSLAST(L = 地线), DRAWNULL), NODRAW;
下跌天数:= IF(ISVALID(天线), BARSLAST(H = 天线), DRAWNULL), NODRAW;

上涨高度:= IF(低点k位置 > 高点k位置, 天线 - 地线, HHV(H, 上涨天数) - 地线), NODRAW;
下跌高度:= IF(高点k位置 > 低点k位置, 天线 - 地线, 天线 - LLV(L, 下跌天数)), NODRAW;

上涨斜率:= IF(上涨天数 > 0, ROUND2(上涨高度 / 涨周期数, 4), 0), NODRAW;
下跌斜率:= IF(下跌天数 > 0, ROUND2(下跌高度 / 跌周期数, 4), 0), NODRAW;

Ancak, DeepSeek benim için işe yaramayan bir değişiklik kodu verdi:
//+------------------------------------------------------------------+
//| Venn Yelpaze Çizgisini Çizme & nbsp; |
//+------------------------------------------------------------------+
void DrawGannFan(double extremum, datetime extremumTime)
{
    // Gann açısını ve ilgili ismi tanımlayın.
    double angles[] = {82.5, 75, 71.25, 63.75, 45, 26.25, 18.75, 15, 7.5};
    string angleNames[] = {"1x8", "1x4", "1x3", "1x2", "1x1", "2x1", "3x1", "4x1", "8x1"};

    // En uç noktadan geçerli K-çizgisine kadar olan dönem sayısını alır
    int extremumBar = iBarShift(_Symbol, PERIOD_CURRENT, extremumTime);
    int currentBar = 0; // Geçerli K-çizgisi 0
    int barDiff = currentBar - extremumBar; // Çevrim sayısı farkı
    
    // Fiyat yükseklik farkını hesapla
    double priceDiff;
    if(isTrendUp)
    {
        // Yükseliş trendi: aşırı düşük fiyattan mevcut maksimum fiyata kadar olan yüksekliği hesaplar
        double currentHigh = iHigh(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = currentHigh - extremum;
    }
    else
    {
        // Düşüş trendi: aşırı yüksek fiyattan mevcut düşük fiyata kadar olan yüksekliği hesaplar
        double currentLow = iLow(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = extremum - currentLow;
    }
    
    // Taban eğimini hesaplayın (1x1 çizgisinin eğimi)
    double baseSlope = (barDiff > 0) ? priceDiff / barDiff : 0;
    
    // Her açı için sektör çizgileri çizin
    for(int i = 0; i < ArraySize(angles); i++)
    {
        string label = "GannFan_" + angleNames[i];  // Nesne etiketleri
        double angle = angles[i];                  // Geçerli açı
        
        // Açıya bağlı olarak eğim çarpanını hesaplayın
        double slopeMultiplier = MathTan(angle * M_PI / 180.0) / MathTan(45 * M_PI / 180.0);
        
        // Fiyat ofsetini hesapla (temel eğim ve açı çarpanına göre)
        double priceShift = baseSlope * barDiff * slopeMultiplier * _Point;
        double endPrice;
        
        // Trend yönüne göre kapanış fiyatının hesaplanması
        if(isTrendUp)
        {
            endPrice = extremum + priceShift;
        }
        else
        {
            endPrice = extremum - priceShift;
            angle = -angle; // Düşüş trendinde ters açı
        }

        // Bir eğilim çizgisi nesnesi oluşturun
        if(ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, TimeCurrent(), endPrice))
        {
            // Eğilim çizgisi özelliklerini ayarlayın
            ObjectSetInteger(0, label, OBJPROP_COLOR, GannFanColor);
            ObjectSetInteger(0, label, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSetInteger(0, label, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, label, OBJPROP_RAY_RIGHT, true);
            ObjectSetString(0, label, OBJPROP_TOOLTIP, "Gann Fan " + angleNames[i]);
        }
        else
        {
            Print("Failed to create Gann Fan line: ", GetLastError());
        }
    }
}

//+------------------------------------------------------------------+
//|| Ters Gann Fan Çizgisi Çizme & nbsp; &nbsp ; ||
//+------------------------------------------------------------------+
void DrawOppositeGannFan(double extremum, datetime extremumTime)
{
    // Gann açısını ve ilgili ismi tanımlayın.
    double angles[] = {82.5, 75, 71.25, 63.75, 45, 26.25, 18.75, 15, 7.5};
    string angleNames[] = {"1x8", "1x4", "1x3", "1x2", "1x1", "2x1", "3x1", "4x1", "8x1"};

    // En uç noktadan geçerli K-çizgisine kadar olan dönem sayısını alır
    int extremumBar = iBarShift(_Symbol, PERIOD_CURRENT, extremumTime);
    int currentBar = 0; // Geçerli K-çizgisi 0
    int barDiff = currentBar - extremumBar; // Çevrim sayısı farkı
    
    // Fiyat yükseklik farkını hesapla
    double priceDiff;
    if(!isTrendUp)
    {
        // Ters trend (yukarı): aşırı düşük fiyattan mevcut maksimum fiyata kadar olan yüksekliği hesaplar
        double currentHigh = iHigh(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = currentHigh - extremum;
    }
    else
    {
        // Ters trend (aşağı yönlü): aşırı yüksek fiyattan mevcut düşük fiyata kadar olan yüksekliği hesaplar
        double currentLow = iLow(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = extremum - currentLow;
    }
    
    // Taban eğimini hesaplayın (1x1 çizgisinin eğimi)
    double baseSlope = (barDiff > 0) ? priceDiff / barDiff : 0;
    
    // Her açı için sektör çizgileri çizin
    for(int i = 0; i < ArraySize(angles); i++)
    {
        string label = "OppositeGannFan_" + angleNames[i];  // Nesne etiketleri
        double angle = angles[i];                          // Geçerli açı
        
        // Açıya bağlı olarak eğim çarpanını hesaplayın
        double slopeMultiplier = MathTan(angle * M_PI / 180.0) / MathTan(45 * M_PI / 180.0);
        
        // Fiyat ofsetini hesapla (temel eğim ve açı çarpanına göre)
        double priceShift = baseSlope * barDiff * slopeMultiplier * _Point;
        double endPrice;
        
        // Ters trendin yönüne göre kapanış fiyatının hesaplanması
        if(!isTrendUp)
        {
            endPrice = extremum + priceShift;
        }
        else
        {
            endPrice = extremum - priceShift;
            angle = -angle; // Düşüş trendinde ters açı
        }

        // Bir eğilim çizgisi nesnesi oluşturun
        if(ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, TimeCurrent(), endPrice))
        {
            // Eğilim çizgisi özelliklerini ayarlayın
            ObjectSetInteger(0, label, OBJPROP_COLOR, GannFanColor);
            ObjectSetInteger(0, label, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSetInteger(0, label, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, label, OBJPROP_RAY_RIGHT, true);
            ObjectSetString(0, label, OBJPROP_TOOLTIP, "Opposite Gann Fan " + angleNames[i]);
        }
        else
        {
            Print("Failed to create Opposite Gann Fan line: ", GetLastError());
        }
    }
}





Sonunda, DeepSeek'ten kaynak kodunuzu değiştirmesini istemek zorunda kaldım (iyi çalışıyor ve çizgileri otomatik olarak çiziyor):
#property copyright "Copyright 2024, Evgeniy Shtenco"  // Telif hakkı bilgileri
#property link      "https://www.mql5.com/en/users/koshtenko"  // Yazar Bağlantıları
#property version   "1.00"  // Gösterge sürüm numarası
#property indicator_chart_window  // Göstergeler grafik penceresinde görüntülenir

// Girdi parametreleri
input int LookBackBars = 300;      // Geri analiz edilen K-hatlarının sayısı
input color GannFanColor = clrBlue; // Vaughan'ın hayran çizgisi renkleri

// Küresel değişkenler
double extremumPrice;        // Uç nokta fiyatı
datetime extremumTime;       // Uç nokta zamanı
double oppositeExtremumPrice; // Ters Uç Nokta Fiyatı
datetime oppositeExtremumTime; // Ters polarite nokta zamanı
bool isTrendUp;              // Trend yönü bayrağı (yükseliş trendi için true)

//+------------------------------------------------------------------+
//| Özel Gösterge Başlatma İşlevleri & nbsp; &nbsp ; ||
//+------------------------------------------------------------------+
int OnInit()
{
    return (INIT_SUCCEEDED);  // Başarılı başlatma
}

//+------------------------------------------------------------------+
//| Özel Gösterge Yeniden Başlatma İşlevleri & nbsp; &nbsp ; ||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
    {
        // Tüm Gann sektörü nesnelerini sil
        ObjectsDeleteAll(0, "GannFan_");
ObjectsDeleteAll(0, "OppositeGannFan_");
}

//+------------------------------------------------------------------+
//| Özel Gösterge Hesaplama Fonksiyonları & nbsp; &nbsp ; | | | | | | | |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,          // Geçerli döngü sayısı
const int prev_calculated,      // Önceden hesaplanan döngü sayısı
const datetime & time[],         // Zaman dizileri
                const double & open[],          // Açılış fiyatları dizisi
                const double & high[],           // En yüksek fiyatların dizisi
                const double & low[],            // En düşük fiyatlar dizisi
                const double & close[],         // Kapanış Fiyatı Dizisi
                const long & tick_volume[],      // Hacim dizisi
                const long & volume[],           // Gerçek Hacim Dizisi
                const int & spread[])            // Puan farkları dizisi
{
    if (rates_total < LookBackBars) return (0);  // Yeterli veri yoksa geri dön

    // Önceden çizilmiş nesneleri temizle
    if (prev_calculated == 0) {
        ObjectsDeleteAll(0, "GannFan_");
        ObjectsDeleteAll(0, "OppositeGannFan_");
    }

    // Son 300 K çizgisindeki uç noktaları bulma
    FindExtremums(rates_total, high, low, time);

    // Venn Yelpaze Çizgisinin Çizilmesi
    DrawGannFan(extremumPrice, extremumTime);
    DrawOppositeGannFan(oppositeExtremumPrice, oppositeExtremumTime);

    return (rates_total);  // İşlenen toplam sütun sayısını döndürür
}

//+------------------------------------------------------------------+
//| Belirli sayıda K çizgisi içindeki uç noktaları bulun. |
//+------------------------------------------------------------------+
void FindExtremums(const int rates_total, const double & high[], const double & low[], const datetime & time[])
{
    int startIndex = rates_total - LookBackBars;  // İndekslemeye başla (300 K satır önce)
    int endIndex = rates_total - 1;               // Bitiş dizini (en son K satırı)

    // Yüksekleri ve alçakları bulmak
    int highestIndex = ArrayMaximum(high, startIndex, LookBackBars);
    int lowestIndex = ArrayMinimum(low, startIndex, LookBackBars);

    // Trendin yönünü belirleyin (en yüksek ve en düşük seviyelerin zamanlamasını karşılaştırın)
    if (time[highestIndex] > time[lowestIndex]) {
        // En yüksek nokta en düşük noktadan sonra ise düşüş trendi
        extremumPrice = high[highestIndex];
        extremumTime = time[highestIndex];
        oppositeExtremumPrice = low[lowestIndex];
        oppositeExtremumTime = time[lowestIndex];
        isTrendUp = false;
    }
    else {
        // aksi takdirde yükseliş trendi
        extremumPrice = low[lowestIndex];
        extremumTime = time[lowestIndex];
        oppositeExtremumPrice = high[highestIndex];
        oppositeExtremumTime = time[highestIndex];
        isTrendUp = true;
    }
}

//+------------------------------------------------------------------+
//| Venn Yelpaze Çizgisini Çizme & nbsp; |
//+------------------------------------------------------------------+
void DrawGannFan(double extremum, datetime extremumTime)
{
    // Gann açısını ve ilgili ismi tanımlayın.
    double angles[] = { 82.5, 75, 71.25, 63.75, 45, 26.25, 18.75, 15, 7.5};
    string angleNames[] = { "1x8", "1x4", "1x3", "1x2", "1x1", "2x1", "3x1", "4x1", "8x1"};

    // Sektör hattının bitiş zamanını hesaplayın (mevcut zaman + 300 döngü)
    datetime endTime = TimeCurrent();  // Bitiş zamanı olarak geçerli zamanı kullan

    // Her açı için sektör çizgileri çizin
    for (int i = 0; i < ArraySize(angles); i++)
    {
        string label = "GannFan_" + angleNames[i];  // Nesne etiketleri
        double angle = angles[i];                  // Geçerli açı

        // Fiyat ofsetini hesapla (zaman farkına göre)
        double secondsDiff = endTime - extremumTime;
        double priceShift = MathTan(angle * M_PI / 180.0) * secondsDiff / PeriodSeconds();
        double endPrice;

        // Trend yönüne göre kapanış fiyatının hesaplanması
        if (isTrendUp) {
            endPrice = extremum + priceShift;
        }
        else {
            endPrice = extremum - priceShift;
            angle = -angle; // Düşüş trendinde ters açı
        }

        // Bir eğilim çizgisi nesnesi oluşturun
        if (ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, endTime, endPrice)) {
            // Eğilim çizgisi özelliklerini ayarlayın
            ObjectSetInteger(0, label, OBJPROP_COLOR, GannFanColor);
            ObjectSetInteger(0, label, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSetInteger(0, label, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, label, OBJPROP_RAY_RIGHT, true);
            ObjectSetString(0, label, OBJPROP_TOOLTIP, "Gann Fan " + angleNames[i]);
        }
        else {
            Print("Failed to create Gann Fan line: ", GetLastError());
        }
    }
}

//+------------------------------------------------------------------+
//|| Ters Gann Fan Çizgisi Çizme & nbsp; &nbsp ; ||
//+------------------------------------------------------------------+
void DrawOppositeGannFan(double extremum, datetime extremumTime)
{
    // Gann açısını ve ilgili ismi tanımlayın.
    double angles[] = { 82.5, 75, 71.25, 63.75, 45, 26.25, 18.75, 15, 7.5};
    string angleNames[] = { "1x8", "1x4", "1x3", "1x2", "1x1", "2x1", "3x1", "4x1", "8x1"};

    // Sektör hattının bitiş zamanını hesapla (geçerli zaman)
    datetime endTime = TimeCurrent();

    // Her açı için sektör çizgileri çizin
    for (int i = 0; i < ArraySize(angles); i++)
    {
        string label = "OppositeGannFan_" + angleNames[i];  // Nesne etiketleri
        double angle = angles[i];                          // Geçerli açı

        // Fiyat ofsetini hesapla (zaman farkına göre)
        double secondsDiff = endTime - extremumTime;
        double priceShift = MathTan(angle * M_PI / 180.0) * secondsDiff / PeriodSeconds();
        double endPrice;

        // Karşı trendin yönüne göre bitiş fiyatının hesaplanması
        if (!isTrendUp) // Ters eğilim
        {
            endPrice = extremum + priceShift;
        }
        else {
            endPrice = extremum - priceShift;
            angle = -angle; // Düşüş trendinde ters açı
        }

        // Bir eğilim çizgisi nesnesi oluşturun
        if (ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, endTime, endPrice)) {
            // Eğilim çizgisi özelliklerini ayarlayın
            ObjectSetInteger(0, label, OBJPROP_COLOR, GannFanColor);
            ObjectSetInteger(0, label, OBJPROP_STYLE, STYLE_SOLID);
            ObjectSetInteger(0, label, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, label, OBJPROP_RAY_RIGHT, true);
            ObjectSetString(0, label, OBJPROP_TOOLTIP, "Opposite Gann Fan " + angleNames[i]);
        }
        else {
            Print("Failed to create Opposite Gann Fan line: ", GetLastError());
        }
    }
}

//+------------------------------------------------------------------+
//| Grafik Olay İşleyici İşlevleri &nbsp nbsp; & & nbsp; |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,                  // Olay Kimliği
const long & lparam,            // Uzun tamsayı parametreleri
                  const double & dparam,          // Çift hassasiyetli parametreler
                  const string & sparam)         // Dize parametreleri
{
    // Grafik değiştiğinde nesneleri yeniden çizin
    if (id == CHARTEVENT_CHART_CHANGE || id == CHARTEVENT_CLICK) {
        // Uç noktaları yeniden bulun ve Venn fan çizgisini çizin.
        int rates_total = Bars(_Symbol, PERIOD_CURRENT);
        double high[], low[];
        datetime time[];
        ArraySetAsSeries(high, true);
        ArraySetAsSeries(low, true);
        ArraySetAsSeries(time, true);
        CopyHigh(_Symbol, PERIOD_CURRENT, 0, rates_total, high);
        CopyLow(_Symbol, PERIOD_CURRENT, 0, rates_total, low);
        CopyTime(_Symbol, PERIOD_CURRENT, 0, rates_total, time);

        FindExtremums(rates_total, high, low, time);
        DrawGannFan(extremumPrice, extremumTime);
        DrawOppositeGannFan(oppositeExtremumPrice, oppositeExtremumTime);
    }
}
William Gann yöntemleri (Bölüm II): Gann Karesi göstergesi oluşturma William Gann yöntemleri (Bölüm II): Gann Karesi göstergesi oluşturma
Zaman ve fiyatın karesi alınarak oluşturulan Gann'ın 9’un Karesine dayalı bir gösterge oluşturacağız. Kodu hazırlayacağız ve göstergeyi platformda farklı zaman aralıklarında test edeceğiz.
Ekonomik tahminler: Python’ın potansiyelini keşfetme Ekonomik tahminler: Python’ın potansiyelini keşfetme
Tahminler için Dünya Bankası ekonomik verileri nasıl kullanılır? Yapay zeka modelleri ile ekonomiyi birleştirirseniz ne olur?
William Gann yöntemleri (Bölüm III): Astroloji işe yarıyor mu? William Gann yöntemleri (Bölüm III): Astroloji işe yarıyor mu?
Gezegenlerin ve yıldızların konumları finansal piyasaları etkiliyor mu? Kendimizi istatistikler ve büyük verilerle donatalım ve yıldızlarla hisse senedi grafiklerinin kesiştiği dünyaya doğru heyecan verici bir yolculuğa çıkalım.
Risk yönetimine kantitatif yaklaşım: Python ve MetaTrader 5’i kullanarak çok dövizli portföy optimizasyonu için VaR modelini uygulama Risk yönetimine kantitatif yaklaşım: Python ve MetaTrader 5’i kullanarak çok dövizli portföy optimizasyonu için VaR modelini uygulama
Bu makale, çok dövizli portföy optimizasyonu için riske maruz değer (Value at Risk, VaR) modelinin potansiyelini araştırmaktadır. Python'ın gücünü ve MetaTrader 5'in işlevselliğini kullanarak, verimli anapara tahsisi ve pozisyon yönetimi için VaR analizinin nasıl uygulanacağını gösteriyoruz. Makale, teorik temellerden pratik uygulamaya kadar, en sağlam risk hesaplama sistemlerinden biri olan VaR'ın algoritmik alım-satımda uygulanmasının tüm yönlerini kapsamaktadır.