//+------------------------------------------------------------------+ //| FibonacciRange.mq4 | //| Rondo | //| http://fx-dollaryen.seesaa.net | //+------------------------------------------------------------------+ #property copyright "Rondo" #property link "http://fx-dollaryen.seesaa.net" #property version "1.0" #property strict #property indicator_chart_window enum fibonacci{ fibo236 = 236, //23.6 fibo386 = 386 //38.6 }; input fibonacci fibo = fibo386; //フィボナッチ比率(%) input color BasicLineColor = clrCadetBlue; //基本ライン色 input ENUM_LINE_STYLE BasicLineStyle = STYLE_DOT; //スタイル input int BasicLineWidth = 1; //太さ input color LineColor = clrWhite; //水平ライン色 input color RectColor = clrNavy; //ボックス色 input int counts = 0; //最大表示数(0:現在まで表示) string indiName = "FR"; double Fibo; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(){ if(fibo == 236) Fibo = 23.6; else if(fibo == 386) Fibo = 38.6; else Fibo = 50.0; long chart_id = ChartID(); datetime time1, time2; double price1, price2; if(ObjectFind(indiName+"_BasicLine") != 0){ int bars_count = WindowBarsPerChart(); int bar = WindowFirstVisibleBar(); double PriceMin = WindowPriceMin(); double PriceMax = WindowPriceMax(); time1 = Time[bars_count/2]; time2 = Time[bars_count/4]; price1 = PriceMin+MathAbs(PriceMax-PriceMin)/4; price2 = PriceMax-MathAbs(PriceMax-PriceMin)/4; } else{ time1 = (datetime)ObjectGetInteger(chart_id, indiName+"_BasicLine", OBJPROP_TIME, 0); time2 = (datetime)ObjectGetInteger(chart_id, indiName+"_BasicLine", OBJPROP_TIME, 1); price1 = ObjectGetDouble(chart_id, indiName+"_BasicLine", OBJPROP_PRICE, 0); price2 = ObjectGetDouble(chart_id, indiName+"_BasicLine", OBJPROP_PRICE, 1); } double valueFibo = MathAbs(price1 - price2)*Fibo/100; Line(indiName+"_BasicLine", time1, price1, time2, price2, BasicLineColor, BasicLineStyle, BasicLineWidth, true); int index2; if(counts == 0) index2 = 0; else{ if(time1 <= time2) index2 = iBarShift(NULL, 0, time1) - counts; else index2 = iBarShift(NULL, 0, time2) - counts; if(index2 < 0) index2 = 0; } Line(indiName+"_Line1", time1, price1, Time[index2], price1, LineColor, STYLE_SOLID, 2, false); Line(indiName+"_Line2", time2, price2, Time[index2], price2, LineColor, STYLE_SOLID, 2, false); Rect(indiName+"_Rect1", time1, price1+valueFibo, Time[index2], price1, RectColor); Rect(indiName+"_Rect2", time2, price2-valueFibo, Time[index2], price2, RectColor); IndicatorSetString(INDICATOR_SHORTNAME, indiName); ChartSetInteger(chart_id, CHART_EVENT_OBJECT_DELETE, true); return(INIT_SUCCEEDED); } void OnDeinit(const int reason){ if(_UninitReason == REASON_REMOVE) objDelete(indiName); } //+------------------------------------------------------------------+ //| 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[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){ long chart_id = ChartID(); if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CLICK){ if(sparam == indiName+"_BasicLine"){ datetime time1 = (datetime)ObjectGetInteger(chart_id, indiName+"_BasicLine", OBJPROP_TIME, 0); datetime time2 = (datetime)ObjectGetInteger(chart_id, indiName+"_BasicLine", OBJPROP_TIME, 1); double price1 = ObjectGetDouble(chart_id, indiName+"_BasicLine", OBJPROP_PRICE, 0); double price2 = ObjectGetDouble(chart_id, indiName+"_BasicLine", OBJPROP_PRICE, 1); int index2; if(counts == 0) index2 = 0; else{ if(time1 <= time2) index2 = iBarShift(NULL, 0, time1) - counts; else index2 = iBarShift(NULL, 0, time2) - counts; if(index2 < 0) index2 = 0; } Line(indiName+"_Line1", time1, price1, Time[index2], price1, LineColor, STYLE_SOLID, 2, false); Line(indiName+"_Line2", time2, price2, Time[index2], price2, LineColor, STYLE_SOLID, 2, false); double valueFibo = MathAbs(price1 - price2)*Fibo/100; if(price1 <= price2){ Rect(indiName+"_Rect1", time1, price1+valueFibo, Time[index2], price1, RectColor); Rect(indiName+"_Rect2", time2, price2-valueFibo, Time[index2], price2, RectColor); } else{ Rect(indiName+"_Rect1", time1, price1, Time[index2], price1-valueFibo, RectColor); Rect(indiName+"_Rect2", time2, price2, Time[index2], price2+valueFibo, RectColor); } } } if(id == CHARTEVENT_OBJECT_DELETE){ if(sparam == indiName+"_BasicLine") ChartIndicatorDelete(chart_id, 0, indiName); } } //+------------------------------------------------------------------+ void Line(string Line_name, datetime time1, double price1, datetime time2, double price2, color Line_color, int Line_style, int Line_width, bool select){ long chart_id = ChartID(); if (ObjectFind(Line_name) != 0) { ObjectCreate(chart_id, Line_name, OBJ_TREND, 0, time1, price1, time2, price2); ObjectSetInteger(chart_id, Line_name, OBJPROP_COLOR, Line_color); ObjectSetInteger(chart_id, Line_name, OBJPROP_STYLE, Line_style); ObjectSetInteger(chart_id, Line_name, OBJPROP_WIDTH, Line_width); ObjectSetInteger(chart_id, Line_name, OBJPROP_BACK, true); ObjectSetInteger(chart_id, Line_name, OBJPROP_RAY_RIGHT, false); ObjectSetInteger(chart_id, Line_name, OBJPROP_SELECTED, select); ObjectSetInteger(chart_id, Line_name, OBJPROP_SELECTABLE, select); ObjectSetInteger(chart_id, Line_name, OBJPROP_HIDDEN, !select); } else{ ObjectMove(Line_name, 0, time1, price1); ObjectMove(Line_name, 1, time2, price2); ObjectSetInteger(chart_id, Line_name, OBJPROP_COLOR, Line_color); ObjectSetInteger(chart_id, Line_name, OBJPROP_STYLE, Line_style); ObjectSetInteger(chart_id, Line_name, OBJPROP_WIDTH, Line_width); } ChartRedraw(chart_id); } void Rect(string Rect_name, datetime time1, double price1, datetime time2, double price2, color Rect_color){ long chart_id = ChartID(); if (ObjectFind(Rect_name) != 0) { ObjectCreate(chart_id, Rect_name, OBJ_RECTANGLE, 0, time1, price1, time2, price2); ObjectSetInteger(chart_id, Rect_name, OBJPROP_COLOR, Rect_color); //ObjectSetInteger(chart_id, Rect_name, OBJPROP_STYLE, Rect_style); //ObjectSetInteger(chart_id, Rect_name, OBJPROP_WIDTH, Rect_width); ObjectSetInteger(chart_id, Rect_name, OBJPROP_BACK, true); ObjectSetInteger(chart_id, Rect_name, OBJPROP_RAY_RIGHT, false); ObjectSetInteger(chart_id, Rect_name, OBJPROP_SELECTABLE, false); ObjectSetInteger(chart_id, Rect_name, OBJPROP_HIDDEN, true); } else{ ObjectMove(Rect_name, 0, time1, price1); ObjectMove(Rect_name, 1, time2, price2); ObjectSetInteger(chart_id, Rect_name, OBJPROP_COLOR, Rect_color); } ChartRedraw(chart_id); } void objDelete(string basicName){ for(int i=ObjectsTotal();i>=0;i--){ string ObjName = ObjectName(i); if(StringFind(ObjName, basicName) >=0) ObjectDelete(ObjName); } }