自動でギャンファンを引いてくれる処理です。

探索範囲はパラメータで指定できるようにしていますので、お好きな範囲を設定下さい。

ギャンファンの詳しい仕組みはとても難しく理解しにくいのですが、高値と安値を引くだけで一定の法則が見えてきます。

各時間足でGBP/JPYとGBP/USDで画像を作りましたので、詳しくは下記画像をご覧下さい。

少なくとも、戻り売りや押し目買いなど使う場面は結構多いと思えます。

ややこしいスケール値の計算も自動で行いますので、誰でも同じギャンファンを引くことが可能になります。

スケール値は、足が一個進む間に変動するPIPSです。
スケール1なら1個の足で1PIPS動く上昇ギャンファン。
スケール-1なら1個の足で-1PIPS動く下降ギャンファン。
スケール50なら1個の足で50PIPS動く上昇ギャンファンとなります。

以下MQLコードです。
カスタムインジケーターでもEAでもCreateGanFan()をコールするだけで動作可能です。

input int SERCH_PERIOD=500;
string obj_name = "AUTO_GANFAN";
void CreateGanFan()
{
  int upperIdx=iHighest(NULL,0,MODE_HIGH,SERCH_PERIOD,0);
  int lowerIdx=iLowest (NULL,0,MODE_LOW ,SERCH_PERIOD,0);
  
  if(upperIdx>lowerIdx)
  {
    int    chart_id = 0;
    ObjectCreate(chart_id,obj_name,
                 OBJ_GANNFAN,
                 0,
                 Time[upperIdx],
                 High[upperIdx],
                 Time[lowerIdx],
                 0
                 );
    
    ObjectSetInteger(chart_id,obj_name,OBJPROP_COLOR,Pink);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_STYLE,STYLE_SOLID);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_WIDTH,1);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_BACK,false);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTED,true);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_HIDDEN,true);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_ZORDER,0);
  
    double tmpVal=Low[lowerIdx]-High[upperIdx];
    double tmpIdx=upperIdx-lowerIdx;
    
    double scale=tmpVal*(1/Point)/tmpIdx;
    ObjectSetDouble(chart_id,obj_name,OBJPROP_SCALE,scale);
  }
  if(upperIdx<lowerIdx)
  {
    int    chart_id = 0;
    ObjectCreate(chart_id,obj_name,
                 OBJ_GANNFAN,
                 0,
                 Time[lowerIdx],
                 Low[lowerIdx],
                 Time[upperIdx],
                 0
                 );
    
    ObjectSetInteger(chart_id,obj_name,OBJPROP_COLOR,SkyBlue);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_STYLE,STYLE_SOLID);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_WIDTH,1);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_BACK,false);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_SELECTED,true);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_HIDDEN,true);
    ObjectSetInteger(chart_id,obj_name,OBJPROP_ZORDER,0);
  
    double tmpVal=High[upperIdx]-Low[lowerIdx];
    double tmpIdx=lowerIdx-upperIdx;
    
    double scale=tmpVal*(1/Point)/tmpIdx;
    ObjectSetDouble(chart_id,obj_name,OBJPROP_SCALE,scale);
  }
}