求解此程序的問題在哪里?
作者:開拓者 TB 來源:cxh99.com 發布時間:2015年07月06日
- 咨詢內容:
Params
Numeric N1(6);
Numeric N2(5);
Numeric FastLength(12);
Numeric SlowLength(26);
Numeric MACDLength(9);
Numeric Lots(1);
Numeric X(10);
Vars
Numeric HD;
Numeric MACDValue;
Numeric AvgMACD;
NumericSeries M1;
NumericSeries M2;
NumericSeries HH;
NumericSeries LL;
Numeric bartime;
String sectionname;
String PCName;
String MP;
Numeric OrderIndex;
Begin
HD=MinMove*PriceScale;
MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;
AvgMACD = XAverage(MACDValue,MACDLength);
M1 = dema(c,5);
M2 = dema(c,22);
If(MarketPosition!=0) //畫開倉價
{PlotNumeric("c",EntryPrice);}
If(CurrentBar < MaxBarsBack) Return;
// 當前BAR的日期和時間
bartime = Date*1000000+Time*1000000;
// 準備保存交易信號的數據庫塊名
sectionname = Symbol+"_"+IIFString(BarType==0,"D","M")+Text(BarInterval)+"_"+FormulaName;
PCName = Symbol+"_"+IIFString(BarType==0,"D","M")+Text(BarInterval)+"_"+FormulaName;
// 實時交易才記錄交易信號
If(BarStatus == 2 And Date == CurrentDate)
{
MP = GetTBProfileString(sectionname,Text(bartime)+"_MP");
//If(MarketPosition <>1 && M1[1] > M2[1])
If( MP <> "1" And MarketPosition ==0 And MACDValue >=AvgMACD AND M1>=M2 )
{
// 按順序給當前BAR的交易信號編號并記錄在數據庫中
OrderIndex = Value(GetTBProfileString(sectionname,Text(bartime)+"_OrderCnt"));
If(OrderIndex == InvalidNumeric) OrderIndex = 1;
Else OrderIndex = OrderIndex + 1;
SetTBProfileString(sectionname,Text(bartime)+"_TotalOrder",Text(OrderIndex));
// 記錄數據庫交易信號的MarketPosition
MP = "1";
SetTBProfileString(sectionname,Text(bartime)+"_MP",MP);
// 記錄交易信號的方向和價格,1多 -1空
//Buy(Lots,Open);
SetTBProfileString(sectionname,Text(bartime)+"_Order_"+Trim(Text(OrderIndex)),"1");
SetTBProfileString(sectionname,Text(bartime)+"_Price_"+Trim(Text(OrderIndex)),Text(Close));
}
//If(MarketPosition <>-1 && M1[1] < M2[1])
If(MP <> "-1" And MarketPosition ==0 And MACDValue<=AvgMACD AND M1<=M2)
{
// 按順序給當前BAR的交易信號編號并記錄在數據庫中
OrderIndex = Value(GetTBProfileString(sectionname,Text(bartime)+"_OrderCnt"));
If(OrderIndex == InvalidNumeric) OrderIndex = 1;
Else OrderIndex = OrderIndex + 1;
SetTBProfileString(sectionname,Text(bartime)+"_TotalOrder",Text(OrderIndex));
// 記錄數據庫交易信號的MarketPosition
MP = "-1";
SetTBProfileString(sectionname,Text(bartime)+"_MP",MP);
// 記錄交易信號的方向和價格,1多 -1空
//SellShort(Lots,Open);
SetTBProfileString(sectionname,Text(bartime)+"_Order_"+Trim(Text(OrderIndex)),"-1");
SetTBProfileString(sectionname,Text(bartime)+"_Price_"+Trim(Text(OrderIndex)),Text(Close));
}
}
// 根據數據庫中記錄的該BAR的交易信號,順序發出交易指令
// 第一筆交易
OrderIndex =1;
If(GetTBProfileString(sectionname,Text(bartime)+"_Order_"+Text(OrderIndex)) == InvalidString) // 沒有記錄則返回
{
Return;
}
Else // 否則發出交易指令
{
If(GetTBProfileString(sectionname,Text(bartime)+"_Order_"+Text(OrderIndex)) == "1")
{
Buy(0,Value(GetTBProfileString(sectionname,Text(bartime)+"_Price_"+Text(OrderIndex))));
}
Else If(GetTBProfileString(sectionname,Text(bartime)+"_Order_"+Text(OrderIndex)) == "-1")
{
SellShort(0,Value(GetTBProfileString(sectionname,Text(bartime)+"_Price_"+Text(OrderIndex))));
}
}
//定義開倉后的最高最低點
If(MarketPosition<>0)
{
If(GetTBProfileString(PCname,Text(bartime)+"HH") == InvalidString) //開倉時記錄開倉價位高低點
{
SetTBProfileString(PCName,Text(bartime)+"HH",Text(EntryPrice));
SetTBProfileString(PCName,Text(bartime)+"LL",Text(EntryPrice));
}
Else
{
If(C>Value(GetTBProfileString(PCName,Text(bartime)+"HH"))) //開倉后更新高點
{
SetTBProfileString(PCName,Text(bartime)+"HH",Text(C));
}
If(C<Value(GetTBProfileString(PCName,Text(bartime)+"LL"))) //開倉后更新低點
{
SetTBProfileString(PCName,Text(bartime)+"LL",Text(C));
}
}
}
If(MarketPosition==1 )
{
If( Value(GetTBProfileString(pcname,Text(bartime)+"LL"))<=EntryPrice-X*HD)
{Sell(0,Min(o,EntryPrice-X*HD));} //止損
ELSE If(Value(GetTBProfileString(pcname,Text(bartime)+"HH"))>=EntryPrice+X*HD AND C<=Value(GetTBProfileString(pcname,Text(bartime)+"HH"))-X*HD) //跟蹤止盈
{Sell(0,Min(o,Value(GetTBProfileString(pcname,Text(bartime)+"HH"))-X*HD));}
}
If(MarketPosition==-1 )
{
If( Value(GetTBProfileString(pcname,Text(bartime)+"HH"))>=EntryPrice+X*HD)
{BuyToCover(0,Max(o,EntryPrice+X*HD));}
ELSE If(Value(GetTBProfileString(pcname,Text(bartime)+"LL"))<=EntryPrice-X*HD AND C>=Value(GetTBProfileString(pcname,Text(bartime)+"LL"))+X*HD)
{BuyToCover(0,MAX(o,Value(GetTBProfileString(pcname,Text(bartime)+"LL"))+X*HD));}
}
END
- TB技術人員:
你程序輸出有什么問題