Type/to search
8
Follow
1364
Followers
Погрузимся в мир количественной оценки ----- Анализ кода скользящего стоп-лосса MACD с двухсторонними операциями
FAQ
Created 2016-04-22 13:53:14  Updated 2023-06-14 10:38:59
 6
 7686

Погрузимся в мир количественной оценки ----- Анализ кода скользящего стоп-лосса MACD с двухсторонними операциями

В предыдущей статье мы обсуждали упрощенные стратегии количественного анализа в 30 строках кода, но в этой статье мы пошагово подведем новичков к тому, как они могут получить больше удовольствия от разработки количественных стратегий.
В этой статье я расскажу о том, как можно торговать на биткойн, и я не буду рассказывать о том, как можно торговать на биткойн, потому что я не знаю ничего о финансах, инвестициях, ценных бумагах и т.д.
Это означает, что мы не должны думать о том, что мы делаем, а должны думать о том, что мы делаем, а не о том, что мы делаем.
Просмотрев соответствующий контент, имея в виду основные понятия, в сочетании с незначительным знанием языка JS, просто написал.
Здесь, проще говоря, K-линия - это запись рыночных событий в течение определенного периода, чтобы было легко наблюдать за динамикой рынка. Уровень является показателем, используемым в предыдущей статье, и, как и MACD-индикатор, является показателем, отражающим тенденции в рыночных событиях.
В статье описываются понятия, алгоритмы, формулы и т. д. Для тех, кто не понимает, обратитесь к градусам. Я смотрю в градусах!

Код содержит следующие глобальные переменные, старые правила, первые объяснения, старые птицы могут быть проигнорированы.

