Hozzászólások
-
SzerzőBejegyzés
-
Hozzászólás: A legnagyobb veszteségű pozi zárása #8596
O.K. Köszönöm
Hozzászólás: A legnagyobb veszteségű pozi zárása #8593Nna, az első két kódrészletet újra küldöm. Nem vágom, hogy miért szövegként tette be. Bocs. Tehát sar váltásra pozi zárás
if(SingleClSARChCl==1&&ClSARPrev>Close[ClSARSignalBar] && ClSARCurr<Close[ClSARSignalBar]) { for(i=0; i<OrdersTotal(); i++) // Order searching cycle { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber()!=Magic) continue; type = OrderType(); if(type == OP_SELL) { RefreshRates(); if(OrderProfit()>0)CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK)); } } }
a záró fgv
bool CloseOrder(int ticket,double lot,double price) { if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false); if(OrderCloseTime() > 0) return(false); int dig=MarketInfo(OrderSymbol(),MODE_DIGITS); string _lot=DoubleToStr(lot,2); string _price=DoubleToStr(price,dig); bool res=OrderClose(ticket,lot,price,Slippage,clClose); if(res) { Sleep(SleepOk); return (res); } int code=GetLastError(); Sleep(SleepErr); return (false); }
Hozzászólás: A legnagyobb veszteségű pozi zárása #8592Szia! A gond az, hogy ugyanez a CloseOrder() függvény nagyszerűen működik a kód más részein. Pl a psar váltáskor a nyereséges pozik zárása:
`if(SingleClSARChCl==1&&ClSARPrev<Close[ClSARSignalBar] && ClSARCurr>Close[ClSARSignalBar])
{
for(i=0; i<OrdersTotal(); i++) // Order searching cycle
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderMagicNumber()!=Magic) continue;type=OrderType();
if(type==OP_BUY)
{
RefreshRates();
if(OrderProfit()>0)CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID));
}
}
}`
Azért ideteszem a függvényt:
bool CloseOrder(int ticket,double lot,double price)
{
if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);
if(OrderCloseTime() > 0) return(false);int dig=MarketInfo(OrderSymbol(),MODE_DIGITS);
string _lot=DoubleToStr(lot,2);
string _price=DoubleToStr(price,dig);bool res=OrderClose(ticket,lot,price,Slippage,clClose);
if(res)
{
Sleep(SleepOk);
return (res);
}int code=GetLastError();
Sleep(SleepErr);return (false);
}`Ideteszem újra a kicsit átfogalmazott problémás részt:
if(ClMaxLoss==1&&LoLot()*ShLot()>0&&SellCnt>1) // ha long és short is van és shortból több, mint egy darab { for(i=0; i<OrdersTotal(); i++) // Order searching cycle { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber()!=Magic) continue; type=OrderType(); if(type==OP_SELL) { RefreshRates(); if(MaxLossShort()==OrderProfit())CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK)); // ha olyat talál, aminek a vesztesége megegyezik a legnagyobb veszteségű short pozival, zárja le } } }
Ehelyett azt csinálja, hogy nem a legnagyobb veszteségű pozit zárja, hanem az utolsónak megnyitottat.
Ha a RefreshRates() utáni sort kicserélem erre:if(Ask-OrderOpenPrice()>=Delta*Point*fpc())CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK)); // ha az ask és megnyitott pozi nyitási ára közötti különbség nagyobb, mint "Delta" pip, zárja le a pozit; // (az fpc() a bróker digitjétől függen ad vissza 10-et vagy százat)
ez működik, a megfelelő pozikat zárja le.
Ezek szerint a hiba ott van valahol a kicserélt sorban. Nem segít az sem, hogyha az „orderprofit” helyett a nyitó és az aktuális „ask” segítségével határozom meg a veszteséget.
Előre is köszönöm a segítségedet.Hozzászólás: A legnagyobb veszteségű pozi zárása #8583Nem jól raktam be a záró-kódrészletet. Újra próbálom:
if(ClMaxLoss==1&&LoLot()*ShLot()>0&&ShLot()>=LoLot()) { for(i=0; i<OrdersTotal(); i++) // Order searching cycle { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol()) continue; type=OrderType(); if(type==OP_BUY) { RefreshRates(); if(MaxLossLong()==OrderProfit()&&BuyCnt>1)CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID)); } } }
Hozzászólás: bróker szerver túlterhelés #5586Kösz, megnézem.
Hozzászólás: bróker szerver túlterhelés #5505Radu, ránéznél erre? Lehet az volt a baj, hogy a különböző párokon elfelejtettem más magic no-t megadni, így szerencsétlen különböző párokat akart mergelni OrderCloseBy()-el? Nem kellett volna zsákszám kapnom a hibaüzeneteket?
Köszönömif(PosTpClose==1&&LoLot()*ShLot()>0) //ha egy páron mindkét irányban van nyitott pozi….
{
if(((OpLoPr()*LoLot()+ OpShPr()*ShLot()))>MinPrPip()) // …és a pipben mért eredmény nagyobb, mint MinPrPip (OpLoPr()*LoLot() jelentése: nyitott long eredmény szorozva a pozimérettel)
{
for(i=0; i<OrdersTotal(); i++) // Order searching cycle
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
{
if(type== OP_BUY)MagicLong=OrderMagicNumber();
if(type== OP_SELL)MagicShort=OrderMagicNumber();
if(MagicLong!=MagicShort)
{
CloseOrders(OP_SELL);
CloseOrders(OP_BUY);
}
if(MagicLong==MagicShort)
{
type=OrderType();
if(type== OP_BUY)LongTicket=OrderTicket();
if(type==OP_SELL)ShortTicket=OrderTicket();RefreshRates();
if(Merge==1) OrderCloseBy(LongTicket,ShortTicket,clCloseBy); // ha mergelés engedélyezett mergelje őket össze
if(Merge!=1)
{
CloseOrders(OP_SELL);
CloseOrders(OP_BUY);
}
}
}
}//for(i=0…..
}
}//if(PosTpClose==1&&LoLot()*ShLot()>0)Hozzászólás: bróker szerver túlterhelés #5504Köszönöm. Ahogy megfejtettem, vagy -ami valószínűbb- lesz még kérdésem, szólok.
Hozzászólás: Mászkáló Trail #4437köszönöm
Hozzászólás: Ciklusból kilépés probléma #4306Köszi Radu, sajna így is folyamatosan változik a visszaküldött FRAM…, de így legalább biztos vagyok benne, hogy máshol kell a hibát keresnem.
Kösz még egyszer: KoszaHozzászólás: bid-ask adatok visszamenőleges értékei #3900Köszönöm. Akkor mégsem egyszerű…
KoszaHozzászólás: CloseBy() invalid ticket #3376Köszi Radu!
Azt írtad, hogy:
„A kódodban viszont a SELL feltétel sora után van egy { } kódrész, ami mindig lefutásra kerül.”
No, ettől megvilágosodtam: Csöppet sem okosan a closeby-t betettem a „for” ciklusba. Kidobtam a cikluson kívülre, egy gyors teszten már működik is.
További jókat: KoszaHozzászólás: "Új" MQL nyelv #3266Kösz, időközben rájöttem: Az összes indi az i….(NULL….)-formában adtam meg, csak az iHigh(0….)-formában. Ezt nem szerette. Tehát iHigh(NULL,…..) a jó formátum.
Hozzászólás: custom indi ex4 #3263Köszönöm
Hozzászólás: Lassuló backteszt #2479Kösz a választ.
1) Elsőre magam is arra gondoltam, hogy a robot a hunyó, de ugyanaz a robot, ugyanolyon beállításokkal ugyanazon időszakaszon elsőre-másodszorra normálisan fut, majd belassul.
2) Komplett optimalizációra gondoltam, igen. De ha belassul akkor az „egyedi futások” is lassúak. Nem csak a terminált, a gépet is újraindítottam, nem segít. -
SzerzőBejegyzés