Kérdezz!

Ez az oldal azért jött létre, hogy lehetőségetek nyíljon olyan kérdések feltételére, amelyek más posztokhoz nem kapcsolódnak.

Ha elakadtál mql (mql4, mq4) programozás közben, akkor itt tedd fel kérdéseidet! Igyekszem rájuk kimerítő megoldást adni, persze a meglévő hozzászólások között is találhatsz számodra értékes információkat.

2012. március 11-ikétől egy új fórum áll rendelkezésetekre a kérdések feltételéhez. Mivel az itteni kommentek egy idő után követhetetlenek, a fórumban témák szerint lehet majd böngészni a korábban feltett kérdéseket.

Az MQL kódkiemelés a fórumban csak később válik elérhetővé.

Az alábbi űrlapon keresztül új témát tudsz indítani MQL4 programozás kapcsán.
A mezők jelentése:

Téma címe

A kérdés témaköre, megnevezése. Maximum 80 karakter lehet.
Például: "Miért nem köt a robotom?"

Téma leírása

A téma induló hozzászólása, melyben részletezed a problémád/kérdésed.

Téma címkék

Olyan kulcsszavak, melyek jellemzőek a kérdésedre. Ezzel megkönnyíted a jövőben hasonló problémával kapcsolatban keresgélő olvasók dolgát. A kulcsszavakat vesszővel válaszd el!
Például: expert,ciklus,ellenőrzés,feltétel

Értesíts e-mailben, ha válasz érkezik

Amennyiben szeretnél e-mailben értesítést kapni ha valaki hozzászól az általad feltett kérdésre, jelöld be ezt az opciót! Ezt egyébként más, számodra érdekes témáknál is megtehed a "Feliratkozás" link segítségével, melyet minden téma első hozzászólásának fejlécében találsz meg.

Címlap Fórumok Hasznos eszközök Kérdések az MQL4 programozási nyelvvel kapcsolatban

Ennek a fórumnak a tartalma: 154 témakör és 677 válasz, utolsó frissítés:  Radulovic Attila 1 hónap.

15 témakör megtekintése : 1-15 / 154
15 témakör megtekintése : 1-15 / 154

Új témakörök létrehozásához jelentkezz be, vagy regisztrálj!

Oszd meg, ha hasznosnak találtad!

