MetaTrader programnyelv – Alapok

Az MQL4 programnyelv alapjai

A poszt címével azt próbálom kifejezni, hogy milyen sok célra használható a MetaTrader kereskedési platform programnyelve, az MQL4. Mivel a téma nagyon nagy, ezért ez a bejegyzés egy sorozat első elemeként fogható fel – igyekszem ésszerű bontásokban (hehe) szétvagdosni a témát. A cél az, hogy egy kis bepillantást nyerjetek az MQL4 nyelv alapjaiba, később az indikátor-szkript-expert advisor készítésbe. Semmiképpen sem célom alapvető programozási tudás átadása, azonban a kommentekben esetlegesen feltett általános kérdésekre – amennyiben tudok – szívesen válaszolok.

Útközben minden észrevételt, véleményt szívesen fogadok – akár a bejegyzések stílusaival, akár a témákkal kapcsolatban.

A bejegyzéseknél alapvető forrásnak a MQL4 Docs és MQL4 Book oldalakat használom, ezért aki hasonlóságot vél felfedezni az eredeti angol szövegek és az általam írtak között, az nem véletlen 🙂

A platform alapja: a terminál

Ha érdekel az MQL4 programozás, akkor mindenekelőtt érdemes megbarátkoznod a kereskedési szoftver (továbbiakban: terminál) alapvető felépítésével. A terminál az online kereskedés szerves része – kliensként viselkedik, és egy szerverhez kapcsolódik amely a brókeren keresztül az élő piac részesévé tesz bennünket.

Maga a terminál egy olyan információkkal teli környezetet biztosít a futtatható szkripteknek, indikátoroknak, experteknek (továbbiakban: programok) amelyben:

  • egyértelműen behatárolható a kereskedni kívánt instrumentum összes paramétere
  • lekérdezhetőek az instrumentumra és a piacra érvényes korlátozások
  • lekérdezhetőek a stop szintek, nyitható kötésegységek, stb.

Ezen környezet alapvető kihasználására egy egyszerű példa a korábban írt cikkemben lévő szkript.

A terminál felépítésével és működésével kapcsolatban érdemes tisztában lenni, mivel a cikkekben csak feltétlen szükséges esetekben fogok kitérni a használatára.

Programok

A terminál három típusú programot képes futtatni, ezek: szkriptek, indikátorok és expert advisorok. Alapvető különbség köztük, hogy mindegyikük más célra való és más feltételekkel futtatható. Nézzük, melyikük mire való!

Indikátorok

Piaci szabályosságok és ismétlődések grafikai ábrázolására, azoknak kiemelésére szolgáló program. Nagyon fontos, hogy a másik két programtípussal ellentétben nem lehet belőle pozíciót nyitni, zárni vagy bármilyen pozicióval kapcsolatos tevékenységet végrehajtani.

Az indikátorok minden új tick beérkezésekor futnak le újra és újra.

Expert advisorok (“robotok”)

Egyéni – technikai, fundamentális, matematikai vagy akár ezek keveréke alapján kialakított – stratégiák “gépiesített”, programozott változata. Ebből a programtípusból – akárcsak a szkriptekből – képesek vagyunk pozíciókat menedzselni, objektumokat rajzolni.

Az expertek minden új tick beérkezésekor futnak le újra és újra.

Szkriptek

Apró segédprogramok, amelyekkel például számunkra szükséges, de a terminálból hiányzó funkciók pótlásaként értelmezhetőek.

A szkriptek csak felhasználói indításra, a tickek beérkeztétől függetlenül futnak le, egyszer.

A “tick” legegyszerűbb megfogalmazása: piaci árváltozás, amely az interneten keresztül a bróker szerveréről a mi terminálunkhoz is eljut. Amennyiben az ár valamely irányba elmozdul valamekkora távolsággal, a terminál árszintje megmozdul és ekkor minden éppen aktív, instrumentra helyezett indikátor és expert advisor lefut.

Ez a futás általában a tized- vagy századmásodpercekig tart. Ha ez az idő egy általunk készített program esetében jóval több (figyelem: 1 másodperc már kvázi rengeteg időnek számít!), akkor valószínűleg rosszul van felépítve, vagyis ily módon helytelenül gazdálkodtunk a rendelkezésre álló idővel. Ez akkor válik különösen érzékelhető problémává, amikor például egy beérkező tick miatt automatikusan lefutó program még be sem fejezte futási “körét”, már másik kör kellene hogy induljon – mivel pl. gyors árváltozás történt. A legrosszabb eshetőség, ha a terminál lelassul, “kifagy” vagy extrém esetben akár össze is omlik – ezeknek a helyzeteknek az eredője szinte kivétel nélkül például egy végtelen ciklus.

