@kmd1220k

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

mql4のコードの修正

Q&A

解決したいこと

サインが出たら即アラームを鳴らすようにと、
サインが確定したらリペイントしないように
修正をお願いします。

該当するソースコード

ソースコードを入力

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 PaleVioletRed
#property indicator_style1 STYLE_DASH
#property indicator_color2 Red
#property indicator_style2 STYLE_DOT
#property indicator_color3 Green
#property indicator_style3 STYLE_DOT
#property indicator_color4 Magenta
#property indicator_width4 2
#property indicator_color5 Aqua
#property indicator_width5 2

//
//
//
//
//

extern string TimeFrame = "current time frame";
extern int gFilterPeriod = 30;
extern int FilterPrice = PRICE_CLOSE;
extern int FilterType = 0;
extern double FrequencyCutoff = 0.01;
extern bool Causal = false;
extern int rangePeriod = 5;
extern int MaMethod = 8;
extern double UpDeviation = 2.0;
extern double DnDeviation = 2.0;
extern bool Interpolate = true;
extern bool ShowArrows = true;
extern int ArrowCodeUp = 233; // Arrow code up
extern int ArrowCodeDn = 234; // Arrow code down
extern double arrowsDistance = 1.0;

extern bool alertsOn = true;
extern bool alertsOnCurrent = false;
extern bool alertsMessage = true;
extern bool alertsSound = false;
extern bool alertsEmail = false;

//
//
//
//
//

double ma[];
double buffer1[];
double buffer2[];
double arrowUp[];
double arrowDn[];
double trend[];
double pr[];
double coeffs[];

//
//
//
//
//

string indicatorFileName;
bool calculateValue;
bool returnBars;
int timeFrame;

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int init()
{
IndicatorBuffers(7);
SetIndexBuffer(0,ma);
SetIndexBuffer(1,buffer1);
SetIndexBuffer(2,buffer2);
SetIndexBuffer(3,arrowDn);
SetIndexBuffer(4,arrowUp); SetIndexArrow(4,ArrowCodeUp);
SetIndexBuffer(5,pr);
SetIndexBuffer(6,trend);

if (ShowArrows)
{
SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,ArrowCodeDn);
SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,ArrowCodeUp);
}
else
{
SetIndexStyle(3,DRAW_NONE);
SetIndexStyle(4,DRAW_NONE);
}

  //
  //
  //
  //
  //

  FrequencyCutoff = MathMax(MathMin(FrequencyCutoff,0.4999999),0.00000001);
  FilterType      = MathMax(MathMin(FilterType,13),0);
  gFilterPeriod   = MathMax(gFilterPeriod,1);
                  if (gFilterPeriod%2==0) gFilterPeriod += 1; 
                       fillCoeffs(coeffs,FrequencyCutoff,gFilterPeriod,FilterType);
  //
  //
  //
  //
  //

  indicatorFileName = WindowExpertName();
  returnBars        = TimeFrame=="returnBars";     if (returnBars)     return(0);
  calculateValue    = TimeFrame=="calculateValue"; if (calculateValue) return(0);
  timeFrame         = stringToTimeFrame(TimeFrame);
  
IndicatorShortName(timeFrameToString(timeFrame)+"  Sync filters-low pass apz bands "+getAverageName(MaMethod)+" ("+rangePeriod+")");

return(0);
}

//
//
//
//
//

int deinit() { return(0); }

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
int start()
{
int i,x,counted_bars=IndicatorCounted(),half = MathFloor(gFilterPeriod/2.0);
if (counted_bars<0) return(-1);
if (counted_bars>0) counted_bars--;
int limit = MathMin(MathMax(Bars-counted_bars,half),Bars-1);
if (returnBars) { ma[0] = limit+1; return(0); }

     //
     //
     //
     //
     //
     
     if (calculateValue || timeFrame==Period())
     {
     
     for (i=limit; i>=0 ; i--) pr[i] = iMA(NULL,0,1,0,MODE_SMA,FilterPrice,i);
     for (i=limit; i>=0 ; i--)
     {
           double sum = 0; ma[i] = 0;
              
           for (int k=0; k<gFilterPeriod; k++) 
              if (Causal) ma[i] += pr[i+k]*coeffs[k];
              else                        
                 if ((i+k-half)>=0 && (i+k-half)<Bars)
                 {
                       ma[i] += pr[i+k-half]*coeffs[k];
                       sum   += coeffs[k];
                 }

           //
           //
           //
           //
           //
                                   
           if (sum!=0) ma[i] /= sum;
           double range      = CalculateRange(rangePeriod,i);
                  buffer1[i] = ma[i] + UpDeviation * range;
                  buffer2[i] = ma[i] - DnDeviation * range;
                  arrowUp[i] = EMPTY_VALUE;
                  arrowDn[i] = EMPTY_VALUE;
                  trend[i]   = 0; 
     
     if (High[i] >= buffer1[i]) trend[i] = -1;
     if (Low[i] <= buffer2[i])  trend[i] =  1;
  
  
     if(trend[i]!=trend[i+1])
              { 
                 if(trend[i] ==  1) arrowUp[i] = Low[i]  - arrowsDistance * iATR(NULL,0,20,i);
                 if(trend[i] == -1) arrowDn[i] = High[i] + arrowsDistance * iATR(NULL,0,20,i);
              }
     }
     
  manageAlerts();
  return(0);            

}

//
//
//
//
//

limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period()));
for(i=limit; i>=0; i--)
{
int y = iBarShift(NULL,timeFrame,Time[i]);
ma[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",gFilterPeriod,FilterPrice,FilterType,FrequencyCutoff,Causal,rangePeriod,MaMethod,UpDeviation,DnDeviation,0,y);
buffer1[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",gFilterPeriod,FilterPrice,FilterType,FrequencyCutoff,Causal,rangePeriod,MaMethod,UpDeviation,DnDeviation,1,y);
buffer2[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",gFilterPeriod,FilterPrice,FilterType,FrequencyCutoff,Causal,rangePeriod,MaMethod,UpDeviation,DnDeviation,2,y);
trend[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",gFilterPeriod,FilterPrice,FilterType,FrequencyCutoff,Causal,rangePeriod,MaMethod,UpDeviation,DnDeviation,6,y);
arrowUp[i] = EMPTY_VALUE;
arrowDn[i] = EMPTY_VALUE;

              if(trend[i] ==  1) arrowUp[i] = Low[i]  - arrowsDistance * iATR(NULL,0,20,i);
              if(trend[i] == -1) arrowDn[i] = High[i] + arrowsDistance * iATR(NULL,0,20,i);

  //
  //
  //
  //
        
  if (!Interpolate || y==iBarShift(NULL,timeFrame,Time[i-1])) continue;

  //
  //
  //
  //
  //

  datetime time = iTime(NULL,timeFrame,y);
     for(x = 1; i+x < Bars && Time[i+x] >= time; x++) continue;	
     for(k = 1; k < x; k++)
     {
        ma[i+k]      = ma[i]      + (ma[i+x]      - ma[i])     * k/x;
        buffer1[i+k] = buffer1[i] + (buffer1[i+x] - buffer1[i])* k/x;
        buffer2[i+k] = buffer2[i] + (buffer2[i+x] - buffer2[i])* k/x;

     }               

}

//
//
//
//
//

manageAlerts();
return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

#define Pi 3.141592653589793238462643383279502884197169399375105820974944592

void fillCoeffs(double& tcoeffs[], double frequencyCutoff, double filterPeriod, int filterType, double multiplier=1)
{
ArrayResize(tcoeffs,filterPeriod);

//
//
//
//
//

int N = filterPeriod-1; double sum = 0;
for (int n=0; n<filterPeriod; n++)
{
double div = (n-N/2.0);
if (div==0) tcoeffs[n] = 2.0PifrequencyCutoff;
else tcoeffs[n] = MathSin(2.0PifrequencyCutoff*div)/div;

  //
  //
  //
  //
  //

  switch(filterType)
  {
     case 0 :  tcoeffs[n] *= (0.54-0.46*MathCos(2*Pi*n/N));                                                                     break; // Hamming
     case 1 :  tcoeffs[n] *= (0.50-0.50*MathCos(2*Pi*n/N));                                                                     break; // Hanning
     case 2 :  tcoeffs[n] *= (0.42-0.50*MathCos(2*Pi*n/N)+0.08*MathCos(4*Pi*n/N));                                              break; // Blackman
     case 3 :  tcoeffs[n] *= (0.35875-0.48829*MathCos(2*Pi*n/N)+0.14128*MathCos(4*Pi*n/N)+0.01168*MathCos(6*Pi*n/N));           break; // Blackman Harris
     case 4 :  tcoeffs[n] *= (0.3635819-0.4891775*MathCos(2*Pi*n/N)+0.1365995*MathCos(4*Pi*n/N)+0.0106411*MathCos(6*Pi*n/N));   break; // Blackman Nutall
     case 5 :  tcoeffs[n] *= (0.355768-0.487396*MathCos(2*Pi*n/N)+0.144232*MathCos(4*Pi*n/N)+0.012604*MathCos(6*Pi*n/N));       break; // Nutall
     case 6 :  tcoeffs[n] *= (2.0/N*(N/2.0-MathAbs(n-N/2)));                                                                    break; // Bartlet zero end points
     case 7 :  tcoeffs[n] *= (0.62-0.48*MathAbs(n/N-0.5)*0.38*MathCos(2.0*Pi*n/N));                                             break; // Bartlet-Hann
     case 8 :  tcoeffs[n] *= (0.50*(1.0-MathCos(2.0*Pi*n/N)));                                                                  break; // Hann
     case 9 :  tcoeffs[n] *= (MathSin(Pi*n/N));                                                                                 break; // Sine
     case 10:  
            double ttx = ((n/N)-1.0);
               if (ttx==0)
                     tcoeffs[n] *= 0;
               else  tcoeffs[n] *= (MathSin(ttx)/(ttx));                                                                        break; // Lanczos
     case 11:  tcoeffs[n] *= (1-1.93*MathCos(2*Pi*n/N)+1.29*MathCos(4*Pi*n/N)+0.388*MathCos(6*Pi*n/N)+0.388*MathCos(8*Pi*n/N)); break; // Flat top
  }
  
  //
  //
  //
  //
  //
  
  sum += tcoeffs[n];

}
for (int k=0; k<filterPeriod; k++) { tcoeffs[k] = tcoeffs[k]/sum; tcoeffs[k] = tcoeffs[k]*multiplier; }
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//

void manageAlerts()
{
if (!calculateValue && alertsOn)
{
if (alertsOnCurrent)
int whichBar = 0;
else whichBar = 1; whichBar = iBarShift(NULL,0,iTime(NULL,timeFrame,whichBar));
if (trend[whichBar] != trend[whichBar+1])
{
if (trend[whichBar] == 1) doAlert(whichBar,"up");
if (trend[whichBar] ==-1) doAlert(whichBar,"down");
}
}
}

//
//
//
//
//

void doAlert(int forBar, string doWhat)
{
static string previousAlert="nothing";
static datetime previousTime;
string message;

  if (previousAlert != doWhat || previousTime != Time[forBar]) {
      previousAlert  = doWhat;
      previousTime   = Time[forBar];

      //
      //
      //
      //
      //

      message =  StringConcatenate(Symbol(),doWhat);
         if (alertsMessage) Alert(message);
         if (alertsEmail)   SendMail(StringConcatenate(Symbol(),"Sync filters bands "),message);
         if (alertsSound)   PlaySound("alert2.wav");
  }

}

//+-------------------------------------------------------------------
//|
//+-------------------------------------------------------------------
//
//
//
//
//

string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//
//
//
//
//

int stringToTimeFrame(string tfs)
{
tfs = StringUpperCase(tfs);
for (int i=ArraySize(iTfTable)-1; i>=0; i--)
if (tfs==sTfTable[i] || tfs==""+iTfTable[i]) return(MathMax(iTfTable[i],Period()));
return(Period());

//
//
//
//
//

}
string timeFrameToString(int tf)
{
for (int i=ArraySize(iTfTable)-1; i>=0; i--)
if (tf==iTfTable[i]) return(sTfTable[i]);
return("");
}

//
//
//
//
//

string StringUpperCase(string str)
{
string s = str;

for (int length=StringLen(str)-1; length>=0; length--)
{
int tchar = StringGetChar(s, length);
if((tchar > 96 && tchar < 123) || (tchar > 223 && tchar < 256))
s = StringSetChar(s, length, tchar - 32);
else if(tchar > -33 && tchar < 0)
s = StringSetChar(s, length, tchar + 224);
}
return(s);
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//

double CalculateRange(int FilterPeriod,int i)
{
int j,k;
double lsum = (FilterPeriod+1)*iCustomMA(iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW, i),rangePeriod,MaMethod,i);
double hsum = (FilterPeriod+1)*iCustomMA(iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,i),rangePeriod,MaMethod,i);
double sumw = (FilterPeriod+1);

//
//
//
//
//

for(j=1, k=FilterPeriod; j<=FilterPeriod; j++, k--)
{
lsum += kiCustomMA(iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW, i+j),rangePeriod,MaMethod,i+j);
hsum += k
iCustomMA(iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,i+j),rangePeriod,MaMethod,i+j);
sumw += k;

  if (j<=i)
  {
     lsum += k*iCustomMA(iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW, i-j),rangePeriod,MaMethod,i-j);
     hsum += k*iCustomMA(iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,i-j),rangePeriod,MaMethod,i-j);
     sumw += k;
  }

}
return (hsum/sumw - lsum/sumw);
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//

double workPrices[];
double workResult[];
int r;

double iCustomMA(double price, int period, int method, int i)
{
if (ArraySize(workPrices)!= Bars) ArrayResize(workPrices,Bars);
r = Bars-i-1;
workPrices[r] = price;

//
//
//
//
//

  switch(method)
  {
     case  0: return(iSma(price,period,i));
     case  1: return(iEma(price,period,i));
     case  2: return(iSmma(price,period,i));
     case  3: return(iLwma(price,period,i));
     case  4: return(iLsma(price,period,i));
     case  5: return(iTma(price,period,i));
     case  6: return(iSineWMA(price,period,i));
     case  7: return(iVolumeWMA(price,period,i));
     case  8: return(iHma(price,period,i));
     case  9: return(iNonLagMa(price,period,i));
     case 10: return(iLwmp(price,period,i));
  }

return(EMPTY_VALUE);
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//

double iSma(double price, double period, int i)
{
double sum = 0;
for(int k=0; k=0; k++) sum += workPrices[r-k];
if (k!=0)
return(sum/k);
else return(EMPTY_VALUE);
}

//
//
//
//
//

double iEma(double price, double period, int i)
{
if (ArraySize(workResult)!= Bars) ArrayResize(workResult,Bars);
double alpha = 2.0 / (1.0+period);
workResult[r] = workResult[r-1]+alpha*(price-workResult[r-1]);
return(workResult[r]);
}
//
//
//
//
//

double iSmma(double price, double period, int i)
{
if (ArraySize(workResult)!= Bars) ArrayResize(workResult,Bars);
if (i>=(Bars-period))
{
double sum = 0;
for(int k=0; k=0; k++) sum += workPrices[r-k];
if (k!=0)
workResult[i] = sum/k;
else workResult[i] = EMPTY_VALUE;
}
else workResult[r] = (workResult[r-1]*(period-1)+price)/period;
return(workResult[r]);
}

//
//
//
//
//

double ilwma_prices[][3];
double iLwma(double price, double period, int i,int forValue=0)
{
if (ArrayRange(ilwma_prices,0)!= Bars) ArrayResize(ilwma_prices,Bars);

//
//
//
//
//

ilwma_prices[r][forValue] = price;
double sum = 0;
double sumw = 0;

  for(int k=0; k<period && (r-k)>=0; k++)
  {
     double weight = period-k;
            sumw  += weight;
            sum   += weight*ilwma_prices[r-k][forValue];  
  }             

if (sumw!=0)
return(sum/sumw);
else return(EMPTY_VALUE);
}

//
//
//
//
//

double ilwmp_prices[][3];
double iLwmp(double price, double period, int i,int forValue=0)
{
if (ArrayRange(ilwmp_prices,0)!= Bars) ArrayResize(ilwmp_prices,Bars);

//
//
//
//
//

ilwmp_prices[r][forValue] = price;
double sum = 0;
double sumw = 0;

  for(int k=0; k<period && (r-k)>=0; k++)
  {
     double weight = (period-k)*(period-k);
            sumw  += weight;
            sum   += weight*ilwmp_prices[r-k][forValue];  
  }             

if (sumw!=0)
return(sum/sumw);
else return(EMPTY_VALUE);
}

//
//
//
//
//

double iLsma(double price, double period, int i)
{
return(3.0iLwma(price,period,i)-2.0iSma(price,period,i));
}

//
//
//
//
//

double iHma(double price, double period, int i)
{
int HalfPeriod = MathFloor(period/2);
int HullPeriod = MathFloor(MathSqrt(period));
double price1 = 2.0*iLwma(price,HalfPeriod,i,0)-iLwma(price,period,i,1);
return (iLwma(price1,HullPeriod,i,2));
}

//
//
//
//
//

double iTma(double price, double period, int i)
{
double half = (period+1.0)/2.0;
double sum = 0;
double sumw = 0;

for(int k=0; k=0; k++)
{
double weight = k+1; if (weight > half) weight = period-k;
sumw += weight;
sum += weight*workPrices[r-k];
}
if (sumw!=0)
return(sum/sumw);
else return(EMPTY_VALUE);
}

//
//
//
//
//

double iSineWMA(double price, int period, int i)
{
double sum = 0;
double sumw = 0;

for(int k=0; k=0; k++)
{
double weight = MathSin(M_PI*(k+1)/(period+1));
sumw += weight;
sum += weight*workPrices[r-k];
}
if (sumw!=0)
return(sum/sumw);
else return(EMPTY_VALUE);
}

//
//
//
//
//

double iVolumeWMA(double price, int period, int i)
{
double sum = 0;
double sumw = 0;

for(int k=0; k=0; k++)
{
double weight = Volume[i+k];
sumw += weight;
sum += weight*workPrices[r-k];
}
if (sumw!=0)
return(sum/sumw);
else return(EMPTY_VALUE);
}

//+------------------------------------------------------------------
//|
//+------------------------------------------------------------------
//
//
//
//
//

#define _length 0
#define _len 1

double nlmvalues[][2];
double nlmprices[][1];
double nlmalphas[][1];

//
//
//
//
//

double iNonLagMa(double price, double length, int i, int instanceNo=0)
{
if (ArrayRange(nlmprices,0) != Bars) ArrayResize(nlmprices,Bars);
if (ArrayRange(nlmvalues,0) < instanceNo+1) ArrayResize(nlmvalues,instanceNo+1);
nlmprices[r][instanceNo]=price;
if (length<3 || r<3) return(nlmprices[r][instanceNo]);

//
//
//
//
//

if (nlmvalues[instanceNo][_length] != length || ArraySize(nlmalphas)==0)
{
double Cycle = 4.0;
double Coeff = 3.0*M_PI;
int Phase = length-1;

     nlmvalues[instanceNo][_length] = length;
     nlmvalues[instanceNo][_len   ] = length*4 + Phase;  

     if (ArrayRange(nlmalphas,0) < nlmvalues[instanceNo][_len]) ArrayResize(nlmalphas,nlmvalues[instanceNo][_len]);
     for (int k=0; k<nlmvalues[instanceNo][_len]; k++)
     {
        if (k<=Phase-1) 
             double t = 1.0 * k/(Phase-1);
        else        t = 1.0 + (k-Phase+1)*(2.0*Cycle-1.0)/(Cycle*length-1.0); 
        double beta = MathCos(M_PI*t);
        double g = 1.0/(Coeff*t+1); if (t <= 0.5 ) g = 1;
  
        nlmalphas[k][instanceNo] = g * beta;
     }

}

//
//
//
//
//

double sum = 0, sumw = 0;
    for (k=0; k < nlmvalues[instanceNo][_len] && (r-k)>=0; k++) { sum += nlmalphas[k][instanceNo]*nlmprices[r-k][instanceNo]; sumw += nlmalphas[k][instanceNo]; }
    if (sumw!=0)
         return(sum/sumw);
    else return(price);

}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//

string methodNames[] = {"SMA","EMA","SMMA","LWMA","LSMA","TriMA","SWMA","VWMA","HullMA","NonLagMA","LWM parabolic"};
string getAverageName(int& method)
{
method=MathMax(MathMin(method,10),0); return(methodNames[method]);
}

//
//
//
//
//

自分で試したこと

初心者なのでコードが詳しくないため試してません。

0 likes

1Answer

ライセンスによって取り扱いが制限されることもあるので,出所不明のソースコードはむやみに転載や改変依頼等をしないでください.

分野が分野だけに丸投げの変更依頼は無償では勘弁して欲しいところであります.ナレッジベースであることを忘れないでください.

2Like

Comments

  1. @kmd1220k

    Questioner

    わかりました。ありがとうございました。

Your answer might help someone💌