#property copyright "Copyright 2013, Tono" #property link "http://tono-n-chi.com" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Black extern bool isFiveTrend = true; extern bool useBigInner = true; string TrendLineNames[5]; datetime MaxDatetime[5]; datetime MinDatetime[5]; double MaxDatePrice[5]; double MinDatePrice[5]; int Index = 0; int VLIndex = 0; double OuterFiboLevel[3] = {1.268, 1.618, 2.618}; double AlterFiboLevel[3] = {0.618, 1, 1.618}; double InnerFiboLevel[4] = {0.382, 0.5, 0.618, 0.786}; double VLFiboLevel[3] = {0.382, 0.618, 1}; int init() { IndicatorShortName("AutoFibo_From_TrendLine"); getTrendLines(); if (Index < 1) return(0); // 4 or B string FiboName; if (isFiveTrend) FiboName = "AutoFibo 4"; else FiboName = "AutoFibo B"; bool isUpTrend = MinDatePrice[0] > MaxDatePrice[0]; ObjectCreate(FiboName, OBJ_FIBO, 0, MinDatetime[0],MinDatePrice[0],MaxDatetime[0],MaxDatePrice[0]); setFiboLevel(FiboName, DarkOrange, OuterFiboLevel); createVLine(FiboName, 0, DarkOrange, VLFiboLevel); if (Index < 2) return(0); // 3 or A if (isFiveTrend) FiboName = "AutoFibo 3"; else FiboName = "AutoFibo A"; getAlternativeFibo(FiboName, 1, Red); if (isFiveTrend && Index >= 4) { // 1 getAlternativeFibo("AutoFibo 1", 3, Teal); } if (!useBigInner || (!((isFiveTrend && Index >= 5) || (!isFiveTrend && Index >= 3)))) { return(0); } // big inner FiboName = "AutoFibo inner"; int InnerIdx; if (isFiveTrend) InnerIdx = 4; else InnerIdx = 2; ObjectCreate(FiboName, OBJ_FIBO, 0, MinDatetime[InnerIdx],MinDatePrice[InnerIdx],MaxDatetime[InnerIdx],MaxDatePrice[InnerIdx]); setFiboLevel(FiboName, Teal, InnerFiboLevel); return(0); } void getTrendLines() { string TmpTrendLineNames[5]; datetime TmpMaxDatetime[5]; datetime TmpMinDatetime[5]; double TmpMaxDatePrice[5]; double TmpMinDatePrice[5]; for (int i = 0; i < ObjectsTotal(); i++) { string lineName = ObjectName(i); if (ObjectType(lineName) == OBJ_TREND) { Print("get! name:" + lineName); TmpTrendLineNames[Index] = lineName; datetime time1 = ObjectGet(lineName, OBJPROP_TIME1); datetime time2 = ObjectGet(lineName, OBJPROP_TIME2); double price1 = ObjectGet(lineName, OBJPROP_PRICE1); double price2 = ObjectGet(lineName, OBJPROP_PRICE2); if (time1 < time2) { TmpMaxDatetime[Index] = time2; TmpMinDatetime[Index] = time1; TmpMaxDatePrice[Index] = price2; TmpMinDatePrice[Index] = price1; } else { TmpMaxDatetime[Index] = time1; TmpMinDatetime[Index] = time2; TmpMaxDatePrice[Index] = price1; TmpMinDatePrice[Index] = price2; } Index++; if (Index > 4 ) break; } } ArrayCopy(MaxDatetime, TmpMaxDatetime, 0, 0); ArraySort(MaxDatetime, WHOLE_ARRAY, 0, MODE_DESCEND); for (i = 0; i < Index; i++) { for (int j = 0; j < Index; j++) { if (MaxDatetime[i] == TmpMaxDatetime[j]) { TrendLineNames[i] = TmpTrendLineNames[j]; MinDatetime[i] = TmpMinDatetime[j]; MinDatePrice[i] = TmpMinDatePrice[j]; MaxDatePrice[i] = TmpMaxDatePrice[j]; } } } } void getAlternativeFibo(string FName, int idx, color LColor) { int MaxDateBar = ObjectGetShiftByValue(TrendLineNames[idx], MaxDatePrice[idx]); int MinDateBar = ObjectGetShiftByValue(TrendLineNames[idx], MinDatePrice[idx]); int BarCount = MinDateBar - MaxDateBar; int BaseDateBar = ObjectGetShiftByValue(TrendLineNames[0], MaxDatePrice[0]); int ShiftDist = BaseDateBar - BarCount; datetime DatetimeDist = iTime(NULL, 0, ShiftDist); if (DatetimeDist == 0) { DatetimeDist = MaxDatetime[0] + (MaxDatetime[idx] - MinDatetime[idx]); } double PriceDist = MaxDatePrice[idx] - MinDatePrice[idx]; ObjectCreate(FName, OBJ_FIBO, 0, DatetimeDist ,MaxDatePrice[0] + PriceDist, MaxDatetime[0], MaxDatePrice[0]); setFiboLevel(FName, LColor, AlterFiboLevel); createVLine(FName, idx,LColor, VLFiboLevel); } void setFiboLevel(string FName, color LColor, double FiboLevel[]) { int LevelSize = ArraySize(FiboLevel); ObjectSet(FName, OBJPROP_FIBOLEVELS, LevelSize); for (int i = 0; i < LevelSize; i++) { ObjectSet(FName, OBJPROP_FIRSTLEVEL + i, FiboLevel[i]); ObjectSetFiboDescription(FName, i, FName + " "+ DoubleToStr((FiboLevel[i] * 100), 1)); } ObjectSet(FName, OBJPROP_LEVELCOLOR, LColor); } void createVLine(string FName, int idx, color LColor, double FiboLevel[]){ int MaxDateBar = ObjectGetShiftByValue(TrendLineNames[idx], MaxDatePrice[idx]); int MinDateBar = ObjectGetShiftByValue(TrendLineNames[idx], MinDatePrice[idx]); int BarCount = MinDateBar - MaxDateBar; int BaseDateBar = ObjectGetShiftByValue(TrendLineNames[0], MaxDatePrice[0]); for (int i = 0; i < ArraySize(FiboLevel); i++) { int FiboBarCount = BarCount * FiboLevel[i]; int ShiftDist = BaseDateBar - FiboBarCount; datetime DatetimeDist = iTime(NULL, 0, ShiftDist); if (DatetimeDist == 0) { DatetimeDist = MaxDatetime[0] + (MaxDatetime[idx] - MinDatetime[idx]); } ObjectCreate("AutoFibo VL" + VLIndex, OBJ_VLINE, 0, DatetimeDist, 0); ObjectSet("AutoFibo VL" + VLIndex, OBJPROP_COLOR, LColor); VLIndex++; } } int deinit() { ObjectDelete("AutoFibo 4"); ObjectDelete("AutoFibo B"); ObjectDelete("AutoFibo 3"); ObjectDelete("AutoFibo A"); ObjectDelete("AutoFibo 1"); ObjectDelete("AutoFibo inner"); for (int i = 0; i < 20; i++) { ObjectDelete("AutoFibo VL" + i); } } int start() { return(0); }