Képzeljük el “csúcsidőben” (amikor rengeteg kötés van akár másodpercen belül) az EURUSD ármozgását! 1 perc alatt az ár extrém esetben akár közel 100 alkalommal is változhat, ami számunkra 100 darab futási kört eredményez. Érdemes tehát tervezni, és nem a véletlenre bízni azt, hogy leendő programunk mennyire működik “könyv szerint”, kevés erőforrást használva.

Az erőforrások megfelelő használata és a teljesítmény optimalizálása azért is fontos, mert a programoknak a terminál adja oda a futás lehetőségét (másként vezérlést), de vissza már csak a program tudja adni a vezérlést a terminálnak. Más szavakkal: ha a programunk rosszul vagy egyáltalán nem adja vissza a vezérlést a terminálnak, hibák történhetnek – a terminál ugyanis nem tudja elvenni a vezérlést a programoktól futás közben.
Megjegyzés: a vezérlés megadása-elvétele ebben az esetben nem a felhasználó, hanem a program általi közbelépést jelenti!

A terminálban elérhető konstansok és változók, azaz a környezet

Elöljáróban pár mondatban összefoglalom, hogy mit jelent a konstans és a változó szó.

Konstans: egy olyan adattípus, melynek az értéke mindig állandó, tehát nem változhat meg.

Változó: olyan adattípus, amely folyamatosan változhat és akár mi is meg tudjuk változtatni az értékét.

Adattípusok

Adattípusból a következőkkel találkozhatunk az MQL4 nyelvben (természetesen nagy részük ismert lehet más programnyelvekből is):

int – egész szám; például: 1, 5, 18956, 983332

double – valós számok; például: 1.34, 456.23, 9833.3

bool – logikai érték; true vagy false

string – szöveg;

color – szín hexadecimális, decimális, vagy szövegalapon tárolva; például: C’128,128,128′ (szürke), C’0x00,0x00,0xFF’ (kék), green (zöld);

dátum – dátum vagy időpont; például: D’2004.01.01 00:00′, D’2010.12.20 15:34:55′

A programban definiált változók típusa a program későbbi részében nem változtatható meg.

Néha szükséges lehet az adattípusok közti konvertálás, amelyben a nyelv által előre megadott szabályok szerint kell eljárni. Például szeretnénk egy dátumot tartalmazó változót szövegként formázni. Erre hozták létre a konverziós függvényeket, amelyeket külön nem (esetleg útközben) részletezek.

Előre definiált konstansok

Minden programozási környezetben léteznek ún. előre definiált konstansok, amelyek értékeit a környezet definiálja és menet közben nem változtathatóak. Az MQL4 esetében ez közvetlenül kapcsolódik a kereskedési fogalmakhoz, időperiódusokhoz, stb. Részletezni nem fogom őket, de a dokumentáció ide vonatkozó fontosabb részeinek magyar összefoglalóját megpróbálom érthetően megfogalmazni.

Ezen konstansokkal tudunk hivatkozni bizonyos beépített funkciók esetében adatok lekérése során.

  • Series arrays

Folyamatos adatok (például gyertyák visszamenőleges adatai) esetén különböző adatrészek megnevezése.

Konstans Érték Leírás
MODE_OPEN 0 Nyitóár
MODE_LOW 1 Legalacsonyabb ár
MODE_HIGH 2 Legmagasabb ár
MODE_CLOSE 3 Záróár
MODE_VOLUME 4 Volume, az iLowest() és iHighest() függvényeknél.
MODE_TIME 5 A gyertya nyitóára, az ArrayCopySeries() függvényben.

  • Timeframes

Időperiódusok. A chartok paramétereinek lekérdezésénél, indikátorok használatánál fontosak.

Konstans Érték Leírás
PERIOD_M1 1 1 perc
PERIOD_M5 5 5 perc
PERIOD_M15 15 15 perc
PERIOD_M30 30 30 perc
PERIOD_H1 60 1 óra.
PERIOD_H4 240 4 óra
PERIOD_D1 1440 Napi
PERIOD_W1 10080 Heti
PERIOD_MN1 43200 Havi
0 (zero) 0 Az éppen charton használt időperiódus

  • Trade operations

Tranzakciók típusai.

Konstans Érték Leírás
OP_BUY 0 Buy pozíció
OP_SELL 1 Sell pozíció
OP_BUYLIMIT 2 Buy limit függő megbízás
OP_SELLLIMIT 3 Sell limit függő megbízás
OP_BUYSTOP 4 Buy stop függő megbízás
OP_SELLSTOP 5 Sell stop függő megbízás

  • Price constants

Alkalmazott ár meghatározása. Indikátoroknál fontos paraméter lehet.

Konstans Érték Leírás
PRICE_CLOSE 0 Záróár
PRICE_OPEN 1 Nyitóár
PRICE_HIGH 2 Legmagasabb ár
PRICE_LOW 3 Legalacsonyabb ár
PRICE_MEDIAN 4 Középár, (legmagasabb+legalacsonyabb)/2.
PRICE_TYPICAL 5 Jellegzetes ár, (legmagasabb+legalacsonyabb+záró)/3.
PRICE_WEIGHTED 6 Súlyozott záróár, (legmagasabb+legalacsonyabb+záró+záró)/4.

  • MarketInfo

Piaci környezet adatainak lekérdezése. Nagy részük kitalálható az előző cikkemben közölt szkript működése alapján.

  • Drawing styles

Rajzolási stílusok

  • Arrow codes

Nyilak típusai

  • Wingdings

Wingdings betűtípus szimbólumai

  • Web colors

Szövegesen hivatkozható színek listája

  • Indicator lines

Specifikus technikai indikátorok vonalainak meghatározása

  • Ichimoku Kinko Hyo

Ichimou Kinko Hyo indikátor paraméterezéséhez szükséges.

  • Moving Average methods

Indikátorok esetén használt mozgóátlagok paraméterezéséhez szükséges.

Konstans Érték Leírás
MODE_SMA 0 Egyszerű mozgóátlag
MODE_EMA 1 Exponenciális mozgóátlag
MODE_SMMA 2 Simított mozgóátlag
MODE_LWMA 3 Lineáris súlyozott mozgóátlag

  • MessageBox

Üzenetablak paraméterezéséhez

  • Object types

Rajzolható objektumok típusai (csak a fontosabbakat részletezem) az ObjectCreate funkcióhoz.

Konstans Érték Leírás
OBJ_VLINE 0 Függőleges vonal. Az első időkoordinátát használja
OBJ_HLINE 1 Vízszintes vonal. Az első árkoordinátát használja.
OBJ_TREND 2 Trendvonal. Két koordinátát használ.
OBJ_TEXT 21 Szöveg. 1 koordinátát használ.
OBJ_ARROW 22 Nyilak. 1 koordinátát használ.
OBJ_LABEL 23 Szövegcímke. 1 koordinátát használ, pixelben megadva.

  • Object properties

Objektum paramétereinek lekérdezéséhez és beállításához szükséges.

  • Object visibility

Konstans Érték Leírás
OBJ_PERIOD_M1 0x0001 Az objektum csak M1 periódusban jelenik meg.
OBJ_PERIOD_M5 0x0002 Az objektum csak M5 periódusban jelenik meg.
OBJ_PERIOD_M15 0x0004 Az objektum csak M15 periódusban jelenik meg.
OBJ_PERIOD_M30 0x0008 Az objektum csak M30 periódusban jelenik meg.
OBJ_PERIOD_H1 0x0010 Az objektum csak H1 periódusban jelenik meg.
OBJ_PERIOD_H4 0x0020 Az objektum csak H4 periódusban jelenik meg.
OBJ_PERIOD_D1 0x0040 Az objektum csak D1 periódusban jelenik meg.
OBJ_PERIOD_W1 0x0080 Az objektum csak W1 periódusban jelenik meg.
OBJ_PERIOD_MN1 0x0100 Az objektum csak MN periódusban jelenik meg.
OBJ_ALL_PERIODS 0x01FF Az objektum minden idősíkon megjelenik.
NULL 0 Az objektum minden idősíkon megjelenik.
EMPTY -1 Az objektum minden idősíkon rejtett.

  • Uninitialize reason codes

A robot futása befejeződésének oka. Az UninitializeReason() függvénynél használható.

Konstans Érték Leírás
0 A szkript önállóan fejezte be a futást.
REASON_REMOVE 1 Az expertet eltávolították a chartról.
REASON_RECOMPILE 2 Az expertet újra lett fordítva.
REASON_CHARTCHANGE 3 Az instrumentum vagy a periódus változott a charton.
REASON_CHARTCLOSE 4 A chart bezárult
REASON_PARAMETERS 5 A felhasználó megváltoztatta a paramétereket
REASON_ACCOUNT 6 A terminál másik számlára lépett át

  • Special constants

Speciális konstansok.

  • Error codes

Hibakódok. A GetLastError() fügvénnyel lekérdezhető az utolsó hibakód, amely után itt lehet keresgélni.

Előre definiált változók

A konstansokon kívül előre definiált változókat is használhatunk programjainkban. Ezen változók értékei gyakran változnak, de mindig az aktuális (bróker által utoljára ismert és számunkra elküldött) piaci helyzetet jelölik.

Ask: Az utolsó ismert eladási ár.

Bars: az aktuális chart gyertyáinak száma.

Bid: az utolsó ismert vételi ár.

Close: tömb, melyben a gyertyák záróára található*

Digits: az aktuális instrumentum árának tizedesjegyeinek száma.

High: tömb, melyben a gyertyák legmagasabb ára található*

Low: tömb, melyben a gyertyák legalacsonyabb ára található*

Open: tömb, melyben a gyertyák nyitóára található*

Point: egy pont számértéke (pl. 1 pont =  0.0001)

Time: tömb, melyben a gyertyák nyitási időpontja található*

Volume: tömb, melyben a gyertyákban bekövetkezett árváltozások száma található*

Folyamatosság elve a tömbökben

A csillaggal (*) jelölt tömbök esetében egy-egy értéket a megfelelő kulcscsal hívhatunk elő. Azt, hogy az aktuális idősíkban hány darab gyertya van, a Bars értékéből tudjuk lekérni. A számsorozat nullától indul, és a nullával jelölt kulcshoz tartozó érték a legutolsó (jobb oldalról az első) gyertyához tartozó érték. Azaz ha a Bars értéke 3980, akkor 3980 értékből válogathatunk és jobbról balra haladva a legfrissebb gyertyához tartozó adott érték kulcsa nulla, a legrégebbi gyertya kulcsa pedig 3979.

A tömbök kulcsainak számsorozata folyamatos, azaz soha nem marad ki egyetlenegy szám sem. A legjobb példa a napi gyertya, ahol is a chart nulladik gyertyája a mai napot szimbolizálja, kulcsa a 0. Ez a gyertya még lezáratlan, azaz mozog – egyes értékei (legmagasabb, legalacsonyabb ár, záróár, volume) változhatnak. Az előtte lévő gyertya az 1-es számú kulcs alatt található, és az előző kereskedési (nem feltétlen naptári!) napot jelenti,  és így tovább.

Másik példa: 5 perces felbontásban az utolsó 5 perces gyertya kulcsa 0, az előtte lévő pedig 1. Amennyiben ez a gyertya befejeződik (azaz az 5 perces taktus lezárul), azonnal ő válik az “előző” gyertyává, és megkapja az 1-es kulcsot – a legfrisebb gyertya kulcsa pedig újra 0-át kap.

Ezen értékek természetesen az idősík felbontásától függően folyamatosan balra haladnak, azaz a legfrisebb gyertya kulcsa mindig 0.

Most pedig nézzünk egy konkrét példát értéklekérdezésre! Szeretném megtudni az éppen aktuális nap illetve a tegnapi nap záróárát! Most induljunk ki abból, hogy a chart aktuális időfelbontása napi. Nyilván ha más időfelbontásban vagy, akkor állítsd át, vagy az eredményeid az adott idősík gyertyáira fognak vonatkozni!

  • mai nap nyitóára: Open[0]
  • tegnapi nap záróára: Close[1]

Ha szeretnénk az eredményt felfokozott lelkiállapotban látni, akkor indítsuk el a MetaEditor kódszerkesztőt, indítsuk el a “New Expert Advisor” varázslót (első gomb fent az eszköztárban), és válasszuk a Script pontot. Ezután adjunk egy nevet életünk első szkriptjének (mondjuk legyen Teszt), és nyomjuk meg a Kész gombot! Ekkor megszületik egy szinte üres szkript, amibe már bátran belekonktárkodhatunk.

Másoljuk be a start() függvény kapcsos zárójelein belülre a következő kódot!

Print (Open[0]);
Print (Close[1]);

Ezek után mentsünk (CTRL-S), majd bökjünk a Compile gombra, vagy nyomjunk egy F5-öt! Ha az alsó Errors nevű ablakban vastagon szedve azt látjuk, hogy “Compiling ‘Teszt.mq4’… 0 error(s), 0 warning(s).”, akkor a közben futó vagy hirtelenjében elindított terminálunkban a Navigátorban a Szkripteket kibontva megtaláljuk Teszt nevű szkriptünket.

Nyissunk tehát egy új chartot, és klikkeljünk duplán szkriptünkre! Látszólag nem történik semmi, azonban ha megvizsgáljuk a “Terminál” panelt (ahol a nyitott pozíciókat is mutatja a program) és rákattintunk az “Expertek” fülre, csodát fogunk látni.

2010.10.29 16:18:08 Teszt EURUSD,H1: removed

