Name
定点进场下单定点离场卖单
Author
Zero
Strategy Description
可以选择在几点进场,几点离场,系统强制建仓,强制平仓,会不停的尝试建仓与平仓, 默认0点进场买,8点出场卖, 设置成进场23,离场8意思就晚上23点进场,第二天8点离场, 如果设置也8.5就是8点半的意思, 设置成8.6就是8点36分,小数点位乘6就是分钟数,止损可以禁止如果勾掉开启止损,止损点如果为0.1表示如果跌0.1%就强制卖出。如果止损价参考最高价,意思就是比如1000买进的,涨到2000了,如果2000跌了0.1%就止损,如果不参考最高价,就是比平均买入价跌了0.1%就止损.
Strategy Arguments
Argument | Default | Description |
---|---|---|
EnterHour | false | 进场时间(小时) |
LeaveHour | 8 | 离场时间(小时) |
SlidePrice | true | 滑动值 |
UsedFund | 1000 | 建仓金额 |
RetryInterval | 5 | 尝试间隔(秒) |
StopLoss | 0.5 | 止损点 |
EnableStopLoss | true | 是否开启止损 |
RefHigh | true | 参考最高价止损 |
StopProfit | 0.5 | 止赢点 |
EnableStopProfit | false | 是否开启止赢 |
Source (javascript)
// 0 means wait buy, 1 means wait sell
var state = 0;
var lastBuyAmount = 0;
var lastHighPrice = 0;
var lastBuyPrice = 0;
var initBalance = 0;
function cancelAllOrders() {
var orders = null;
while (!(orders = exchange.GetOrders())) {
Sleep(2000);
}
if (orders.length > 0) {
for (var j = 0; j < orders.length; j++) {
exchange.CancelOrder(orders[j].Id);
if (j < (orders.length-1)) {
Sleep(2000);
}
}
}
}
function MustBuy() {
var buyAmount = 0;
var initAccount = _C(exchange.GetAccount);
if (initBalance == 0) {
initBalance = initAccount.Balance;
if (initAccount.Balance < UsedFund) {
throw "账户余额不足,少于设定值 " + UsedFund;
}
}
UsedFund = Math.min(initAccount.Balance, UsedFund);
var spend = 0;
var buyAmount = 0;
while (spend < UsedFund) {
var ticker = _C(exchange.GetTicker);
var amount = _N((UsedFund - spend) / (ticker.Last + SlidePrice));
if (amount < 0.001) {
break;
}
exchange.Buy(ticker.Last + SlidePrice, amount);
Sleep(RetryInterval * 1000);
cancelAllOrders();
var account = _C(exchange.GetAccount);
spend = initAccount.Balance - account.Balance;
buyAmount = account.Stocks - initAccount.Stocks;
}
if (buyAmount > 0) {
lastBuyPrice = lastHighPrice = (spend / buyAmount);
Log("平均买入价", _N(lastHighPrice));
}
return buyAmount;
}
function MustSell(sellAmount) {
var remaind = sellAmount;
var initAccount = _C(exchange.GetAccount);
while (remaind >= 0.001) {
var ticker = _C(exchange.GetTicker);
exchange.Sell(ticker.Last - SlidePrice, remaind);
Sleep(RetryInterval * 1000);
cancelAllOrders();
var newAccount = _C(exchange.GetAccount);
remaind -= (initAccount.Stocks - newAccount.Stocks);
initAccount = newAccount;
}
LogProfit(initAccount.Balance - initBalance);
}
function onTick() {
var now = new Date();
var h = now.getHours() + (now.getMinutes() / 60);
if (state == 0 && (
(EnterHour < LeaveHour && h >= EnterHour && h < LeaveHour) ||
(EnterHour > LeaveHour && (h >= EnterHour || h < LeaveHour))
)) {
lastBuyAmount = MustBuy();
state = 1;
} else if (state == 1 && (
(EnterHour < LeaveHour && (h >= LeaveHour || h < EnterHour)) ||
(EnterHour > LeaveHour && (h >= LeaveHour && h < EnterHour))
)) {
if (lastBuyAmount > 0) {
MustSell(lastBuyAmount);
lastBuyAmount = 0;
}
state = 0;
} else if ((EnableStopProfit || EnableStopLoss) && lastBuyAmount > 0) {
var ticker = _C(exchange.GetTicker);
if (RefHigh) {
lastHighPrice = Math.max(lastHighPrice, ticker.Last);
}
var ratioStopLoss = Math.abs((lastHighPrice - ticker.Last) / lastHighPrice);
var ratioStopProfit = Math.abs((lastBuyPrice - ticker.Last) / lastBuyPrice);
var shouldSell = false;
if (EnableStopLoss && ticker.Last < lastHighPrice && (ratioStopLoss >= (StopLoss/100))) {
// Stop loss
Log("开始止损, 当前跌价点数:", _N(ratioStopLoss*100), "当前价格", ticker.Last, "对比价格", _N(lastHighPrice));
shouldSell = true;
} else if (EnableStopProfit && ticker.Last > lastBuyPrice && (ratioStopProfit >= (StopProfit/100))) {
// Stop loss
Log("开始止赢, 当前涨价点数:", _N(ratioStopProfit*100), "当前价格", ticker.Last, "对比价格", _N(lastBuyPrice));
shouldSell = true;
}
if (shouldSell) {
MustSell(lastBuyAmount);
lastBuyAmount = 0;
}
}
}
function main() {
if (EnterHour == LeaveHour) {
throw "进场时间跟离场时间不能相等!";
}
Log(_C(exchange.GetAccount));
while(true) {
onTick();
Sleep(60000);
}
}
Detail
https://www.fmz.com/strategy/64
Last Modified
2018-03-27 15:53:49