/*
 * Copyright (c) 2015, StrategyQuant - All rights reserved.
 *
 * Code in this file was made in a good faith that it is correct and does what it should. 
 * If you found a bug in this code OR you have an improvement suggestion OR you want to include 
 * your own code snippet into our standard library please contact us at:
 * http://tasks.strategyquant.com/projects/snippets/
 *
 * This code can be used only within StrategyQuant products. 
 * Every owner of valid (free, trial or commercial) license of any StrategyQuant product 
 * is allowed to freely use, copy, modify or make derivative work of this code without limitations,
 * to be used in all StrategyQuant products and share his/her modifications or derivative work 
 * with the StrategyQuant community.
 *  
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES 
 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *  
 */
package com.strategyquant.extend.CorrelationOf;

import java.util.HashMap;

import com.strategyquant.lib.correlation.CorrelationLib;
import com.strategyquant.lib.correlation.CorrelationType;
import com.strategyquant.lib.language.L;
import com.strategyquant.lib.results.SQOrder;
import com.strategyquant.lib.results.SQOrderList;
import com.strategyquant.lib.time.SQTime;
import com.strategyquant.lib.time.TimePeriod;
import com.strategyquant.lib.time.TimePeriods;

public class NumberOfClosedTrades extends CorrelationType {

	public NumberOfClosedTrades() {
		name = L.t("Number of closed trades");
		dataType = DATA_TYPE_TRADES;
	}

	@Override
	public void computePeriods(SQOrderList orders, TimePeriods timePeriods, int period) throws Exception {
		long ms;
		
		HashMap<Long, TimePeriod> periodsMap = CorrelationLib.getPeriodsAsHashMap(timePeriods, period);
		
		for(SQOrder order : orders) {
			if(order.isCanceledOrder() || !order.isMarketOrder()) {
				continue;
			}
			
			ms = CorrelationLib.getCorrectPeriod(order.CloseTime, period);

			if(!periodsMap.containsKey(ms)) {
				throw new Exception("Period '"+SQTime.toDateMinuteString(ms)+"' not found!");
			}
			
			periodsMap.get(ms).value ++;
		}
	}

}