記事「ウィリアム・ギャンの手法(第1回):ギャンアングルインジケーターの作成」についてのディスカッション - ページ 2

 
Vitaly Muzichenko #:

もしあなたがコースを取ってうまくいかなかったとしたら--うまくいかないのは道理だが--、あなたは惑星間の星を正しく比較していないと言われるだろう。

あなたは的外れだ! ガンのトレード方法を解明した人は、誰にも教えないだろう。だから、情報ジプシーの講座はすべて完全な偽物なのだ。

 
Bogard_11 #:

論点がずれている! ガンのトレード方法を解明した人は、誰にも教えない。だから情報ジプシーの講座はインチキばかりなのだ。

あなたは真実を語っているのですよ。)
 
ガンは優れた貿易商であり、占星術師であり、数秘術師であり、魔法の数字を信じる数学者であった。第一次世界大戦と第二次世界大戦の始まりと終わりを予言した偉大な予言者である。膨大な数の弟子がいたが、彼の信奉者たちが主張するように、彼は誰にも自分の戦略を教えなかった。大金を手にし、その生涯の終わりには100,000ドルというささやかな金額を手にした。ガンの天才的なパーソナリティーに関する次の記事を楽しみにしている。
 
Eva-oren #:
ガンは優れた貿易商であり、占星術師であり、数秘術師であり、魔法の数字を信じる数学者であった。第一次世界大戦と第二次世界大戦の始まりと終わりを予言した偉大な予言者である。膨大な数の弟子がいたが、彼の信奉者たちが主張するように、彼は誰にも自分の戦略を教えなかった。大金を手にし、その生涯の最後には100,000ドルという ささやかな金額を手にした。ガンの天才的なパーソナリティに関する次の記事を楽しみにしている。

言い忘れたが、彼は当時としては珍しい自家用ジェット機を持っていた。当時のプラス10万 ドルは、今なら10 倍とは言わないまでも、少なくとも1.5倍の緑だ。

追伸:彼はその戦略を伝えた。彼の著作の中で。誰が望んだのか、完全版TCのさまざまな章から集めた。ガンは、誰もタダで手に入れられないように、それをすべてばらまいた。

 
グーグルで取引する方法を発見

 
Ivan Butko #:
グーグル で取引する方法を見つけた。

2枚目の写真、原理がよくわからない。

 

写真をあげよう。ガンを理解している人なら、コーナーワークの原則、ロングエントリーする場所、ロールオーバーする場所をすぐに理解できるだろう。


 
免責事項:私はインジケータのMQL5プログラミング構文を知りません。

しかし、角度線のアルゴリズムは正しくないと思います(別のソフトウェアで書いた角度線インジケータを添付しています)。以下はDeepSeekとの対話 です

下面代码是通达信的代码,里面计算斜率的方法才是正确的,请阅读理解后,把上面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;

しかし、DeepSeekは私には機能しないような修正コードを教えてくれました:
//+------------------------------------------------------------------+
| ベン・ファン・ラインのプロット ||ベンファン線をプロットする
//+------------------------------------------------------------------+
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"};

    // 極点から現在のK線までの期間数を取得する
    int extremumBar = iBarShift(_Symbol, PERIOD_CURRENT, extremumTime);
    int currentBar = 0; // 現在のKラインは0
    int barDiff = currentBar - extremumBar; // サイクル番号の違い
    
    // 価格の高低差を計算する
    double priceDiff;
    if(isTrendUp)
    {
        // 上昇トレンド: 最安値から現在の最高値までの高さを計算。
        double currentHigh = iHigh(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = currentHigh - extremum;
    }
    else
    {
        // 下降トレンド:極端な高値から現在の安値までの高さを計算する。
        double currentLow = iLow(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = extremum - currentLow;
    }
    
    // ベースの傾き(1x1直線の傾き)を計算する。
    double baseSlope = (barDiff > 0) ? priceDiff / barDiff : 0;
    
    // 各角度にセクター線を引く
    for(int i = 0; i < ArraySize(angles); i++)
    {
        string label = "GannFan_" + angleNames[i];  // オブジェクト・ラベル
        double angle = angles[i];                  // 現在の角度
        
        // 角度に基づいて勾配倍率を計算する。
        double slopeMultiplier = MathTan(angle * M_PI / 180.0) / MathTan(45 * M_PI / 180.0);
        
        // 価格のオフセットを計算する。
        double priceShift = baseSlope * barDiff * slopeMultiplier * _Point;
        double endPrice;
        
        // トレンド方向に基づく終値の計算
        if(isTrendUp)
        {
            endPrice = extremum + priceShift;
        }
        else
        {
            endPrice = extremum - priceShift;
            angle = -angle; // 下降トレンドの反転角度
        }

        // トレンドラインオブジェクトを作成する
        if(ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, TimeCurrent(), 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());
        }
    }
}