145 hozzászólás a(z) “Kérdezz!” bejegyzéshez

  1. Sziasztok!
    Mailban már írtam Radunak, hogy mennyire örülök, hogy magyar nyelven is van színvonalas blog, ahol MT4 témában lehet informálódni, tanulni és segítséget kapni és adni! Én minden számítástechnikai tudás nélkül (leszámítva a jó öreg Basicot) igyekszek mql4 progikat írni.
    Most az alábbi probléma megoldásához szeretnék segítséget kérni:

    Indikátor írásakor az alábbi, gyakran előforduló problémával találkozok:
    Idősík váltásakor vagy a program indításakor, amikor a meta még adatokat tölt be, "elromlik" az indikátor, össze-vissza vonalak születnek. Ha ilyenkor ismét idősíkot váltok, majd vissza, tehát visszalépek arra az idősíkra, ahova már nem kell új adatokat betölteni, mert megvan mind, helyreáll a rend, és a továbbiakban szépen működik az indikátor.
    Ennek a hibának az orvoslására találtam ki az alábbi trükköt, amely úgy tűnik megoldja a problémát, de nem találom túl "elegánsnak". Van erre valamilyen "hivatalos", korrekt megoldás, vagy jó ez így?

      int init()
      {
    //----
       SetIndexBuffer(0,BL); SetIndexLabel(0,"BigL");
       SetIndexBuffer(1,BS); SetIndexLabel(1,"BigS");
       SetIndexBuffer(2,TN); SetIndexLabel(2,"TrendN");
       SetIndexBuffer(3,TL); SetIndexLabel(3,"TrendL");
       SetIndexBuffer(4,TS); SetIndexLabel(4,"TrendS");
       SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexEmptyValue(0,0);
       SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexEmptyValue(1,0);
       SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexEmptyValue(2,0);
       SetIndexStyle(3,DRAW_HISTOGRAM); SetIndexEmptyValue(3,0);
       SetIndexStyle(4,DRAW_HISTOGRAM); SetIndexEmptyValue(4,0);
       b=Bars;
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
      int start()
      {
    //----
       if(Bars>b+1)
       {
        ArrayInitialize(BL,0);
        ArrayInitialize(BS,0);
        ArrayInitialize(TN,0);
        ArrayInitialize(TL,0);
        ArrayInitialize(TS,0);
        init();
       }
       count=IndicatorCounted(); if(count>0) count--;
       limit=Bars-count;
       for(i=limit; i>=0; i--)
       {
       {
        if(Bars>b) b=Bars;
       stb ....................

    Várom válaszaitokat! Üdv! Abunba

  2. Szia Radu!
    Azt szeretném kérdezni, hogy tömb változó dimenziójának megadásakor, ha nem tudom előre pontosan, hogy mekkora lesz, javaslod-e megadni egy nagy számot (99999999) és ez lessítja-e a program futását?
    U.i: az előző kérdésemre adott válaszod miatt rengeteget próbálgattam az indikátort, az IndicatorCounted() paranccsal is próbáltam variálni, de minden esetben hibásan működött, amikor új adatot töltött be, akár előről akár hátulról (Home bill. nyomkodáskor illetve bekapcsoláskor). A start()-ban való init()-tel egyenlőre jól működik, emiatt valszeg így hagyom.
    Üdv! Abunbna

    • Nyilván nem elegáns megoldás, de valóban nincs rá más lehetőség ha előre nem tudjuk a tömbök méretét. Memóriafoglalás szempontjából sem túl optimalizált megoldás - egyébként mi a konkrét feladat amihez tömbös megoldást akarsz használni?

  3. Gyertyákat méretezek át, és előre nem lehet tudni, hogy a Bars-ból hány új gyertya fog születni. Lehet hogy több, lehet hogy kevesebb, attól függően, hogy mekkora lesz az új gyetyák mérete.

  4. Renko "féle" chart rajzolása indikátor ablakba. Azért írom, hogy "féle", mert a neten található scriptek, indik, expertek a múltbéli gyertyák esetében azok max és min árából készítenek feltételezett gyertyasorozatot, amely egyáltalán nem biztos, hogy a valóságban is úgy születtek volna. Ez a hiba főleg akkor jelentkezik, ha nagy gyertyákbók képeznek kis méretű Renko bárokat. Én olyat akarok, amely csak a záróárakból dolgozik, és mivel ilyet nem találtam, magam akarom elkészíteni. Külön indikátor ablakban jelenne meg, mert sajnos ahhoz kevés vagyok (egyenlőre :) ), hogy offline chartban ábrázoljam. Az idő ábrázolása egy 2. indi ablakban lenne, mert nem tudom, hogy hogyan lehetne két teljesen eltérő nagyságrendű értéket (bárok: pl 1.3255 és 1.3260, idő pl: 20110112.1136) úgy megjeleníteni egy indi ablakban, hogy az utóbbit ne ábrázolja de a data ablakban megjelenjen, és a indi ablak skáláján NE vegye figyelembe!!! (ez utóbbi feltétel a gond, és a DRAW_NONE nem segít) Van erre esetleg jó ötleted?
    Egyébként nem nagy gond az sem, ha az idő külön ablakban lesz, mert akkor ebben az ablakban egy, a felette levő indi ablak ábrázolt Renko bárokból számolt trend indikátort is tudok működtetni.

  5. Sziasztok!
    A kérdésemet egyszerűen próbálom megfogalmazni:
    Hogyan lehet elérni azt, hogy egy indikátor ne ábrázoljon, és az Y tengely méretezése során ne vegyen figyelembe egy tömb adatsort, de kiírja a data ablakban?
    Nem jó megoldás a: "#property indicator_maximum" vagy "...minimum", mert az előre nem lehet tudni, és állandóan változtatni kellene! Próbálkozásaim során kiderült, hogy nem jó megoldás a: "SetIndexStyle(3,DRAW_NONE)" sem!
    A válaszokat előre is köszönöm!
    Üdv! Abunba

  6. Nem értem pontosan az Y tengelyes részt, de a SetIndexStyle -os megoldás jó, kipróbáltam. Ha nem megy, akkor mutasd a kódot!

  7. Ismét kipróbáltam. A SetIndexStyle -os megoldás esetében az Y tengely skálájának automatikus méretezésénél figyelembe veszi az ábrázolni nem kívánt adatsort is. Tehát az a gond, hogy ez az ábrázolni kívánt adatsor számszaki nagyságrendje teljesen más (jóval nagyobb) mint a többi, ábrázolt adatsor nagyságrendje, így a chart kinézete teljesen rossz. (alul - felül hatalmas űr van)

  8. sziasztok.
    egy olyan problémám adódott, hogy egy expertet szertnék átalakítani, de csak az ex4 file van meg. valaki át tudná ezt alakítani mq4-re?
    köszönettel.
    tom

  9. Szia Radu!Azt kérdezném, hogy letöltöttem az átlagár scriptet és ha berakok egy charton long és short pozit, mondjuk az egyik pozi 0.01 lot a sort, a másik 0.04 long és így tovább akár ellentétes irányokba akkor is kiszámolja az átlagárat és nulla lesz ha oda teszem a stopot és a célárat? Előre is köszi

    • Üdv!

      Az átlagár szkript a short és a long kötések átlagárát külön-külön és egyesítve is kiírja.
      Amennyiben a kilépési szinteket ennek megfelelően állítod be, akkor (összesítve) nullában kell hogy záródjanak a pozíciók. (nyilván egy-egy nagyobb lotméretű pozíció képes ellensúlyozni a másik/többi pozíció(k) veszteségét, stb.)

      Javaslom, hogy először mindenképpen demó környezetben próbáld ki!

  10. Szia Radu!

    Nagyon tetszik az oldalad, nagyon hasznos infókat lehet innen szedni.
    A pontos adatokért is hatalmas köszönet.
    Egy olyan kérdéssel fordulok hozzád, hogy megbízható centes számlát hol tudok nyitni?
    Válaszodat előre is köszönöm.

    Üdv. :
    Péter

    • A "megbízható" is relatív, de sokan a környezetemben az FXOpen illetve InstaForex centes számlákat használják.

      Jómagam az FXOpennél nyitottam anno és nem volt gondolom velük.

  11. Szia Radu!

    Régen beszéltünk már. Felmerült egy olyan probléma amin megakadtam. Ha beállok egy szintre ahol pozit szeretnék nyitni, eléri a szintet megnyitja a pozit és a stoploss lezárja. Mivel tudom kiolvastatni, hogy az adott pozit mi alapján zárta stoploss vagy takeprofit?
    Előre is köszi Robi

    • Ez egyszerű! Amennyiben:

      - OrderClosePrice() egyenlő OrderStopLoss() -szal, akkor stop loss kiszálló volt;
      - OrderClosePrice() egyenlő OrderTakeProfit() -tal, akkor take profit kiszálló volt;
      - OrderClosePrice() egyikkel sem egyenlő, akkor kézi zárás volt.

      Használd a NormalizeDouble() függvényt, mert egy-egy tizedesjegyen is múlhat a pontos egyenlőség.

    • Az is megoldás erre, ha megnézed a lezárt trade kommentjét az OrderComment() függvénnyel és ennek az utolsó 4 karaktere stop esetén [sl], míg target esetén [tp].

      GG

  12. Szia Radu,
    az expertek optimalizálásával kapcsolatban mi a te álláspontod melyik módszer a leg célra vezetőbb, hogy kerülhető el a túloptimalizálás, és mikor kapjuk a legjobb eredményt a jövőre vonatkoztatva?
    Előre is köszi az infót!
    Lakat

  13. Gondolom kifejezetten a stratégia optimalizálására gondolsz. Ezzel kapcsolatban nagy okosságom / igazságom nincs, viszont egy jó tanácsot mindenféleképpen tudok adni: a backtesztek - még ha a pontosabb adatokkal végzed is el őket - kizárólag iránymutatásra jók. Indulj ki abból, hogy a bactesztekben sosem történik meg olyan helyzet, ami "élőben" - és itt nem az éles pénzre, hanem a jelenben történő futtatásra gondolok - viszont igen.

    A backtesztelés-optimalizálás során - persze ha a stratégia engedi - mindenképpen a minél kisebb kockázat irányából mennék a nagyobb hozzam-nagyobb kockázat felé. Hiszen hiába hoz egy csomó backteszt során nagyon jól a stratégia, ha az ezzel járó kockázatot élőben már nem vállalnád. A jövőre vonatkoztatva pedig azt tartsd szem előtt, hogy azokkal a stratégiákkal érdemes foglalkozni, amely nem a jövőt próbálja megjósolni, hanem a jelenre reagál jól. Az ezzel járó mentális és pszichólógiai terhet a robot nem 100%-ban fogja levenni a válladról, így ezzel is kalkulálj amikor a tesztekben a jövőbeli kockázatokat (és stresszt) próbálod megsaccolni. (a robot vs. mentális felkészültségről még lesz poszt!)
    Amennyiben a kockázatokat nagyjából belőtted, lehet növelni/módosítani a robot hozamával kapcsolatos paramétereket.

    Nem tudom, hogy ilyen válaszra számítottál-e; ha nem, akkor írd le egy kicsit bővebben, hogy te hogy álltál neki idáig a tesztelésnek, és hogy mi az a konkrétum ahol esetleg kétségekbe ütköztél.

  14. Szia!

    Elég sok back testet készítettem, és szeretném az MT4 lehetőségeihez képest kicsit jobban kielemezni őket. Pl átlagos havi profit %, egyes időszakoknál külön megtudjam nézni a DD-t stb...

    Szóval van egy 99%-os pontosságú tesztem 2008.01.01-től 2011.05.31-ig és szeretném ezt mondjuk accessbe vagy excelbe tenni. A legnagyobb gondom, hogy nincsenek meg a képletek pl profit faktor számítási képlete stb...
    Ha ezekbe a programokba nem is, de van arra lehetőség, hogy a nyers teszt eredményeket betöltsem valami MyFXBook-hoz hasonló elemző programba? Vagy akár a MyFXBookba?

    Előre is köszi!

    • Javaslatom a következő: a tesztek során a számodra fontos történéseket (margin, egyenleg, floating, stb.) rögzítsd egy külön csv fájlba. Ennél jobb megoldást hirtelen nem tudok.
      Az MT4 beépítve valóban nem ad túl nagy szabadságot az adatok feldolgozhatóságával kapcsolatban.

      A képletekre nagyjából azért lehet következtetni, de mint írtam a legjobb megoldás valószínűleg a saját adatfeldolgozás lehet.

      A MyFXBookkal konkrét tapasztalatom csak nagyon régről van, azóta sok minden változhatott, új funkciókat csinálhattak, stb. Anno viszont nem volt lehetőség backtesztes adatok feldolgoztatására.

      Az egyéni adatfeldolgozással kapcsolatban igyekszem segíteni, ha van további kérdésed. Ha nem programozol, akkor pedig nézünk valami megoldást a problémádra.

  15. Szia Radu!
    Szuper rendesek vagytok, hogy megosztottátok az MQL4 könyv fordítását ingyenesen. Végig tanulmányoztam és megpróbálkozom az kódírással. Kezdetnek ki akartam próbálni a könyvben szereplő UsualExpert-et, hogy majd azt alakítgatva írok saját robotot. Azonban rögtön az elején elakadtam. A kód fordításakor (compile) egy hibát jelez, helyileg a Tral_Stop.mqh-ban:
    '(' - function definition unexpected. Többször is átnéztem, de nem találtam hibát. Megvan minden kapcsos zárójel. Van valamilyen tipped, hogy merre mi lehet a gond? Találkozott már más is esetleg ezzel a hibával?

    Előre is kösz!

    • Letöltöttem a példakódokat, és nem sikerült hibát előcsalogatnom a usualexpert.mq4 kapcsán. Letöltötted vagy copy pastelted a fájlokat?

      Ha másoltad, akkor próbáld letölteni erről a linkről: tral_stop.mqh

      Nekem letöltve és másolva sem generál hibát fordításnál.

  16. Szia Radu!

    Először is gratulálok a weblapodhoz! Nagyon sok hasznos dolgot találtam rajta. A kérdésem pedig az lenne, hogy milyen editort használsz? Hosszabb forrásoknál a MetaEditort már elég kényelmetlennek találom. Jól jönne pl. ha mutatná az összetartozó zárójeleket, kódblokkokat. Esetleg hasznos lenne ha kódblokkok összecsukhatók lennének, stb.... Én a JEditet találtam ami használhatónak néz ki.

    Előre is köszi az infót!
    Steev

  17. Köszönöm, igyekszem:)
    A kezdetektől a beépített MetaEditort használom. Vannak komoly hiányosságai, de alapvetően elvagyok vele.

    A JEdithez van mq4 kód kiemelő (színek, stb.)? Én amúgy Notepad++ -t használok, és jó volna ahhoz csinálni (ha még nincs) mq4 kiemelőt.
    Az összecsukható blokkok viszont nekem is nagyon hiányoznak:)

    A külső editornál azonban azt is meg kell oldani, hogy a fordítás működjön egy gombnyomásra. Ennek a kényelmét azért hiányolnám.

    • Köszi a tippet. Beraktam a modes könyvtárba, de ennek ellenére a Buffer optionsben nem található az mql4. Mit rontottam el?:)

    • A C:\Users\%User%\.JEdit\modes alá másold. Az ott található catalog fileba pedig szúrd be a következőt a MODES szekcióba. Nekem így működik. :) Nézegettem a np++-t. Tetszik. Lehet próbálok kreálni hozzá valami mql-es fájlt, úgy néztem nem túl bonyolult a dolog.

    • Bemásoltam oda az mql4.xml-t, hozzáadtam ezt a sort a cataloghoz:
      MODE NAME="mql4" FILE="mql4.xml" FILE_NAME_GLOB="*.mq4"

      (relációs jeleket az elejéről végéről most töröltem ki, mert úgy nem jelent meg a hozzászólásban)
      De nem történik semmi. Ha megnyitok egy mq4 fájlt, ugyanúgy fekete minden. A buffer optionsben pedig nem jelenik meg az mql4 nyelv.

      Idáig nem valami szimpatikus a jEdit - és nem azért, mert a fentiek nem sikerültek, hanem mert néhány részét túlságosan agyonbonyolítottnak érzem.

  18. Mást én sem csináltam. Nálam működik. :) Azt vettem még észre, hogy ha a JEditből kilépek a javaw.exe néha bent marad a folyamatok között. És amíg ezt kézzel be nem zárom addig a jeditre nincs hatással a módosítás. Lehet, hogy nálad is ez a helyzet? Egyébként most hogy egyre többet nézegetem az np++-t az nekem is szimpatikusabb. :) :)

    • Jah, az volt a gond. Nem csípem a java-t túlságosan...
      Most működik a színezés, de nekem maga a program nagyon idegen. Inkább csináljuk meg Notepad++-hoz :)
      A futtatást majd megoldottam, le is fogom írni. A színezést oldjuk meg:)

  19. Szia Radu!

    Először is gratulálok az oldaladhoz, nagy segítség!
    Kettő kérdésem lenne.
    1, Ahhoz, hogy e-mailt küldjön a MT4, hogy kell beállítani?
    2, Tapasztalataid alapján, egy stoppos stratégiát milyen időre visszamenőleg érdemes optimalizálni, valamint elért eredményeit figyelembe venni, és milyen profit faktor számít már jónak?
    Pl ha az elmúlt másfél évben adott stoploss értékekkel keres a stratégia de az előtte lévő években nem keres de nem is veszít, az elfogadható? (Merthogy változik az évek alatt egy devizapár mozgása?) Valami vélemény?

    Előre is köszi a válaszokat!

    Üdv: Ogics

    • Köszi:)

      1. A Metatraderben a Beállítások -> Email fülecskén találod az e-mailre vonatkozó beállításokat. Aztán a SendMail függvénnyel tudsz e-mailt küldeni. Amennyiben ez nem megoldható vagy nem szimpatikus a számodra, akkor kövesd a blogot, mert hamarosan lesz értesítéssel kapcsolatban igénybe vehető szolgáltatás (e-mail, sms)

      2. Ez nehéz kérdés. Az általad leírtak alapján úgy tűnik, hogy a stratégia bizonytalan eredményű. Ez ugye azt jelenti, hogy bizonyos piaci helyzetekben - rövidebb vagy hosszabb ideig - jól működik, azonban vannak helyzetek amikor abszolút nem. Jómagam nem kedvelem az ilyesfajta stratégiákat, mert épp a fenti tulajdonságaik miatt lehetetlen valós visszateszt eredményeket kialakítani velük kapcsolatban. Ugyanis hiába teszteled vissza őket 5 évre, lehet hogy a holnapi indítás során a szöges ellentétét műveli majd a tesztben tapasztaltaknak.
      Tehát: vagy a stratégián változtatsz, és kiegészíted olyan elemekkel amelyek segítenek egy-egy rossz pozíció kimenedzselésében, vagy elfogadod azt hogy a stratégia (és a stratégia alapján készült robot) egyáltalán nem képes "egyedül" futni. Természetesen minden esetben kell az emberi felügyelet, de a te esetedben ez nem csak a krízishelyzetekben, hanem kvázi állandóan javallott. De ez csak az én véleményem, nyilván nem mindenki osztja a nézeteimet.

    • Köszönöm a választ!

      Az E-maillel kapcsolatban a kérdésem arra vonatkozott, hogy azon a Beállítások --> E-mail fülön miket kell beírni, hogy pl gmail-ra küldjön e-mailt ha meghívom a programban SendMail függvénnyel.

      Egy stratégia futtatásán milyen várt eredmény ( expected payoff) esetén érdemes elgondolkozni szerinted?

      Továbbiakban az adatokkal kapcsolatban merült fel problémám. Végigcsináltam az általad leírt Pontosabb adatok egyszerűen cikkben lévő dolgokat, működik is teljesen jól, 99%-os nak írja ha lefuttatom. Ami probléma felmerül, hogyha ugyanazt lefuttatom nem az általad leírt módon megszerzett adatokon, hanem a MetaTrader által magától letöltött adatokon, akkor teljesen eltérő eredményt ad. A MT-nek a szerveréről amit letölt a program ennyire más adatai lennének? Mert nem apró különbség van a kettő eredmény között, hanem óriási. Ez a svájci bank által letöltött adatok mennyire mondhatók biztosra, ilyenkor melyik eredménynek hihetünk ?

    • Az e-mail beállításaidat neked kell tudni. Az e-mail szolgáltatódnál is (nagy valószínűséggel) van smtp szerver, nézz utána! A többi beállítást is neked kell tudnod, login, jelszó, feladó, címzett. A feladó és címzett lehet ugyanaz (a saját címed pl.)

      Az expected payoff tekintetében nem tudok bő információval segíteni. Az érték maga a nyereséges/veszteséges pozíciók alapján számolódik, szóval ennek fényében a stratégiától függ az hogy ezek a számok hogyan alakulnak.

      A "konzerv" és a brókeri adatokon futtatott backtesztek közötti különbség sajnos néha igen nagy. Ennek oka lehet például az, hogy a brókeri adatok között hosszabb időszak kompletten hiányzik (pl. 1 hónap).

  20. Kedves Radu!
    Óriási szolgálatot tettél mindenkivel a könyv és tapasztalataid megosztása által.
    Én is felbuzdultam és írtam egy rövidke EA-t az #FDXU1 charthot. Azaz erre optimalizáltam, mert ezen kereskedtem mechanikusan eddig.
    Pozició nyitás elötti pillanatra, egy figyelmeztető jelzést állítottam be, hogy tudjam mikor nyit.
    A Stratégia teszterben - optimalizálás érdekében - többször lefuttattam és működött és működik a mai napig is.
    Mármint a program, én nem gazdagodtam meg.
    Nyitotta és zárta a poziciókat, trailing stop működött.
    Boldogan ráeresztettem élő kereskedésre, a figyelmeztető jelzések jöttek, DE NEM NYIT POZICIÓT!
    Többször átnéztem, a be van kapcsolva az élő kereskedés, nem kértem megerősítést.
    A hiba biztos bennem van, de fogalmam sincs, azaz elfogyott az összes ötletem.
    Hiába kutakodtam a neten megoldás után nem találtam.
    Most itt állok a gép elött egy baltával a kezemben és csak te mentheted meg a végtől.
    Előre köszönöm a segítségedet.
    Somek

    • Hello Somek!

      Sajnos hibaüzenet vagy kód hiányában nem tudok neked részletekbe menően segíteni. A terminál Expertek fülén általában megtalálható, hogy mi a hiba oka.
      A hiba forrása lehet például az, hogy a backteszt szimulált környezetében tud kötni a robot, élesen azonban nem - ennek számtalan oka lehet:
      - pontatlan/idejét múlt a TP/SL/nyitóár megadása. Szúrj be egy RefreshRates() -et az OrderSend elé, illetve használd a NormalizeDouble(ertek, Digits) pontosítást!
      - ECN számláról van szó, azaz nyitásnál nem adhatod meg a TP/SL értéket. Próbálj ezek megadása nélkül nyitni!
      - hibás lotméret, nem elegendő pénz, requote, stb.

      A logfájlok alapján lehet nyomozni tovább. Szúrd be ezt közvetlenül az OrderSend sor után - csak így tudok bővebben segíteni.

      Print(GetLastError());
  21. Köszönöm, próbálkozom. A baltát letettem.
    Minden nyitás előtt jött egy üzenet, pl:
    2011.09.05 15:21:08 FDXU1_1_2a #FDXU1,M1: uninit reason 5
    2011.09.05 15:21:08 FDXU1_1_2a #FDXU1,M1 inputs: Stop_Long=75; Profit_Long=2000; Stop_Short=75; Profit_Short=2000; Trailing_Stop=75; Lot=0.2;

    • Küldd át a teljes kódot a radu kukac radu pont hu e-mail címre, mert ha minden nyitás előtt init-deinit van, az teljesen abnormális.

  22. Örök hálám, működik.
    Kivettem a StopLost és a TakeProfit meghatározását az OrderSend() fv-ből és utána következő sorban módosítom a pozíciót.
    Valamint elhelyeztem a RefreshRates() fv-t és a hibakód sort is.
    Most azonban nem tudom, hogy mi volt a rossz, majd később kipróbálom.
    Még egyszer köszönöm!

  23. Elég valószínű, hogy a TP és SL előre megadása. Legalábbis én annak jósolom a legnagyobb sanszot:)

    Jó kísérletezést!

  24. Sziasztok!

    Nekem a következő nagy gondom lenne:

    USDCHF_ID=OrderSend(Symbol(),OP_SELL,ldLot,bid,Slippage,ldStop,ldTake,lsComm,3,0,clOpenSell);

    és folyamatosan 129-es hibát kapok vissza, ami arra utal, hogy nem jó az ár. A Slippage változót már az egekbe is felvittem. Az az érdekes, hogy néha elmegy, néha meg nem! Mi lehet az oka? Köszi a segítséget!
    Andris

    • A Slippage változó értéke 3-5 körül bőven megfelelő.

      Gondolom a bid az Bid akar lenni.

      Kötések kezelése előtt RefreshRates() (beépített változók kényszerített frissítése) és NormalizeDouble(érték, Digits) (tizedespontosság) használata kifejezetten javasolt.
      Amennyiben ez sem oldja meg a problémádat, látnom kell a kódot és úgy próbálok meg segíteni.

    • Köszi a segítséget! A bid változó bid =MarketInfo(Symbol(),MODE_BID);

      Mert már arra gondoltam, hogy a Bid nem azt az értéket adja vissza amin zárni tudok... A NormalizeDouble-vel ugyanez volt a helyzet, de egy érdekességet észrevettem! Csak és kizárólag FxPron jön ki ez a hiba, máshol nem! és FxPron is csak akkor amikor nem ülök a gép előtt, szóval lehet figyelnek! :)

      Köszi a segítséget!
      Andris

  25. Szia Radu!
    Szegedi Robi vagyok csak nem enged fel a régi nevemmel a jelszót elfelejtettem vagy valami, de nem ezért kereslek van pici problem.

    ticketsa = openPosition (currentSymbol, OP_SELL, LongLotSize, 0, Bid + SL, Bid - TP, MagicNumber, SellColor);

    ezután kiolvastatom az értékeket

    OrderSelect(ticketsa,SELECT_BY_TICKET);
                      főnyitóár = OrderOpenPrice();
                      főnyitópozi = OrderLots();
                      főnyitóstop = OrderStopLoss();
                      főnyitótake = OrderTakeProfit();

    később ezekkel dolgozzon. egyszer volt egy eset amikor gyors mozgás volt és elcsúsztak az értékek amiket kiolvasott(nem tudom miért), hogyan tudom megállítani a robotot, hogy addig ne menjen tovább amíg az order nem teljesült és akkor olvassa ki az értékeket amikor a pozi megvan nyitva?
    Köszi Robi

    • Hello Robi! Dobj egy levelet és visszaállítom a jelszavadat, hogy ne legyen több accountod ide:)

      A problémádat nem teljesen értem. Ha egy változónak értékként átadod az Order-rel kezdődő függvényeket, akkor a változóban tárolt adatok önmaguktól nem fognak frissülni, csak ha te frissíted őket.
      Ha ezt meg akarod tenni, akkor:

      - vizsgáld meg, h van-e nyitott pozíciód
      - ha van, és ki tudtad választani akkor menj tovább
      - kiválasztás után a megfelelő értékeket frissítsd.

      Arra figyelj, hogy a tizedesjegy pontosságok itt is számíthatnak. Tehát érdemes mindig a NormalizeDouble (x, Digits) formát használni!

  26. Szia Radu!
    Azt szeretném megtudni, hogy tudsz e indexekről (első sorban SP 500 érdekelne) részletes és hosszú adatsorról, vagy van e neked? Konkrétan órás vagy jobb felbontással, és sok év érdekelne, szeretnék egy manuális kereskedési stratégiát tesztelni rajta.
    köszönöm: Jójárt Péter.

    • Sajnos nem találkoztam még ilyesmivel -a Dukascopynál legalábbis. A google segítségével ess neki a keresésnek, ennél jobbat pillanatnyilag én sem tudok!

  27. Szia Radu!
    A segítségedet szeretném kérni a következőkhöz. Robot illetve hagyományos kereskedést is folytatok egyszerre. A robotkereskedéshez mt4 platformot, viszont a kézi kereskedéseimhez AmiBroker platformot használok, a chartok elemzéséhez jobbnak találom mint a Metatradert.A kérdésem a következő: tudnál-e abban segítséget nyújtani hogy mt4-es valós idejű adatokat importáljak az AmiBroker szoftverembe, data backfill lehetőséggel?Az interneten találtam egy-két mt4 plugint amit erre találtak ki de 1.)- vagy nem működik. 2.)- vagy működik de nagyon sok memóriát használ, drasztikusan lassul a gép és 3-ik devizapárt adatátvitelét már nehezen kezeli.Vásároltam már egy szoftvert is ehhez (http://iticsoftware.com/forex-software/metatrader-dde) de ez sem tökéletes, nincs backfill data és körülményes a kezelése.Én ezeket az eszközöket a rendelkezésedre bocsájtanám, ha fel tudnád őket használni egy új, működőképes program elkészítéséhez.Kérdés hogy tudsz-e ebben segíteni. Köszönöm válaszod.
    Üdv,
    Csaba

    • Kedves Csaba!

      Számomra teljesen ismeretlen az AmiBroker platformja.
      Annyit kérlek írj meg, hogy mit takar konyhanyelven ez a "backfill data". Lehetséges, hogy tudok segíteni de ehhez több információra van szükségem!

  28. Kedves Radu!

    Elnézést a rossz fogalmazásért. A backfill data kifejezés alatt azt értettem hogy a program indulásakor visszamenőleg - attól függően hogy milyen időtávban dolgozom - betölt nekem adatokat.Pl: 15 perces valós idejű (realtime) adatokat importálok az mt4-ből.Az importált adatok attól az időponttól jelennek meg a másik szoftverben (AmiBroker) amikor az adatokat elkezdtem importálni, mondjuk 5 perce.Backfill data opcióval pedig betölti az előző 3 nap adatait is, mint historical, avagy történelmi adat. Attól féltem hogy az AmiBroker ismeretlen lesz. Így egy kicsit nehezebb...

  29. Kedves Radu!

    Először is megköszönném az oldalt, mert nagyon jó!
    Viszont lenne egy kérdésem, amire nem találtam választ (lehet, hogy azért, mert nincs)
    Adott egy vásárolt indikátor (ex4 formátum) ami garfikus és hang jelzést is ad lehetséges pozíció nyitásnál. A kérdés arra irányul, hogy ennek a jelzésére rá tudok-e húzni egy expert advisort, tehát mikor jelzést ad (jelzéstől függően) nyisson egy pozíciót.

    Válaszod előre is köszönöm.

    • Hello kimby!

      Többségében igen, azonban először ki kell nyomozni hogy erre az indikátor mennyi lehetőséget ad. Az értékesített indikátorok esetében számíthatsz arra, hogy nem könnyítik meg a dolgodat. A következő helyzetekkel találkozhatsz (a legelső a legkönnyebb, a legutolsó a legnehezebb):

      1) az indikátor Data ablakban látható értékei alapján egyértelműen tudod, hogy milyen szignált ad és mit kell tenned
      2) az indikátor által kirajzolt objectek alapján tudod, hogy milyen szignált ad és mit kell tenned
      3) az első kettő vegyesen
      4) csak a naplóba írt jelzéseket lehet felhasználni

      Az utóbbi mód elég körülményes, de persze minden megoldható. A grafikus jelzésekre tudsz építeni, a hangra nem - alapvetően a hang lejátszásának megtörténtét semmilyen módon nem lehet lekérdezni a Metán belül.
      Ha további segítségre van szükséged, vagy esetleg szeretnéd h ránézzek az indikátorra, írj.

      Remélem, segítettem.

  30. Kedves Radu!

    Köszönöm gyors válaszod!
    Én első körben az 1-es variációra kerestem a választ a könyvben, valamint a neten... (hozászolások stb..) Mivel az indikátor feldob egy jelzést "Alert-et" ami elvileg minden szükséges információt tartalmaz a kereskedés indításához.
    Az ablakban megjelenő információ:
    "Buy signal price 0.8508, StopLoss on 0.8405 EURGBP, 15 minutes chart"
    Sajnos eddig sehol sem találtam programot, program leírást ami ALERT jelzés alapján kereskedne:(
    Válaszod előre is köszönöm!

    • Az alert ablak önmagában semmire sem jó. A naplóbejegyzés talán, de az eléggé körülményes... A chartra írt adatok nem segítenek?

    • Charton csak egy színes nyíl jelenik meg az alertal egy időben:
      sárga nyíl lefele "Sell"
      Zöld nyíl felfele "Buy"
      A naplóban nem találok semmit, bár lehet, hogy rossz helyen keresem..

    • TÉVEDTEM!!
      A naplóban megtaláltam, ugyan azt a leírást..amit alert ír!
      Most már csak innen kell valahogyan kinyernem az információt, ha jól értem, de hogyan?

  31. Igen, azért mondtam a naplót mert ott is szerepelnie kell. Sajnos nem egyszerű a dolgod: egy külső beépülő (dll) segítségével olvashatod ki a naplófájlból a megfelelő sorokat. Gyakorlatilag tankkal mész virágot szedni :) Ezért kérdeztem, hogy a chartra nem ír _semmit_ ?

    • Sajnos semmit:(
      Egyedül a nyilakat rajzolja nekem..
      Tehát ami infóm van:
      1. Napló
      2. Alert
      3. Nyilak különböző színben

      Ez alapján mit csináljak?
      Merre induljak?
      Ha kell megyek tankkal virágot szedni, mert nem tudom miből áll össze az az indikátor:(

  32. A nyilak remek kiindulópontot képviselnek. Ha objektumként léteznek, akkor őket kell ellenőrizned és lekérdezned. Ha az indikátor egy vonalaként rajzolódnak ki, akkor pedig folyamatosan lekérdezed az aktuális (vagy lezárt) gyertyához kapcsolódó értékeket. Előtte persze nézd meg, hogy a nyilak mikor (milyen feltétel) alapján rajzolódnak. Ezt a nyomozást a data ablakban tudod megejteni.
    Pl.: két érték egyezése esetén kirajzol egy kék nyilat. Így indulhatsz el!

  33. Szia Radu!
    Abszolút kezdő vagyok, most ismerkedem a géppel, programozással, MT4, tőzsdével és hát nyilván az MQL4 is tök új. Nagy csodálója vagyok a magyar nyelvű oktató oldalaknak sok köszönet érte Neked is és készítőnek is, írtad Te is javítod.
    Munkátok dicséreteként és némi infóért írom-e sorokat.
    A ROC indikátort nézegettem és tesztelése közben párszor lefagyott a terminálom. A következő javítások után mintha jók lennének a vonalak de legalább nem fagy le a terminál.
    start()
    1. ellenőrzés
    eredeti:
    - if (iHistory-1) // If too many bars ..

    2. while ciklus belépő/futó feltétel
    eredeti:
    - while(i=0) // Loop for uncounted bars

    3. 17-ben a for ciklus közepe
    eredeti:
    for(n=i; n>=i+Aver_Bars; n++) // Summing last values
    // Ha n=i akkor n nemlehet >= i+valami (ha valami nagyobb mint 0)
    javított:
    for(n=i; n<=i+Aver_Bars; n++) // Summing last values
    Ha valamelyiket nem kellet volna javítani vagy felesleges/rossz a javítás kérlek jelezd. Nem vagyok megelégedve a vonalak/indikátorok jelenlegi futásával birkózom még vele, minden tanács jól jön.
    Köszi előre is és további jó munkát.

    • Szia!

      Örülök, hogy segít a blog! Köszönöm a visszajelzést!

      Meg fogom nézni az e-mailben küldött hozzászólásodat, és válaszolok majd.

  34. Szia Radu és Többiek

    Az lenne a kérdésem, hogy tesztelés alatt az expert le tudja e kérdezni a számlatörténetet. A célom az lenne, hogy megnézné a lezárt kötések utolsóján a profitot, ha nagyobb nullánál a kötésmérethez hozzáad egyet, ha kisebb nullánál kivon egyet. Sajnos hétvégén csak teszteren tudom próbálni, de teszteren nem működik.

    int HT=HistoryTotal(),CX=0;
    OrderSelect(HT,SELECT_BY_POS,MODE_HISTORY);
    if(OrderMagicNumber()==magic_X && OrderProfit() > 0){CX=CX-1;}
    LOT=5-CX;

    Én rontottam el valamit?
    Üdv Povi

    • Kijavítottam a kódodat (a relációsjel kapcsán). Egyébként ha a legutolsó pozíciót akarod kiválasztani, az általad megadott kód sehogy sem jó - az OrdersHistoryTotal() a számlatörténetben szereplő pozik darabszámát adja meg. (vigyázz, befolyásolja a számlatörténet panel aktuális beállítása - vagyis hogy a számlatörténet mekkora részét szeretné látni a felhasználó)

      Először szükséged van a legnagyobb ticket számra, amit a pozíciókból kérhetsz le. Természetesen csak azokat a pozíciókat vedd számításba, amelyek a megfelelő magic számmal, típussal, stb. rendelkeznek. Ettől függetlenül kénytelen vagy végigmenni az összes pozíción!

      int
            i,
            LastTicket;
       
      for (i = 0; i < OrdersHistoryTotal(); i++) {
            OrderSelect (i, SELECT_BY_POS, MODE_HISTORY);
       
            if (feltételek: pl. magic szám, stb.) {
                   LastTicket = MathMax (LastTicket, OrderTicket());
            }
      }
       
      if (LastTicket > 0 && OrderSelect(LastTicket, SELECT_BY_TICKET)) {
             profit vizsgálata, stb.
      }

      Amúgy jó hogy írtál, a blog programozóknak szóló részét is bővíteni fogom, kezdve a leggyakrabban használt funkciókkal (pl. a fenti). Remélem, tudtam segíteni!

      Kódot egyébként a következőképpen lehet beszúrni (képként mutatom, mert így látszanak a relációs jelek is):

      Az pre tag-ek közé írt szövegben már minden jel át fog jönni!

  35. Szervusz Radu és mindenki más!

    Segítségre lenne szükségem, elakadtam egy MQL feladattal. Van egy indikátorom, ami tökéletesen működik, de a szkriptet áttéve robotba, a robot nem működik. Röviden erről lenne szó:

     
        for(x = 0; x < e; x++)   vect[x] = 2*WMA(x, period/2) - WMA(x, period);        
     
        for(x = 0; x < e-period; x++)   ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);  
     
        // Print (vect[x] + "  " + ExtMapBuffer[x]);

    Elnézést a rövidségért, elhagytam a deklarációkat, értékadásokat. Hiányzik a WMA alfüggvény is, ami egy mozgóátlag. Úgy érzem, nem ezekben rejlik a hiba oka.

    A probléma, ameddig a mellékelt Print parancson keresztül már eljutottam, az, hogy az ExtMapBuffer tömböt a robotban nem tölti fel a szkript. Az indikátorban viszont igen. Hogy lehet ez? Mi lehet a gond?

    Előre is köszönöm

    • Jó lenne látni a kód többi részét is. Lehet, hogy a tömb deklarálása során van valami probléma - így viszont nem látom, hogy pélául e honnan kapja az értékét.

  36. Kedves Radu!

    Én is robotokat írogatok, van több is amelyek már élőszámlán futnak. Most egy másoló robotot szeretnék készíteni, amelyik egy szerveren futó robotról veszi le a jelet. Hol találok ehhez irodalmat? Tudsz esetleg segíteni? Előre is nagyon köszönöm! Email.: *****@gmail.com

  37. Hello!

    Ehhez szükségeltetik egy külső modul (DLL), amelyen keresztül a robotok közti kommunikációt tudod intézni. Keresned kell tehát egy olyan embert, aki jártas a Windows API-ban, és hajlandó neked dll-t írni. A DLL fájl eljárásait importálhatod az expertekbe, és így egy saját külön keretrendszer segítségével gyakorlatilag bármit megoldhatsz.
    A téma nagyon bő, alapvetően én sem találtam semmiféle irodalmat a neten ezen téma kapcsán, csak a saját fejem után mentem. Ha konkrét kérdésed merül fel, akkor írd meg - igyekszem segíteni. Leírást vagy cikket nem tudok neked a témában (még) prezentálni, de talán egyszer eljutok addig is.

  38. Sziasztok!
    Olvastam a marginról irt cikket, de még elkelne egy kis segítség hogy mennyi margin kellene az alábbi pozik nyitásához.
    GBPUSD buy 0.01
    sell 0.03
    buy 0.09
    sell 0.18
    buy 0.36
    sell 0.72

    Az infó scipt az alábbi adatokat irta ki
    kontaktus mérete 100000
    tőkeáttét 1:500
    valuta USD
    margin 1 lot buy esetén 314.08
    margin 1 lot hedge esetén 0

    előre is köszi a segítséget.

    • Szia Sanyi!

      A cikkben benne van a konkrét példa: "A VÁLASZTOTT INSTRUMENTUM MÁSODIK TAGJA MEGEGYEZIK A SZÁMLÁNK DEVIZANEMÉVEL" bekezdés.
      Annyi kiegészítéssel, hogy 0.46 buyod és 0.93 selled van nyitva, ha jól számoltam. A kettőt kivonod egymásból, tehát csak 0.47 sellel kell kalkulálnod, hiszen a maradék "összezárt" pozíciónak számít, azaz a bróker nulla margint számít fel érte, ahogy ezt a szkript is kiírta.
      A maradék kapcsán tehát 100.000 -et (konktraktus) elosztod a tőkeáttéttel (500), így kapsz 200-at. Ezt a számot felszorzod az instrumentum árfolyamértékével, így kapod meg a konkrét felszámolt margint.
      Gondolom különböző árfolyamon nyitottad a pozíciókat - különböző árfolyammal számold végig az összes pozíciót, és utána vedd ki az egyenletből az összezárt pozíciókat. A hedgelés leírásában a "c) a bróker nem számít fel letétet az összezárt pozíciókra" bekezdés vonatkozik Rád.

  39. Kedves Radu!
    Még lenne egy kérdésem!
    Mit jelent az hogy pozíciók kényszerzárása a bróker által 10%.
    Köszönöm

    • Mi írta ezt ki neked? Szerintem stopoutra gondolnak, vagyis hogy túl nagy kitettség esetén mikor zár le kényszerűen a bróker.

    • Ha a margin szint (margin és a saját tőke százaléka) átlépi a 10%-os határt, akkor a legkevésbé nyereséges pozícióval kezdve elkezdik az akkori áron lezárni a pozícióidat, vagyis a veszteségeid realizálásra kerülnek. Ez azért történik, mert nincs több (elég) pénzed finanszírozni a veszteségeidet.

      Van olyan bróker, aki ezt az úgy nevezett “margin call”-t százalékban adja meg (mint nálad), és van olyan aki fix összeghez hasonlítja a szabad marginodat a számla devizanemében. Amennyiben a stopout, akkor az összes pozíciód éppen aktuális profitja realizálva lesz.

      Gyakorlatilag a köznyelvben ilyenkor mondjuk, hogy “elszállt a számlám”.

  40. Szia Radu!
    Még egy kérdés a marginról.
    Ha megvan hogy 1 lot mondjuk 380 $ akkor ez hány pont minuszig elég?

  41. Az lenne a kérdésem hogy ha nyitok egy sell pozit 0.01 téttel, akkor annak a margin igénye 3,15$ , de én azt szeretném ha az SL=210 pont legyen. Erre a minusz 210 pontra kell e nekem még számolnom valami fedezetet vagy elég a 3,15$ .

  42. Tisztelt Látogató és Tisztelt Radu!

    Mint minden MQL programot tanuló ember életében bármennyi segédanyaggal is rendelkezik, bármennyire is tud angolul, eljön az a pillanat, amikor egyszerűen nem halad tovább, és muszáj tapasztaltabb "sorstársai" fele kérdést intézni, hogy megelőzze a maradék hajának a kihullását.Eljött a pillanat...
    Miután megtalálta az ember a számára megfelelő indikátort, és szétnézés után rájön, hogy nincsen rá EA, elkezd maga gyártani rá robotot.Ellenben ez egy olyan összetett indikátor, ami 7buffert használ, de végeredményként egy használhatatlan értéket hoz ki.Ellenben a data ablakban az egyik értéke a 7 közül lenne a stratégia egyetlen szükséges eleme.
    Kérdésem egyszerű.Hogyan lehet a data ablakból ezt az értéket kivarázsolni, hogy azt az EA használni is tudja a feltételrendszerében, amire a kötésnek meg kellene valósulnia.Válaszodat, válaszotokat előre is köszönöm.Üdv.:mirage76

    • Kedves mirage76!

      Az értékekhez az iCustom() függvénnyel tudsz hozzájutni. A data ablakban az indikátor értékei közül fentről indulva vizsgáld meg, hogy hanyadik adatsorra van szükséged. Mivel az indexelés nullától indul, ha a 6. érték kell neked, akkor ez 5-ös indexet jelent majd.

      iCustom(szimbolum, timeframe, "indikator_konkret_fajlneve_a_kiterjesztes_nelkul", [annyi paraméter, amennyi az indikátornak konkrétan van], adatsor indexe, gyertya);

      Ha ez megvan, akkor hozzájutsz egy konkrét gyertya értékéhez. Innentől kezdve már csak ki kell találnod, hogy az értéket (értékeket) hogyan tudod felhasználni, mikor változik, stb. Így lesz egy egyszerű matematikai értékből szignál.

      Példa:

      data0 = iCustom(Symbol(), Period(), "csodaindikator", param1, param2, param3, 0, 1);
      data1 = iCustom(Symbol(), Period(), "csodaindikator", param1, param2, param3, 1, 1);

      A fenti kód lekéri a "csodaindikator" nevű indikátor 1-es gyertyához tartozó 0-ás és 1-es adatsorának értékét az aktuális instrumentum aktuális idősíkján. Innentől kezdve a saját következtetéseid alapján ha például data0 nagyobb mint nulla, és data1 értéke üres (EMPTY_VALUE) akkor a szignál BUY - fordított esetben pedig SELL.

      Ha további kérdésed van, írj!

  43. Szia Radu!

    Elöszőr is tök jó az oldalad. Nemrég kezdtem el foglalkozni az MQL4 programozásával és készítettem magamnak egy saját indikátort. Robotokat nem kedvelem, szeretek magam kötögetni és managelni a pozit. Lenne néhány kérdésem...

    1. Hogy tudok if függvényt úgy csinálni a Symbol()-ra, hogy csak egy részét nézem...
    pontosabban pl: if (Symbol() == "#FDX...)
    Tehát nem írom ki a teljes ticker kódot, főleg, hogy az indexeknél (határidő) ez változik. Pontosabban vmi joker karakter kellene mint mondjuk a csillag.

    2. Illetve van a scriptem ami szétválogatja a pozikat aszerint, hogy short vagy long és számol kockázatot is. Ha viszont felezem a pozit akkor nem csinál semmit, hiszen, ha jól tudom lezárja az adott ticketet és nyitva marad a másik része egy új ticketszámon.
    Hova tudnám elküldeni a kódot és megbeszélni mennyiért javítod ki?

    köszi előre is

    üdv
    artv
    Előre is köszi

    • Örülök, hogy tetszik:)

      1. problémádra:

      StringSubStr() vagy StringFind() függvény a barátod.

      if (StringSubstr(Symbol(), 0, 3) == "#FDX") {
       
      }
       
      if (StringFind(szoveg, keresendo_szoveg, 0) > -1) {
       
      }

      A 2. problémád nem teljesen tiszta, beszéljünk e-mailben - a Névjegy oldalon megtalálod a címem.

  44. Ha az "Átlagár számítása" cikkben lévő eszközre gondolsz, az szkript és nem indikátor. A cikkben le van írva a telepítés részletesen!

  45. Ilyesmit csináltam...
    if (StringSubstr(Symbol(), 0, 3) == "#FDX") Celar_price_RR = DoubleToStr(Celar_price,2);

    Viszont erre nem fut rá.
    Nyilván a if (StringFind(szoveg, keresendo_szoveg, 0) > -1) is kellne valamit kezdenem ,de ezt nem értem.
    Mi a szöveg és a keresendő szöveg???

    • szoveg = amiben keresni akarsz (= Symbol() )
      keresendo_szoveg = amit keresel (= #FXT, vagy amit szeretnél)

      Ennél egyszerűbben nem tudom mondani:)

  46. Hát igen a kezdők botladozása, ezen részét a doksinak még nem futottam át... ;)
    Így már okés minden... köszönöm a segítséget.

    üdv
    artv

  47. Sziasztok!

    Tudna valaki segíteni OrderProfit-tal kapcsolatban? Ha már előfordult hasonló értekezés elnézést... nem találtam.

    Egyik autómatám egy file-ba logol, és valami oknál fogva az OrderProfit() "hibás" értéket ad. Pl. 50 pip-es stop-nál 45, 40-nél 35, 20-nál 18 (???). Maga a TESTER pontos, kerek összeget jelenít meg 50, 40, stb., viszont a file-ba valami számomra féligmeddig logikátlan érték kerül. Kiírattam a OrderSwap-et... elméletileg 0. Kivontam a az Open, illetve a Close értékét 50, 40, stb. Sakk-Matt! A Symbol Properties-ben szerepelnek SWAP értékek, de maga a TESTER sem veszi figyelembe... annak is pontatlan értékeket kellene adnia.
    Valaki?

    • Valószínűleg nem jó adatot íratsz ki a logba, vagy megváltozik míg eljutsz a kiíráshoz - legtöbbször ez szokott az ilyen jellegű problémák oka lenni. Ha megmutatod a programot, akkor igyekszem segíteni.

  48. Köszönöm a gyors választ!

    if (OrdersTotal()==0 && trade==TRUE)
        {
            file=FileOpen("is.dat", FILE_CSV|FILE_READ|FILE_WRITE, ';');      
            FileSeek(file,0,SEEK_END);
            FileWrite(file,OrderType(),OrderProfit());        
            FileClose(file);
            trade=FALSE;
        }

    Hát ez csak egy primitív részlet az OrderClose-t követően. Nem bütyköltem az értékeket, helyreközel "tökéletes" értékeket ad vissza. Ugyanilyen pontatlan az MathAbs(OrderClosePrice()-OrderOpenPrice) is. Viszont a grafikus ábrán megjelenő értékek (be, illetve kiszálló) differencája pontos egész. Értelmetlennek tűnő hiba...

    • Pontosíts lécci, hogy mit szeretnél kiíratni a fájlba. A kód alapján akkor írsz bármit is a fájlba, ha egyetlen pozíciód sincs nyitva, így nem tudom megállapítani hogy lezárt pozíció adatát akarod-e kiíratni, vagy mit.

      Használd lécci a pre tagot, ahogy a http://www.radu.hu/kerdezz/ oldalon van leírva. A beszélgetést majd át fogom helyezni oda!

  49. A file-ba lényegében egy "fotó" kerül, a be, illetve a kiszállás körülményeiről. Maga a probléma szempontjából lényegtelenek a logban szereplő értékek, illetve természetesen nem önálló ciklusról van szó. A rövid részletben csak azt jeleztem, hogy nem módosítom a Close utáni értékeket. A Close után a legutolsó profit értéket kell tartalmaznia az OrderProfit-nak, ami néhány pip-es eltéréssel igaz is.

    • Igen, elvileg. A gyakorlat azonban mást mutat - zárás után válaszd ki a pozíciót újra OrderSelect-tel, és akkor jó lesz a profit értéked.
      Arra figyelj, hogy ha nem ticket alapján választod ki, akkor a gyűjtő már nem a MODE_TRADES, hanem a MODE_HISTORY.

  50. Rendben. Ezt nem próbáltam. Érdekes BUG, amennyiben ez orvosolja a hibát. Nem nagyon látom, hogy hol kaphat új, pontatlan értéket, de most kiderül!

    Köszönettel, jelzem az eredményt!

  51. Úgy fest üzemel! :)

    Valahol elkallódnak az Order érékei. Érdekes, hogy nam abszolút fals értékkel tér vissza, hanem csak itt-ott hiányzik egy kicsi! :)

    A megoldás szempontjából pedig célszerűbb, illetve egyszerűbb ticket alapján szelektálni, bár egyszerre csak egyetlen poziciót engedek szabadjára!

    Köszönöm, és gratulálok a fórumhoz. A legtöbb helyen "értelmi fogyatékosok" csordájával találkozik az ember, akik hozzá nemértésüket "egyszerűséggel" próbálják leplezni!

    Tisztelettel,
    Kálmándi Zsolt

  52. Tisztelt Radu!

    Van egy ügyes robotom(mindenkinek van...), egy szimbólumon egy ordert enged csak.Amikor zárja a buy-t nyitja a sell-t és fordítva.Nincs is baj addig, míg egy idősíkon szeretném működtetni.Azonban amikor egy szimbólumon párhuzamosan több idősíkban is szeretnék kereskedni, zavarják egymást a robotok.Egyik idősík nyit, másik lezárja azt stb. A kérdés az volna, hogy hol tudom ezt állítani,hogy ne zavarják egymást a robotok azonos páron, persze úgy, hogy egy charton az eredeti egy order funkció maradjon.Ha szükséges átküldöm a forráskódot.Köszönöm.

    • Magic számokat kell használni. Ez szolgál a robotok pozícióinak megkülönböztetésére.

      Az egyik robotbeállításodnak mondjuk 30-as számot adsz, a másiknak 50-eset. A lényeg, hogy egész szám legyen és nullától különbözzön.

      Természetesen innentől kezdve a robot kódjában figyelni kell arra, hogy csak a saját magic számú pozícióit kezelje - vagyis minden kritikus ponton használni kell például az OrderMagicNumber() nevű függvényt. Ez a pozíció kiválasztása után visszaadja a pozíció magic számát.

      Egy pozíció számára kiosztott magic szám később nem változtatható.

  53. szia Radu. én csak egy kicsike kis dolgot szeretnék kérdezni. az adatokat rendben legeneráltam és használni is tudtam. m1 es adatokat generáltam le. de most amikor rájöttem hogy kellene nekem legenerálni 15 perces adatokat is, valahogy nem sikerült... miért? azt a hibaüzenetet küldi hogy Can't open input file. elsőre simán le tudtam generálni most meg nem tud megnyitni valami bemeneti filét. próbáltam újratelepíteni úgy sem volt jó. kifogytam az ötletekből... a Jforex2fxt-t használom. Mit tegyek hogy másodjára is el tudjam kezdeni az adatok legenerálását?

    • A fájlnévnek meg kell egyeznie az instrumentum nevével. Valószínűleg ez az első esetben meg is volt, másodszorra vagy elraktad onnan a fájlt, vagy nem megfelelő a neve.

      Ha EURUSD charton dolgozol, akkor EURUSD.csv legyen a fájlnév!

  54. szia. igen ezt tudom, de biztos hogy megfelelő a neve merthogy másoltam nem bíztam a véletlenre azt sem. sőt olyat is csináltam hogy átneveztem EURUSD.csv re ahogy írtad merthogy amikor letöltöttem a dukaskopyrol hosszabb volt de így is ugyanazt az üzit kaptam sajnos hogy Can’t open input file. tehát a file név az egyezik biztosan...

    • Milyen bróker ez? Mi a konkrét instrumentumnév? Milyen operációs rendszer, és a meta a c:\Program Files vagy Program Files (x86) -ba van-e telepítve?

  55. ja és a második esetben is ugyanazon a helyen azaz az experts files helyen voltak a filék. és amikor megnyitottam a Jforex2fxt-t , akkor ott az első helyre ahogy kell beirtam a file nevét. és az sem fordúlhatott elő hogy másik chartra tettem véletlenül mert figyeltem hogy eurusd t eurusd re tegyem.. szóval máshol lehet a hiba.

  56. Xp az oprendszer, instatrader az mt4. és próbáltam már úgy is hogy c: program files instatrader mappába. meg ugy is hogy a d: re telepitettem sehogy nem jo.
    mindenhol ugyanezt csinálja...

    • Egyelőre passzolom. Ha a fájlnév jó, és a fájl az experts\files\ -on belül van, akkor működnie kell a cuccnak.

  57. ezt nem értem.. most jó. nem az lehetett hogy a hétvégén nincs kapcsolat a szerverrel és most meg van hétköznap? mert most megy. hétvégén meg nem ment és ugyanúgy csináltam mindent és figyeltem mindenre nagyon.. arra a kapcsolatra azt irtad hogy kell. úgy emlékszem. bár hétvégén is kéne hogy legyen kapcsolat...
    na mindegy nem tudom mi volt a hiba.. mert az se lehet hogy elütöttem valamit mert figyeltem rá nagyon.. azért köszi a segítséget... akartalak keresni már robot programozásával kapcsolatban de majd ami késik nem múlik. :) szia.

  58. Sziasztok, először is csatlakoznék a gratulálók táborához a blog és a fordítás miatt. Kézzel kereskedem élesben, de teljesen kezdő "MQL-robotoló" vagyok, nagyon sokat segít a könyv. Most viszont megakadtam. Képtelen vagyok rábírni a jószágot, hogy mínuszos pozit ne zárjon. Íme a kódrészlet: Mit rontottam el? Köszönöm.

     {  
     
       if (CloseOrders(OP_SELL) > 0 && OrderProfit()>0) return; // zárja a meglévő shortot, ha az plusszos
        }
    • Az OrderProfit-os feltételt eggyel kintebb kell raknod, mert jelen pillanatban az "és" feltétel így működik:

      Ha a CloseOrders függvény nagyobb számot ad vissza, mint nulla ÉS a profit nagyobb, mint nulla akkor return történjen.

      Ami kell tehát neked, az a következő:

      if (profitvizsgálat) {
       
          if (CloseOrders(OP_SELL) > 0) { ... }
       
      }

      Azt viszont vedd figyelembe, hogy a profitvizsgálathoz direkt nem írtam OrderProfit() > 0 -át, hiszen az egy konkrét kiválasztott pozícióra vonatkozik. Ha több pozi profitját szeretnéd vizsgálni, akkor már másként kell lekérdezned a profitot - erre különösen légy tekintettel!
      A fenti javaslatom lényege, hogy csak akkor zárunk, ha az általad szabott feltétel igaz. Egyébként nem is megyünk a záróeljárás környékére.

  59. Köszönöm. A profitvizsgálat lenne a következő, oly módon, hogy az egy irányban nyitott pozikat átlagolja a kis drága, és ellenkező jelre zárja őket ha plusszban tudja tenni. Addig meg hedgeljen ellenkező jelre. Darabig el leszek vele... Kösz még egyszer.

  60. Sziasztok! Próbálgatom "kézi" stratégiámat átültetni MT4 alá, mint kezdő. Következőket szeretném megkérdezni. Van egy EA amit EURUSD chart-hoz kapcsolok. Tudok-e adni megbizást más párhoz is ugyanazon egyetlen EA-ból. A teszt során ugyanis érvénytelen szimbolum hibaüzenetet kaptam. Ez csak a tesztelés miatt van így, vagy annyi chart-ot kell nyitnom, ahány devizapárral kereskedem? Még egy kérdésem is lenne, miért nem hézagmentes az MT4 grafikonja. Pl. jan. 11-ét február 5-e követ. Köszönöm válaszotokat! Evelin

    • Első kérdésedre a megoldás az, amit írtál - csak tesztben van így. Stratégiai teszterben nem lehet multi-symbol tesztet futtatni.
      Valós idejű futtatás esetén egy expertből tudod kezelni az összes rendelkezésre álló instrumentumot.

      Második kérdésedre pedig ezt az oldalt javaslom elolvasásra! Sajnos az MT4 beépített múltbéli adat kezelése valóban siralmas, erről és ennek megoldásáról olvashatsz a fenti cikkben.

  61. Szia radu!
    Egy kódrészletről érdekelne a véleményed:
    int CountTrades()
    {
    int l_count_0 = 0;
    for (int l_pos_4 = OrdersTotal() - 1; l_pos_4 >= 0; l_pos_4--)
    {
    OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
    if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0++;
    }
    return (l_count_0);
    }
    Az lenne a kérdés, vajon egy számlán két charton két EA-ban különböző magic numberrel alkalmazva lehet-e hogy ha az egyiknek vannak nyitott poziciói, akkor azt a másik is ugyanúgy érzékeli.
    Remélem érthető volt, előre is köszi a választ.
    NZ.

    • Egy számlán belül egy-egy expertből vagy szkriptből az összes pozíciót látod - függetlenül attól, hogy azt ki vagy mi nyitotta. A magic szám olyasfajta elkülönítésre szolgál, amellyel a beazonosíthatjuk a pozíciók tömegéből, hogy melyeket akarjuk kezelni éppen.

      Ezt a cikket olvasd el, ebben van megoldás a pozíciószámlálásra.

  62. Kedves Radu és Többiek!

    Egy kis segítségre lenne szükségem! 1 charton szeretném látni egyidőben, ugyanannak az indikátornak más idősík(ok)hoz tartozó képét (is). Konkrétan az Ichimoku Kinko Hyo indikátorról van szó. Például, M15 a fő idősíkom, de szeretném látni a H1 és H4es Ichimoku indikátort is egyfajta átfedésként, hogy pontosabb képet kapjak a jelentősebb S/R szintekről. Tudtok esetleg valami egyszerű megoldást erre a problémára?
    Előre is köszönöm a segítséget!
    Üdv, Máté

    • Kedves Máté!

      Az iIchimoku függvény második paramétere a timeframe, ezzel tudsz más idősíkot lekérni.

      double
         tenkan_sen_H1 = iIchimoku (NULL, PERIOD_H1, 9, 26, 52, MODE_TENKANSEN, 1),
         tenkan_sen_H4 = iIchimoku (NULL, PERIOD_H4, 9, 26, 52, MODE_TENKANSEN, 1),

      Ez a lehetőség minden indikátornál, és természetesen az iCustom egyéni indikátorfeldolgozó függvény esetében is rendelkezésre áll.

      Arra különösen figyelj, hogy ha nullát adsz meg az idősík helyén, akkor mindig az aktuális idősík adatait veszed alapul. Ez gondot okozhat akkor, ha elfeledkezel erről a tényről és a robot valós idejű futtatása közben véletlen idősíkot váltasz.
      Ezért javallott fixálni az alapértelmezett idősíkot is, és akkor már nyugodtan váltogatható az idősík - nem lesz kapcsolat a chart aktuális idősíkja és a háttérben lekért adatok között.

      A fenti bekezdés vonatkozik az egyszerűsített elérésű chart adatokra is, azaz: Time[], Open[], Close[], stb. Ezeket az iTime, iOpen, iClose, stb. függvénnyel kérheted le más idősíkok kapcsán.

  63. Köszönöm a gyors választ! Ez tényleg nem tűnik bonyolultnak,de nem értek a programozáshoz, így meghaladja a képességeimet. Bár a metaeditorba megnyitottam az ichimokut, de inkább nem kontárkodok bele. Ha ez egy egyszerű beállítás, végig tudnál vezetni valamikor szóban a beállításokon, miközben megnyitnám a metaeditort? Ha nem az, mi a következő lépés a megoldás felé, árajánlat, egyéb?
    Köszönöm!

    • Jah, bocsi. Azt hittem programozási szemszögből kérdezed:) E-mailben felveszem veled a kapcsolatot, és megbeszéljük a részleteket. Tényleg az az e-mail címed, amit megadtál ? :)

  64. Szia Radu,

    Volna egy kérdésem van egy robotom amit back teszteken sokat próbálgattam és elég sikeres, de viszont most már 2 hónapja futtatom demo számlán és van amikor a robot nem zárja le az osszes kereskedést. Valami baj volna ezekben a sorokban?

    int CheckForClose()
    {
      if(getProfit()>=Amount ){CloseAll();}
     
      if(LockDown>0)
      {
        for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--)
        {
          if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)&&(LockDown>0))
          { int Pos=OrderType();
            if((Pos==OP_BUY)&&(Bid-OrderOpenPrice()>Point*LockDown)&&(OrderStopLoss() == 0))
            {OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point,OrderTakeProfit(),0,CLR_NONE);}
            if((Pos==OP_SELL)&&(OrderOpenPrice()-Ask>Point*LockDown)&&(OrderStopLoss() == 0))
            {OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point,OrderTakeProfit(),0,CLR_NONE);}
          }
        }
      } 
     
    }
    • Amennyiben a CloseAll(); funkció kapcsán (piaci zárás) merült fel gondod, látnom kell a CloseAll funkciót is.

      Ha a takeprofit/stoploss zárások nem stimmelnek, akkor az megint más tészta. Egyelőre a kódban 1 hibát találtam, de szerintem az nem feltétlen befolyásolja a hibás működést.

    • Szia

      Mutatom a többi részt is

      int CheckForClose()
      {
        if(getProfit()>=Amount ){CloseAll();}
       
        if(LockDown>0)
        {
          for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--)
          {
            if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)&&(LockDown>0))
            { int Pos=OrderType();
              if((Pos==OP_BUY)&&(Bid-OrderOpenPrice()>Point*LockDown)&&(OrderStopLoss() == 0))
              {OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point,OrderTakeProfit(),0,CLR_NONE);}
              if((Pos==OP_SELL)&&(OrderOpenPrice()-Ask>Point*LockDown)&&(OrderStopLoss() == 0))
              {OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point,OrderTakeProfit(),0,CLR_NONE);}
            }
          }
        } 
       
      }  
      //---------------------------------------------------------------------------             
      double getProfit()
      {
         double Profit = 0;
         for (int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--)
         {
           if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES))
           Profit = Profit + OrderProfit() + OrderSwap();
         }
         return (Profit);
      }
      //---------------------------------------------------------------------------               
      void CloseAll()
      {
         bool   Result;
         int    i,Pos,Error;
         int    Total=OrdersTotal();
       
         if(Total>0)
         {
           for(i=Total-1; i>=0; i--) 
           {
             if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) 
             {
               Pos=OrderType();
               if(Pos==OP_BUY)
               {Result=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);}
               if(Pos==OP_SELL)
               {Result=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, CLR_NONE);}
               if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT))
               {Result=OrderDelete(OrderTicket(), CLR_NONE);}
      //-----------------------
               if(Result!=true) 
                { 
                   Error=GetLastError(); 
                   Print("LastError = ",Error); 
                }
               else Error=0;
      //-----------------------
             }   
           }
         }
         return(0);
      }

      A programban nincsennek takeprofit/stoploss zárások

    • A problémádat valószínűleg az okozza, hogy a for ciklus során - mire az végigjutna az összes iteráción - megkavarodik a pozícióindex, és emiatt kimarad egy-két-x darab pozíció záródása.

      Ezt úgy tudod kikerülni, hogy megszámolod a zárni kívánt pozíciók számát, és a for ciklust egy while ciklusba ágyazod be. A sikeres zárásoknál megemeled a külön erre a célra létrehozott számlálót, és a while ciklus futása akkor szakad meg, ha a zárni kívánt pozíciók száma megegyezik majd a lezártakéval.

      A pozíciószámlálásról ebben a cikkben olvashatsz.

      szamlalo = 0;
       
      zarando_poziciok = szamlalas();
       
      while (szamlalo < zarando_poziciok) {
         if (OrderType() <= OP_SELL && OrderClose(...)) {
             szamlalo++;
         }
       
         if (OrderType() > OP_SELL && OrderDelete(ticket)) {
             szamlalo++;
         }
      }

      Az első feltétel csak OP_BUY -ra és OP_SELL -re fog vonatkozni, a második viszont minden másra, ami nagyobb mint OP_SELL (azaz limit és stop megbízásokra).

      Arra természetesen még figyelj, hogy ha nagyon súlyos vagy nem változó körülménybe botlik a zárási rész (a kereskedés nincs engedélyezve, hibás ár, stb.), akkor break-el egy idő után szakítsd meg a while-t, különben a végtelenségig próbál sikertelenül zárni majd.

  65. Magic numberrel kapcsolatban,köszönöm az infót utólag.
    Most már a párhuzamos chartokon is jól mennek robotaim.
    Köszönöm.

  66. Kedves Radu !

    Problémám hasonló mint a fentiek leírtak között szereplő M76-é. Expert + külső indikátor összekeresztezése...hogyan?

    Expert az alábbi forráskódu:

     
    extern int MagicNumber = 0;
    extern bool SignalMail = False;
    extern bool EachTickMode = {EachTickMode};
    extern double Lots = {Lots};
    extern int Slippage = {Slippage};
    extern bool UseStopLoss = {UseStopLoss};
    extern int StopLoss = {StopLoss};
    extern bool UseTakeProfit = {UseTakeProfit};
    extern int TakeProfit = {TakeProfit};
    extern bool UseTrailingStop = {UseTrailingStop};
    extern int TrailingStop = {TrailingStop};
     
    int BarCount;
    int Current;
    bool TickCheck = False;
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init() {
       BarCount = Bars;
     
       if (EachTickMode) Current = 0; else Current = 1;
     
       return(0);
    }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit() {
       return(0);
    }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start() {
       int Order = SIGNAL_NONE;
       int Total, Ticket;
       double StopLossLevel, TakeProfitLevel;
     
     
     
       if (EachTickMode && Bars != BarCount) TickCheck = False;
       Total = OrdersTotal();
       Order = SIGNAL_NONE;
     
       //+------------------------------------------------------------------+
       //| Variable Begin                                                   |
       //+------------------------------------------------------------------+
     
    {Var}
    {VarBuy}
    {VarSell}
    {VarCloseBuy}
    {VarCloseSell}
     
       //+------------------------------------------------------------------+
       //| Variable End                                                     |
       //+------------------------------------------------------------------+
     
       //Check position
       bool IsTrade = False;
     
       for (int i = 0; i < Total; i ++) {
          OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
          if(OrderType()  0) {                 
                   if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                      if(OrderStopLoss()  0) {                 
                   if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                      if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                         OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                         if (!EachTickMode) BarCount = Bars;
                         continue;
                      }
                   }
                }
             }
          }
       }
     
       //+------------------------------------------------------------------+
       //| Signal Begin(Entry)                                              |
       //+------------------------------------------------------------------+
     
       {SignalBuy}
       {SignalSell}
     
       //+------------------------------------------------------------------+
       //| Signal End                                                       |
       //+------------------------------------------------------------------+
     
       //Buy
       if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
          if(!IsTrade) {
             //Check free margin
             if (AccountFreeMargin()  0) {
                if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    				Print("BUY order opened : ", OrderOpenPrice());
                    if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
    			} else {
    				Print("Error opening BUY order : ", GetLastError());
    			}
             }
             if (EachTickMode) TickCheck = True;
             if (!EachTickMode) BarCount = Bars;
             return(0);
          }
       }
     
       //Sell
       if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
          if(!IsTrade) {
             //Check free margin
             if (AccountFreeMargin()  0) {
                if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    				Print("SELL order opened : ", OrderOpenPrice());
                    if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
    			} else {
    				Print("Error opening SELL order : ", GetLastError());
    			}
             }
             if (EachTickMode) TickCheck = True;
             if (!EachTickMode) BarCount = Bars;
             return(0);
          }
       }
     
       if (!EachTickMode) BarCount = Bars;
     
       return(0);
    }
    //+------------------------------------------------------------------+

    Segítségedet előre is köszönöm.

    Viktor

    • Írtam neked e-mailt is. Az általad adott kód valamilyen expert builder alkalmazásból származik, és nemigazán értem hogy mit szeretnél pontosan elérni illetve milyen segítséget vársz tőlem. Folytassuk e-mailben!

  67. Szia Radu!

    Nagyon tetszik az oldalad, rengeteg hasznos infóval lettem gazdagabb általa(d).
    Egy olyan dologgal kapcsolatban kérném a segítséged, hogy van egy expertem, ami csak backtest-eken működik, és hiába rakom rá akármilyen számlára, egyszerűen nem akar kötni. Próbáltam már mindenféle beállításokkal, különböző brókereknél, élő és demó számlákon egyaránt, de semmi. Az expert működésben van és nem ad semmilyen hibajelzést....
    Szerinted mi lehet a probléma??

    Segítséged előre is köszönöm!

    • Van hozzá forráskódod, vagy zárt robotról van szó? Akárhogyis, kell a robot hogy meg tudjam vizsgálni, hogy lehet-e valamit kezdeni vele.

      Illetve: valós idejű futtatásnál ellenőrizd, hogy az Expertek fülön van-e valamilyen hibaüzenet. Leggyakoribb az szokott lenni, hogy pl. ECN számlán instant megbízást akar SL-el és TP-vel megadva kötni a robot. Ha erre a programozó nem gondolt, akkor örökké hibákat fog írogatni (csak a hibanaplóba, ha egyéb helyre nem is)

      A futtatási környezet gondolom megfelelő (kereskedés engedélyezve, long-short kötések engedélyezve, smiley vigyorog, stb.)

  68. Huhh, gyorsan jött a válasz. :-)
    Igazad volt! Tényleg az ECN számla miatt volt a probléma. Úgyhogy így meg is oldódott a rejtély. :-)
    Köszönöm szépen a segítséged!