コード例 #1
0
        public void CalcDeal_MACD(Stock stock, TickData tickData, Deal deal)
        {
            TrendData    trend        = stock.trend_day;
            StrategyData strategyData = trend.mStrategyData;

            if (times == 0)
            {
                if (strategyData.ma10.ma == 0)
                {
                    return;
                }
                if (trend.mPartData.close < strategyData.ma10.ma &&
                    tickData.price > strategyData.ma10.ma)
                {
                    deal.buy_price  = tickData.price;
                    deal.buy_shares = deal.getBuyShares(StartMoney);
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
            else if (times > 0)
            {
                double sPrice = stock.position.getCostPrice() * SellPriceRate;
                double bPrice = stock.position.getCostPrice() * BuyPriceRate;
                if (tickData.price > stock.position.getCostPrice() * SellPriceRate)
                {
                    if (stock.position.shares_available != stock.position.shares)
                    {
                        return;
                    }
                    if (tickData.price > strategyData.ma10.ma)
                    {
                        return;
                    }
                    deal.sell_shares = stock.position.shares;
                    deal.sell_price  = tickData.price;
                    //if (deal.sell_shares > stock.position.shares_available) return;
                    deal.eType = Deal.ESell;
                }
                else if (tickData.price < stock.position.getCostPrice() * BuyPriceRate)
                {
                    //if (times == 10) { return; }
                    deal.buy_price  = tickData.price;
                    deal.buy_shares = deal.getBuyShares(StartMoney);
                    if (deal.buy_shares == 0)
                    {
                        return;
                    }
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
        }
コード例 #2
0
ファイル: TradingStrategy.cs プロジェクト: CharlexDF/Hunter
        public void run_tick(Stock stock, TickData tickData)
        {
            stock.trend_30m.PreProcessData(tickData);

            Deal deal = stock.mStrategy.CalcDeal(stock, tickData);

            //sell
            while (deal.eType == Deal.ESell)
            {
                if (!isTradeTime(tickData.dt))
                {
                    break;
                }
                deal.sell_dt = new DateTime(tickData.dt.Ticks);
                deal.backtest_sell(deal.sell_price, deal.sell_shares, ESR.EPR_Normal);

                stock.position.AddDeal(deal);
                stock.mStrategy.ProcessDeal(stock, deal);
                deal.copy_position = Utility.Clone(stock.position);
                stock.position.Clear();
                DataMining.DealList.Add(deal);
                TradingStrategy.AddCash(deal.sell_total_money);
                break;
            }
            FinalDateCloseTrading(stock, tickData);

            //buy
            while (deal.eType == Deal.EBuy)
            {
                if (!isTradeTime(tickData.dt))
                {
                    break;
                }
                if (isEndDate())
                {
                    break;
                }
                deal.buy_dt = new DateTime(tickData.dt.Ticks);
                if (!deal.canAfford())
                {
                    return;
                }
                deal.backtest_buy(deal.buy_price, deal.buy_shares);

                stock.position.AddDeal(deal);
                stock.mStrategy.ProcessDeal(stock, deal);
                deal.copy_position = Utility.Clone(stock.position);
                DataMining.DealList.Add(deal);
                TradingStrategy.AddCash(deal.buy_total_money * -1);
                break;
            }

            stock.trend_day.AddTickData(tickData);
            stock.trend_day.mStrategyData.ProcessData(stock.trend_day);
            stock.trend_30m.AddTickData(tickData);
            stock.trend_30m.mStrategyData.ProcessData(stock.trend_30m);
        }
コード例 #3
0
        public void CalcDeal(Stock stock, TickData tickData, Deal deal)
        {
            TrendData    trend  = stock.trend_30m;
            StrategyData stData = trend.mStrategyData;

            if (stock.position.shares == 0)
            {
                //buy
                if (stData.ma30.ma == 0)
                {
                    return;
                }
                if (tickData.dt.Hour < 13)
                {
                    return;
                }
                if (trend.mPartData.close < stData.ma30.ma &&
                    tickData.price >= stData.ma30.ma)
                {
                    deal.buy_shares = StartShares;
                    deal.buy_price  = tickData.price;
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
            else
            {
                if (stock.position.shares_available != stock.position.shares)
                {
                    return;
                }

                //sell
                if (tickData.price < stData.ma30.ma)
                {
                    deal.sell_shares = stock.position.shares;
                    deal.sell_price  = tickData.price;
                    deal.eType       = Deal.ESell;
                }
            }
        }
コード例 #4
0
        public void CalcDeal_HighFrequency(Stock stock, TickData tickData, Deal deal)
        {
            TrendData    trend        = stock.trend_day;
            StrategyData strategyData = trend.mStrategyData;

            //sell
            if (stock.position.shares_available > 0)
            {
                if (openPrice == 0)
                {
                    openPrice = tickData.price;
                }
                if (tickData.price > highPrice)
                {
                    highPrice = tickData.price;
                }

                double costPrice = stock.position.getCostPrice();
                double diff      = highPrice - costPrice;
                if (diff >= 0.03)
                {
                    double sPrice = openPrice + Math.Floor(diff / 1.6 * 100) / 100;
                    if (tickData.price < sPrice)
                    {
                        deal.sell_shares = stock.position.shares_available;
                        deal.sell_price  = tickData.price;
                        deal.eType       = Deal.ESell;
                    }
                }

                //final wall

                /*
                 * DateTime endDt = new DateTime(tickData.dt.Year, tickData.dt.Month, tickData.dt.Day, 14, 50, 0);
                 * if (tickData.dt.Ticks > endDt.Ticks)
                 * {
                 *  deal.sell_shares = stock.position.shares_available;
                 *  deal.sell_price = tickData.price;
                 *  deal.eType = Deal.ESell;
                 * }
                 */
            }

            //buy
            if (stock.position.shares == 0)
            {
                if (tickData.price <= strategyData.ma5.low)
                {
                    deal.buy_price  = tickData.price;
                    deal.buy_shares = deal.getBuyShares(StartMoney * 10);
                    if (deal.buy_shares == 0)
                    {
                        return;
                    }
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
        }
コード例 #5
0
        public void CalcDeal_Add(Stock stock, TickData tickData, Deal deal)
        {
            TrendData    trend        = stock.trend_30m;
            StrategyData strategyData = trend.mStrategyData;

            if (times == 0)
            {
                if (strategyData.ma10.ma == 0)
                {
                    return;
                }
                if (trend.mPartData.close > strategyData.ma10.ma &&
                    tickData.price < strategyData.ma10.ma)
                {
                    deal.buy_shares = StartShares;
                    deal.buy_price  = tickData.price;
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
            else if (times > 0)
            {
                if (tickData.price > stock.position.getCostPrice() * SellPriceRate)
                {
                    if (stock.position.shares_available != stock.position.shares)
                    {
                        return;
                    }
                    deal.sell_shares = stock.position.shares;
                    deal.sell_price  = tickData.price;
                    //if (deal.sell_shares > stock.position.shares_available) return;
                    deal.eType = Deal.ESell;
                }
                else if (tickData.price < stock.position.getCostPrice() * BuyPriceRate)
                {
                    //EarnMoney = sMoney1 - bMoney1 = sMoney2 - bMoney1 - bMoney2;
                    //sMoney1 = sMoney2 - bMoney2;
                    //sPrice1*bShares1 = sPrice2*(bShares1+bShares2) - bPrice2*bShares2;
                    //sPrice1 = bPrice1*SellPriceRate;
                    //bPrice2 = bPrice1*BuyPriceRate;
                    //(sPrice2-bPrice2)*bShares2 = (sPrice1-sPrice2)*bShares1
                    //bShares2 = bShares1 * (sPrice1-sPrice2) / (sPrice2-bPrice2)

                    //if (times == 10) { return; }
                    deal.buy_price = tickData.price;
                    double bPrice1  = stock.position.getCostPrice();
                    double bPrice2  = deal.buy_price;
                    double sPrice1  = sellPrice1;
                    double sPrice2  = bPrice2 * SellPriceRate;
                    double bShares1 = stock.position.shares;

                    double denominator = sPrice1 - sPrice2;
                    double numerator   = sPrice2 - bPrice2;
                    double x           = denominator / numerator * bShares1;
                    x = Math.Ceiling(x / 100) * 100;
                    deal.buy_shares = Convert.ToInt32(x);
                    if (deal.buy_shares == 0)
                    {
                        return;
                    }
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
        }
コード例 #6
0
        public void CalcDeal_Multi(Stock stock, TickData tickData, Deal deal)
        {
            TrendData    trend        = stock.trend_30m;
            StrategyData strategyData = trend.mStrategyData;

            if (times == 0)
            {
                if (strategyData.ma10.ma == 0)
                {
                    return;
                }
                if (trend.mPartData.close < strategyData.ma10.ma &&
                    tickData.price > strategyData.ma10.ma)
                {
                    deal.buy_shares = StartShares;
                    deal.buy_price  = tickData.price;
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
            else if (times > 0)
            {
                if (tickData.price > stock.position.getCostPrice() * SellPriceRate)
                {
                    if (stock.position.shares_available != stock.position.shares)
                    {
                        return;
                    }
                    deal.sell_shares = stock.position.shares;
                    deal.sell_price  = tickData.price;
                    //if (deal.sell_shares > stock.position.shares_available) return;
                    deal.eType = Deal.ESell;
                }
                else if (tickData.price < stock.position.getCostPrice() * BuyPriceRate)
                {
                    //EarnRate = 1.01;
                    //PriceRate = 0.02;
                    //SellPriceRate = 1 + PriceRate;
                    //bPrice2 = tickData.price;
                    //SellPrice = bPrice2 * SellPriceRate;

                    //CostMoney * EarnRate = SellMoney;
                    //(bPrice1*bShares1 + bPrice2*bShares2)*EarnRate = SellPrice*TotalShares;
                    //Mid = SellPrice / EarnRate;
                    //bPrice1*bShares1 + bPrice2*bShares2 = Mid*bShares1 + Mid*bShares2;
                    //bShares2*(bPrice2 - Mid) = bShares1*(Mid - bPrice1);
                    //bShares2 = bShares1*(Mid - bPrice1) / (bPrice2 - Mid);

                    if (times == TopTimes)
                    {
                        return;
                    }
                    deal.buy_price = tickData.price;
                    double bPrice1     = stock.position.getCostPrice();
                    double bPrice2     = deal.buy_price;
                    double sellPrice   = bPrice2 * SellPriceRate;
                    double mid         = sellPrice / (1 + EarnRate);
                    double denominator = mid - stock.position.getCostPrice();
                    double numerator   = deal.buy_price - mid;
                    double x           = denominator / numerator * stock.position.shares;
                    x = Math.Ceiling(x / 100) * 100;
                    deal.buy_shares = Convert.ToInt32(x);
                    if (!deal.canAfford())
                    {
                        return;
                    }
                    deal.eType = Deal.EBuy;
                }
            }
        }