Smart Trading Script

  • // STS v0.10g - Smart Trading Script (c) 2012-2013 NeatPortal.com
    // WARNING: This script requires NEATBOT 2735+ to run
    //
    // The script tries to gain more resources by using spread between bid and ask prices
    // Algorithm is simplified, but should work reasonably well under broad range of conditions
    //
    // Comment out if you want to disable auto start
    label autorun
    // uncomment the next line if you are using 2720-2734 build
    // MAX_TRADE = 9999999
    
    // ===== OPTIONAL CONFIGURATION PARAMETERS =====
    // Extra resources to reserve (in addition to city's reserved resources)
    //       food, wood, stone, iron, gold:
    extra = [  1m,   1m,    1m,   1m,  100 ]
    
    // How aggressive we want to be (lower number would increase trading gains at the cost of potentially slower trade execution)
    aggr = 2%
    
    // Only trade if we expect this much gain
    gain = 2%
    
    // ===== NOTHING TO CONFIGURE BELOW THIS LINE =====
    delay = 10
    config trade:0
    comm = 0.5%
    maxRes = 990B
    
    label nextres
    res = floor(random() * 4) // choose resource to trade randomly, helps with multiple trading running
    resName = ResourceIntNames[res]
    
    label check
    if city.tradesArray.length > 8 execute "sleep " + delay
    if city.tradesArray.length > 8 execute "canceltrade " + city.tradesArray[0].id
    if city.tradesArray.length > 8 goto check
    
    label notready
    if !m_context.marketReady() goto notready
    prices = [ Price(res, aggr), Price(res, 1 - aggr), Price(res, aggr) * (1 + comm), Price(res, 1 - aggr) * comm ]
    resGold = city.reservedResource.gold + extra[4] + max(0, city.resource.gold - city.reservedResource.gold - extra[4]) * 0.8
    canSell = (city.resource[resName].amount - city.reservedResource[resName] - extra[res]) * 0.8
    sellLimit = (city.resource.gold - resGold) / prices[3]
    if canSell > 0 if sellLimit >=1 if prices[1] - prices[3] < prices[2] * (1 + gain) goto nextres
    if sellLimit < 1 sellLimit = min(max(1, (resGold - city.resource.gold) / prices[1] / 2), (city.resource.gold - 1) / prices[3]) // we are low on gold
    sellVolume = floor(min(canSell, sellLimit, MAX_TRADE - max(0, floor(min(maxRes - city.resource[resName].amount, (city.resource.gold - resGold) / prices[2]))) / 3))
    if sellVolume > 0 execute "sell " + res + " " + sellVolume + " " + prices[1]
    buyVolume = floor(min(maxRes - city.resource[resName].amount, (city.resource.gold - resGold) / prices[2], MAX_TRADE))
    if buyVolume > 0 execute "buy " + res + " " + buyVolume + " " + prices[0]
    goto nextres
Romulus
Author: Romulus