Имя переменнойНачальная величинапроиллюстрировать
Interval2000Эта переменная - опросный цикл, то есть количество времени, в течение которого программа приостанавливает ожидание. Единицы измерения - миллисекунды, 1000 миллисекунд - это 1 секунда, поэтому первоначальное значение этой переменной - 2 секунды.
STATE_FREE0Это переменная, обозначающая состояние, обозначающая пустоту.
STATE_BUY1Это переменная, которая указывает на то, что у вас есть несколько позиций.
STATE_SELL2Статусная переменная, обозначающая пустое держание позиции.
ORDER_INVALID3Переменная состояния позиции, означающая не держать позиции.
ORDER_VALID4Я не знаю, что делать.
stateSTATE_FREEПеременные состояния, инициируемые в пустом состоянии.
SignalDelay0Первоначально планировалось, что сигнал будет задержан и временно недействителен.
stopProfit0.002Эта переменная имеет значение, стоп-страх, например, капитал * стоп-страх ((0,002) означает максимальную потерю в размере 0,002 капитала, максимальный убыток.
step0.5Длина шага скольжения стоп-убытков. Для повышения или понижения уровня стоп-убытков.
opAmount1Фиксированный объем операций.
profit0Потеря.

Глобальный объект, используемый для записи информации о позиции, содержит несколько методов, в основном для реализации скользящих стоп-убытков.

var holdOrder = {//持仓信息对象 orderState: ORDER_INVALID,// 持仓状态 price: 0, //持仓均价 amount: 0, //持仓量 time: null, // 操作时间 stopPrice: 0, // 止损价 level: 1, //止损等级 updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏 if(state === STATE_SELL){//当前 空头持仓 return (lastPrice - this.price) * amount; } if(state === STATE_BUY){//当前 多头持仓 return - (lastPrice - this.price) * amount; } }, SetStopPrice: function(ticker,stopState){//更新止损价 if(stopState === STATE_FREE){ //更新止损时状态 为空闲 return this.stopPrice; } if(stopState === STATE_BUY){ //更新止损时状态 为多仓 if(this.orderState === ORDER_INVALID){ return this.stopPrice; } if(this.stopPrice === 0){//初始 止损价为0 时 this.stopPrice = this.price * ( 1 - stopProfit ); } if( ticker.Last <= this.price ){ //最后成交价 小于等于 持仓均价时 this.stopPrice = this.price * ( 1 - stopProfit ); this.level = 1; }else{//其它情况 if( ticker.Last - this.price > this.level * step ){//超出当前等级 设置滑动止损 this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price ); //更新止损价为滑动后的止损价 this.level++;//上调止损等级 }else{//其它 this.stopPrice = this.stopPrice;//保持当前止损价不变 } } }else if( stopState === STATE_SELL){//空头持仓类似 if(this.orderState === ORDER_INVALID){ return this.stopPrice; } if(this.stopPrice === 0){ this.stopPrice = this.price * ( 1 + stopProfit ); } if( ticker.Last >= this.price ){ this.stopPrice = this.price * ( 1 + stopProfit ); this.level = 1; }else{ if( this.price - ticker.Last > this.level * step ){ this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last ); this.level++; }else{ this.stopPrice = this.stopPrice; } } } return this.stopPrice;//返回止损价 }, initHoldOrder: function(){//平仓后 用于 初始化持仓信息的 函数 this.orderState = ORDER_INVALID; this.price = 0; this.amount = 0; this.time = null; this.stopPrice = 0; this.level = 1; } };
  • Код загружен на GitHub:
    НажмитеgithubВход.
  • Здесь нет официальных групп QQ, пожалуйста, присоединяйтесь к группе 309368835 Inventors Quantify.

Внизу мы быстро просматриваем функции, которые мы будем использовать.

function MACD_Cross(){//检测MACD指标,交叉状态的函数 var records = exchange.GetRecords();//获取K线数据 while(!records || records.length < 45){ //K线数据不能为null,要大于45个柱,不符合标准 循环获取直到符合 records = exchange.GetRecords(); Sleep(Interval); } var macd = TA.MACD(records,12,26,9);//调用指标函数, 参数为MACD 默认的参数。 var dif = macd[0]; //dif线 var dea = macd[1]; //dea线 var column = macd[2]; // MACD柱 var len = records.length; //K线周期长度 if( (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2 ){ //判断金叉条件:dif 与 dea 此刻均大于0 , 且dif由下上穿dea , 且 MACD量柱大于0.2 return 1; //返回1 代表 金叉信号。 } if( (dif[len-1] < 0 && dea[len-1] < 0) && dif[len-1] < dea[len-1] && dif[len-2] > dea[len-2] && column[len-1] < -0.2 ){ //判断死叉条件: return 2;//返回2 代表 死叉信号。 } return 0; //金叉 、死叉 信号以外,为等待信号 0 。 } function getTimeByNormal(time){// 获取时间的 函数 把毫秒时间 转换 标准时间 var timeByNormal = new Date(); timeByNormal.setTime(time); var strTime = timeByNormal.toString(); var showTimeArr = strTime.split(" "); var showTime = showTimeArr[3]+"-"+showTimeArr[1]+"-"+showTimeArr[2]+"-"+showTimeArr[4]; return showTime; }

Внизу начинается главная функция стратегии, которая использует классификацию шаблонов для транзакций, как и предыдущая 30-строчная среднелинейная стратегия. Подробности транзакций упакованы, и заинтересованные друзья могут найти код в количественном описании разработчика, а комментированная версия размещена в официальных группах QQ, github.

function main(){ var initAccount = $.GetAccount(exchange);//首先我们来记录初始时的账户信息,这里调用了模板类库的导出函数 var nowAccount = initAccount;//再声明一个 变量 表示 现在账户信息 var diffMoney = 0; //钱 差额 var diffStocks = 0;//币 差额 var repair = 0; //计算 盈亏时 用于修正的 量 var ticker = exchange.GetTicker(); //获取此刻市场行情 Log("初始账户:",initAccount); //输出显示 初始账户信息。 while(true){//主函数循环 scan(); //扫描函数, 稍后讲解,主要是判断 开仓、平仓 以及 操作 开仓 、 平仓。 ticker = exchange.GetTicker();//在while循环内 获取 市场行情 if(!ticker){//如果 没有获取到 (null) 跳过以下 重新循环 continue; } if(holdOrder.orderState == ORDER_VALID){//判断当前是否 持仓 Log("当前持仓:",holdOrder); //如果 当前持仓 输出 持仓 信息 } if(holdOrder.orderState == ORDER_INVALID){//如果 未持仓(已平仓) nowAccount = $.GetAccount(exchange); //获取当前账户信息 diffMoney = nowAccount.Balance - initAccount.Balance; //计算 当前账户 与 初始账户之间的 钱 差额 diffStocks = nowAccount.Stocks - initAccount.Stocks; // 计算 当前账户 与 初始账户之间的 币 差额 repair = diffStocks * ticker.Last; //把 币的差额 * 最后成交价 ,转为等值的钱, 用于计算 盈亏 LogProfit(diffMoney + repair ,"RMB","现在账户:",nowAccount,"本次盈亏:",profit);//输出 盈亏 信息 } Sleep(Interval);//轮询 } }

Далее следует основная часть стратегии, обнаружение открытых и закрытых позиций, а также открытые и закрытые операции.

function scan(){ var sellInfo = null; //声明 储存平仓信息的变量 , 初始化null var buyInfo = null; //声明 开仓的 , 初始化null var opFun = null;// 开仓函数, 两种状态 , 开多仓 , 开空仓。 var singal = 0; //信号 while(true){//检测 及操作 循环 var ticker = exchange.GetTicker(); //获取市场行情 if(!ticker){ //判断 获取失败 跳过以下 ,继续循环获取 continue; } holdOrder.SetStopPrice(ticker,state); //设置 持仓 止损价 if(state === STATE_FREE && (singal = MACD_Cross()) !== 0 ){ //判断策略运行状态是否空闲、此刻MACD指标信号是否空闲, 符合 策略运行状态空闲 且 有金叉或死叉执行以下 holdOrder.initHoldOrder();//初始化持仓信息 opFun = singal === 1 ? $.Buy : $.Sell ;//根据MACD_Cross函数返回结果,判断开多仓、开空仓。 buyInfo = opFun(opAmount);//开仓操作 holdOrder.orderState = ORDER_VALID;//设置持仓信息,状态为持仓 holdOrder.price = buyInfo.price; //设置持仓均价 由 开仓操作函数 opFun返回。 holdOrder.amount = buyInfo.amount; //设置持仓量 holdOrder.time = getTimeByNormal((new Date()).getTime());//设置持仓开始的时间 state = singal === 1 ? STATE_BUY : STATE_SELL; //更新策略状态为多仓 或 空仓 var account = $.GetAccount(exchange); //获取账户信息 if(singal === 1){//输出开仓方向 和 当前账户信息 Log("开多仓。","账户:",account); }else{ Log("开空仓。","账户:",account); } break; }else{ var lastPrice = holdOrder.price;// 把持仓均价 赋值 给 lastPrice if( state === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ){ //如果 多仓 且 持仓信息为持仓 且 最后成交价 小于止损价,执行以下 Log("多头止损平仓","初始止损价:",holdOrder.price * (1 - stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//多头止损平仓信息 sellInfo = $.Sell(holdOrder.amount);//平仓 holdOrder.orderState = ORDER_INVALID;//平仓信息 更新进对象 holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal((new Date()).getTime()); profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount);//更新浮动盈亏 state = STATE_FREE;//更新状态 break;//跳出 } if( state === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice ){//同上 , 这个是空头止损平仓 Log("空头止损平仓","初始止损价:",holdOrder.price * (1 + stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//测试 sellInfo = $.Buy(holdOrder.amount); holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal((new Date()).getTime()); profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount); state = STATE_FREE; break; } if(state === STATE_BUY && MACD_Cross() === 2 ){//做多时,MACD指标死叉 -- 死叉平仓 sellInfo = $.Sell(holdOrder.amount); Log("死叉平仓","初始止损价:",holdOrder.price * (1 - stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//测试 holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal((new Date()).getTime()); profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount); state = STATE_FREE; break; } if(state === STATE_SELL && MACD_Cross() === 1 ){//做空时,MACD指标金叉 ---金叉平仓 sellInfo = $.Buy(holdOrder.amount); Log("金叉平仓","初始止损价:",holdOrder.price * (1 + stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//测试 holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal((new Date()).getTime()); profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount); state = STATE_FREE; break; } } Sleep(Interval);//轮询间隔,就是让程序暂停一会儿。 } }

Я устал читать код, и мне надоело пить.

Давайте поговорим о принципе сдвигающейся остановки

В этом разделе кода, посвященном сдвигу, есть строки:SetStopPriceФункции, основанные на входящихstopState(стоп-статус) иticker(Данные рынка) для обновления цены стоп-лосса.stopState === STATE_BUY(b) в зависимости от обстоятельств производить оценку и обновлять стоп-цену.orderStateВ случае, если цена остановки равна 0, ее инициализация умножается на среднюю цену покупки(1 - stopProfit)│ │ │ │ │ │ │ │ticker.Last) и средняя цена держания позиций (this.price) в сравнении с текущим уровнем остановки (this.levelЕсли превышает текущий уровень, то обновляет стоп-цену до значения после скольжения, увеличивая стоп-цену; в противном случае, сохраняет текущий стоп-цену неизменной.stopState === STATE_SELL), логика аналогична, но принимается отрицательное значение для разницы между последней ценой сделки и средней ценой держания позиции, а при обновлении стоп-стоп отнимается это значение. В конце концов, возвращается стоп-стоп после обновления.

Стоп-стрит - это стратегия управления рисками

В процессе удержания позиции, в зависимости от колебаний рыночных цен, регулируется стоп-лосс, чтобы уменьшить потери или защитить прибыль. Согласно логике кода, можно увидеть следующие ключевые моменты для реализации скольжения стоп-лосса:updateCurrentProfitМетод SetStopPrice используется для обновления текущей прибыли и убытка, исходя из состояния держателя позиции (state) и последней цены (lastPrice). Если держатель позиции продается (state_sell), то прибыль является разностью между последней ценой и средней ценой держателя позиции, умноженной на количество держателя позиции; если держатель позиции продается (state_buy), то прибыль является отрицательной. Метод SetStopPrice используется для обновления цены остановки.1 - stopProfitЕсли остановка остается пустой (STATE_SELL), логика аналогична. Метод initHoldOrder используется для инициализации информации о позиции после закрытия позиции, чтобы преобразовать состояние позиции, среднее, количество, время действия цены, остановку и остановку в исходное состояние.

Если вы хотите попробовать свои силы, не забудьте процитировать этот шаблон в своем блоге о криптовалютных биржах.

Справочная информация

Related Recommendations
Comment
All comments (6)

    楼主好,我是www.banbiren.com搬币人,搬砖行情平台作者,正在学习量化交易,我qq号:39866099,可否邀请我进一下群,先在搜索加入不行。

    8 years ago

    好的 ^^, 您这边 直接申请吧, MAC QQ 没找到 邀请的地方 >_< , 1群群号 : 309368835 现在 有几个 位置。

    8 years ago

    进步好快 〜

    10 years ago

    大神指点的好~~嘿嘿

    10 years ago

    辛苦了

    10 years ago

    一起学习~呵呵~

    10 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)