Forex programozás Fórum Egyéb MT4 build 950 kifagy Válasz erre: MT4 build 950 kifagy

Roden
Tag
Bejegyzések száma: 52

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?