//+------------------------------------------------------------------+
//|                                       keys_SynchroChart_Line.mq4 |
//|                                                   Copyright 2022 |
//|                                           https://www.fxnav.net/ |
//+------------------------------------------------------------------+

/********************************************************************
著作権は「株式会社キーストン」が有しております。
無断再配布、再編を禁止します。
使用した事によって発生した損害は、一切補償しません。
*********************************************************************/

#property copyright "FXキーストン"
#property link      "https://www.fxnav.net/mt4navi/synchro_chart_line/"

#property description "トレンドラインを他の時間足チャートにもシンクロしてくれるMT4/MT5インジケーターを無料公開！【keys_SynchroChart_Line】"
#property description "https://www.fxnav.net/mt4navi/synchro_chart_line/"

#property version   "2.7"
#property strict
#property indicator_chart_window

enum sync {

    allChart = 1,     //全ての時間足で同期
    lowerChart = 2,   //下位足限定で同期
    upperChart = 3,    //上位足限定で同期
    sameChart = 4     //同じ時間足で同期

};

input sync setting1 = 1;  //同期する時間足を指定

sinput string group = "";  //【時間足個別設定】

input bool boolM1 = true;  //1分足同期
input bool boolM5 = true;  //5分足同期
input bool boolM15 = true;  //15分足同期
input bool boolM30 = true;  //30分足同期
input bool boolH1 = true;  //1時間足同期
input bool boolH4 = true;  //4時間足同期
input bool boolD1 = true;  //日足同期
input bool boolW1 = true;  //週足同期
input bool boolMN = true;  //月足同期

sinput string group1 = "";  //【オブジェクト個別設定】

input bool boolOBJ_VLINE = true;        //垂直線同期
input bool boolOBJ_HLINE = true;        //水平線同期
input bool boolOBJ_TREND = true;        //トレンドライン同期
input bool boolOBJ_LINE = true;        //その他のライン同期

input bool boolOBJ_CHANNEL = true;     //チャネル同期
input bool boolOBJ_GANN = true;        //ギャン同期
input bool boolOBJ_FIBO = true;        //フィボナッチ同期
input bool boolOBJ_SHAPE = true;       //図形同期
input bool boolOBJ_ARROW = true;       //矢印類同期
input bool boolOBJ_GRAPHIC = true;     //グラフィック同期

input string obj_name_exclusion = "";   //同期を除外するオブジェクト名の一部（複数ある場合「,」で区切る）

string object_exclude[];   //除外するオブジェクト名
bool OneClick = false;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{

    ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);
    ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true);
    ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);

    StringSplit(obj_name_exclusion, StringGetCharacter(",",0) , object_exclude);

    return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(rates_total);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

    if(id == CHARTEVENT_MOUSE_MOVE) {

        if((uint)sparam == 1) OneClick = true;
    }

    if(id == CHARTEVENT_OBJECT_CREATE) {

        string objName = sparam;

        if(!objNameCheck2(objName)) return;
        if(OneClick == false) return;

        Synchro((ENUM_CHART_EVENT)id, objName);

    }

    if(id == CHARTEVENT_OBJECT_CHANGE || id == CHARTEVENT_OBJECT_DRAG) {

        string objName = sparam;

        if(!objNameCheck2(objName)) return;

        Synchro((ENUM_CHART_EVENT)id, objName);

    }

    if(id == CHARTEVENT_OBJECT_DELETE) {

        string objName = sparam;

        if(!objNameCheck(objName)) return;

        long currChart = ChartFirst();

        while(true) {

            if(boolMatchChart(currChart)) {

                ObjectDelete(currChart, objName);
                ChartRedraw(currChart);

            }

            //ObjectDelete(currChart, objName);

            if(ChartNext(currChart) < 0) break;
            else currChart = ChartNext(currChart);
        }
    }

    if(id == CHARTEVENT_OBJECT_CLICK) {

        string objName = sparam;

        if(!objNameCheck2(objName)) return;

        long objChartID = ChartID();

        bool objSelectable = ObjectGetInteger(objChartID, objName, OBJPROP_SELECTABLE);
        bool objSelected = ObjectGetInteger(objChartID, objName, OBJPROP_SELECTED);

        long currChart = ChartFirst();

        while(true) {

            if(boolMatchChart(currChart)) {

                ObjectSetInteger(currChart, objName, OBJPROP_SELECTABLE, objSelectable);
                ObjectSetInteger(currChart, objName, OBJPROP_SELECTED, objSelected);

                ChartRedraw(currChart);

            }

            if(ChartNext(currChart) < 0) break;
            else currChart = ChartNext(currChart);
            //ChartSymbol(currChart);
        }
    }
}

//+------------------------------------------------------------------+
bool boolMatchChart(long id)
{

    if(ChartSymbol(id) == _Symbol && id != ChartID() &&
            ((setting1 == 1) ||
             (setting1 == 2 && _Period>=ChartPeriod(id)) ||
             (setting1 == 3 && _Period<=ChartPeriod(id)) ||
             (setting1 == 4 && _Period==ChartPeriod(id)))) {

    } else return false;

    if((boolM1 && ChartPeriod(id) == PERIOD_M1) ||
            (boolM5 && ChartPeriod(id) == PERIOD_M5) ||
            (boolM15 && ChartPeriod(id) == PERIOD_M15) ||
            (boolM30 && ChartPeriod(id) == PERIOD_M30) ||
            (boolH1 && ChartPeriod(id) == PERIOD_H1) ||
            (boolH4 && ChartPeriod(id) == PERIOD_H4) ||
            (boolD1 && ChartPeriod(id) == PERIOD_D1) ||
            (boolW1 && ChartPeriod(id) == PERIOD_W1) ||
            (boolMN && ChartPeriod(id) == PERIOD_MN1)) {

    } else return false;

    return true;

}


//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool objNameCheck(string name)
{
    if(StringFind(name, "Vertical Line") == 0 ||
            StringFind(name, "Horizontal Line") == 0 ||
            StringFind(name, "Trendline") == 0 ||
            StringFind(name, "Trend By Angle") == 0 ||
            StringFind(name, "Cycle Lines") == 0 ||
            StringFind(name, "Channel") == 0 ||
            StringFind(name, "Equidistant Channel") == 0 ||
            StringFind(name, "StdDev Channel") == 0 ||
            StringFind(name, "Regression Channel") == 0 ||
            StringFind(name, "Andrews Pitchfork") == 0 ||
            StringFind(name, "Gann") == 0 ||
            StringFind(name, "Fibo") == 0 ||
            StringFind(name, "Expansion") == 0 ||
            StringFind(name, "Rectangle") == 0 ||
            StringFind(name, "Triangle") == 0 ||
            StringFind(name, "Ellipse") == 0 ||
            StringFind(name, "Arrow") == 0 ||
            StringFind(name, "Text") == 0 ||
            StringFind(name, "Label") == 0) return(true);

    return(false);

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool objNameCheck2(string obj_name)
{

    int exclude_counts = ArraySize(object_exclude);

    if(exclude_counts > 0) {
        for(int i=0; i<exclude_counts; i++) {
            if(StringFind(obj_name, object_exclude[i]) >= 0) return(false);
        }
    }

    ENUM_OBJECT obj_type = (ENUM_OBJECT)ObjectGetInteger(0, obj_name, OBJPROP_TYPE);

    switch(obj_type) {

    case OBJ_VLINE:
        if(StringFind(obj_name, "Vertical Line ") == 0) return(true);
        else return(false);

    case OBJ_HLINE:
        if(StringFind(obj_name, "Horizontal Line ") == 0) return(true);
        else return(false);

    case OBJ_TREND:
        if(StringFind(obj_name, "Trendline ") == 0) return(true);
        else return(false);

    case OBJ_TRENDBYANGLE:
        if(StringFind(obj_name, "Trend By Angle ") == 0) return(true);
        else return(false);

    case OBJ_CYCLES:
        if(StringFind(obj_name, "Cycle Lines ") == 0) return(true);
        else return(false);

    case OBJ_CHANNEL:
        if(StringFind(obj_name, "Channel ") == 0) return(true);
        else return(false);

    case OBJ_STDDEVCHANNEL:
        if(StringFind(obj_name, "StdDev Channel ") == 0) return(true);
        else return(false);

    case OBJ_REGRESSION:
        if(StringFind(obj_name, "Regression Channel ") == 0) return(true);
        else return(false);

    case OBJ_PITCHFORK:
        if(StringFind(obj_name, "Andrews Pitchfork ") == 0) return(true);
        else return(false);

    case OBJ_GANNLINE:
        if(StringFind(obj_name, "Gann Line ") == 0) return(true);
        else return(false);

    case OBJ_GANNFAN:
        if(StringFind(obj_name, "Gann Fan ") == 0) return(true);
        else return(false);

    case OBJ_GANNGRID:
        if(StringFind(obj_name, "Gann Grid ") == 0) return(true);
        else return(false);

    case OBJ_FIBO:
        if(StringFind(obj_name, "Fibo ") == 0) return(true);
        else return(false);

    case OBJ_FIBOTIMES:
        if(StringFind(obj_name, "Fibo TimeZones ") == 0) return(true);
        else return(false);

    case OBJ_FIBOFAN:
        if(StringFind(obj_name, "Fibo Fan ") == 0) return(true);
        else return(false);

    case OBJ_FIBOARC:
        if(StringFind(obj_name, "Fibo Arcs ") == 0) return(true);
        else return(false);

    case OBJ_FIBOCHANNEL:
        if(StringFind(obj_name, "Fibo Channel ") == 0) return(true);
        else return(false);

    case OBJ_EXPANSION:
        if(StringFind(obj_name, "Expansion ") == 0) return(true);
        else return(false);

    case OBJ_RECTANGLE:
        if(StringFind(obj_name, "Rectangle ") == 0) return(true);
        else return(false);

    case OBJ_TRIANGLE:
        if(StringFind(obj_name, "Triangle ") == 0) return(true);
        else return(false);

    case OBJ_ELLIPSE:
        if(StringFind(obj_name, "Ellipse ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_THUMB_UP:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_THUMB_DOWN:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_UP:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_DOWN:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_STOP:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_CHECK:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_LEFT_PRICE:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_RIGHT_PRICE:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_BUY:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW_SELL:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_ARROW:
        if(StringFind(obj_name, "Arrow ") == 0) return(true);
        else return(false);

    case OBJ_TEXT:
        if(StringFind(obj_name, "Text ") == 0) return(true);
        else return(false);

    case OBJ_LABEL:
        if(StringFind(obj_name, "Label ") == 0) return(true);
        else return(false);

    case OBJ_BUTTON:
        if(StringFind(obj_name, "Button ") == 0) return(true);
        else return(false);

    case OBJ_BITMAP:
        if(StringFind(obj_name, "Bitmap ") == 0) return(true);
        else return(false);

    case OBJ_BITMAP_LABEL:
        if(StringFind(obj_name, "Bitmap Label ") == 0) return(true);
        else return(false);

    case OBJ_EDIT:
        if(StringFind(obj_name, "Edit ") == 0) return(true);
        else return(false);

    case OBJ_EVENT:
        if(StringFind(obj_name, "Event ") == 0) return(true);
        else return(false);

    case OBJ_RECTANGLE_LABEL:
        if(StringFind(obj_name, "Rectangle Label ") == 0) return(true);
        else return(false);

    default:
        return(false);

    }

    return(false);

}


//+------------------------------------------------------------------+
bool objTypesCheck(string obj_name)
{

    ENUM_OBJECT obj_type = (ENUM_OBJECT)ObjectGetInteger(0, obj_name, OBJPROP_TYPE);

    //垂直線
    if(obj_type == OBJ_VLINE) {

        if(boolOBJ_VLINE) return(true);
        else return(false);

    }

    //垂直線
    if(obj_type == OBJ_HLINE) {

        if(boolOBJ_HLINE) return(true);
        else return(false);

    }

    //トレンドライン
    if(obj_type == OBJ_TREND) {

        if(boolOBJ_TREND) return(true);
        else return(false);

    }

    //その他のライン系
    if(obj_type == OBJ_TRENDBYANGLE || obj_type == OBJ_CYCLES) {

        if(boolOBJ_LINE) return(true);
        else return(false);

    }

    //チャネル系
    if(obj_type == OBJ_CHANNEL || obj_type == OBJ_STDDEVCHANNEL || obj_type == OBJ_REGRESSION || obj_type == OBJ_PITCHFORK) {

        if(boolOBJ_CHANNEL) return(true);
        else return(false);

    }

    //ギャン系
    if(obj_type == OBJ_GANNLINE || obj_type == OBJ_GANNFAN || obj_type == OBJ_GANNGRID) {

        if(boolOBJ_GANN) return(true);
        else return(false);

    }

    //フィボナッチ系
    if(obj_type == OBJ_FIBO || obj_type == OBJ_FIBOTIMES || obj_type == OBJ_FIBOFAN || obj_type == OBJ_FIBOARC || obj_type == OBJ_FIBOCHANNEL || obj_type == OBJ_EXPANSION) {

        if(boolOBJ_FIBO) return(true);
        else return(false);

    }

    //図形系
    if(obj_type == OBJ_RECTANGLE || obj_type == OBJ_TRIANGLE || obj_type == OBJ_ELLIPSE) {

        if(boolOBJ_SHAPE) return(true);
        else return(false);

    }

    //矢印系
    if(obj_type == OBJ_ARROW_THUMB_UP || obj_type == OBJ_ARROW_THUMB_DOWN ||
            obj_type == OBJ_ARROW_UP || obj_type == OBJ_ARROW_DOWN || obj_type == OBJ_ARROW_STOP || obj_type == OBJ_ARROW_CHECK ||
            obj_type == OBJ_ARROW_LEFT_PRICE || obj_type == OBJ_ARROW_RIGHT_PRICE ||
            obj_type == OBJ_ARROW_BUY || obj_type == OBJ_ARROW_SELL ||
            obj_type == OBJ_ARROW) {

        if(boolOBJ_ARROW) return(true);
        else return(false);

    }

    //グラフィック系
    if(obj_type == OBJ_TEXT || obj_type == OBJ_LABEL || obj_type == OBJ_BUTTON || obj_type == OBJ_BITMAP || obj_type == OBJ_BITMAP_LABEL || obj_type == OBJ_EDIT ||
            obj_type == OBJ_ARROW_LEFT_PRICE || obj_type == OBJ_ARROW_RIGHT_PRICE || obj_type == OBJ_EVENT || obj_type == OBJ_RECTANGLE_LABEL) {

        if(boolOBJ_GRAPHIC) return(true);
        else return(false);

    }

    return(true);

}


//+------------------------------------------------------------------+
void Synchro(ENUM_CHART_EVENT event_id, string synchro_name)
{

    if(objTypesCheck(synchro_name) == false) return;

    string objName = synchro_name;

    long objChartID = ChartID();

    //ENUM_OBJECT_PROPERTY_INTEGER
    ENUM_OBJECT objType = (ENUM_OBJECT)ObjectGetInteger(objChartID, objName, OBJPROP_TYPE);

    color objColor = (color)ObjectGetInteger(objChartID, objName, OBJPROP_COLOR);

    ENUM_LINE_STYLE objStyle = (ENUM_LINE_STYLE)ObjectGetInteger(objChartID, objName, OBJPROP_STYLE);

    int objWidth = (int)ObjectGetInteger(objChartID, objName, OBJPROP_WIDTH);
    bool objBack = ObjectGetInteger(objChartID, objName, OBJPROP_BACK);
    long objZorder = (long)ObjectGetInteger(objChartID, objName, OBJPROP_ZORDER);

    bool objFill = false;

    if(objType == OBJ_RECTANGLE || objType == OBJ_TRIANGLE || objType == OBJ_ELLIPSE || objType == OBJ_CHANNEL || objType == OBJ_STDDEVCHANNEL || objType == OBJ_REGRESSION) {
        objFill = (bool)ObjectGetInteger(objChartID, objName, OBJPROP_FILL);
    }

    bool objHidden = ObjectGetInteger(objChartID, objName, OBJPROP_HIDDEN);
    bool objSelected = ObjectGetInteger(objChartID, objName, OBJPROP_SELECTED);
    bool objReadonly = ObjectGetInteger(objChartID, objName, OBJPROP_READONLY);

    datetime objTime = (datetime)ObjectGetInteger(objChartID, objName, OBJPROP_TIME, 0);
    datetime objTime1 = (datetime)ObjectGetInteger(objChartID, objName, OBJPROP_TIME, 1);
    datetime objTime2 = (datetime)ObjectGetInteger(objChartID, objName, OBJPROP_TIME, 2);
    datetime objTime3 = 0;
    datetime objTime4 = 0;

    bool objSelectable = ObjectGetInteger(objChartID, objName, OBJPROP_SELECTABLE);

    //OBJPROP_CREATETIME

    int objLevels = 0;
    color objLevelColor = clrNONE;
    ENUM_LINE_STYLE objLevelStyle = 0;
    int objLevelWidth = 0;

    double objLevelValue[];
    string objLevelText[];

    if(objType == OBJ_FIBO || objType == OBJ_FIBOTIMES || objType == OBJ_FIBOFAN || objType == OBJ_FIBOARC || objType == OBJ_FIBOCHANNEL || objType == OBJ_EXPANSION) {

        objLevels = (int)ObjectGetInteger(objChartID, objName, OBJPROP_LEVELS);

        ArrayResize(objLevelValue, objLevels);
        ArrayResize(objLevelText, objLevels);

        objLevelColor = (color)ObjectGetInteger(objChartID, objName, OBJPROP_LEVELCOLOR);
        objLevelStyle = (ENUM_LINE_STYLE)ObjectGetInteger(objChartID, objName, OBJPROP_LEVELSTYLE);
        objLevelWidth = (int)ObjectGetInteger(objChartID, objName, OBJPROP_LEVELWIDTH);

        for(int i = 0; i < objLevels; i++) {

            ObjectGetDouble(objChartID, objName, OBJPROP_LEVELVALUE, i, objLevelValue[i]);
            ObjectGetString(objChartID, objName, OBJPROP_LEVELTEXT, i, objLevelText[i]);
        }
    }

    ENUM_ALIGN_MODE objAlign = 0;
    if(objType == OBJ_EDIT) {
        objAlign = (ENUM_ALIGN_MODE)ObjectGetInteger(objChartID, objName, OBJPROP_ALIGN);
    }

    int objFontSize = (int)ObjectGetInteger(objChartID, objName, OBJPROP_FONTSIZE);

    bool objRayRight = ObjectGetInteger(objChartID, objName, OBJPROP_RAY_RIGHT);
    bool objRayLeft = ObjectGetInteger(objChartID, objName, OBJPROP_RAY_LEFT);
    bool objRay = ObjectGetInteger(objChartID, objName, OBJPROP_RAY);

    bool objEllipse = false;
    if(objType == OBJ_FIBOARC) {
        objEllipse = ObjectGetInteger(objChartID, objName, OBJPROP_ELLIPSE);
    }

    uchar objArrowCode = (uchar)ObjectGetInteger(objChartID, objName, OBJPROP_ARROWCODE);
    uint objTimeframes = (uint)ObjectGetInteger(objChartID, objName, OBJPROP_TIMEFRAMES);

    ENUM_ARROW_ANCHOR objArrowAnchor = 0;
    ENUM_ANCHOR_POINT objAnchorPoint = 0;

    if(objType == OBJ_ARROW_THUMB_UP || objType == OBJ_ARROW_THUMB_DOWN ||
            objType == OBJ_ARROW_UP || objType == OBJ_ARROW_DOWN ||
            objType == OBJ_ARROW_STOP || objType == OBJ_ARROW_CHECK ||
            objType == OBJ_ARROW_LEFT_PRICE || objType == OBJ_ARROW_RIGHT_PRICE ||
            objType == OBJ_ARROW_BUY || objType == OBJ_ARROW_SELL || objType == OBJ_ARROW) {

        objArrowAnchor = (ENUM_ARROW_ANCHOR)ObjectGetInteger(objChartID, objName, OBJPROP_ANCHOR);

    }

    if(objType == OBJ_LABEL || objType == OBJ_BITMAP_LABEL || objType == OBJ_TEXT) {
        objAnchorPoint = (ENUM_ANCHOR_POINT)ObjectGetInteger(objChartID, objName, OBJPROP_ANCHOR);
    }

    int objXdistance = 0;
    int objYdistance = 0;

    if(objType == OBJ_BUTTON || objType == OBJ_RECTANGLE_LABEL || objType == OBJ_EDIT || objType == OBJ_CHART) {
        objXdistance = (int)ObjectGetInteger(objChartID, objName, OBJPROP_XDISTANCE);
        objYdistance = (int)ObjectGetInteger(objChartID, objName, OBJPROP_YDISTANCE);
    }

    ENUM_GANN_DIRECTION objDirectiion = 0;

    if(objType == OBJ_GANNFAN || objType == OBJ_GANNGRID) {
        objDirectiion = (ENUM_GANN_DIRECTION)ObjectGetInteger(objChartID, objName, OBJPROP_DIRECTION);
    }

    bool objState = (bool)ObjectGetInteger(objChartID, objName, OBJPROP_STATE);

    //OBBJPROP_CHART_ID

    int objXsize = 0;
    int objYsize = 0;

    if(objType == OBJ_LABEL || objType == OBJ_BUTTON || objType == OBJ_CHART || objType == OBJ_BITMAP || objType == OBJ_BITMAP_LABEL || objType == OBJ_EDIT || objType == OBJ_RECTANGLE_LABEL) {
        objXsize = (int)ObjectGetInteger(objChartID, objName, OBJPROP_XSIZE);
        objYsize = (int)ObjectGetInteger(objChartID, objName, OBJPROP_YSIZE);
    }

    int objXoffset = 0;
    int objYoffset = 0;

    if(objType == OBJ_BITMAP_LABEL || objType == OBJ_BITMAP) {
        objXsize = (int)ObjectGetInteger(objChartID, objName, OBJPROP_XOFFSET);
        objYsize = (int)ObjectGetInteger(objChartID, objName, OBJPROP_YOFFSET);
    }

    ENUM_TIMEFRAMES objPeriod = (ENUM_TIMEFRAMES)ObjectGetInteger(objChartID, objName, OBJPROP_PERIOD);

    bool objDateScale = (bool)ObjectGetInteger(objChartID, objName, OBJPROP_DATE_SCALE);
    bool objPriceScale = (bool)ObjectGetInteger(objChartID, objName, OBJPROP_PRICE_SCALE);
    int objChartScale = (int)ObjectGetInteger(objChartID, objName, OBJPROP_CHART_SCALE);

    color objBgcolor = clrNONE;

    if(objType == OBJ_EDIT || objType == OBJ_BUTTON || objType == OBJ_RECTANGLE_LABEL) {
        objBgcolor = (color)ObjectGetInteger(objChartID, objName, OBJPROP_BGCOLOR);
    }

    ENUM_BASE_CORNER objCorner = (ENUM_BASE_CORNER)ObjectGetInteger(objChartID, objName, OBJPROP_CORNER);
    ENUM_BORDER_TYPE objBorderType = (ENUM_BORDER_TYPE)ObjectGetInteger(objChartID, objName, OBJPROP_BORDER_TYPE);

    color objBorderColor = clrNONE;

    if(objType == OBJ_EDIT || objType == OBJ_BUTTON) {
        objBorderColor = (color)ObjectGetInteger(objChartID, objName, OBJPROP_BORDER_COLOR);
    }


    //ENUM_OBJECT_PROPERTY_DOUBLE
    double objPrice = ObjectGetDouble(objChartID, objName, OBJPROP_PRICE, 0);
    double objPrice1 = ObjectGetDouble(objChartID, objName, OBJPROP_PRICE, 1);
    double objPrice2 = ObjectGetDouble(objChartID, objName, OBJPROP_PRICE, 2);
    double objPrice3 = 0.0;
    double objPrice4 = 0.0;

    double objScale = 0.0;

    if(objType == OBJ_GANNFAN || objType == OBJ_GANNGRID || OBJ_GANNLINE || OBJ_FIBOARC) {
        objScale = ObjectGetDouble(objChartID, objName, OBJPROP_SCALE);
    }

    double objAngle = ObjectGetDouble(objChartID, objName, OBJPROP_ANGLE);
    double objDeviation = ObjectGetDouble(objChartID, objName, OBJPROP_DEVIATION);

    //ENUM_OBJECT_PROPERTY_STRING
    string objText = ObjectGetString(objChartID, objName, OBJPROP_TEXT);
    string objTooltip = ObjectGetString(objChartID, objName, OBJPROP_TOOLTIP);
    string objFont = ObjectGetString(objChartID, objName, OBJPROP_FONT);

    string objBmpFile = "";
    string objBmpFile1 = "";

    if(objType == OBJ_BITMAP_LABEL) {
        objBmpFile = ObjectGetString(objChartID, objName, OBJPROP_BMPFILE, 0);
        objBmpFile1 = ObjectGetString(objChartID, objName, OBJPROP_BMPFILE, 1);
    }

    long currChart = ChartFirst();

    while(true) {

        if(boolMatchChart(currChart) == false || currChart == objChartID) {

            if(ChartNext(currChart) < 0) break;
            else currChart = ChartNext(currChart);

            continue;

        }

        if(event_id == CHARTEVENT_OBJECT_CREATE) {

            //クリックしながら表示（３パラメーター系）
            if(objType == OBJ_PITCHFORK ||objType == OBJ_TRIANGLE || objType == OBJ_ELLIPSE) {

                //最初のワンクリックで表示するのでパラメーターは１つだけ
                if(ObjectFind(currChart, objName) < 0) ObjectCreate(currChart, objName, objType, 0, 0, 0.0);

            } else {

                //他のオブジェクトはドラッグするタイプ
                if(ObjectFind(currChart, objName) < 0)
                    ObjectCreate(currChart, objName, objType, 0, objTime, objPrice, objTime1, objPrice1, objTime2, objPrice2);
            }

        } else {

            ObjectSetInteger(currChart, objName, OBJPROP_TIME, 0, objTime);
            ObjectSetInteger(currChart, objName, OBJPROP_TIME, 1, objTime1);
            ObjectSetInteger(currChart, objName, OBJPROP_TIME, 2, objTime2);

            ObjectSetDouble(currChart, objName, OBJPROP_PRICE, 0, objPrice);
            ObjectSetDouble(currChart, objName, OBJPROP_PRICE, 1, objPrice1);
            ObjectSetDouble(currChart, objName, OBJPROP_PRICE, 2, objPrice2);

        }


        if(event_id == CHARTEVENT_OBJECT_CHANGE) {

            if(objType != ObjectGetInteger(currChart, objName, OBJPROP_TYPE)) {

                //ObjectDelete(currChart, objName);
                //ChartRedraw(currChart);
                //if(ObjectFind(currChart, objName) < 0) ObjectCreate(currChart, objName, objType, 0, objTime, objPrice);

            }
        }

        ObjectSetInteger(currChart, objName, OBJPROP_COLOR, objColor);
        ObjectSetInteger(currChart, objName, OBJPROP_STYLE, objStyle);
        ObjectSetInteger(currChart, objName, OBJPROP_WIDTH, objWidth);
        //ObjectSetInteger(currChart, objName, OBJPROP_BACK, objBack);
        ObjectSetInteger(currChart, objName, OBJPROP_ZORDER, objZorder);

        if(objType == OBJ_RECTANGLE || objType == OBJ_TRIANGLE || objType == OBJ_ELLIPSE || objType == OBJ_CHANNEL || objType == OBJ_STDDEVCHANNEL || objType == OBJ_REGRESSION) {

            //OBJPROP_FILLが機能しない
            ObjectSetInteger(currChart, objName, OBJPROP_BACK, true);
            ObjectSetInteger(objChartID, objName, OBJPROP_FILL, objFill);

        }

        //OBJPROP_FILLを機能させるためここに移動
        ObjectSetInteger(currChart, objName, OBJPROP_BACK, objBack);

        ObjectSetInteger(objChartID, objName, OBJPROP_HIDDEN, objHidden);

        ObjectSetInteger(currChart, objName, OBJPROP_SELECTED, true);

        ObjectSetInteger(currChart, objName, OBJPROP_READONLY, objReadonly);

        ObjectSetInteger(currChart, objName, OBJPROP_SELECTABLE, objSelectable);

        if(objType == OBJ_FIBO || objType == OBJ_FIBOTIMES || objType == OBJ_FIBOFAN || objType == OBJ_FIBOARC || objType == OBJ_FIBOCHANNEL || objType == OBJ_EXPANSION) {

            ObjectSetInteger(currChart, objName, OBJPROP_LEVELS, objLevels);

            for(int i = 0; i < objLevels; i++) {
                ObjectSetInteger(currChart, objName, OBJPROP_LEVELCOLOR, i, objLevelColor);
                ObjectSetInteger(currChart, objName, OBJPROP_LEVELSTYLE, i, objLevelStyle);
                ObjectSetInteger(currChart, objName, OBJPROP_LEVELWIDTH, i, objLevelWidth);
                ObjectSetDouble(currChart, objName, OBJPROP_LEVELVALUE, i, objLevelValue[i]);
                ObjectSetString(currChart, objName, OBJPROP_LEVELTEXT, i, objLevelText[i]);
            }
        }

        if(objType == OBJ_EDIT) {
            ObjectSetInteger(currChart, objName, OBJPROP_ALIGN, objAlign);
        }

        ObjectSetInteger(currChart, objName, OBJPROP_FONTSIZE, objFontSize);
        ObjectSetInteger(currChart, objName, OBJPROP_RAY_RIGHT, objRayRight);
        ObjectSetInteger(currChart, objName, OBJPROP_RAY_LEFT, objRayLeft);
        ObjectSetInteger(currChart, objName, OBJPROP_RAY, objRay);

        if(objType == OBJ_FIBOARC) {
            ObjectSetInteger(currChart, objName, OBJPROP_ELLIPSE, objEllipse);
        }

        ObjectSetInteger(currChart, objName, OBJPROP_ARROWCODE, objArrowCode);
        ObjectSetInteger(currChart, objName, OBJPROP_TIMEFRAMES, objTimeframes);

        if(objType == OBJ_ARROW_THUMB_UP || objType == OBJ_ARROW_THUMB_DOWN ||
                objType == OBJ_ARROW_UP || objType == OBJ_ARROW_DOWN ||
                objType == OBJ_ARROW_STOP || objType == OBJ_ARROW_CHECK ||
                objType == OBJ_ARROW_LEFT_PRICE || objType == OBJ_ARROW_RIGHT_PRICE ||
                objType == OBJ_ARROW_BUY || objType == OBJ_ARROW_SELL || objType == OBJ_ARROW) {

            ObjectSetInteger(currChart, objName, OBJPROP_ANCHOR, objArrowAnchor);

        }

        if(objType == OBJ_LABEL || objType == OBJ_BITMAP_LABEL || objType == OBJ_TEXT) {
            ObjectSetInteger(currChart, objName, OBJPROP_ANCHOR, objAnchorPoint);
        }

        if(objType == OBJ_BUTTON || objType == OBJ_RECTANGLE_LABEL || objType == OBJ_EDIT || objType == OBJ_CHART) {
            ObjectSetInteger(currChart, objName, OBJPROP_XDISTANCE, objXdistance);
            ObjectSetInteger(currChart, objName, OBJPROP_YDISTANCE, objYdistance);
        }

        if(objType == OBJ_GANNFAN || objType == OBJ_GANNGRID) {
            ObjectSetInteger(currChart, objName, OBJPROP_DIRECTION, objDirectiion);
        }

        ObjectSetInteger(currChart, objName, OBJPROP_STATE, objState);

        if(objType == OBJ_LABEL || objType == OBJ_BUTTON || objType == OBJ_CHART || objType == OBJ_BITMAP || objType == OBJ_BITMAP_LABEL || objType == OBJ_EDIT || objType == OBJ_RECTANGLE_LABEL) {
            ObjectSetInteger(currChart, objName, OBJPROP_XSIZE, objXsize);
            ObjectSetInteger(currChart, objName, OBJPROP_YSIZE, objYsize);
        }

        if(objType == OBJ_BITMAP_LABEL || objType == OBJ_BITMAP) {
            ObjectSetInteger(currChart, objName, OBJPROP_XOFFSET, objXoffset);
            ObjectSetInteger(currChart, objName, OBJPROP_YOFFSET, objYoffset);
        }

        ObjectSetInteger(currChart, objName, OBJPROP_PERIOD, objPeriod);

        ObjectSetInteger(currChart, objName, OBJPROP_DATE_SCALE, objDateScale);
        ObjectSetInteger(currChart, objName, OBJPROP_PRICE_SCALE, objPriceScale);
        ObjectSetInteger(currChart, objName, OBJPROP_CHART_SCALE, objChartScale);

        ObjectSetInteger(currChart, objName, OBJPROP_CORNER, objCorner);
        ObjectSetInteger(currChart, objName, OBJPROP_BORDER_TYPE, objBorderType);

        if(objType == OBJ_EDIT || objType == OBJ_BUTTON) {
            ObjectSetInteger(currChart, objName, OBJPROP_BORDER_COLOR, objBorderColor);
        }


        //ENUM_OBJECT_PROPERTY_DOUBLE

        if(objType == OBJ_GANNFAN || objType == OBJ_GANNGRID || objType == OBJ_GANNLINE || objType == OBJ_FIBOARC) {
            ObjectSetDouble(currChart, objName, OBJPROP_SCALE, objScale);
        }

        ObjectSetDouble(currChart, objName, OBJPROP_ANGLE, objAngle);
        ObjectSetDouble(currChart, objName, OBJPROP_DEVIATION, objDeviation);

        //ENUM_OBJECT_PROPERTY_STRING
        ObjectSetString(currChart, objName, OBJPROP_TEXT, objText);
        ObjectSetString(currChart, objName, OBJPROP_TOOLTIP, objTooltip);
        ObjectSetString(currChart, objName, OBJPROP_FONT, objFont);

        if(objType == OBJ_BITMAP_LABEL) {

            ObjectSetString(currChart, objName, OBJPROP_BMPFILE, 0, objBmpFile);
            ObjectSetString(currChart, objName, OBJPROP_BMPFILE, 1, objBmpFile1);

        }

        if(event_id == CHARTEVENT_OBJECT_CREATE) {

            //作られたオブジェクトは選択されていない状態
            ObjectSetInteger(currChart, objName, OBJPROP_SELECTED, false);
        }

        ChartRedraw(currChart);

        if(ChartNext(currChart) < 0) break;
        else currChart = ChartNext(currChart);
        //ChartSymbol(currChart);
    }

    if(event_id == CHARTEVENT_OBJECT_CREATE) {
        OneClick = false;
    }

}

//+------------------------------------------------------------------+
