我对MYSQL很新,但我有使用VBA编程的经验。我试图创建一个存储过程,它将根据历史股票价格数据表对策略进行回溯测试。程序将计算收盘价格的20天移动平均线然后如果所选日期CLOSE的价格高于他的价格比移动平均线a"买"启动。如果目前正在进行交易,则没有新的"买入"如果所选日期CLOSE低于20天移动平均线,则可以放置"出售"启动。每次进行买入或卖出时,数据都会记录在一个名为backtest结果的表中。我使用的数据来自http://finance.yahoo.com/q/hp?s=AAPL+Historical+Prices,我将其放入表格中。正如您所看到的那样,数据是按降序排列的,所以为了让我能够进行测试,我必须从最早的日期开始,这个日期恰好位于底部。我遇到的问题是没有数据输入到这个新创建的表中(购买日期,购买价格,销售日期,卖出价格)。谁能发现为什么会这样? mysql也适合逐行处理吗?谢谢!
`Begin
DECLARE total_count int;
DECLARE moving_average decimal;
DECLARE move_up int;
DECLARE current_price decimal;
DECLARE count_var int;
DECLARE buy_price decimal;
DECLARE sell_price decimal;
DECLARE trade_on tinyint;
DECLARE account_balance decimal;
DECLARE start_row int;
DECLARE trade_date date;
SET @trade_on = 0;
SELECT @trade_on;
DROP TABLE IF EXISTS backtestresults;
CREATE TABLE backtestresults (buydate date,buyprice decimal, selldate date, sellprice decimal, accountbalance decimal);
SELECT COUNT(*) INTO @total_count FROM AAPL_Prices;
SELECT * FROM AAPL_Prices WHERE Special_ID = @total_count;
SET @start_row = @total_count -19;
SET @account_balance = 100000;
Loop1: WHILE (start_row > 1) DO
SELECT FORMAT(AVG(SClose),2) FROM AAPL_Prices WHERE Special_ID < @start_row + 19 AND Special_ID > @start_row INTO @moving_average;
SELECT SClose FROM AAPL_Prices WHERE Special_ID = @start_row -19 INTO @current_price;
SELECT TradeDate FROM AAPL_Prices WHERE special_ID = @start_row -19 INTO @trade_date;
IF @trade_on = 0 THEN
IF @current_price > @moving_average THEN
SET @buy_price = @current_price;
SET @trade_on = 1;
SET @account_balance = @account_balance - @buy_price;
INSERT INTO backtestresults (buyprice) values (@buy_price);
INSERT INTO backtestresults (buydate) values (@trade_date);
INSERT INTO backtestresults (balance) values (@account_balance);
End If;
END IF;
IF trade_on = 1 THEN
IF @current_price < @moving_average THEN
SET @sell_price = @current_price;
SET @trade_on = 0;
SET @account_balance = @account_balance + @buy_price;
INSERT INTO backtestresults(sellprice) values (@sell_price);
INSERT INTO backtestresults(selldate) values (@trade_date);
INSERT INTO backtestresults(balance) values (@account_balance);
END IF;
END IF;
SET @start_row = @start_row - 1;
END WHILE Loop1;
SELECT @account_balance;
DESCRIBE backtestresults;
SELECT @start_row;
End`