kosza
Tag
Bejegyzések száma: 23

Szia! 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.