设为首页 收藏本站
查看: 973|回复: 0

[经验分享] BotVS趋势交易策略-MACD

[复制链接]

尚未签到

发表于 2017-12-8 21:32:57 | 显示全部楼层 |阅读模式
  MACD低买高卖自动跟单滑动止损策略 , 基于Python实现。
  交叉后前一柱指金叉后的第一柱的值, 交叉后前一柱指金叉前的最后一个柱的值, 滑动价格指下单时加的价格,比如买单会现价加上这个价格,卖单会减去这个价格
  参数
DSC0000.png

  代码



import math
import time
import datetime

def Fixed(v):
return math.floor(v*1000)/1000

# 取消指定ID号的订单
def WaitOrder(exchange, orderId, timeoutToCancel):
t = time.time()
ts = int(round(t * 1000))
while True:
Sleep(3000);
orderInfo = exchange.GetOrder(orderId);
if (not orderInfo):
continue;
if (orderInfo.Status == ORDER_STATE_CLOSED or orderInfo.Status == ORDER_STATE_CANCELED):
return orderInfo;
t = time.time()
if ((int(round(t * 1000)) - ts) > timeoutToCancel):
exchange.CancelOrder(orderId);

# 买入
def Buy(exchange, maxPrice, slidePrice, balanceRatio, timeoutS):
t = time.time()
ts = int(round(t * 1000))
account = None;
dealAmount = 0.0;
usedBlance = 0.0;
maxBalanceUse = 0.0;
isFirst = True;
while True:
if (isFirst):
isFirst = False;
else:
Sleep(3000);
ticker = exchange.GetTicker();
if (not ticker):
continue;
buyPrice = ticker.Sell + slidePrice;
# Price too high, wait...
if (buyPrice > maxPrice):
continue;
# Initialize at first
if (account is None):
account = exchange.GetAccount();
if (not account):
continue;
# Initialize maxBalanceUse
maxBalanceUse = account.Balance * balanceRatio;

buyAmount = Fixed((maxBalanceUse - usedBlance) / buyPrice);
if (buyAmount < exchange.GetMinStock()):
break;

orderId = exchange.Buy(buyPrice, buyAmount);
if (not orderId):
Log(buyPrice, buyAmount, maxBalanceUse, usedBlance);
continue;
orderInfo = WaitOrder(exchange, orderId, timeoutS);
dealAmount += orderInfo.DealAmount;
usedBlance += orderInfo.Price * orderInfo.DealAmount;
if (orderInfo.Status == ORDER_STATE_CLOSED):
break;
t = time.time()
if ((int(round(t * 1000)) - ts) < timeoutS):
break
return {'amount': dealAmount, 'price': (usedBlance / dealAmount  if dealAmount > 0  else 0)};
# 卖出
def Sell(exchange, sellAmount, slidePrice):
# Account info must set
account = exchange.GetAccount();
while (not account):
Sleep(2000);
account = exchange.GetAccount();
sellAmount = min(sellAmount, account.Stocks);
cash = 0.0;
remain = sellAmount;
while (remain >= exchange.GetMinStock()):
ticker = exchange.GetTicker();
if (not ticker):
Sleep(2000);
continue;
sellPrice = ticker.Buy - slidePrice;
sellOrderId = exchange.Sell(sellPrice, remain);
if (not sellOrderId):
Sleep(2000);
continue;
orderInfo = WaitOrder(exchange, sellOrderId, 10000);
remain -= orderInfo.DealAmount;
cash += orderInfo.Price * orderInfo.DealAmount;
return {'amount': sellAmount, 'price': (cash / sellAmount if sellAmount > 0 else 0)};

BuyInfo = None;
BanlanceRatio = 1.0;
Profit = 0.0;
timeAtBuy = 0;
def onTick(exchange):
global BuyInfo, BanlanceRatio, Profit, timeAtBuy
ticker = exchange.GetTicker();
records = exchange.GetRecords();
if (not ticker or not records or len(records) < 45):
return;

ticks = [];
for i in range(len(records)):
ticks.append(records.Close);
macd = TA.MACD(records, 12, 26, 9);
dif = macd[0];
dea = macd[1];
his = macd[2];
op = 0;
if (BuyInfo is None):
# 判断买入条件, macd柱由下翻上(由红转绿)
if (dif[len(ticks)-1] > 0 and his[len(ticks)-1] > ac1 and his[len(ticks)-2] < bc1):
op = 1;
else:
# 卖出条件,昨天跌、今天跌、今天低于昨天
if (records[len(records)-2].Time > timeAtBuy and records[len(records)-1].Close < records[len(records)-1].Open - 0.5
and records[len(records)-2].Close < records[len(records)-2].Open - 0.5
and records[len(records)-1].Close < records[len(records)-2].Close - 0.5):
op = 2;
# 当前价跌破成本价、今天跌
elif (records[len(records)-2].Time > timeAtBuy and BuyInfo['price'] > records[len(records)-1].Close and records[len(records)-1].Close < records[len(records)-1].Open - 0.5):
op = 2;
# 成本价低于最新价 或者 dif 小于0  、his小于0 ???
elif ((BuyInfo['price'] < ticker.Last or dif[len(ticks)-1] < 0) and his[len(ticks)-1] <= 0):
op = 2;
# 当前价跌破成本价、达到止损点
elif ((BuyInfo['price'] > ticker.Last) and ((BuyInfo['price'] - ticker.Last) / BuyInfo['price'] > TrailingStop)):
op = 2;

if (op == 1):       # 买入
info = Buy(exchange, ticker.Sell + (SlidePrice * 3), SlidePrice, BanlanceRatio, orderTimeout * 1000);
# Log(info);
# Log(ticker);
# Log(type(info));
# Log(type(ticker));
if (info['amount'] > 0):
BuyInfo = info;
timeAtBuy = records[len(records)-1].Time;
elif (op == 2):    # 卖出
info = Sell(exchange, BuyInfo['amount'], SlidePrice);
if (info['amount'] > 0):
Profit += info['amount'] * (info['price'] - BuyInfo['price']);
LogProfit(Profit);
BuyInfo = null;


def main():
account = exchange.GetAccount();
if (account):
Log(exchange.GetName(), exchange.GetCurrency(), account);
while (True):
onTick(exchange);
Sleep(30000);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-422266-1-1.html 上篇帖子: RabbitMQ的几个概念 下篇帖子: rabbitmq的简单介绍二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表