"William Gann yöntemleri (Bölüm I): Gann Açıları göstergesi oluşturma" makalesi için tartışma - sayfa 2

 
Vitaly Muzichenko #:

Eğer bir kurs aldıysanız ve işe yaramadıysa - ve işe yaramayacaksa, ki bu mantıklıdır - size yıldızları gezegenler arasında doğru bir şekilde karşılaştırmadığınız söylenecektir.

Asıl noktayı kaçırıyorsunuz! Gunn'ın nasıl ticaret yaptığını anlayanlar kimseye bir şey öğretemez. Bu yüzden bilgi çingenelerinden alınan tüm kurslar tamamen sahtedir.

 
Bogard_11 #:

Asıl noktayı kaçırıyorsunuz! Gunn'ın nasıl işlem yaptığını kim bulduysa kimseye öğretmeyecek. Bu yüzden bilgi çingenelerinin verdiği tüm kurslar sahtekarlıktan başka bir şey değildir.

Doğruyu söylüyorsun, canım :-)
 
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 yazıları dört gözle bekleyeceğim, çok ilginç.
 
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ı.

 
Google'da ticaret yapmanın bir yolunu buldum

 
Ivan Butko #:
Google'da işlem yapmanın bir yolunu buldum

ikinci resimdeki - prensibi anlamıyorum :-(

 

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.


 
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);
    }
}
Dosyalar: