インジケータはこれが良い
//------------------------------------------------------------------#property copyright "nyxjfxxx@ybb.ne.jp"#property link "http://hanma.zouri.jp/"#property version "1.00" #property description "IH"//------------------------------------------------------------------#property indicator_separate_window#property indicator_buffers 8#property indicator_color1 Blue#property indicator_color2 Red#property indicator_color3 Blue#property indicator_color4 Red#property indicator_color5 Blue#property indicator_color6 Red#property indicator_color7 Blue#property indicator_color8 Red#property indicator_minimum 0#property indicator_maximum 0//------------------------------------------------------------------extern string TimeFrame1 = "Current Time Frame";string TimeFrame2 = "next1";string TimeFrame3 = "next2";string TimeFrame4 = "next3";ENUM_MA_METHOD MaMethod1 = MODE_SMA;ENUM_MA_METHOD MaMethod2 = MODE_SMA;int MaPeriod1 = 100;int MaPeriod2 = 100;bool UseHAHighLow = true;string UniqueID = "4 Time Frame HA";int LinesWidth = 0;color LabelsColor = clrDarkGray;int LabelsHorizontalShift = 99;double LabelsVerticalShift = 99.5;bool alertsOn = true;int alertsLevel = 99;bool alertsMessage = false;bool alertsSound = true;bool alertsEmail = false;bool All_Sig_Arrows = false;int Arr_otstup = 0; int Arr_width = 1;color Arr_Up_col = Blue;color Arr_Dn_col = Red;int History = 20000;//------------------------------------------------------------------double trends[];double ha1u[];double ha1d[];double ha2u[];double ha2d[];double ha3u[];double ha3d[];double ha4u[];double ha4d[];int timeFrames[4];bool returnBars;bool calculateValue;string indicatorFileName;//------------------------------------------------------------------////------------------------------------------------------------------int init(){ IndicatorBuffers(9); SetIndexBuffer(0,ha1u); SetIndexBuffer(1,ha1d); SetIndexBuffer(2,ha2u); SetIndexBuffer(3,ha2d); SetIndexBuffer(4,ha3u); SetIndexBuffer(5,ha3d); SetIndexBuffer(6,ha4u); SetIndexBuffer(7,ha4d); SetIndexBuffer(8,trends); indicatorFileName = WindowExpertName(); returnBars = (TimeFrame1=="returnBars"); if (returnBars) return(0); calculateValue = (TimeFrame1=="calculateValue"); if (calculateValue) return(0); for (int i=0; i<8; i++) { SetIndexStyle(i,DRAW_ARROW,EMPTY,LinesWidth); SetIndexArrow(i,110); } timeFrames[0] = stringToTimeFrame(TimeFrame1); timeFrames[1] = stringToTimeFrame(TimeFrame2); timeFrames[2] = stringToTimeFrame(TimeFrame3); timeFrames[3] = stringToTimeFrame(TimeFrame4); IndicatorShortName(UniqueID); return(0);}//------------------------------------------------------------------////------------------------------------------------------------------int deinit(){ //for (int t=0; t<4; t++) ObjectDelete(UniqueID+t); for (int i = ObjectsTotal()-100; i >= 0; i--) if (StringSubstr(ObjectName(i), 0, StringLen(UniqueID)) == UniqueID) ObjectDelete(ObjectName(i)); return(0); }//------------------------------------------------------------------////------------------------------------------------------------------double trend[][2];#define _up 0#define _dn 1int start(){ int i,r,counted_bars=IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars>0) counted_bars--; int limit = MathMin(Bars-counted_bars,Bars-1); if (limit>History) limit = History; if (returnBars) { ha1u[0] = limit+1; return(0); } if (calculateValue) { calculateHA(limit); return(0); } if (timeFrames[0] != Period()) limit = MathMax(limit,MathMin(History,iCustom(NULL,timeFrames[0],indicatorFileName,"returnBars",0,0)*timeFrames[0]/Period())); if (timeFrames[1] != Period()) limit = MathMax(limit,MathMin(History,iCustom(NULL,timeFrames[1],indicatorFileName,"returnBars",0,0)*timeFrames[1]/Period())); if (timeFrames[2] != Period()) limit = MathMax(limit,MathMin(History,iCustom(NULL,timeFrames[2],indicatorFileName,"returnBars",0,0)*timeFrames[2]/Period())); if (timeFrames[3] != Period()) limit = MathMax(limit,MathMin(History,iCustom(NULL,timeFrames[3],indicatorFileName,"returnBars",0,0)*timeFrames[3]/Period())); if (ArrayRange(trend,0)!=Bars) ArrayResize(trend,Bars); static bool initialized = false; if (!initialized) { initialized = true; int window = WindowFind(UniqueID); for (int t=0; t<4; t++) { string label = timeFrameToString(timeFrames[t]); ObjectCreate(UniqueID+t,OBJ_TEXT,window,0,0); ObjectSet(UniqueID+t,OBJPROP_COLOR,LabelsColor); ObjectSet(UniqueID+t,OBJPROP_PRICE1,t+LabelsVerticalShift); ObjectSetText(UniqueID+t,label,8,"Arial"); } } for (t=0; t<4; t++) ObjectSet(UniqueID+t,OBJPROP_TIME1,Time[0]+Period()*LabelsHorizontalShift*60); for(i = limit, r=Bars-i-1; i >= 0; i--,r++) { trend[r][_up] = 0; trend[r][_dn] = 0; for (int k=0; k<4; k++) { int y = iBarShift(NULL,timeFrames[k],Time[i]); if (UseHAHighLow) { double halo = iCustom(NULL,timeFrames[k],indicatorFileName,"calculateValue","","","",MaMethod1,MaPeriod1,MaMethod2,MaPeriod2,0,y); double hahi = iCustom(NULL,timeFrames[k],indicatorFileName,"calculateValue","","","",MaMethod1,MaPeriod1,MaMethod2,MaPeriod2,1,y); bool isUp = (hahi>halo); } else { double hacl = iCustom(NULL,timeFrames[k],indicatorFileName,"calculateValue","","","",MaMethod1,MaPeriod1,MaMethod2,MaPeriod2,2,y); double haop = iCustom(NULL,timeFrames[k],indicatorFileName,"calculateValue","","","",MaMethod1,MaPeriod1,MaMethod2,MaPeriod2,3,y); isUp = (haop>hacl); } switch (k) { case 0 : if (isUp) { ha1u[i] = k+1; ha1d[i] = EMPTY_VALUE;} else { ha1d[i] = k+1; ha1u[i] = EMPTY_VALUE; } break; case 1 : if (isUp) { ha2u[i] = k+1; ha2d[i] = EMPTY_VALUE;} else { ha2d[i] = k+1; ha2u[i] = EMPTY_VALUE; } break; case 2 : if (isUp) { ha3u[i] = k+1; ha3d[i] = EMPTY_VALUE;} else { ha3d[i] = k+1; ha3u[i] = EMPTY_VALUE; } break; case 3 : if (isUp) { ha4u[i] = k+1; ha4d[i] = EMPTY_VALUE;} else { ha4d[i] = k+1; ha4u[i] = EMPTY_VALUE; } break; } if (isUp) trend[r][_up] += 1; else trend[r][_dn] += 1; } trends[i]=trends[i+1]; if(trends[i]!=1 && ha1u[i]!=EMPTY_VALUE && ha2u[i]!=EMPTY_VALUE && ha3u[i]!=EMPTY_VALUE && ha4u[i]!=EMPTY_VALUE) { trends[i] = 1; arrows_wind(i,"Up",Arr_otstup ,233,Arr_Up_col,Arr_width,false); }else{ ObjectDelete(UniqueID+"Up"+TimeToStr(Time[i])); } if(trends[i]!=-1 && ha1d[i]!=EMPTY_VALUE && ha2d[i]!=EMPTY_VALUE && ha3d[i]!=EMPTY_VALUE && ha4d[i]!=EMPTY_VALUE) { trends[i] =-1; arrows_wind(i,"Dn",Arr_otstup ,234,Arr_Dn_col,Arr_width,true); }else{ ObjectDelete(UniqueID + "Dn" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } if(All_Sig_Arrows) { if(trends[i]== 1 && (ha1u[i]==EMPTY_VALUE || ha2u[i]==EMPTY_VALUE || ha3u[i]==EMPTY_VALUE || ha4u[i]==EMPTY_VALUE)) trends[i] = 0; if(trends[i]==-1 && (ha1d[i]==EMPTY_VALUE || ha2d[i]==EMPTY_VALUE || ha3d[i]==EMPTY_VALUE || ha4d[i]==EMPTY_VALUE)) trends[i] = 0; } } manageAlerts(); return(0);}//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void arrows_wind(int k, string N,int ots,int Code,color clr, int ArrowSize,bool up) { string objName = UniqueID+N+TimeToStr(Time[k]); double gap = ots*Point; ObjectCreate(objName, OBJ_ARROW,0,Time[k],0); ObjectSet (objName, OBJPROP_COLOR, clr); ObjectSet (objName, OBJPROP_ARROWCODE,Code); ObjectSet (objName, OBJPROP_WIDTH,ArrowSize); if (up) { ObjectSet(objName, OBJPROP_ANCHOR,ANCHOR_BOTTOM); ObjectSet(objName,OBJPROP_PRICE1,High[k]+gap); }else{ ObjectSet(objName, OBJPROP_ANCHOR,ANCHOR_TOP); ObjectSet(objName,OBJPROP_PRICE1,Low[k]-gap); }}//-------------------------------------------------------------------////-------------------------------------------------------------------void calculateHA(int limit){ for (int i=limit; i>=0; i--) { double maOpen = iMA(NULL,0,MaPeriod1,0,MaMethod1,PRICE_OPEN ,i); double maClose = iMA(NULL,0,MaPeriod1,0,MaMethod1,PRICE_CLOSE,i); double maLow = iMA(NULL,0,MaPeriod1,0,MaMethod1,PRICE_LOW ,i); double maHigh = iMA(NULL,0,MaPeriod1,0,MaMethod1,PRICE_HIGH ,i); double haOpen = (ha3u[i+1]+ha3d[i+1])/2.0; double haClose = (maOpen+maHigh+maLow+maClose)/4; double haHigh = MathMax(maHigh, MathMax(haOpen, haClose)); double haLow = MathMin(maLow, MathMin(haOpen, haClose)); if (haOpen<haClose) { ha4u[i]=haLow; ha4d[i]=haHigh; } else { ha4d[i]=haLow; ha4u[i]=haHigh; } ha3u[i]=haOpen; ha3d[i]=haClose; } for(i=limit; i>=0; i--) { ha1u[i]=iMAOnArray(ha4u,0,MaPeriod2,0,MaMethod2,i); ha1d[i]=iMAOnArray(ha4d,0,MaPeriod2,0,MaMethod2,i); ha2u[i]=iMAOnArray(ha3u,0,MaPeriod2,0,MaMethod2,i); ha2d[i]=iMAOnArray(ha3d,0,MaPeriod2,0,MaMethod2,i); } }//------------------------------------------------------------------////------------------------------------------------------------------void manageAlerts(){ if (alertsOn) { int whichBar = Bars-1; if (trend[whichBar][_up] >= alertsLevel || trend[whichBar][_dn] >= alertsLevel) { if (trend[whichBar][_up] >= alertsLevel) doAlert("up" ,trend[whichBar][_up]); if (trend[whichBar][_dn] >= alertsLevel) doAlert("down",trend[whichBar][_dn]); } }}//------------------------------------------------------------------////------------------------------------------------------------------void doAlert(string doWhat, int howMany){ static string previousAlert="nothing"; static datetime previousTime; string message; if (previousAlert != doWhat || previousTime != Time[0]) { previousAlert = doWhat; previousTime = Time[0]; message = Symbol()+" at "+TimeToStr(TimeLocal(),TIME_SECONDS)+" "+howMany+" time frames of haDelta are aligned "+doWhat; if (alertsMessage) Alert(message); if (alertsEmail) SendMail(Symbol()+" 4 time frame haDelta",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 toInt(double value) { return(value); }int stringToTimeFrame(string tfs){ tfs = stringUpperCase(tfs); int max = ArraySize(iTfTable)-1, add=0; int nxt = (StringFind(tfs,"NEXT1")>-1); if (nxt>0) { tfs = ""+Period(); add=1; } nxt = (StringFind(tfs,"NEXT2")>-1); if (nxt>0) { tfs = ""+Period(); add=2; } nxt = (StringFind(tfs,"NEXT3")>-1); if (nxt>0) { tfs = ""+Period(); add=3; } for (int i=max; i>=0; i--) if (tfs==sTfTable[i] || tfs==""+iTfTable[i]) return(MathMax(iTfTable[toInt(MathMin(max,i+add))],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);}//------------------------------------------------------------------////------------------------------------------------------------------