2010.10.29 16:18:08 Teszt EURUSD,H1: uninit reason 0

2010.10.29 16:18:08 Teszt EURUSD,H1: 1.3897

2010.10.29 16:18:08 Teszt EURUSD,H1: 1.3898

2010.10.29 16:18:08 Teszt EURUSD,H1: loaded successfully

A legfrisebb adat a fenti, azaz először sorrendben a “loaded successfully”, azaz “sikeresen betöltve” üzenetet kaptuk meg és csak ezután a többit.

A számunkra fontos két érték pedig az első üzenet után látható. Először a mai nap nyitóára, utána pedig a tegnapi nap záróára látható. Ebben az esetben nem volt nagy a különbség, csak 1 pip.

Ez a példakód több szempontból is fontos az alapok megértésével kapcsolatban, én legalább kettőt mondok.

1) Folyamatosság elve

Komolyabb stratégiák, illetve indikátorok készítéséhez elengedhetetlen hogy átlássátok a fenti tömbök folytonosságát. Ugyanis a kulcs-érték párhuzam a beépített és később általunk megírt indikátorok értékeinek lekérdezésénél is teljesen ugyanígy működik. Amennyiben a szkriptet mondjuk napi nézetben indítjuk el, mi mégis az aktuális óra nyitóárára vagyunk kíváncsiak, akkor sincs nehéz dolgunk – a fenti előre definiált változóknak van egy megfelelő függvénye is. Azok segítségével pedig napi nézetben is le tudjuk kérdezni más időperiódus gyertyáinak, vagy indikátorának értékeit.

A fenti kód egy kicsit megváltoztatva:

 iOpen(Symbol(), PERIOD_M1, 0)

Azaz kíváncsiak vagyunk az aktuális instrumentum [ Symbol() ] egy perces adatai közül [ PERIOD_M1 ] a 0. gyertyájának nyitóárára.

2) RefreshRates() függvény

Nagyon fontos függvény, amit hosszabb – inkább komplexebb –  kódoknál mindenképpen érdemes használni. A fent taglalt előre definiált változókat frissíti, mivel elképzelhető hogy a program futása közben azok értéke megváltozik.

A függvény használatával elkerülhető például az, hogy a kód elején megkapott Ask értéken próbálunk nyitni a program futásának közepén, miközben az az érték már a lekérdezés után azonnal (pl. egy századmásodperccel később) megváltozott. Ha ezt a függvényt nem használjuk, előbb-utóbb rejtélyes hibákat fogunk megélni.

Zárszó

A következő poszt is nemsokára érkezik. Addig is bízom benne, hogy a fenti – majdhogynem ömlesztett – információtömeget hasznosnak ítélitek. Várom a kommenteket és véleményeket a poszttal kapcsolatban!

 

Írta: | 2017-08-30T09:39:49+00:00 2010. november 2., kedd|MQL4, Olvasnivaló programozóknak|34 hozzászólás

A szerzőről:

Radulovic Attila vagyok, a radu.hu tulajdonosa és szerkesztője. Remélem, hasznosnak találod az oldalamon található anyagokat! Célom, hogy hatékony segítséget nyújtsak Neked a kereskedéssel és az automatizálással kapcsolatban. Érdekel a véleményed, kérlek írd meg kommentben!

34 hozzászólás

  1. NZ 2010. november. 10. szerda - 12:03 - Válasz

    Szuper ez az írás is. Ha folytatás is legalább ilyen szintű lesz, akkor csak ajánlani tudom.
    Egy kis kiegészítés, nem túl lényeges, a Compile gombra, vagy az F5-re is végrehajt mentést.

  2. ang3lt 2010. november. 13. szombat - 14:24 - Válasz

    Szia

    Koszonom az irast nagyon hasznosnak talalom, remelem lesz folytatas!

    Viszont sikerult rogton elakadnom. Csak annyit szeretnek hogy az aktualis gyertyta close erteket kiirja:

    Alert(“Close: “,Close[0]);
    De miert csak 4 tizedesjegyet ir ki? Egy kerekitett erteket kapok mindig.

    Ha a chartot nezem akkor viszont 5 van.
    Alert(“Digits:” ,Digits);
    Ez is 5el ter vissza.
    Mit rontok el?

    Elore is koszonom!

    • radu 2010. november. 13. szombat - 19:21

      ang3lt: Alapból 4 tizedesjegyet ír ki az Alert() és Print() is. A konverziós függvényeknél találsz egy DoubleToStr() nevűt, ami a double értékeket string típusra formázza. Itt meg tudod adni, hogy hány tizedesjegyet akarsz kiíratni. Megoldás:


      Alert ("Close: ", DoubleToStr(Close[0], Digits));

      Ez éppen Digits számú (esetedben 5) tizedesjeggyel írja ki, de nyilván annak helyére bármi megadható. A függvényt (és a többi konverziós fgvt, amik még jól jöhetnek) itt találod meg.

  3. rrob 2010. november. 22. hétfő - 23:36 - Válasz

    Szia
    Csak nem sikerül módosítanom a nyitott pozit, illetve az első módosítást elvégzi és azután nem csinál semmit vele ha új pozit nyit azzal sem pozi nyitása: ticketa = openPosition(currentSymbol, OP_SELL, LongLotSize, 0, Bid + SL, Bid – TP, MagicNumber, SellColor); ticketb = openPosition(currentSymbol, OP_SELL, LongLotSize, 0, Bid + SL, Bid – STP, MagicNumber + STP, SellColor);
    pozi módosítása: if (Ar == 0){
    OrderSelect(ticketa,SELECT_BY_POS,MODE_TRADES);
    if (OrderOpenPrice() == Bid – StopNullaAktivalo) {
    createLabel (currentSymbol + “_sig_label”, “Szignál: “, 5, 55, 0, 0, 0);
    createLabel (currentSymbol + “_sig”, OrderOpenPrice(), 100, 55, 0, 0, 0);
    // itt módosít máshol nem
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + StopNulla,OrderTakeProfit(),0,Blue);
    if (ticketb > 0){
    OrderSelect(ticketb,SELECT_BY_POS,MODE_TRADES);
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + StopNulla,OrderTakeProfit(),0,Blue);
    }
    Ar = Bid;
    }

    Előre is köszi a segítséget
    Egy lelkes amatőr 🙂

    • radu 2010. november. 23. kedd - 00:03

      Első ránézésre félkómásan: megmarad az “Ar” változód értéke, így a következő körben az if (Ar == 0)… sorod már eleve nem teljesülhet. Rakj egy Ar = 0; -át az openPositions után!

    • rrob 2010. november. 23. kedd - 17:50

      Hali
      igen bocs azt nem másoltam be de a pozi nyitás után ott van az A=0; a “ticketa” nevű pozit módosítja, de a “ticketb” azt nem, egy körben kellene változtatnia mind a kettőt.
      Köszi

    • radu 2010. november. 23. kedd - 21:53

      Oh, most már látom. Tegnap túl fáradt voltam.

      SELECT_BY_POS helyett SELECT_BY_TICKET kell. Az előbbi az a pozíciók listája szerint sorszámhivatkozást, míg az utóbbi ticket alapú hivatkozást jelent. Amikor egy ticket számot kapsz vissza, vagy olvasol ki akkor természetesen ticket alapján is kell kiválasztani az adott ordert.

  4. rrob 2010. november. 23. kedd - 21:56 - Válasz

    Értem
    Köszi

  5. balogh lászló 2010. november. 26. péntek - 15:00 - Válasz

    Szia,tényleg jó a blog és még jobb lenne ha folytatodna… tudod hogy szokott lenni,irkálnak egy darabig aztán ha már a blog fenntartja magát akkor már nem törődnek vele pedig érdemes lenne.Én most ismerkedek ezzel a nyelvvel és nagyon szeretném megtanulni,eddig csak CNC-ét progiztam de látom ez egy kicsit nehezebb.Tehát szerintem mindenki”felhatalmaz” rá hogy folytasd,csak így tovább.Esetleg tudnál nekem segíteni,lenne egy egyszerű stratégia de sajnos még nem tudok müködőképes progit irni,kéne egy tök egyszerű progi amin gyakorolhatnék,én irnám át a változokat csak egy alap lenne meg.Autodidakta módón.Elöre is köszi és sok látogatót a blogra.

    • radu 2010. november. 26. péntek - 23:51

      Rajta vagyok az ügyön, és lesz új bejegyzés ez biztos. Igyekszem minél előbb, de ígérgetni nem szeretnék. A lényeg, hogy lesz! 🙂

  6. Attila 2010. december. 6. hétfő - 13:46 - Válasz

    Kedves Radu!

    Nagyon tetszik a blog!
    Robotírásra adtam a fejem és bele is ütköztem az első akadályba. Amikor bemásolom az expertet a Meta experts könyvtárába nem jelenik meg csak szürkén és nem indul el.
    Mi ennek az oka?
    Nagyon örülnék, ha felvehetném veled a kapcsolatot.
    Attila

    • radu 2010. december. 6. hétfő - 14:31

      Szia!

      Feltételezem idegen expertről van szó. Ebben az esetben ha csak az ex4-et másolod be az experts könyvtárba, akkor azért jelenik meg szürkén, mert nincs mellette forráskód.

      Amennyiben csak a forrást másoltad be, és mégis szürke a robot akkor pedig a fordítás (compiling) közben történt valami hiba. Emiatt a robot nem fordult le, és kvázi használhatatlan (a paraméterablakot sem tudod előhozni). Ha ez a helyzet, akkor nyisd meg a kódszerkesztőt, benne a fájlt és próbáld meg lefordítani. A hibaüzeneteket látni fogod, és onnan már könnyebb elkezdeni nyomozni, hogy valójában mi a probléma eredete.

  7. werisch 2010. december. 20. hétfő - 07:59 - Válasz

    Sziasztok!

    Egy forumbol találtam rá erre a linkre. Nagyon örülök annak, hogy van ilyen honlap is.
    Remélem hoszútávu lesz ez a blog. Én is értek valamennyire a MT4 programozásához.
    Valamikor programozóként dolgoztam és januártol kezdtem el nézegetni, tanulni ezt a nyelvet, mégpedig azért mert a robotok amikkel találkoztam nem nagyon müködtek és érdekelt mi van bennük leprogramozva. Aztán később már a saját ötleteimet is megvalósitottam, de egyik sem volt a backtesztek szerint hatékony pénztermelő robot.

    • radu 2010. december. 20. hétfő - 22:19

      Köszönöm a visszajelzésedet. Lesznek még programozással kapcsolatos cikkek, igyekszem minél hamarabb összerakni egy következő posztot!

  8. Ásó Zsolt 2011. január. 24. hétfő - 19:18 - Válasz

    Végre egy magyar nyelvű oldal is foglalkozik a Metatrader mélyebb szintű használatával!
    /Engem kiváltképpen egy teljesen új indikátor létrehozása érdekel. Elgondolásom megvan, csak sajnos nem értek a szoftverhez használatához. Már csak ezért is remélem, hogy “életben marad” ez a blog./

    • radu 2011. január. 24. hétfő - 20:23

      Örülök, hogy tetszik a blog. Ahogy már korábban is írtam, igyekszem majd új posztokat írni a témában.
      Ha meg nem ér rá a dolog, akkor szólj és adok árajánlatot az indikátorra.

  9. NZ 2011. január. 25. kedd - 12:08 - Válasz

    Sziasztok!
    Tudnátok segíteni, hogy a következő kifejezések mit jelentenek?
    a -= 4;
    b <<= 8;

    • radu 2011. január. 25. kedd - 15:31

      a -= 4;

      “a” változóból 4 kivonása.
      int a = 16;
      a -= 4;
      Print (a);

      A kiírás 12 lesz. Gyakorlatilag egy egyszerűsített kivonás. Ugyanez természetesen működik a += operátorral az összeadásra, *= operátorral a szorzásra, stb.

      b <<= 8;

      Ez már bonyolultabb – a biteltoltás operátora. Nem gyakran használt cucc, legalábbis nem hiszem hogy robotprogramozásnál túl sokszor kerülne előtérbe a kettes számrendszerben való operálás:)

      Bővebben itt olvashatsz ezekről: http://docs.mql4.com/basis/operations/assign

    • NZ 2011. január. 25. kedd - 18:06

      Köszi a választ, a másodikat nem értem mi lehet….
      b = 1000 esetleg???

    • radu 2011. január. 25. kedd - 18:13
  10. NZ 2011. január. 26. szerda - 15:52 - Válasz

    Köszi az infót, azt hiszem értem ……. legalábbis remélem.
    Egy tömb elemének értékadásakor ez mit jelent?
    a[2]= 5|6|12;
    Mit kell a számokkal csinálni?

    • radu 2011. január. 26. szerda - 20:41

      Szerintem ilyen megadás nincs az MQL4 nyelvben.

      Max ez villan be:
      a[] = { 5, 6, 12 };

      De amit írtál az teljesen ismeretlen.

  11. NZ 2011. január. 27. csütörtök - 09:14 - Válasz

    Itt a kódrészlet:

    void Compress(int &amp;aia_0[100], string as_4) {
       int li_24;
       int li_28;
       int li_32;
       int li_36;
       int li_12 = StringLen(as_4);
       int li_16 = 0;
       for (int l_index_20 = 0; li_12 &gt; 0; l_index_20++) {
          if (li_12 &lt; 4) li_24 = 0;
          else {
             li_24 = StringGetChar(as_4, li_16 + 3);
             li_24 &lt;&lt;= 24;
          }
          if (li_12 &lt; 3) li_28 = 0;
          else {
             li_28 = StringGetChar(as_4, li_16 + 2);
             li_28 &lt;&lt;= 16;
          }
          if (li_12 &lt; 2) li_32 = 0;
          else {
             li_32 = StringGetChar(as_4, li_16 + 1);
             li_32 &lt;&lt;= 8;
          }
          if (li_12 &lt; 1) li_36 = 0;
          else li_36 = StringGetChar(as_4, li_16);
          aia_0[l_index_20] = li_24 | li_28 | li_32 | li_36;
          li_12 -= 4;
          li_16 += 4;
       }
       aia_0[l_index_20] = 0;
    }
    • radu 2011. január. 27. csütörtök - 17:03

      http://docs.mql4.com/basis/operations/assign

      Javítom magam, létezik ilyen megadás: szintén kettes számrendszerhez kapcsolódik. Nyilván kódvisszafejtés szempontjából ez aligha segít neked. Robotprogramozás során elég ritkán van szükség ilyen funkció használatára.

      Gyakorlatilag egy-egy szám kettes számrendszerbeli megadását fűzöd össze vagy vagy és művelettel.

  12. nc 2011. március. 13. vasárnap - 20:12 - Válasz

    Sziasztok! Egy kérdésem lenne. Hogyan lehet mql4-ben lekérdezni, hogy éppen milyen chart ablak van nyitva? Tehát, ha EURUSD van akkor ezt csinálja, ha CADUSD, akkor mondjuk meg azt. 🙂

    Köszi szépen előre is!

    • radu 2011. március. 13. vasárnap - 22:26

      A Symbol() függvény kell neked.

      Remélem, erre gondoltál – sajnos ennél szofisztikáltabb lehetőséget nemigen ad a nyelv.

  13. bandika 2011. április. 26. kedd - 20:14 - Válasz

    Sziasztok! radu te nagyon nagyon vágod ezt a témát.Külön vannak erre irányuló tanfolyamok?Vagy bárki aki ért egy kicsit a programozáshoz rálátása lehet erre és tudna csinálni egy indikátort vagy robotot?

    • radu 2011. április. 26. kedd - 20:28

      A neten azt hiszem már belefutottam MQL4 tanfolyamba, mindenesetre sok infót nem találtam róla.
      Én nem végeztem semmilyen ilyen irányú tanfolyamot, viszont PHP-s alapokkal könnyen belemerültem az MQL-be is – lévén hogy mindkét nyelv alapja a C.

      Amit mindenképpen javaslok: tanfolyam magával a tőzsdei kereskedéssel kapcsolatban. Itt a blogon is találsz linket egy tanfolyami céghez, de gyakorlatilag bármilyen alapszintű tanfolyam jó lehet, ami minimális ugródeszkát biztosít a gyakorlati kereskedéshez. Ha az alapok megvannak, utána jöhet a programozás:)

      Akinek van programozási tudása, az jóval könnyebben merül el bármilyen programozási nyelvben. Mindemellett azt gondolom, hogy aki ambíciózus és egy kicsit is hajlandó venni a fáradtságot hogy valaminek utána nézzen, képes beletanulni akár ebbe a programnyelvbe is.

  14. bandika 2011. április. 27. szerda - 08:21 - Válasz

    Köszönöm a gyors választ.Én egy nagyon egyszerű indikátorral kereskedek már lassan 2 hónapja és úgy néz ki h tudok vele pénzt keresni.Mennyibe kerülne nekem ha nem szeretnék 8 órát itt ülni és gombokat nyomkodni? 😀

    • radu 2011. április. 27. szerda - 08:54

      Skypeon vagy e-mailben keress meg, és ha leírod/elmondod a pontos elképzelést akkor tudok rá adni pontos árat és határidőt.

  15. bandika 2011. április. 27. szerda - 11:43 - Válasz

    mail cimet tudnál küldeni?

    • radu 2011. április. 27. szerda - 12:21

      Az oldalsó menüben vagy a Névjegy menüben megtalálod:)

  16. bandika 2011. április. 27. szerda - 15:04 - Válasz

    Helló .elküldtem egy rajzot és egy kis leírást a e-mailedre remélem el tudsz rajta igazodni,és tudsz nekem segíteni.előre is köszi

  17. bandika 2011. április. 29. péntek - 12:21 - Válasz

    Hy radu. Nem tudom hogy megkaptad e a mailt,vagy hogy el tudtál e rajta igazodni,kivitelezhető lehet szerinted?Kérlek válaszolj.Tökön ülök 😀

Hagyj üzenetet

Adhatok Neked még több ingyenes tartalmat?

Értesítelek hetente megjelenő új tartalmaimról.