Trang chủ Kiến thức PositionSelect() và PositionGet: Quản Lý Positions
Knowledge

PositionSelect() và PositionGet: Quản Lý Positions

14 tháng 11, 2025

Làm việc với open positions - select, get properties, calculate profit/loss.

Position Management Functions

PositionSelect() - Select Position by Symbol

// Select position for current symbol
if(PositionSelect(_Symbol)) {
    // Position exists for this symbol
    double profit = PositionGetDouble(POSITION_PROFIT);
    double volume = PositionGetDouble(POSITION_VOLUME);
    Print("Position profit: $", profit, " Volume: ", volume);
} else {
    Print("No position for ", _Symbol);
}

PositionGetTicket() - Get by Index

// Loop through all positions
for(int i = 0; i < PositionsTotal(); i++) {
    ulong ticket = PositionGetTicket(i);
    if(ticket > 0) {
        string symbol = PositionGetString(POSITION_SYMBOL);
        double profit = PositionGetDouble(POSITION_PROFIT);
        Print("Ticket: ", ticket, " Symbol: ", symbol, " P/L: $", profit);
    }
}

Get Position Properties

if(PositionSelect(_Symbol)) {
    // String properties
    string symbol = PositionGetString(POSITION_SYMBOL);
    string comment = PositionGetString(POSITION_COMMENT);
    
    // Integer properties
    long magic = PositionGetInteger(POSITION_MAGIC);
    long type = PositionGetInteger(POSITION_TYPE);  // BUY or SELL
    datetime openTime = (datetime)PositionGetInteger(POSITION_TIME);
    
    // Double properties
    double volume = PositionGetDouble(POSITION_VOLUME);
    double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
    double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
    double sl = PositionGetDouble(POSITION_SL);
    double tp = PositionGetDouble(POSITION_TP);
    double profit = PositionGetDouble(POSITION_PROFIT);
    double swap = PositionGetDouble(POSITION_SWAP);
    double commission = PositionGetDouble(POSITION_COMMISSION);
    
    Print("=== Position Info ===");
    Print("Type: ", (type == POSITION_TYPE_BUY) ? "BUY" : "SELL");
    Print("Volume: ", volume);
    Print("Open: ", openPrice, " Current: ", currentPrice);
    Print("Profit: $", profit);
}

Count Positions by Type

int CountPositions(ENUM_POSITION_TYPE type, long magic = 0) {
    int count = 0;
    for(int i = 0; i < PositionsTotal(); i++) {
        ulong ticket = PositionGetTicket(i);
        if(ticket == 0) continue;
        
        // Check magic (optional)
        if(magic > 0 && PositionGetInteger(POSITION_MAGIC) != magic)
            continue;
        
        // Check type
        if(PositionGetInteger(POSITION_TYPE) == type)
            count++;
    }
    return count;
}

// Usage
int buyPositions = CountPositions(POSITION_TYPE_BUY);
int sellPositions = CountPositions(POSITION_TYPE_SELL);