TB寫了兩個交易指令來克服重啟重發(fā)單,盤中測試不成功,
作者:開拓者 TB 來源:cxh99.com 發(fā)布時間:2012年12月11日
- 咨詢內(nèi)容: 我參照帖子,寫了兩個交易指令來克服重啟重發(fā)單,結(jié)果測試部成功;請問問題出在哪?
分別是
Params
Numeric SetPositionValue(0); //設(shè)置倉位值
Numeric lots(1);
Numeric length(2);
Vars
Numeric Position; //1表示持有多頭,-1表示持有空頭,0為沒有持倉
NumericSeries Ma;
NumericSeries Ma1;
NumericSeries cl;
Begin
If(Date != Date[1] && High == Low) Return;
Ma = Average(Close,Length); // 均線
Ma1 = Ma[1];
cl=close[1];
If (Position==InvalidNumeric) //狀態(tài)初始化
{
Position = SetPositionValue;
}
SetTBProfileString("Trade","Position",Text(Position));
Position = Value(GetTBProfileString("Trade","Position")); //讀寫文件獲取Position
If (Position!=1 And CrossOver(cl,Ma1))
{
Buy(lots,open);
Position=1;
}
If (Position!=-1 And CrossOver(Ma1,cl))
{
SellShort(lots,open);
Position=-1;
}
SetTBProfileString("Trade","Position",Text(Position)); //將Position重置寫入數(shù)據(jù)庫
End
和
Params
Numeric lots(1);
Numeric length(2);
Vars
NumericSeries Ma;
NumericSeries Ma1;
NumericSeries cl;
String RiQiDo;
String RiQi;
Begin
If(Date != Date[1] && High == Low) Return;
Ma = Average(Close,Length); // 均線
Ma1 = Ma[1];
cl=close[1];
if(RiQiDo==InvalidString)
{
RiQiDo=="000000000000000000";
}
SetTBProfileString("JcYi","ruDo",RiQiDo); //寫入文件
RiQiDo=GetTBProfileString("JcYi","ruDo"); // 初始化時設(shè)置
If(MarketPosition==0 And CrossOver(cl,Ma1))
{
If (BarStatus==2)
{
RiQi=DateTimeToString(Date+Time);
RiQi=Mid(RiQi,0,18);
If (RiQi==RiQiDo)
{
Return;
}
}
Buy(1,open);
RiQiDo=DateTimeToString(Date+Time);
RiQiDo=Mid(RiQiDo,0,18);
SetTBProfileString("JcYi","ruDo",RiQiDo); //重置后寫入文件
}
If(MarketPosition==1 And CrossOver(Ma1,cl))
{
sell(1,open);
}
end
望能迅速解答,謝謝。
- TB技術(shù)人員: 本帖最后由 穿堂風(fēng) 于 2010-9-28 11:23 編輯
程序里邊怎么控制都是沒用的,buy,sell這些是信號發(fā)單,你要出信號,它就會發(fā)單,除非你不要信號。我想了一個解決方法,就是barstatus==2的時候用A函數(shù),歷史行情用buy,sell這些,缺點(diǎn)就是當(dāng)前bar無信號,我還是比較喜歡有信號,所以目前就還那樣用著,真出現(xiàn)重啟軟件重復(fù)發(fā)單了,就手動平掉,唉。
- TB客服: 另外,感覺你這塊這樣處理邏輯性不好:
If (Position==InvalidNumeric) //狀態(tài)初始化
{
Position = SetPositionValue;
}
SetTBProfileString("Trade","Position",Text(Position));//每次運(yùn)行都被初始化了,拿不到真實(shí)值
Position = Value(GetTBProfileString("Trade","Position")); //每次拿到的都是你參數(shù)里的固定值
你這塊可以直接:
if(barstatus == 0)
{
SetTBProfileString("Trade","Position",Text(SetPositionValue));
}
else
{
Position = Value(GetTBProfileString("Trade","Position"));
}
- 網(wǎng)友回復(fù): A函數(shù),試了一下,仍然無法控制
- 網(wǎng)友回復(fù):
A函數(shù),試了一下,仍然無法控制
zhouqian 發(fā)表于 2010-9-28 14:35
不會吧,你參考下我下邊的偽代碼,是不是你時間處理上有問題,記錄一個打印看看。
riqi = Text(Date)+Text(Time*1000000);//拿到當(dāng)前bar的完整時間
riqi = Mid(riqi,16);//取前16位
riqido = GetTBProfileString(SymbolName,"riqido");//取上次發(fā)單時間,如果是第一個發(fā)單,結(jié)果就是無效值,沒關(guān)系
If(BarStatus == 2)
{
If(riqi == riqido)//如果當(dāng)前bar已經(jīng)下過單
{
//重復(fù)發(fā)單
Return;
}
A_SendOrder();
SetTBProfileString(symbolname,"riqido",riqi);//當(dāng)前bar未下單,則下單,并記錄下單bar時間
}