I once wrote a utility method within a `Util.cls`  that would convert an amount in currency X to the org currency using the appropriate DatedCOnversionRate. This would be invoked by a trigger on the object in question containing the currency amount that needs the org currency value. The trigger would use this method and save the result in a separate custom field like `Amount_USD__c` if USD was the org currency.

Adapt as needed for your use case

    // Singleton, remember when first referenced, key = DatedConversionRate.id
    private static Map<ID,DatedConversionRate>              dcrIdToDcrMap;                      

    //  ----------------------------------------
    //  convertToOrgCurrency - convert value in some ISO currency to org currency as of given date
    //  ----------------------------------------
    public static Decimal convertToOrgCurrency(String currencyIso, Decimal currencyVal, Date currencyDate) {
        Decimal res;
        if (currencyIso == null || currencyVal == null) {}
        else {
            if (dcrIdToDcrMap == null)              // build the map only once for life of the transaoction
                dcrIdToDcrMap = new Map<ID,DatedConversionRate> ([select id, isoCode, conversionrate, nextStartDate, startDate from DatedConversionRate]);
            for (DatedConversionRate dcr: dcrIdToDcrMap.values()) {
                if (dcr.isoCode != currencyIso)                                         continue;   // look for a match in table against input currency
                if (currencyDate < dcr.startDate || currencyDate >= dcr.nextStartDate)  continue;   // not in the range of effective dates
                System.debug(LoggingLevel.INFO,'Converting using dcr: ' + dcr);
                res =  currencyVal / dcr.conversionRate;
                break;  
            }
        }
        System.debug(LoggingLevel.INFO,'convertToOrgCurrency res= ' + res);
        return res;
    }

    //  ----------------------------------------
    //  convertFromOrgCurrency - convert value in org currency to some iso currency as of given date 
    //  ----------------------------------------
    public static Decimal convertFromOrgCurrency(String currencyIso, Decimal currencyVal, Date currencyDate) {
        Decimal res;
        if (currencyIso == null || currencyVal == null) {}
        else {
            if (dcrIdToDcrMap == null)              // build the map only once for life of the transaoction
                dcrIdToDcrMap = new Map<ID,DatedConversionRate> ([select id, isoCode, conversionrate, nextStartDate, startDate from DatedConversionRate]);
            for (DatedConversionRate dcr: dcrIdToDcrMap.values()) {
                if (dcr.isoCode != currencyIso)                                         continue;   // look for a match in table against input currency
                if (currencyDate < dcr.startDate || currencyDate >= dcr.nextStartDate)  continue;   // not in the range of effective dates
                System.debug(LoggingLevel.INFO,'Converting using dcr: ' + dcr);
                res =  currencyVal * dcr.conversionRate;
                break;  
            }
        }
        System.debug(LoggingLevel.INFO,'convertFromOrgCurrency res= ' + res);
        return res;
    }