見出し画像

ASCTrendでトレンドを示唆するMT4インジケーター

TradingView

// Inputs for ASC Trend
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)

// ASC Trend Calculations...
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インジケーター

//+------------------------------------------------------------------+
//|                                      ASCTrendBinaryIndicator.mq4 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#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 parameters
input bool eternalfg = false;       // eternal 確定
input int ASClength = 10;           // ASC Length
input int RISK = 3;                 // RISK

// Indicator buffers
double ASCTrendBuffer[];

// Global variables
int eternal;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // Indicator buffers mapping
   SetIndexBuffer(0, ASCTrendBuffer);
   SetIndexStyle(0, DRAW_LINE);
   SetIndexLabel(0, "ASC Trend Binary");
   
   // Set indicator short name
   IndicatorShortName("ASC Trend Binary (0 or 1)");
   
   // Initialize eternal
   eternal = eternalfg ? 1 : 0;
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 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[])
{
   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--)
   {
      // Calculate Range and AvgRange
      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);
      
      // Calculate TrueCount and TrueCount2
      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++;
      }
      
      // Calculate WPR values
      double wpr3RR = iWPR(NULL, 0, 3 + RISK + RISK, i);
      double wpr3 = iWPR(NULL, 0, 3, i);
      double wpr4 = iWPR(NULL, 0, 4, i);
      
      // Calculate WprAbs
      double WprAbs = 100 + (TrueCount2 > 0 ? wpr4 : TrueCount > 0 ? wpr3 : wpr3RR);
      
      // Calculate ASC_Trend
      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; // Use previous trend
      }
      else
      {
         ASC_Trend = WprAbs > 50 ? 1 : -1; // Initial value
      }
      
      // Set buffer value (0 or 1)
      ASCTrendBuffer[i] = ASC_Trend == 1 ? 1 : 0;
   }
   
   return(rates_total);
}
//+------------------------------------------------------------------+

いいなと思ったら応援しよう!

ホソノP
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!