TradingView
eternalfg = input(false, title='eternal 確定')
eternal = eternalfg ? 1 : 0
ASClength = input.int(title='ASC Length', minval=4, defval=10)
RISK = input.int(title='RISK', minval=0, defval=3)
x1 = 67 + RISK
x2 = 33 - RISK
Range = ta.highest(ASClength) - ta.lowest(ASClength)
AvgRange = ta.sma(Range, ASClength)
CountFg = math.abs(open - close) >= AvgRange * 2.0 ? 1 : 0
TrueCount = math.sum(CountFg, ASClength)
CountFg2 = math.abs(close[3] - close) >= AvgRange * 4.6 ? 1 : 0
TrueCount2 = math.sum(CountFg2, ASClength - 3)
wpr3RR = ta.wpr(3 + RISK + RISK)
wpr3 = ta.wpr(3)
wpr4 = ta.wpr(4)
WprAbs = 100 + (TrueCount2 > 0 ? wpr4 : TrueCount > 0 ? wpr3 : wpr3RR)
ASC_Trend = 0
ASC_Trend := WprAbs[eternal] < x2[eternal] ? -1 : WprAbs[eternal] > x1[eternal] ? 1 : ASC_Trend[1]
トレンドの状態を示すASCTrendBinaryMT4インジケーター
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
#property indicator_minimum 0
#property indicator_maximum 1
input bool eternalfg = false;
input int ASClength = 10;
input int RISK = 3;
double ASCTrendBuffer[];
int eternal;
int OnInit()
{
SetIndexBuffer(0, ASCTrendBuffer);
SetIndexStyle(0, DRAW_LINE);
SetIndexLabel(0, "ASC Trend Binary");
IndicatorShortName("ASC Trend Binary (0 or 1)");
eternal = eternalfg ? 1 : 0;
return(INIT_SUCCEEDED);
}
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[])
{
int limit = rates_total - prev_calculated;
if (prev_calculated == 0) limit = rates_total - ASClength - 1;
double x1 = 67 + RISK;
double x2 = 33 - RISK;
for (int i = limit; i >= 0; i--)
{
double Range = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, ASClength, i)) -
iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, ASClength, i));
double AvgRange = iMA(NULL, 0, ASClength, 0, MODE_SMA, Range, i);
int TrueCount = 0;
int TrueCount2 = 0;
for (int j = 0; j < ASClength; j++)
{
if (MathAbs(open[i+j] - close[i+j]) >= AvgRange * 2.0) TrueCount++;
if (j < ASClength - 3 && MathAbs(close[i+j+3] - close[i+j]) >= AvgRange * 4.6) TrueCount2++;
}
double wpr3RR = iWPR(NULL, 0, 3 + RISK + RISK, i);
double wpr3 = iWPR(NULL, 0, 3, i);
double wpr4 = iWPR(NULL, 0, 4, i);
double WprAbs = 100 + (TrueCount2 > 0 ? wpr4 : TrueCount > 0 ? wpr3 : wpr3RR);
double ASC_Trend;
if (i < rates_total - 1)
{
if (WprAbs < x2) ASC_Trend = -1;
else if (WprAbs > x1) ASC_Trend = 1;
else ASC_Trend = ASCTrendBuffer[i+1] > 0.5 ? 1 : -1;
}
else
{
ASC_Trend = WprAbs > 50 ? 1 : -1;
}
ASCTrendBuffer[i] = ASC_Trend == 1 ? 1 : 0;
}
return(rates_total);
}