Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › RSI szintek szinezése
-
SzerzőBejegyzés
-
Radu!
Szeretném beszínezni az RSI szinteket, hogy jobban lássam, és rectangle megoldással próbálkoztam de nem sikerült, tudnál segítséget adni?
Választ előre is köszönömannyit még hozzá tennék, hogy az RSI-ben alapban szeretném megoldani, úgy, hogy a sávok színeit, meg is adhassam
Horizontális vonalak nem elegendőek?
a különböző sávokat szeretném beszínezni, hogy jobban kiemeljem az RSI szalagját és a színsávok könnyebben megmutatják hol tart. Ezért nem elégséges, ha vonalakkal van megoldva, hanem a mögöttes terület szín külömbsége segít gyorsabb értékelésben.
Tehát pl 30-50 sávot kék színűre. az 50-70 sávot zöldre és így tovább.
Segítséget előre is köszönömint Create()
{
datetime T1= TimeYear(1994);
datetime T2=TimeYear(2033);
ObjectCreate(„koci-1”,OBJ_RECTANGLE,1,T1,0,T2,0);
ObjectSet(„koci-1”, OBJPROP_COLOR,bullszin);
WindowRedraw();
return (0);
}
egy ilyen megoldásban gondolkodtam, de mivel nem ismerem elég jól a nyelvet ezért biztos nem jól adtam meg a paramétereket.Sebtében összerakva ez alapnak jó. Természetesen a függvény szebb paraméterezésével igényesebben meg lehet oldani.
Figyelj oda arra, hogy a subWindow (alablak azonosító) helyes legyen! A 0 a chart azonosítója, 1-től kezdődnek az indikátorok. Indikátor ablakot a WindowFind() függvénnyel kereshetsz meg.
void Create() { color bullszin = clrLime; // Szín datetime T1= StrToTime("1994.01.01"), // Dátum start T2= StrToTime("2033.01.01"); // Dátum end double RSI_Up = 33, // Szint (tól) RSI_Dn = 55; // Szint (ig) int subWindow = 1; // Indikátor subwindow azonosítója ObjectCreate(0, "koci-1", OBJ_RECTANGLE, subWindow, T1, RSI_Up, T2, RSI_Dn); ObjectSet("koci-1", OBJPROP_COLOR, bullszin); WindowRedraw(); }
Nagyon köszönöm, hogy szakítottál erre időt, be is raktam egy teszt sablonba, sajnos még nem jelenik meg a színezés, de próbálkozom vele, annyit tettem, hogy
az
int
subWindow = WindowFind(„proba”);amit javasoltál hogy kérdezzem le a subWindow számát
Ne a „proba” -ra keress rá, hanem pontosan arra az indikátorra, aminek az ablakát keresed. Helyezd fel tehát az RSI indikátort, és arra keress rá, amit az indikátor ablak bal felső sarkában kiír. Alapbeállításnál tehát:
RSI(14)
Kód szintjén:
int subWindow = WindowFind("RSI(14)"); Print(subWindow);
Amennyiben a visszakapott érték -1, akkor nem jó szövegre kerestél rá.
Megint kénytelen vagyok hozzád fordulni, mert a könyvben leírtak alapján próbálok előre jutni, de nagyon nem megy.
extern color bullszin = clrWhite;
extern color savszin = clrGold;int
subWindow = WindowFind(„RSI(14)”); // Indikátor subwindow azonosítója//+——————————————————————+
//| Custom indicator initialization function |
//+——————————————————————+void Create() {
//Print(subWindow);
datetime
T1= StrToTime(„1994.01.01”), // Dátum start
T2= StrToTime(„2033.01.01”); // Dátum enddouble
RSI_Up0 = 0, // Szint (tól)
RSI_Up1 = 10,
RSI_Up2 = 21; // Szint (ig)//——-subwin érték kiiratása———-
string sub_Win = IntegerToString(subWindow);ObjectCreate(„SubWindow”, OBJ_LABEL,0, 0,0);
ObjectSetText(„SubWindos”,sub_Win,12,”Comic sans Ms”,clrWhite);
ObjectSet(„SubWindow”,OBJPROP_CORNER,3);
//——————————————-ObjectCreate(0,”vonal”,OBJ_HLINE, subWindow,0,RSI_Up0);
ObjectSet(„vonal)”,OBJPROP_COLOR, savszin);ObjectCreate(0,”koci-1″, OBJ_RECTANGLE, subWindow, T1, RSI_Up0, T2, RSI_Up1);
ObjectSet(„koci-1”, OBJPROP_COLOR, bullszin);WindowRedraw();
}
A felesleges részt nem raktam be már azt is próbálgattam, hogy külön kiíratom a számot hogy lássam de nem ír ki semmit, vagyis jól adtam meg keresett ablakot, de próbáltam sima vonalat bele rajzolni – mint láthat- de azzal se jutottam közelebb, mit rontottam el?
Választ előre is köszönöm
PéterRadu!
Nagyon szépen köszönöm a segítségedet, probléma megoldva, hamarosan a teljes megoldást is közzé teszem, ha valakit érdekelne.
PéterSzóval ha valakit érdekel ez a probléma, egy megoldást már tudok mutatni íme:
#property indicator_chart_window extern string alap ="Ird be az kivánt indicator bal felső sarkában lévő szöveget"; extern string indicator = "RSI(14)"; extern string datum ="Itt állathatod a sávok időbeli hosszát"; extern datetime T1 = D'1994.01.01 00:00'; extern datetime T2 = D'2034.01.01 00:00'; extern string sav ="Sáv szélességének beállítása 0-100 érték között"; extern double sav6 = 0.0; extern double sav5 = 0.0; extern double sav4 = 0.0; extern double sav3 = 0.0; extern double sav2 = 0.0; extern double sav1 = 0.0; extern double sav0 = 0.0; extern string savszin = "Sáv színének beállítása"; extern color savszin6 = clrWhite; extern color savszin5 = clrWhite; extern color savszin4 = clrWhite; extern color savszin3 = clrWhite; extern color savszin2 = clrWhite; extern color savszin1 = clrWhite; extern color savszin0 = clrWhite; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int ertek = WindowFind(indicator); string szoveg = StrToInteger(ertek); //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int deinit(){ //ObjectDelete("Kijelzés"); //ObjectDelete("vonal"); ObjectDelete("koci-1"); ObjectDelete("koci-2"); ObjectDelete("koci-3"); ObjectDelete("koci-4"); ObjectDelete("koci-5"); ObjectDelete("koci-6"); ObjectDelete("koci-7"); return(0); } int start(){ ObjectCreate(0,"koci-1", OBJ_RECTANGLE,ertek, T1, sav1, T2, sav0); ObjectSet("koci-1", OBJPROP_COLOR, savszin0); ObjectCreate(0,"koci-2",OBJ_RECTANGLE,ertek,T1,sav2,T2,sav1); ObjectSet("koci-2", OBJPROP_COLOR, savszin1); ObjectCreate(0,"koci-3",OBJ_RECTANGLE,ertek,T1,sav3,T2,sav2); ObjectSet("koci-3", OBJPROP_COLOR, savszin2); ObjectCreate(0,"koci-4",OBJ_RECTANGLE,ertek,T1,sav4,T2,sav3); ObjectSet("koci-4", OBJPROP_COLOR, savszin3); ObjectCreate(0,"koci-5",OBJ_RECTANGLE,ertek,T1,sav5,T2,sav4); ObjectSet("koci-5", OBJPROP_COLOR, savszin4); ObjectCreate(0,"koci-6",OBJ_RECTANGLE,ertek,T1,sav6,T2,sav5); ObjectSet("koci-6", OBJPROP_COLOR, savszin5); // ObjectCreate(0,"koci-7",OBJ_RECTANGLE,ertek,T1,sav7,T2,sav6); // ObjectSet("koci-7", OBJPROP_COLOR, savszin6); WindowRedraw(); return(0); }
Ami a lényeg, hogy kis hiba még van az indikátorban, de azt megoldani, már igen egyszerű feladat. Ami a lényeg, hogy több indikátorra is lehet használni pl Stohastikra, illetve minden olyanra, amelyik 0-100 között hozza a grafikonját. Ha valaki ezt átmásolja az editorba, egyből fordíthatja is le, és megy probléma nélkül, illetve a kis problémát aki lefordítja az első használatnál észre fogja venni, de könnyen javítható.
Bárdos PéterKöszönöm, hogy megosztottad. Módosítottam a hozzászólásodat, hogy ki legyen emelve a kód. Milyen kis hibára gondolsz egyébként?
A hiba annyi, hogy nem a megfelelő helyre rakja a színezést, és keresgélni kell ha valaki jól be akarja színezni az indikátorát. Ennyi, de majd ha lesz egy kis időm akkor megnézem az okát. minden esetre annyit hozzátennék, hogy az első 0.0 az a Nulla, az utolsó pedig minden esetben 100.0 kell hogy legyen, nem tudom mért nem tudok belépni, hogy módosítsam, de ez van.
Módosítom neked, csak konrkétan írd meg, mely változókat akarod milyen értékre javítani.
az igazság az ez nem is akkora probléma ,mert gyorsan orvosolható viszont az, hogy nem veszi komolyan a program a rákeresést, az már nagyobb gond. pl
RSI(14)- re megcsinálok egy beállítást, remekül végre is hajtja, ám ha ha előveszek még egy RSI(3)-at mondjuk akkor már nem különbözteti meg a két indikátort, és csak az elsőt fogja megtalálni erre mi a megoldás?Írd át a kódot úgy, hogy a WindowFind() -os lekérdezés minden start() -ban fusson le. Állandóan le kell futtatni, hiszen az ablaksorrend változhat.
Az ObjectCreate elé rakj egy ObjectFind() -ot – azaz kérdezd le egy változóba, hogy jelenleg melyik alablakban van az objektum. Ennek kettős célja van:
- ha már létezik az objektum, akkor meg kell nézned hogy az általad – WindowFind() segítségével – lekérdezett és az ObjectFind() által visszakapott szám megegyezik-e. Ha megegyezik, akkor a megfelelő ablakban létezik az objektum, vagyis nem kell mindig megpróbálni létrehozni (felesleges), elegendő csak a tulajdonságait álligatni, és azokat is csak akkor, ha szükséges.
- ha nem egyezik meg (-1) vagy más ablakban van, akkor ki kell törölni az objektumokat ObjectDelete-tel, újra létrehozni őket.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.