Name
EMA趋势跟踪当周次周季度
Author
crypto_future
Strategy Description
此策略基于EMA均线做趋势跟踪,当形成EMA金叉时开仓,形成EMA死叉时平仓。从趋势中赚取利润。本策略支持OKEX合约做多做空双向开仓。
补充说明:EMA(Exponential Moving Average)是指数移动平均值。也叫 EXPMA 指标,它也是一种趋向类指标,指数移动平均值是以指数式递减加权的移动平均。
EMA趋势跟踪法是基于截断亏损,让利润奔跑的交易哲学而开发,趋势跟踪法认为市场中由于人性的贪婪和恐惧以及经济周期的影响,会造成市场走势的持续上升或持续下跌从而形成趋势,通过捕捉市场的主要趋势从而获得市场平均或超越市场平均的利润。
注:本策略仅用于学习调试,用于实盘后果自负。
Source (javascript)
var strategy_version="1.62.EMA"; //test
/*
使用说明:
- okex的账户设置为10倍杠杆
- 使用全仓模式
- 使用API v1
*/
/********************************************策略参数**********************************/
var price_n={Futures_OKCoin_BSV_USD:2};//价格精度设置
var num_n={Futures_OKCoin_BSV_USD:0};//数量精度设置
var minestbuy={Futures_OKCoin_BSV_USD:1};//最小买入量
var price_step={Futures_OKCoin_BSV_USD:0.2};//定价单调整量
var contract_min={Futures_OKCoin_BSV_USD:10};//最小合约金额
var wait_ms=3000;//重试等待时间(ms)
var max_wait_order=6000;//订单等待时间(ms)
var margin_lv=10;//杠杆倍数
var ok_future_target='bsv';//目标合约
var keep_risk_rate=2;//保证金率 (总权益/可用)
var trade_unit_div=4;//每次交易资产百分比
var push_notification=true;//微信通知交易机会
var N_mult=3;//N的倍数(用于计算高位止损)
var k_type=PERIOD_M15;//k线类型
var N_knumber=50;//取50个bar用于计算n
/********************************************策略参数**********************************/
//全局变量
var total_loop=0;
var tw_sell1_lowest=100000;
var tw_buy1_highest=0;
var nw_sell1_lowest=100000;
var nw_buy1_highest=0;
var qt_sell1_lowest=100000;
var qt_buy1_highest=0;
var total_trade_num=0;
var success_trade_num=0;
var failed_trade_num=0;
//主函数
function main(){
Log("strategy_version="+strategy_version);
$.set_params(price_n,num_n,minestbuy,price_step,wait_ms,max_wait_order);
if (push_notification){
Log("策略开始运行!已开启推送。@");
}
//restore data
total_trade_num=Number(_G("total_trade_num"));
success_trade_num=Number(_G("success_trade_num"));
failed_trade_num=Number(_G("failed_trade_num"));
while(true){
try{
exchange.SetMarginLevel(margin_lv);
var exname=exchange.GetName();
var currency=exchange.GetCurrency();
var account=$.retry_get_account(exchange);
var f_orders=_C(exchange.GetOrders);
exchange.SetContractType("this_week");
var tw_depth=_C(exchange.GetDepth);
var tw_sell1=tw_depth.Asks[0].Price;
var tw_buy1=tw_depth.Bids[0].Price;
var tw_records=_C(exchange.GetRecords,k_type);
if (tw_records.length<=60){
Log("tw_records.length无效,跳过此次执行...");
Sleep(wait_ms);
continue;
}
exchange.SetContractType("next_week");
var nw_depth=_C(exchange.GetDepth);
var nw_sell1=nw_depth.Asks[0].Price;
var nw_buy1=nw_depth.Bids[0].Price;
var nw_records=_C(exchange.GetRecords,k_type);
if (nw_records.length<=60){
Log("nw_records.length无效,跳过此次执行...");
Sleep(wait_ms);
continue;
}
exchange.SetContractType("quarter");
var qt_depth=_C(exchange.GetDepth);
var qt_sell1=qt_depth.Asks[0].Price;
var qt_buy1=qt_depth.Bids[0].Price;
var qt_records=_C(exchange.GetRecords,k_type);
if (qt_records.length<=60){
Log("qt_records.length无效,跳过此次执行...");
Sleep(wait_ms);
continue;
}
var position=_C(exchange.GetPosition);
var tw_zuoduo_zhangshu=0;
var tw_zuoduo_avg_price=0;
var tw_zuoduo_amount=0;
var tw_zuokong_zhangshu=0;
var tw_zuokong_avg_price=0;
var tw_zuokong_amount=0;
var nw_zuoduo_zhangshu=0;
var nw_zuoduo_avg_price=0;
var nw_zuoduo_amount=0;
var nw_zuokong_zhangshu=0;
var nw_zuokong_avg_price=0;
var nw_zuokong_amount=0;
var qt_zuoduo_zhangshu=0;
var qt_zuoduo_avg_price=0;
var qt_zuoduo_amount=0;
var qt_zuokong_zhangshu=0;
var qt_zuokong_avg_price=0;
var qt_zuokong_amount=0;
for (var i=0; i < position.length; i++){
if (position[i].ContractType==="this_week"){
if (position[i].Type===PD_LONG){
tw_zuoduo_zhangshu=position[i].Amount;
tw_zuoduo_avg_price=position[i].Price;
tw_zuoduo_amount=tw_zuoduo_zhangshu*contract_min[$.get_exchange_id(exchange)]*(1/tw_zuoduo_avg_price-1/tw_buy1+1/tw_zuoduo_avg_price);
}
if (position[i].Type===PD_SHORT){
tw_zuokong_zhangshu=position[i].Amount;
tw_zuokong_avg_price=position[i].Price;
tw_zuokong_amount=tw_zuokong_zhangshu*contract_min[$.get_exchange_id(exchange)]*(1/tw_sell1-1/tw_zuokong_avg_price+1/tw_zuokong_avg_price);
}
}
if (position[i].ContractType==="next_week"){
if (position[i].Type===PD_LONG){
nw_zuoduo_zhangshu=position[i].Amount;
nw_zuoduo_avg_price=position[i].Price;
nw_zuoduo_amount=nw_zuoduo_zhangshu*contract_min[$.get_exchange_id(exchange)]*(1/nw_zuoduo_avg_price-1/nw_buy1+1/nw_zuoduo_avg_price);
}
if (position[i].Type===PD_SHORT){
nw_zuokong_zhangshu=position[i].Amount;
nw_zuokong_avg_price=position[i].Price;
nw_zuokong_amount=nw_zuokong_zhangshu*contract_min[$.get_exchange_id(exchange)]*(1/nw_sell1-1/nw_zuokong_avg_price+1/nw_zuokong_avg_price);
}
}
if (position[i].ContractType==="quarter"){
if (position[i].Type===PD_LONG){
qt_zuoduo_zhangshu=position[i].Amount;
qt_zuoduo_avg_price=position[i].Price;
qt_zuoduo_amount=qt_zuoduo_zhangshu*contract_min[$.get_exchange_id(exchange)]*(1/qt_zuoduo_avg_price-1/qt_buy1+1/qt_zuoduo_avg_price);
}
if (position[i].Type===PD_SHORT){
qt_zuokong_zhangshu=position[i].Amount;
qt_zuokong_avg_price=position[i].Price;
qt_zuokong_amount=qt_zuokong_zhangshu*contract_min[$.get_exchange_id(exchange)]*(1/qt_sell1-1/qt_zuokong_avg_price+1/qt_zuokong_avg_price);
}
}
}
var account_rights=account.Info.info[ok_future_target].account_rights;//账户权益
var keep_deposit=account.Info.info[ok_future_target].keep_deposit;//保证金
var profit_real=account.Info.info[ok_future_target].profit_real;//已实现盈亏
var profit_unreal=account.Info.info[ok_future_target].profit_unreal;//未实现盈亏
var risk_rate=(keep_deposit===0?1000000:(account_rights/keep_deposit));//account.Info.info[ok_future_target].risk_rate;//保证金率 10倍杠杆,当保证金率小于等于10%,才会触发爆仓线;20倍杠杆,当保证金率小于等于20%,才会触发爆仓线。 这意味着如果您开10倍LTC合约,当您的亏损达到开仓保证金的90%时,会触发爆仓线;若开20倍杠杆的合约,当您的亏损达到开仓保证金的80%时,才会触发爆仓线。
var tw_atr = TA.ATR(tw_records, N_knumber);
var nw_atr = TA.ATR(nw_records, N_knumber);
var qt_atr = TA.ATR(qt_records, N_knumber);
if (tw_atr.length<=1 || nw_atr.length<=1 || qt_atr.length<=1){
Log("atr.length无效,跳过此次执行...");
Sleep(wait_ms);
continue;
}
var tw_N=tw_atr[tw_atr.length-1];
var nw_N=nw_atr[nw_atr.length-1];
var qt_N=tw_atr[qt_atr.length-1];
var tw_ema7=TA.EMA(tw_records,7);
var nw_ema7=TA.EMA(nw_records,7);
var qt_ema7=TA.EMA(qt_records,7);
var tw_ema30=TA.EMA(tw_records,30);
var nw_ema30=TA.EMA(nw_records,30);
var qt_ema30=TA.EMA(qt_records,30);
if (tw_ema7.length<=5||tw_ema30.length<=5||nw_ema7.length<=5||nw_ema30.length<=5||qt_ema7.length<=5||qt_ema30.length<=5){
Log("ema无效,跳过此次执行...");
Sleep(wait_ms);
continue;
}
var tw_ema_buyduo=false;
var tw_ema_sellduo=false;
if (tw_ema7[tw_ema7.length-2]>tw_ema30[tw_ema30.length-2] &&
tw_ema7[tw_ema7.length-3]<=tw_ema30[tw_ema30.length-3]){
tw_ema_buyduo=true;
}
if (tw_ema7[tw_ema7.length-2]<tw_ema30[tw_ema30.length-2] &&
tw_ema7[tw_ema7.length-3]>=tw_ema30[tw_ema30.length-3]){
tw_ema_sellduo=true;
}
var nw_ema_buyduo=false;
var nw_ema_sellduo=false;
if (nw_ema7[nw_ema7.length-2]>nw_ema30[nw_ema30.length-2] &&
nw_ema7[nw_ema7.length-3]<=nw_ema30[nw_ema30.length-3]){
nw_ema_buyduo=true;
}
if (nw_ema7[nw_ema7.length-2]<nw_ema30[nw_ema30.length-2] &&
nw_ema7[nw_ema7.length-3]>=nw_ema30[nw_ema30.length-3]){
nw_ema_sellduo=true;
}
var qt_ema_buyduo=false;
var qt_ema_sellduo=false;
if (qt_ema7[qt_ema7.length-2]>qt_ema30[qt_ema30.length-2] &&
qt_ema7[qt_ema7.length-3]<=qt_ema30[qt_ema30.length-3]){
qt_ema_buyduo=true;
}
if (qt_ema7[qt_ema7.length-2]<qt_ema30[qt_ema30.length-2] &&
qt_ema7[qt_ema7.length-3]>=qt_ema30[qt_ema30.length-3]){
qt_ema_sellduo=true;
}
var tw_ema_buykong=false;
var tw_ema_sellkong=false;
if (tw_ema7[tw_ema7.length-2]<tw_ema30[tw_ema30.length-2] &&
tw_ema7[tw_ema7.length-3]>=tw_ema30[tw_ema30.length-3]){
tw_ema_buykong=true;
}
if (tw_ema7[tw_ema7.length-2]>tw_ema30[tw_ema30.length-2] &&
tw_ema7[tw_ema7.length-3]<=tw_ema30[tw_ema30.length-3]){
tw_ema_sellkong=true;
}
var nw_ema_buykong=false;
var nw_ema_sellkong=false;
if (nw_ema7[nw_ema7.length-2]<nw_ema30[nw_ema30.length-2] &&
nw_ema7[nw_ema7.length-3]>=nw_ema30[nw_ema30.length-3]){
nw_ema_buykong=true;
}
if (nw_ema7[nw_ema7.length-2]>nw_ema30[nw_ema30.length-2] &&
nw_ema7[nw_ema7.length-3]<=nw_ema30[nw_ema30.length-3]){
nw_ema_sellkong=true;
}
var qt_ema_buykong=false;
var qt_ema_sellkong=false;
if (qt_ema7[qt_ema7.length-2]<qt_ema30[qt_ema30.length-2] &&
qt_ema7[qt_ema7.length-3]>=qt_ema30[qt_ema30.length-3]){
qt_ema_buykong=true;
}
if (qt_ema7[qt_ema7.length-2]>qt_ema30[qt_ema30.length-2] &&
qt_ema7[qt_ema7.length-3]<=qt_ema30[qt_ema30.length-3]){
qt_ema_sellkong=true;
}
//update lowest and highest
if (tw_zuoduo_zhangshu>0 && tw_buy1>tw_buy1_highest){
tw_buy1_highest=tw_buy1;
}
if (tw_zuokong_zhangshu>0 && tw_sell1<tw_sell1_lowest){
tw_sell1_lowest=tw_sell1;
}
if (nw_zuoduo_zhangshu>0 && nw_buy1>nw_buy1_highest){
nw_buy1_highest=nw_buy1;
}
if (nw_zuokong_zhangshu>0 && nw_sell1<nw_sell1_lowest){
nw_sell1_lowest=nw_sell1;
}
if (qt_zuoduo_zhangshu>0 && qt_buy1>qt_buy1_highest){
qt_buy1_highest=qt_buy1;
}
if (qt_zuokong_zhangshu>0 && qt_sell1<qt_sell1_lowest){
qt_sell1_lowest=qt_sell1;
}
if (tw_zuoduo_zhangshu===0){
tw_buy1_highest=0;
}
if (tw_zuokong_zhangshu===0){
tw_sell1_lowest=100000;
}
if (nw_zuoduo_zhangshu===0){
nw_buy1_highest=0;
}
if (nw_zuokong_zhangshu===0){
nw_sell1_lowest=100000;
}
if (qt_zuoduo_zhangshu===0){
qt_buy1_highest=0;
}
if (qt_zuokong_zhangshu===0){
qt_sell1_lowest=100000;
}
var trade_unit=(account_rights*(10/keep_risk_rate)/trade_unit_div)*((tw_buy1+tw_sell1+nw_buy1+nw_sell1+qt_buy1+qt_sell1)/6)/contract_min[$.get_exchange_id(exchange)];
//开仓
if (tw_zuoduo_zhangshu===0 && tw_ema_buyduo && risk_rate>keep_risk_rate && account.Stocks>0){
exchange.SetContractType("this_week");
exchange.SetDirection("buy");
var dealamount=$.perform_limited_order("buy",exchange,tw_sell1,trade_unit,false,"futures","buy");
tw_buy1_highest=tw_buy1;
if (push_notification){
Log("已完成当周做多"+trade_unit+'张'+'@');
}
}
else if (tw_zuokong_zhangshu===0 && tw_ema_buykong && risk_rate>keep_risk_rate && account.Stocks>0){
exchange.SetContractType("this_week");
exchange.SetDirection("sell");
var dealamount=$.perform_limited_order("sell",exchange,tw_buy1,trade_unit,false,"futures","sell");
tw_sell1_lowest=tw_sell1;
if (push_notification){
Log("已完成当周做空"+trade_unit+'张'+'@');
}
}
else if (nw_zuoduo_zhangshu===0 && nw_ema_buyduo && risk_rate>keep_risk_rate && account.Stocks>0){
exchange.SetContractType("next_week");
exchange.SetDirection("buy");
var dealamount=$.perform_limited_order("buy",exchange,nw_sell1,trade_unit,false,"futures","buy");
nw_buy1_highest=nw_buy1;
if (push_notification){
Log("已完成次周做多"+trade_unit+'张'+'@');
}
}
else if (nw_zuokong_zhangshu===0 && nw_ema_buykong && risk_rate>keep_risk_rate && account.Stocks>0){
exchange.SetContractType("next_week");
exchange.SetDirection("sell");
var dealamount=$.perform_limited_order("sell",exchange,nw_buy1,trade_unit,false,"futures","sell");
nw_sell1_lowest=nw_sell1;
if (push_notification){
Log("已完成次周做空"+trade_unit+'张'+'@');
}
}
else if (qt_zuoduo_zhangshu===0 && qt_ema_buyduo && risk_rate>keep_risk_rate && account.Stocks>0){
exchange.SetContractType("quarter");
exchange.SetDirection("buy");
var dealamount=$.perform_limited_order("buy",exchange,qt_sell1,trade_unit,false,"futures","buy");
qt_buy1_highest=qt_buy1;
if (push_notification){
Log("已完成季度做多"+trade_unit+'张'+'@');
}
}
else if (qt_zuokong_zhangshu===0 && qt_ema_buykong && risk_rate>keep_risk_rate && account.Stocks>0){
exchange.SetContractType("quarter");
exchange.SetDirection("sell");
var dealamount=$.perform_limited_order("sell",exchange,qt_buy1,trade_unit,false,"futures","sell");
qt_sell1_lowest=qt_sell1;
if (push_notification){
Log("已完成季度做空"+trade_unit+'张'+'@');
}
}
//平仓
else if (tw_zuoduo_zhangshu>0 && (tw_buy1_highest-tw_buy1>N_mult*tw_N||tw_ema_sellduo/* ||tw_buy1-tw_zuoduo_avg_price>N_mult*tw_N */)){
exchange.SetContractType("this_week");
exchange.SetDirection("closebuy");
var dealamount=$.perform_limited_order("sell",exchange,tw_buy1,tw_zuoduo_zhangshu,true,"futures","closebuy");
total_trade_num++;
if (tw_buy1>tw_zuoduo_avg_price){
success_trade_num++;
}else{
failed_trade_num++;
}
if (push_notification){
Log("已完成当周平多:"+((tw_buy1>tw_zuoduo_avg_price)?'盈利':'亏损')+'@');
}
}
else if (tw_zuokong_zhangshu>0 && (tw_sell1-tw_sell1_lowest>N_mult*tw_N||tw_ema_sellkong/* ||tw_zuokong_avg_price-tw_sell1>N_mult*tw_N */)){
exchange.SetContractType("this_week");
exchange.SetDirection("closesell");
var dealamount=$.perform_limited_order("buy",exchange,tw_sell1,tw_zuokong_zhangshu,true,"futures","closesell");
total_trade_num++;
if (tw_sell1<tw_zuokong_avg_price){
success_trade_num++;
}else{
failed_trade_num++;
}
if (push_notification){
Log("已完成当周平空:"+((tw_sell1<tw_zuokong_avg_price)?'盈利':'亏损')+'@');
}
}
else if (nw_zuoduo_zhangshu>0 && (nw_buy1_highest-nw_buy1>N_mult*nw_N||nw_ema_sellduo/* ||nw_buy1-nw_zuoduo_avg_price>N_mult*nw_N */)){
exchange.SetContractType("next_week");
exchange.SetDirection("closebuy");
var dealamount=$.perform_limited_order("sell",exchange,nw_buy1,nw_zuoduo_zhangshu,true,"futures","closebuy");
total_trade_num++;
if (nw_buy1>nw_zuoduo_avg_price){
success_trade_num++;
}else{
failed_trade_num++;
}
if (push_notification){
Log("已完成次周平多:"+((nw_buy1>nw_zuoduo_avg_price)?'盈利':'亏损')+'@');
}
}
else if (nw_zuokong_zhangshu>0 && (nw_sell1-nw_sell1_lowest>N_mult*nw_N||nw_ema_sellkong/* ||nw_zuokong_avg_price-nw_sell1>N_mult*nw_N */)){
exchange.SetContractType("next_week");
exchange.SetDirection("closesell");
var dealamount=$.perform_limited_order("buy",exchange,nw_sell1,nw_zuokong_zhangshu,true,"futures","closesell");
total_trade_num++;
if (nw_sell1<nw_zuokong_avg_price){
success_trade_num++;
}else{
failed_trade_num++;
}
if (push_notification){
Log("已完成次周平空:"+((nw_sell1<nw_zuokong_avg_price)?'盈利':'亏损')+'@');
}
}
else if (qt_zuoduo_zhangshu>0 && (qt_buy1_highest-qt_buy1>N_mult*qt_N||qt_ema_sellduo/* ||qt_buy1-qt_zuoduo_avg_price>N_mult*qt_N */)){
exchange.SetContractType("quarter");
exchange.SetDirection("closebuy");
var dealamount=$.perform_limited_order("sell",exchange,qt_buy1,qt_zuoduo_zhangshu,true,"futures","closebuy");
total_trade_num++;
if (qt_buy1>qt_zuoduo_avg_price){
success_trade_num++;
}else{
failed_trade_num++;
}
if (push_notification){
Log("已完成季度平多:"+((qt_buy1>qt_zuoduo_avg_price)?'盈利':'亏损')+'@');
}
}
else if (qt_zuokong_zhangshu>0 && (qt_sell1-qt_sell1_lowest>N_mult*qt_N||qt_ema_sellkong/* ||qt_zuokong_avg_price-qt_sell1>N_mult*qt_N */)){
exchange.SetContractType("quarter");
exchange.SetDirection("closesell");
var dealamount=$.perform_limited_order("buy",exchange,qt_sell1,qt_zuokong_zhangshu,true,"futures","closesell");
total_trade_num++;
if (qt_sell1<qt_zuokong_avg_price){
success_trade_num++;
}else{
failed_trade_num++;
}
if (push_notification){
Log("已完成季度平空:"+((qt_sell1<qt_zuokong_avg_price)?'盈利':'亏损')+'@');
}
}
LogStatus(
'-----------------------------------------------------'+'\n'+
'当周做多张数/均价/现价/止损价: '+tw_zuoduo_zhangshu+'/'+_N(tw_zuoduo_avg_price,2)+'/'+_N(tw_buy1,2)+'/'+_N(tw_buy1_highest-N_mult*tw_N,2)+'\n'+
'次周做多张数/均价/现价/止损价: '+nw_zuoduo_zhangshu+'/'+_N(nw_zuoduo_avg_price,2)+'/'+_N(nw_buy1,2)+'/'+_N(nw_buy1_highest-N_mult*nw_N,2)+'\n'+
'季度做多张数/均价/现价/止损价: '+qt_zuoduo_zhangshu+'/'+_N(qt_zuoduo_avg_price,2)+'/'+_N(qt_buy1,2)+'/'+_N(qt_buy1_highest-N_mult*qt_N,2)+'\n'+
'-----------------------------------------------------'+'\n'+
'当周做空张数/均价/现价/止损价: '+tw_zuokong_zhangshu+'/'+_N(tw_zuokong_avg_price,2)+'/'+_N(tw_sell1,2)+'/'+_N(tw_sell1_lowest+N_mult*tw_N,2)+'\n'+
'次周做空张数/均价/现价/止损价: '+nw_zuokong_zhangshu+'/'+_N(nw_zuokong_avg_price,2)+'/'+_N(nw_sell1,2)+'/'+_N(nw_sell1_lowest+N_mult*nw_N,2)+'\n'+
'季度做空张数/均价/现价/止损价: '+qt_zuokong_zhangshu+'/'+_N(qt_zuokong_avg_price,2)+'/'+_N(qt_sell1,2)+'/'+_N(qt_sell1_lowest+N_mult*qt_N,2)+'\n'+
'-----------------------------------------------------'+'\n'+
'当周N: '+tw_N+'\n'+
'次周N: '+nw_N+'\n'+
'季度N: '+qt_N+'\n'+
'-----------------------------------------------------'+'\n'+
'账户权益: '+account_rights+'\n'+
'已用保证金: '+keep_deposit+'\n'+
'可用保证金: '+account.Stocks+'\n'+
'风险比率: '+risk_rate+'\n'+
'期货仓位: '+position.length+'\n'+
'未完成订单: '+f_orders.length+'\n'+
'总交易次数/盈利次数/亏损次数: '+total_trade_num+'/'+success_trade_num+'/'+failed_trade_num+'\n'+
'交易成功率: '+success_trade_num/total_trade_num+'\n'+
'单次交易张数: '+trade_unit+'\n'+
'-----------------------------------------------------'+'\n'+
('♜轮询次数: '+total_loop+'\n')+
('♜更新时间: '+$.get_ChinaTimeString()+'\n')+
('♜VER:'+strategy_version+'\n')+
('♜霖霖量化-博客: http://www.pcclean.io/category/量化交易/ #0000ff'+'\n')+
('♜霖霖量化-实盘策略: http://www.pcclean.io/quant #ff0000'+'\n')
);
_G("total_trade_num", total_trade_num);
_G("success_trade_num", success_trade_num);
_G("failed_trade_num", failed_trade_num);
if (total_loop%100===0){
LogProfit(account_rights);
}
total_loop++;
Sleep(wait_ms);
}catch(err) {
Log("catch error:"+err.message);
Sleep(wait_ms);
}
}//while end
}
Detail
https://www.fmz.com/strategy/203272
Last Modified
2020-04-29 11:58:29