Hozzászólások

15 bejegyzés megtekintése - 16-30 / 42
  • Szerző
    Bejegyzés
  • Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 nem válaszol #5152

    Ha nem jelent gondot az újratelepítés a személyes adatok törlésével együtt, akkor azzal jobban jársz mintha távolról megpróbáljuk kitalálni mi hibádzik.

    Utána pedig feltétlen olvasd el Radu cikkét a rendszermappáról: itt megtalálod

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 nem válaszol #5147

    Szia Franci!

    Csak tipp:

    Ha valóban az expertel van a gond próbáld meg, hogy:
    1. Megnyitod a telepített terminál rendszermappáját (Fálj menü/Rendszermappa megnyitása).
    2. Ott belépsz a MQL4\Experts mappába
    3. Bezárod a terminált (MetaTrader-t).
    4. És nevezd át az expertet! Pl. TutiExpert.ex4-ről pl.: TutiExpert1.ex4-re.
    Ha ott van mellette az mq4 fálj akkor azt is, mert ha újraindításkor a terminál nem találja az erdeti ex4 fáljlt de megvan a forráskód(az mq4 fálj) akkor újrafordítja magának.
    4.a Tehát pl.:TutiExpert.mq4-ről TutiExpert1.mq4-re.
    5. És most próbáld újra elindítani a terminált.

    Elvileg az fog történni, hogy mivel nem találja az expertet, így nem is csatolja a chart-hoz.
    És ha ez az expert okozta a problémát akkor mostmár reagálni fog a terminál.
    Bajt nem csinálsz vele. Később vissza nevezheted a fájlokat ha akarod, vagy csak úgy próba képpen.

    Csak tipp! De hátha segít.

    Üdv.

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5137

    Na jó akkor összefoglalom magamnak.

    Tehát azt mondod lényegében, hogy a For ciklusos számbavétel egy villámgyors memóriaművelet (ahhoz képest mintha egyben a zárást is megkísérelnénk amelynek lehet hálózati késleltetése, ami ráadásul a pozíció indexeket is meg keveri). És a tempó akkora, hogy pl. a 200 pozíció „átnyálazása” alatt elhanyagolható az esélye, hogy az OrdersTotal() értéke megváltozik(avgy pozíciók nyílnak vagy zárodnak egy másik instrumentumon), ezért nem érdemes az OrdersTotal() nyitó és záró értékét összevetni.

    ——————————————————————————————————-
    PS:
    Csak érdekességnek írom, hogy: Internet Explorer alatt ha InPrivate módban böngészem az oldalad, akkor a konkrét témaoldalon nem jelenik meg a szerkesztődoboz, hanem helyette megkapom a felkérést, hogy jelentkezzek be (pedig már bent vagyok). A kezdőoldaladra visszalépve újra bejelentkezett állpotban vagyok.

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5131

    A tapasztalatod nagy kincs. Biztos észrevetted volna ha valami hibádzik az OrdersTotal() körül.

    De fura megemészteni, hogy egy külső paramétrekkel operáló függvény nem mindig az aktuális értéket adja vissza.
    Ez olyan mintha azt mondanánk pl. hogy:
    1.
    EURUSD cahrton futtatott expertben az OnTick() legelején meghívott
    MarketInfo(„GBPUSD”,MODE_BID) fügvény biztosan ugyanazt az értéket adja akkor is ha OnTick()végén újra lekérdezem, és közte volt egy hosszas analízis (és GBPUSD-n meg záporoztak a tickek).
    vagy ha:
    2. Mégis a(z ‘összeszámláló’) For cikluson belül hajtok végre sikeres zárást, de ez nem befolyásolja az OrdersTotal() értékét. De akkor meg minek kigyűjteni külön tömbe a zárandó pozíciókat?

    Ez így következetlen, szerintem.

    A fentebb leírt while ciklusba ágyazás – mivel csak 2 feltétel ellenőrzését jelenti, ami többnyire nem teljesül – gyakorlatilag 0 befolyással van a program futási idejére.
    Száz szónak is egy a vége: Programból egy ideig megfigyelem hogyan viselkedik az OrdersTotal().

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5118

    Amennyiben kizárható, hogy az OrdersTotal() értéke megváltozik egy tick alatt, akkor a felvetésemnek nincs értelme természetesen. De nem találtam erre vonatkozó referenciát.

    Abból indultam ki, hogy az MQL4 Help-jében is így használják.

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5105

    Köszi, hogy mindig lehet rád számítani a válaszadásban, és a cikket is.

    Korábban már én is arra következtetésre jutottam, hogy először ki kell gyűjteni a bezárandó pozíciókat egy tömbe és utána zárni.
    A fentebb leírt problémám, inkább az volt, hogy sikerült egy soha nem teljesülő feltételt megadni a For ciklusban. Eddig valamiért azt hittem, hogy csak a while ciklus veszélyes ebből a szempontból.

    Viszont ennek kapcsán jutott eszembe, hogy nem tökéletes közvetlenül a For ciklusban használni az OrdersTotal() függvény értékét feltételként!

    Vegyük az alábbi feltételezett esetet: nyitva van 8 db megbízás. E=EURUSD, G=GBPUSD

    Index szerint ebben a sorrendben:

    E1, E2, G3, G4, E5, E6, E7, E8
    

    Valamilyen feltételünk szerint itt az ideje kigyűjteni a zárandó pozíciókat.
    EURUSD szimbólumot dolgozzuk fel éppen és az 5. indexű megbízásnál járunk, és itt el kell időznünk néhány millisecundomot(kapcsolati késleltetés, miegymás)
    Közben egy másik szálon, vagy pl. StopLoss miatt a G3, G4 bezáródik.

    Akkor a sorrendem már így néz ki:

    E1, E2, E5, E6, E7, E8
    

    És MOST ugrok a cikluban a 6. indexre – E8 !
    Tehát E6, E7 kiértékelése ki fog maradni. És az OrdersTotal() szerint minden rendben. Végig mentünk az összesen. Pedig nem.

    Itt jön be még az, hogy vajon mi volt az eredeti trigger feltétel ami a pozíció kigyűjtést elindította.
    Vajon a következő tick-nél is fenn fog állni?
    Mindenképp meg kell oldani, hogy a kimaradt pozíciókat (ha vannak!?) detektáljam valahogy. De miért várnék a következő tickre? Ráadásul úgy bonyolultabb is lenne, mert valami „pótfeltételt” is vizsgálnom kéne(előfeltételezve azt, hogy az imént hiányosan(?) kigyűjtött pozíciókat be is zártam).

    Ezért gondolom, hogy a cikkben leírtakat még ki kell egészíteni egy while ciklussal is.
    Valami ilyesmire gondolok(a teljesség igénye nélkül):

    int oTo=OrdersTotal();
    int zarniKell[];
    int limit=0;
    
    do
    {
       ArrayFree(zarniKell);
       for (int i=0; i<oTo; i++) 
       { 
          if (OrderSelect(i,SELECT_BY_POS))
          {
             //...feltételek ellenőrzése,
             ArrayResize(...);
             zarniKell[x]=OrderTicket();
             stb.
          } 
       }
       limit++;
    }
    while(oTo!=OrdersTotal() && limit<10);
    

    Az OrdersTotal() értékét még a ciklus előtt lementem, és csak akkor fogadom el feldolgozottnak a teljes megbízás listát, ha az értéke menet közben nem változott (vagy GetLastError()-ra alapozva dolgozom fel újra).
    (És arról még nem is beszéltünk, hogy mi van ha közben egy pozíció bezárult egy másik pedig megnyílt. :) )

    Mit gondolsz?

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5101

    Na közben ráfutottam egy másik ágra.
    A For ciklus fejlécét Ctrl+C -vel másoltam, és itt szúrtam el:

    for(j=0; i<oTotal; j++)

    Tanulságos. Legközelebb már tudni fogom mit keressek.

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5100

    Időközben kivettem az OrdersTotal()-t For ciklusból.

    Most így csinálom:

    int oT=OrdersTotal();
    for (int i=0; i<oT; i++) 
    { 
      if (OrderSelect(i,SELECT_BY_POS))
      { ... } 
    }
    

    és megszűnt a fagyás.
    Tudom még ez sem tökéletes, mert ha időközben zárul egy megbízás egy másik charton, akkor az ‘Order-sorrend’
    változás miatt kimaradhat a ciklusban egy-egy pozíció, de esetemben ez nem kritikus.

    Ha mégis nagyon kritikus lenne az időzítés akkor meg beteszem az egészet egy do while ciklusba és a végén összehasonlítom újra oT!= OrdersTotal() [esetleg: oT-closedposCount!=OrdersTotal()] értékét.

    A lényeg, hogy már nem fagy.

    ————————————————-

    Még egy dolog amit tapasztaltam:
    Egy másik ciklusban ahol egy saját tömböt járok végig, rosszul adtam meg a feltétel és minuszba futtattam a tömbindexet.
    Azonkívül, hogy megállt az expert és kaptam egy kövér hibaüzenetet a naplóba, az MT4 lecsatolta az expert minden példányát az összes chartról. Kézzel vissza kellet helyeznem a chartok-ra és újra megadni a paramétereket. Érdekes.

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: MT4 build 950 kifagy #5096

    Köszi a választ. Hétvégén nem volt időm foglakozni vele. Ma már talán lesz.
    Pénteken még az történt, hogy ment a kód minden chart-on, aztán az egyiken megállt.

    Demó számláról lévén szó azt az egyet bezártam, most hétfő 8:00-kor az van, hogy többi azt csinálja amit kell.
    Eddig hajlamos voltam az gondolni, hogy a For ciklusokkal nem lehet probléma. Lefutja a köreit aztán annyi.

    Jobban átgondolva a dolgot, talán az lesz a baj, hogy az OrdersTotal()-t használom feltételként a For ciklusban, aminek akár menet közben is változhat az értéke.

    Roden
    Tag
    Bejegyzések száma: 52
    Hozzászólás: Mászkáló Trail #4459

    Hello kosza.

    Érdemes körülnézni az MetaTrader kódkönyvtárában.
    Sokat lehet tanulni az ott közzé tett kódokból.

    Egy működő TrailingStop megoldást pl. itt találsz:

    https://www.mql5.com/en/code/12232

    Igaz ez a kód nem csak követőstoppot hanem a TakeProfit és a StopLoss megoldását is tartalmazza.
    A view linkre kattintva láthatod a kódot.
    (Bár szvsz. még ezt is lehetne bőven tovább egyszerűsíteni, átláthatóbbá tenni)

    Roden
    Tag
    Bejegyzések száma: 52

    Hát akkor mostmár dokumentálva van. Itt nálad!

    Roden
    Tag
    Bejegyzések száma: 52

    a gyertya open time -ja mindenképpen 00:00:00 -nak megfelelő unix timestamp lesz

    Na ez az amit nem tudtam! Így már mindent értek. Kösz a türelmet.

    Roden
    Tag
    Bejegyzések száma: 52

    Előrebocsátom, hogy én sem kötekedni szeretnék. Inkább tanulni.

    De ezt nem értem:

    A felhasználó ráhelyezi a chartra a robotját, és óránkénti futtatást szeretne; a ráhelyezés mondjuk 00:22:16-kor történik meg. Ebben az esetben a következő futás időpontja 00:00:00 + 1 óra lesz, azaz 01:00:00.

    Hogy jön ide, hogy mikor helyezi rá a chart-ra a robotját?
    Ez nem befolyásolja a Time[0] értékét!
    A Time[0] értéke meg ugyebár egyáltalán nem biztos, hogy 00:00:00 lesz. Már miért lenne annyi? Lehet az 00:00:45 is. Mondjuk. (Vagy a Time[0] mindig kerek egész óra értéket vesz fel H1 idősíkon?)

    Ha ehhez hozzáadok 3600-at az pedig 01:00:45 lesz.

    Tehát a NextRun futása nem az új gyertya kezdetéhez fog kötődni, hanem ehhez az időponthoz.
    És persza ha a

    if (int(TimeCurrent()) >= NextRun)

    feltétel már igaz lett, azonbelül már be tudod azonosítani, hogy igen, tényleg, ez egy új gyertya.

    És szögezzük le: Most nem arról beszélünk, hogy mi értelme van pontosan azonosítani egy új gyertya első tickjét, hanem arról hogy hogyan lehetséges megoldani.

    Roden
    Tag
    Bejegyzések száma: 52

    A másodpercet elírtam. Már javítottam. Gyors voltál…. :)

    Roden
    Tag
    Bejegyzések száma: 52

    Köszönöm a tanácsokat! A Sleep() és a RefreshRates()-t kifogom próbálni meg lekezelem ezt az iTime 0-t.
    Mint írtam az hogy backtesztnél jól működjön jelen esetben nem szempont, de jó, hogy felhívtad rá a figyelmem.
    A tömböket kifejezetten kedvelem. :)

    Viszont ez a NextRun nekem nem evidens.

    Mondjuk H1 idősíkon vagyunk. (Most tekintsünk el a többi idősík vizsgálatától) Nyugodt periódus van és a Time[0] értéke pl. 05:00:25 lesz – merthogy a fenti példánál maradva az első 25mp-ben nem történik semmi – nem jön tick.

    A NextRun_H1 értékét ugyebár így számolod:

    NextRun_H1 = int(Time[0] + PERIOD_H1 * 60);

    Ez esetben a NextRun_H1 értéke 06:00:25 lesz.
    (Ha mondjuk H1-es gyertyák közötti Gap-et szeretnék elkapni ezt így nem lehetne.)

    Tehát egy óra múlva abban az első 25mp-ben sok minden történhet.
    Avagy úgyis mondhatnám, hogy egy múltbeli adatból származtatod egy jövőbeli futtatás időpontját.
    Amivel nincs is gond ha csak az a feladat, hogy időzítve fusson egy-egy funkció és nem pontosan egy esemény bekövetkeztekor – új gyertya képződésekor.

    Ha viszont nem fontos az esemény hanem csak az időzítés akkor meg miért ne így csinálnám:

    static int NextRun_H1=0;
    OnInit()
    {
     NextRun_H1=Hour();
    }
    
    OnTick()
    {
     if (NextRun_H1 != Hour())
     {
      RunThis();
      NextRun_H1=Hour();
     }
    }
    
15 bejegyzés megtekintése - 16-30 / 42