//+------------------------------------------------------------------+
//|| 逆ギャンファンラインのプロットnbsp; &nbsp; ||
//+------------------------------------------------------------------+
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"};

    // 極点から現在のK線までの期間数を取得する
    int extremumBar = iBarShift(_Symbol, PERIOD_CURRENT, extremumTime);
    int currentBar = 0; // 現在のKラインは0
    int barDiff = currentBar - extremumBar; // サイクル番号の違い
    
    // 価格の高低差を計算する
    double priceDiff;
    if(!isTrendUp)
    {
        // 極端な安値から現在の最高値までの高さを計算する。
        double currentHigh = iHigh(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = currentHigh - extremum;
    }
    else
    {
        // 逆トレンド(下向き):極端な高値から現在の安値までの高さを計算する。
        double currentLow = iLow(_Symbol, PERIOD_CURRENT, 0);
        priceDiff = extremum - currentLow;
    }
    
    // ベースの傾き(1x1直線の傾き)を計算する。
    double baseSlope = (barDiff > 0) ? priceDiff / barDiff : 0;
    
    // 各角度にセクター線を引く
    for(int i = 0; i < ArraySize(angles); i++)
    {
        string label = "OppositeGannFan_" + angleNames[i];  // オブジェクト・ラベル
        double angle = angles[i];                          // 現在の角度
        
        // 角度に基づいて勾配倍率を計算する。
        double slopeMultiplier = MathTan(angle * M_PI / 180.0) / MathTan(45 * M_PI / 180.0);
        
        // 価格のオフセットを計算する。
        double priceShift = baseSlope * barDiff * slopeMultiplier * _Point;
        double endPrice;
        
        // 逆トレンドの方向に基づく終値の計算
        if(!isTrendUp)
        {
            endPrice = extremum + priceShift;
        }
        else
        {
            endPrice = extremum - priceShift;
            angle = -angle; // 下降トレンドの反転角度
        }

        // トレンドラインオブジェクトを作成する
        if(ObjectCreate(0, label, OBJ_TREND, 0, extremumTime, extremum, TimeCurrent(), 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());
        }
    }
}





結局、DeepSeekにソースコードを調整してもらうことになりました(問題なく動作し、自動的に線が引かれます):
#property copyright "Copyright 2024, Evgeniy Shtenco"  // 著作権情報
#property link      "https://www.mql5.com/en/users/koshtenko"  // 著者リンク
#property version   "1.00"  // インジケータのバージョン番号
#property indicator_chart_window  // インジケータはチャート・ウィンドウに表示される。

// 入力パラメータ
input int LookBackBars = 300;      // 分析されたKラインの数
input color GannFanColor = clrBlue; // ヴォーンのファンライン・カラー

// グローバル変数
double extremumPrice;        // 極端なポイント価格
datetime extremumTime;       // 極点時間
double oppositeExtremumPrice; // 逆エクストリーム・ポイント・プライス
datetime oppositeExtremumTime; // 逆極性ポイント時間
bool isTrendUp;              // トレンド方向フラグ(上昇トレンドなら真)

//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数 &nbsp.||カスタムインジケーター初期機能; ||
//+------------------------------------------------------------------+
int OnInit()
{
    return (INIT_SUCCEEDED);  // 初期化に成功
}

//+------------------------------------------------------------------+
//| カスタムインジケータの再初期化機能 &nbsp.||カスタム指標再初期化機能; ||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
    {
        // すべてのギャン・セクター・オブジェクトを削除する
        ObjectsDeleteAll(0, "GannFan_");
ObjectsDeleteAll(0, "OppositeGannFan_");
}

