Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › iMAOnArray
-
SzerzőBejegyzés
-
Szia Radu!
Ha nem gond, kérnék egy kis segítséget, csúnyán elakadtam. Erősen leegyszerűsítve:
Adott egy indikátor, amely az indításakor kezdi el az adatgyűjtést (tehát nincsenek histórikus adatok).
A példa kedvéért ez az adat legyen az épp aktuális Close[0], a chart legyen M1-es.
Ahogy telnek a percek, gyűlnek az újabb Close[0]-ok, és most jön a lényeg:
szeretném megkapni a Close[0]-ok exp.mozgóátlagát az iMAOnArray segítségével.
A zanzásított kód://---------------------------------------------------------------------------- //--- indicator buffers double MainBuffer[]; double SignalBuffer[]; extern int SPeriod=5; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorDigits(Digits); SetIndexBuffer(0,MainBuffer); SetIndexBuffer(1,SignalBuffer); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 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[]) { //--- MainBuffer[0]=Close[0]; SignalBuffer[0]=iMAOnArray(MainBuffer,0,SPeriod,0,MODE_EMA,0); //--- return value of prev_calculated for next call return(rates_total); } //----------------------------------------------------------------------------
Hogyan írnád át ezt a kódot, hogy értelmes eredményt kapj a SignalBuffer-nek?
(A példaprogram nyilván teljesen értelmetlen, de a válaszodból megkapom, amire kíváncsi vagyok.)
Előre is köszi!Talán kicsit értelmesebben hangzik így:
Adott egy tömb, ami 0 elemet tartalmaz a program indításakor, és minden újabb tickkel gyűlnek bele az adatok. Ennek a tömbnek a mozgóátlagát szeretném megkapni az iMAOnArray segítségével.
Egy egyszerű ciklussal kapnám meg az értékeket:for(int i=0; i<Counter; i++) { Signal[i]=iMAOnArray(Main_Array,0,Ma_Period,0,MODE_EMA,i); }
A gondom az, hogy az első x érték értelmezhetetlen lesz, gondolom azért, mert nulláról indítva átlagol.
Mi a megoldás?Örülök. Bár azt figyelembe vagy kénytelen venni, hogy perces a legkisebb időfelbontás, emiatt a tick alapú megjelenítés nem lehetséges.
Pont ez a poén, hogy tick chartról van szó. ;)
A lényeg az volt, hogy csak akkortól kezdje a számolást, amikor már van elég (azaz periódusnyi) adat a feed tömbben. Tudtam, hogy erről van szó, csak bénáztam az indexeléssel.Az idő tengelye biztosan nem lesz egy percnél kisebb felbontású, hiszen azt még offline charton sem tudod elérni.
Pedig bizony kisebb az. Olyan gyakorisággal lépteted a chartot, ahogy akarod. Nyilván független az „anyachart” időskálájától.
Ez offline chart? Csinálnál egy screenshotot? Az adat ablakban eleve nincs másodperc a gyertyakezdethez, ezért írom.
Az adat ablak nem játszik, ez attól független. Emilben ment a screenshot.
Nem kaptam tőled e-mailt, radu kukac radu.hu -ra küldted?
Nem, hanem a blogos emailre. Elküldöm újra.
Hali Radu, struktúrákban otthon vagy? Struktúra egyik elemét ki lehet emelni tömbként, hogy az iMAOnArray számára hozzáférhető legyen?
Nem dolgozom struktúrákkal. Az iMAOnArray speciális tömböt fogad, szóval ha a tömb típusa stimmel, még akár működhet is. Ki kell próbálni.
Itt van leírás a struktúrákról és osztályokról, hátha találsz idevágó infót.
Illetve itt van még szó a struktúrákról a „Arrays in structures” bekezdésben.
Az iMAOnArray első paramétere dinamikus double tömb. Az alábbi kód szintaktikailag helyes (nincs fordítási hiba)
struct sTeszt { int id; double db[]; }; sTeszt Teszt[10]; void OnStart() { // ... Itt kell adatokkal feltölteni ... for( int i = 0; i < ArraySize( Teszt ); i++ ) { if( ArraySize( Teszt[ i ].db ) > 10) { Print( iMAOnArray( Teszt[ i ].db, 0,10 ,0 ,MODE_EMA, 0 ) ); } } }
Köszi a választ. A szintaxis tényleg jó, de sajnos nem alkalmazható arra, amire nekem kell. Nálam így nézne ez ki (a struct-ban nincs tömb).
struct sTeszt
{
int id;
double db;
};
sTeszt Teszt[10];
//
for(int i=0; i<10; i++)
{
Print(iMAOnArray(???,0,10,0,MODE_EMA,i));
}
A kérdőjel helyére kellett volna az okosság, de nem lelem (valószínűleg azért, mert nincs).
Az általad javasolt verzió sajna nem jó nekem, egyrészt feleslegesen duplikálja a tömböt (db, Teszt – nekem csak a Teszt kellene tömbként), másrészt nincs előnye így a struct-nak azzal szemben, mintha az elemeit használnám külön-külön tömbökként.
De, köszi ismét! :) -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.