アイスバーグ委員会戦略www.fmz.comアイスバーグ・コミッションとは,投資家の大規模取引を指す. 市場への過剰な影響を避けるため,大きな単一のコミッションは,現在の最新の購入/販売価格と顧客設定価格に応じて,自動的に1つの大きな注文を複数の小さな注文に分割します. この戦略は,自動的に小注文委任を行い,以前の注文が完全に販売されたり,最新の価格が現在の配置価格から大幅に偏ったときに自動的に注文を再配置します.
例として: 単一平均の浮動点が 10 に設定されている場合:
各ポジションの数は,単一のポジションの平均値の90%~110%で,ポジション価格は,最新の購入価格で,1回 (マイナス1回の委託深さ) と言うことができます. 最後のポジションが完了した後,新しいポジションが作成されます.
戦略の総量がオーダーの総数に等しいとき,配当は停止する.市場の最新の取引価格が最大購入価格よりも高くなったとき,プロミスが停止され,最新の取引価格が最高購入価格よりも低いときにプロミスが再開される.
function CancelPendingOrders() {
while (true) {
var orders = _C(exchange.GetOrders);
if (orders.length == 0) {
return;
}
for (var j = 0; j < orders.length; j++) {
exchange.CancelOrder(orders[j].Id);
if (j < (orders.length-1)) {
Sleep(Interval);
}
}
}
}
var LastBuyPrice = 0;
var InitAccount = null;
function dispatch() {
var account = null;
var ticker = _C(exchange.GetTicker);
if (LastBuyPrice > 0) {
if (_C(exchange.GetOrders).length > 0) {
if (ticker.Last > LastBuyPrice && ((ticker.Last - LastBuyPrice) / LastBuyPrice) > (2*(EntrustDepth/100))) {
Log('deviate to much, newest last price:', ticker.Last, 'order buy price', LastBuyPrice);
CancelPendingOrders();
} else {
return true;
}
} else {
account = _C(exchange.GetAccount);
Log("order finised, total cost:", _N(InitAccount.Balance - account.Balance), "avg buy price:", _N((InitAccount.Balance - account.Balance) / (account.Stocks - InitAccount.Stocks)));
}
LastBuyPrice = 0;
}
var BuyPrice = _N(ticker.Buy * (1 - EntrustDepth/100),PricePerision);
if (BuyPrice > MaxBuyPrice) {
return true;
}
if (!account) {
account = _C(exchange.GetAccount);
}
if ((InitAccount.Balance - account.Balance) >= TotalBuyNet) {
return false;
}
var RandomAvgBuyOnce = (AvgBuyOnce * ((100 - FloatPoint) / 100)) + (((FloatPoint * 2) / 100) * AvgBuyOnce * Math.random());
var UsedMoney = Math.min(account.Balance, RandomAvgBuyOnce, TotalBuyNet - (InitAccount.Balance - account.Balance));
var BuyAmount = _N(UsedMoney / BuyPrice, 3);
if (BuyAmount < MinStock) {
return false;
}
LastBuyPrice = BuyPrice;
exchange.Buy(BuyPrice, BuyAmount, 'Cost: ', _N(UsedMoney), 'last price', ticker.Last);
return true;
}
function main() {
CancelPendingOrders();
InitAccount = _C(exchange.GetAccount);
Log(InitAccount);
if (InitAccount.Balance < TotalBuyNet) {
throw "balance not enough";
}
LoopInterval = Math.max(LoopInterval, 1);
while (dispatch()) {
Sleep(LoopInterval * 1000);
}
Log("All Done", _C(exchange.GetAccount));
}
小さな夢素晴らしい!