//+------------------------------------------------------------------+
//| カスタムインジケータ計算関数|カスタムインジケーター計算機能; | | | | | | | |
//+------------------------------------------------------------------+
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 < LookBackBars) return (0);  // 十分なデータがない場合はリターンする

    // 以前に描画したオブジェクトをクリアする
    if (prev_calculated == 0) {
        ObjectsDeleteAll(0, "GannFan_");
        ObjectsDeleteAll(0, "OppositeGannFan_");
    }

    // 直近300Kラインの極端点を見つける
    FindExtremums(rates_total, high, low, time);

    // ヴェン・ファン・ラインを描く
    DrawGannFan(extremumPrice, extremumTime);
    DrawOppositeGannFan(oppositeExtremumPrice, oppositeExtremumTime);

    return (rates_total);  // 処理された列の総数を返す。
}

//+------------------------------------------------------------------+
//| 指定されたKライン数内の極端点を見つける。|
//+------------------------------------------------------------------+
void FindExtremums(const int rates_total, const double & high[], const double & low[], const datetime & time[])
{
    int startIndex = rates_total - LookBackBars;  // インデックス作成開始(300K行前)
    int endIndex = rates_total - 1;               // 終了インデックス(最新のK行)

    // 最高点と最低点を見つける
    int highestIndex = ArrayMaximum(high, startIndex, LookBackBars);
    int lowestIndex = ArrayMinimum(low, startIndex, LookBackBars);

    // トレンドの方向性を判断する(高値と安値のタイミングを比較する)
    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;
    }
}

//+------------------------------------------------------------------+
| ベン・ファン・ラインのプロット&nbsp;||ベンファン線をプロットする
//+------------------------------------------------------------------+
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"};

    // セクターラインの終了時刻を計算する(現在時刻+300サイクル)
    datetime endTime = TimeCurrent();  // 現在時刻を終了時刻として使用する

    // 各角度にセクター線を引く
    for (int i = 0; i < ArraySize(angles); i++)
    {
        string label = "GannFan_" + angleNames[i];  // オブジェクト・ラベル
        double angle = angles[i];                  // 現在の角度

        // 価格のオフセットを計算する(時差に基づく)
        double secondsDiff = endTime - extremumTime;
        double priceShift = MathTan(angle * M_PI / 180.0) * secondsDiff / PeriodSeconds();
        double endPrice;

        // トレンド方向に基づく終値の計算
        if (isTrendUp) {
            endPrice = extremum + priceShift;
        }
        else {
            endPrice = extremum - priceShift;
            angle = -angle; // 下降トレンドの反転角度
        }

        // トレンドラインオブジェクトを作成する
        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());
        }
    }
}

//+------------------------------------------------------------------+
//|| 逆ギャンファンラインのプロットnbsp; &nbsp; ||
//+------------------------------------------------------------------+
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 = TimeCurrent();

    // 各角度にセクター線を引く
    for (int i = 0; i < ArraySize(angles); i++)
    {
        string label = "OppositeGannFan_" + angleNames[i];  // オブジェクト・ラベル
        double angle = angles[i];                          // 現在の角度

        // 価格のオフセットを計算する(時差に基づく)
        double secondsDiff = endTime - extremumTime;
        double priceShift = MathTan(angle * M_PI / 180.0) * secondsDiff / PeriodSeconds();
        double endPrice;

        // 逆トレンドの方向に基づいて終了価格を計算する。
        if (!isTrendUp) // 逆トレンド
        {
            endPrice = extremum + priceShift;
        }
        else {
            endPrice = extremum - priceShift;
            angle = -angle; // 下降トレンドの反転角度
        }

        // トレンドラインオブジェクトを作成する
        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());
        }
    }
}

//+------------------------------------------------------------------+
//| チャートイベントハンドラ機能 &nbspnbsp; & &nbsp;
//+------------------------------------------------------------------+
void OnChartEvent(const int id,                  // イベントID
const long & lparam,            // 長い整数パラメータ
                  const double & dparam,          // 倍精度パラメータ
                  const string & sparam)         // 文字列パラメータ
{
    // チャートの変更時にオブジェクトを再描画する。
    if (id == CHARTEVENT_CHART_CHANGE || id == CHARTEVENT_CLICK) {
        // 両極端を再検索し、ベン・ファン・ラインをプロットする。
        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);
    }
}
ファイル: