Индикаторы: My Signal Table

 

My Signal Table:

Моя версия Signal Table

Author: intoffy

 

коментарий и действие порадовало

 // при удалении нашего индикатора нужно удалить все объекты,
   // которые мы уже создали
   ObjectsDeleteAll();
 
sergeev:

коментарий и действие порадовало

 // при удалении нашего индикатора нужно удалить все объекты,
   // которые мы уже создали
   ObjectsDeleteAll();
А что не так???
 

Вы просто приняли решение за пользователя, что ему никакие объекты на экране вообще не нужны. Как говорится "после меня хоть потоп..."

Но на графике ведь может быть разметка не только вашим индюком.

Поэтому идентифицируйте свои объекты одним общим префиксом и потом удаляйте только свои объекты.

//------------------------------------------------------------------ ObjectsDeleteAll2
void ObjectsDeleteAll2(int wnd=-1, int type=-1, string pref="")
{
        string st, names[]; int i, n=ObjectsTotal(); ArrayResize(names, n);
        for (i=0; i<n; i++) names[i]=ObjectName(i);
        for (i=0; i<n; i++) 
        {
                if (wnd>=0) if (ObjectFind(names[i])!=wnd) continue;
                if (type>=0) if (ObjectType(names[i])!=type) continue;
                if (pref!="") if (StringSubstr(names[i], 0, StringLen(pref))!=pref) continue;
                ObjectDelete(names[i]);
        }
}
 
sergeev:

Вы просто приняли решение за пользователя, что ему никакие объекты на экране вообще не нужны. Как говорится "после меня хоть потоп..."

Но на графике ведь может быть разметка не только вашим индюком.

Поэтому идентифицируйте свои объекты одним общим префиксом и потом удаляйте только свои объекты.

//------------------------------------------------------------------ ObjectsDeleteAll2
void ObjectsDeleteAll2(int wnd=-1, int type=-1, string pref="")
{
        string st, names[]; int i, n=ObjectsTotal(); ArrayResize(names, n);
        for (i=0; i<n; i++) names[i]=ObjectName(i);
        for (i=0; i<n; i++) 
        {
                if (wnd>=0) if (ObjectFind(names[i])!=wnd) continue;
                if (type>=0) if (ObjectType(names[i])!=type) continue;
                if (pref!="") if (StringSubstr(names[i], 0, StringLen(pref))!=pref) continue;
                ObjectDelete(names[i]);
        }
}
Ну, да... извините... Я об этом не подумал... Все-таки, ваш опыт программирования и мой... сравнили тоже...
 

вот более удобная версия. а еще посмотрите на красивые решения на сайте ForexTools. Сергей в этом плане всегда на передовой.

//---Настройка MA
extern int FastSMA=13;
extern int SlowSMA=24;
//---Настройка WPR
extern int WPRPeriod=13;
//---Настройка MACD
extern int FastMACD=12;
extern int SlowMACD=26;
extern int SignalMACD=9;
//---Настройка OsMA
extern int FastPeriod=12;
extern int SlowPeriod=26;
extern int SignalPeriod=9;
//---Настройка CCI
extern int   CCIPeriod    = 14;
//---Настройка MOM
extern int   MOMPeriod    = 14;
//---Настройка RSI
extern int   RSIPeriod    = 14;
//---- Параметры ADX
extern int   ADXPeriod    = 14;
//----Настройка индикатора.
extern int scaleX=20;
extern int scaleY=20;
extern int offsetX=35;
extern int offsetY=20;
extern int fontSize=16;
extern int corner=2;
extern int symbolCodeBuy=228;
extern int symbolCodeSell=230;
extern int symbolCodeNoSignal=178;
extern color signalBuyColor=Blue,
             signalSellColor=Red,
             noSignalColor=WhiteSmoke,
             textColor=Gold;
int period[]={1,5,15,30,60,240,1440,10080,43200};
string periodString[]={"M1","M5","M15","M30","H1","H4","D1","W1","MN1"},
       // создаем еще один массив с названиями индикаторов
       signalNameString[]={"MA","WPR","SAR","MACD","OsMA","CCI","MOM","RSI","ADX"};//9
string sID="MST", arr[3], font="Wingdings";
color clr[3];
//------------------------------------------------------------------ init
int init()
{
        clr[0]=signalBuyColor; clr[1]=signalSellColor; clr[2]=noSignalColor;
        arr[0]=CharToStr(symbolCodeBuy); arr[1]=CharToStr(symbolCodeSell); arr[2]=CharToStr(symbolCodeNoSignal);
        // таблица сигналов
        for(int x=0;x<9;x++) 
                for(int y=0;y<9;y++) SetLabel(sID+"signal"+x+y, 0, arr[2], clr[2], x*scaleX+offsetX+5, y*scaleY+40, corner, fontSize, font);
        // названия таймфреймов    
        for(x=0;x<9;x++) SetLabel(sID+"textPeriod"+x, 0, periodString[x], textColor, x*scaleX+offsetX+6, offsetY+10, corner, 8, "Tahoma");
        // названия индикаторов 
        for(y=0;y<9;y++) SetLabel(sID+"textSignal"+y, 0, signalNameString[y], textColor, offsetX-25, y*(scaleY)+offsetY+24, corner, 8, "Tahoma");
        for(x=0;x<9;x++) SetLabel(sID+"MainSignal"+x, 0, arr[2], clr[2], x*scaleX+offsetX+5, 5, corner, fontSize, font);
   return(0);
}
//------------------------------------------------------------------ deinit
int deinit() { ObjectsDeleteAll2(0, OBJ_LABEL, sID); return(0); }
//------------------------------------------------------------------ start
int start()
{
        int Sum[9]; ArrayInitialize(Sum, 0);
        int x, y, sign=-1;
        
        for(x=0; x<9; x++)
        {
                y=0;
                if(iMA(Symbol(), period[x], FastSMA,0,0,0,0)>iMA(Symbol(), period[x], SlowSMA,0,0,0,0)) 
                {       sign=OP_BUY; Sum[x]++; } else {sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                
                y++; sign=2;
                if(MathAbs(iWPR(Symbol(),period[x],WPRPeriod,0))<20.0) { sign=OP_BUY; Sum[x]++; } 
                else if(MathAbs(iWPR(Symbol(),period[x],WPRPeriod,0))>80.0) { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if(iSAR(Symbol(),period[x],0.02,0.2,0)<Close[0]) 
                {       sign=OP_BUY; Sum[x]++; } else {sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if (iMACD(Symbol(),period[x],FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,0)>iMACD(Symbol(),period[x],FastMACD,SlowMACD,SignalMACD,PRICE_CLOSE,MODE_MAIN,1))     
                {       sign=OP_BUY; Sum[x]++; } else { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if (iOsMA(Symbol(),period[x],FastPeriod,SlowPeriod,SignalPeriod,PRICE_CLOSE,0) > 0)
                {       sign=OP_BUY; Sum[x]++; } else { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if (iCCI(Symbol(),period[x],CCIPeriod,PRICE_CLOSE,0) > 0)
                {       sign=OP_BUY; Sum[x]++; } else { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if (iMomentum(Symbol(),period[x],MOMPeriod,PRICE_CLOSE,0) > 100)
                {       sign=OP_BUY; Sum[x]++; } else { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if (iRSI(Symbol(),period[x],RSIPeriod,PRICE_CLOSE,0) > 50)
                {       sign=OP_BUY; Sum[x]++; } else { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
                y++;
                if (iADX(Symbol(),period[x],ADXPeriod,PRICE_CLOSE,MODE_PLUSDI,0) > iADX(Symbol(),period[x],ADXPeriod,PRICE_CLOSE,MODE_MINUSDI,0))
                {       sign=OP_BUY; Sum[x]++; } else { sign=OP_SELL; Sum[x]--; }
                ObjectSetText(sID+"signal"+x+y, arr[sign], fontSize, font, clr[sign]);
        }
        for (x=0; x<9; x++)
        {
                sign=2; if (Sum[x]>0) sign=OP_BUY; else sign=OP_SELL;
                ObjectSetText(sID+"MainSignal"+x, arr[sign], fontSize,"Wingdings", clr[sign]); 
        }
        return(0);
}
//------------------------------------------------------------------ SetLabel
void SetLabel(string name, int wnd, string text, color clr, int x, int y, int corn, int fontsize, string font)
{
        ObjectCreate(name, OBJ_LABEL, wnd, 0, 0); ObjectSet(name, OBJPROP_CORNER, corn); 
        ObjectSetText(name, text, fontsize, font, clr); 
        ObjectSet(name, OBJPROP_XDISTANCE, x);  ObjectSet(name, OBJPROP_YDISTANCE, y); 
}
//------------------------------------------------------------------ ObjectsDeleteAll2
void ObjectsDeleteAll2(int wnd=-1, int type=-1, string pref="")
{
        string st, names[]; int i, n=ObjectsTotal(); ArrayResize(names, n);
        for (i=0; i<n; i++) names[i]=ObjectName(i);
        for (i=0; i<n; i++) 
        {
                if (wnd>=0) if (ObjectFind(names[i])!=wnd) continue;
                if (type>=0) if (ObjectType(names[i])!=type) continue;
                if (pref!="") if (StringSubstr(names[i], 0, StringLen(pref))!=pref) continue;
                ObjectDelete(names[i]);
        }
}
Причина обращения: