Ebben a posztban igyekszem egy kis ízelőt adni a MetaTrader 4 kereskedési platform programnyelvébe, mely az MQL4. Mivel a téma nagyon nagy, ezért ennek a bejegyzésnek csupán az a célja, hogy egy kis bepillantást nyerjetek az MQL4 nyelv alapjaiba, 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.
Nem célom továbbá az sem, hogy kitérjek az újabb MQL5 programnyelv új képességeire, ezt majd egy másik bejegyzésben teszem meg. Megjegyzem, hogy az ebben a cikkben tárgyalt alapfogalmak egy része MQL5-ben is megállja a helyét, hiszen a két nyelv alapja nagyrészt közös.
Ú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ásként a MQL4 Docs és MQL4 Book oldalakat használtam, 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 :) Ha érdekel, olvasd el bejegyzésemet arról, hogy milyen szempontokat érdemes figyelembe venni az MQL4 / MQL5 programozás során, ha pedig úgy döntesz, hogy inkább egy programozót bíznál meg egy feladattal, olvasd el a MetaTrader programozás kapcsán létrehozott útmutatómat.
Mi a MetaTrader programozás?
Azt jelenti, hogy a programozás során egyedi programokat hozunk létre, amelyeket a MetaTrader platform 4-es, vagy 5-ös verziójában használhatunk fel. A két szoftver között jelentős különbségek vannak, bővebben erről a MetaTrader útmutatómban olvashatsz. Egyedi program lehet egy forex kereskedőrobot, vagy indikátor is.
A programozási nyelv az MQL4, vagy az MQL5 lehet, a fejlesztés eszköze pedig a MetaEditor nevű szerkesztőfelület, ez fordítja le a kódot, és teszi az MT terminál számára olvashatóvá EX4/EX5 fájlok formájában.
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ők az instrumentumra és a piacra érvényes korlátozások,
- lekérdezhetők a stop szintek, nyitható kötésegységek stb.
E környezet alapvető kihasználására egy egyszerű példa a korábban írt cikkemben lévő, instrumentum információit lekérdező 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.
Program típusok
A terminál három típusú programot képes futtatni, ezek: expert advisorok, indikátorok és szkriptek. Alapvető különbség köztük, hogy mindegyikük más célra szolgál és más feltételekkel futtatható. Nézzük, melyikük mire való!
Mi a tick?
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. Mértékét a ticksize határozza meg, forex (devizapiaci) instrumentumok esetén a leggyakrabban 0,00001. Amennyiben az ár valamely irányba elmozdul valamekkora távolsággal, a terminál árszintje megmozdul és ekkor minden éppen aktív, instrumentumra 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 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 például 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 egy végtelen ciklus.
Képzeljük el „csúcsidőben” (amikor rengeteg kötés van a piacon 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 beérkező ticket, így ugyanennyi 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
A változóknak különböző típusai lehetnek. Ilyen adattípusból a következőkkel találkozhatunk az MQL4 nyelvben (nagy részük ismert lehet más programnyelvekből is):
Adattípusok
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 (Sorozat tömbök)
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ősíkok)
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ó típusok)
A tranzakciók típusai. Segítségükkel lehet pozíciót nyitni, de használatukkal könnyen azonosítani tudod akár a saját funkcióidban is, hogy milyen típusú ügyleteket kezelsz éppen.
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 (Ár konstansok)
Az alkalmazott ár meghatározása. Indikátorok paraméterezésénél rendkívül fontos paraméter, ezeket a lehetőségeket találod meg a MetaTrader felhasználói felületén is a gyári indikátorok legördülő listájában.
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 (Piac információk)
Piaci környezet adatainak lekérdezése. Nem sorolom fel őket, mivel nagy részük célja kitalálható az előző cikkemben közölt szkript működése alapján.
Drawing styles (Rajzstílusok)
A MetaTraderben ezeket a rajzolási stílusokat használhatod egy indikátorban. Ezek kifejezetten a puffervonalak stílusai, kerülőútként grafikus objektumokat is használhatunk.
Arrow codes (Nyíl kódok)
Az indikátor nyíl típusú rajzolási puffereiben, illetve a nyíl objektumoknál ezeket a nyíl típusokat használhatod.
Wingdings
A Wingdings betűtípus szimbólumai.
Web colors (Webes színek)
A szövegesen hivatkozható színek listája. Használatukkal elkerülhető, hogy az RGB színkódokkal kelljen meghatározni.
Indicator lines (Indikátor vonalak)
Néhány technikai indikátor vonalainak meghatározása.
Moving Average methods (Mozgóátlag módszerek)
A gyári indikátoroknál a simítási módszerének paraméterezése során az alábbi konstansok közül választhatsz. A leggyakrabban a mozgóátlag indikátorhoz használjuk őket.
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 |
Object types (Objektum típusok)
Rajzolható objektumok típusai (csak a leggyakrabban használtakat sorolom fel) 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 tulajdonságok)
Objektum paramétereinek lekérdezéséhez (ObjectGet* függvények) és beállításához (ObjectSet* függvények) szükséges.
Object visibility (Objektum láthatóság)
Ezekkel a konstansokkal adható meg, hogy az objektum mely idősíkon (vagy idősíkokon) látszódjon.
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. |
OBJ_NO_PERIODS, EMPTY | -1 | Az objektum minden idősíkon rejtett. |
MessageBox (Üzenetablakok és kérdező párbeszédablakok paraméterezéséhez)
Időnként előfordul, hogy szeretnél megjeleníteni egy felugró jóváhagyási, vagy kérdező ablakot. Ez a lehetőség csak valós idejű futtatás esetén áll rendelkezésedre, és ezekkel a konstansokkal tudod befolyásolni, hogyan jelenjen meg a párbeszédpanel, milyen választási lehetőségeket tartalmazzon, milyen ikonja legyen stb.
Uninitialize reason codes (Eltávolítási kód)
A robot, indikátor, vagy szkript futása befejeződésének oka. Az UninitializeReason() függvénynél használható.
Konstans | Érték | Leírás |
---|---|---|
REASON_PROGRAM | 0 | A program az ExpertRemove() függvény hívása miatt 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álbann másik számlára lépett át a felhasználó, vagy megszakadt a kapcsolat és újracsatlakozás történt |
REASON_TEMPLATE | 7 | Új sablon alkalmazva |
REASON_INITFAILED | 8 | Azt jelzi, hogy az OnInit() handler nullától eltérő értéket adott vissza, vagyis hiba történt az inicializálás során |
REASON_CLOSE | 9 | A terminálprogramot bezárták |
Special constants (Speciális konstansok)
Olyan univerzális konstansok, amelyekkel egy-egy speciális állapotot, vagy célt írunk le, például NULL, EMPTY, EMPTY_VALUE stb.
Error codes (Hibakódok)
A GetLastError() fügvénnyel lekérdezhető az utolsó művelet hibakódja, amely után a hibakódok, valamint a futásidejű hibakódok listájában lehet keresgélni.
Célszerű ezeket a konstansokat használni az általunk létrehozott programkódban is. Egyedi felhasználói hibakódok létrehozására is van mód.
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.
A folyamatosság elve a tömbökben
A csillaggal (*) jelölt tömbök esetében egy-egy értéket a megfelelő kulccsal 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 egy érték lekérdezésére! 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!
További olvasnivalók
Figyelmedbe ajánlom korábbi bejegyzésemet a pozíciók zárásának folyamatáról, illetve remek forrás a tanuláshoz az MQL4 könyv magyar változata.
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.
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!
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.
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 :)
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!
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
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.
Értem
Köszi
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.
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! :)
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
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.
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.
Köszönöm a visszajelzésedet. Lesznek még programozással kapcsolatos cikkek, igyekszem minél hamarabb összerakni egy következő posztot!
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./
Ö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.
Sziasztok!
Tudnátok segíteni, hogy a következő kifejezések mit jelentenek?
a -= 4;
b <<= 8;
a -= 4;
b <<= 8;
Bővebben itt olvashatsz ezekről: http://docs.mql4.com/basis/operations/assign
Köszi a választ, a másodikat nem értem mi lehet….
b = 1000 esetleg???
Kb. hasonló, kiindulópontnak jó: http://hu.wikibooks.org/wiki/C_Sharp_programoz%C3%A1s/Oper%C3%A1torok
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?
Szerintem ilyen megadás nincs az MQL4 nyelvben.
Max ez villan be:
a[] = { 5, 6, 12 };
De amit írtál az teljesen ismeretlen.
Itt a kódrészlet:
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.
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!
A Symbol() függvény kell neked.
Remélem, erre gondoltál – sajnos ennél szofisztikáltabb lehetőséget nemigen ad a nyelv.
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?
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.
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? :D
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.
mail cimet tudnál küldeni?
Az oldalsó menüben vagy a Névjegy menüben megtalálod:)
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
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 :D