Стратегия длинной и короткой торговли на основе EMA и кумулятивного объема


Дата создания: 2023-09-20 11:48:34 Последнее изменение: 2023-09-20 11:48:34
Копировать: 0 Количество просмотров: 793
1
Подписаться
1617
Подписчики

Обзор

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

Стратегический принцип

Вычислите 50-дневную среднюю ЭМА, а также 100-дневный показатель накопленного объема. Когда ЭМА снизу вверх превышает накопленный объем, создается сигнал купить больше; когда ЭМА снизу вверх превышает накопленный объем, создается сигнал продать меньше.

В процессе удержания позиции, устанавливается фиксированный стоп-убыток и стоп-выход. Стоп-убыток устанавливается на 8% ниже цены входа; стоп-выход устанавливается на 8% выше цены входа, и часть позиции ликвидируется, когда цена достигает точки стоп-убытка.

Анализ преимуществ

Эта стратегия в сочетании с трендовым показателем EMA и показателем денежных потоков для накопления объема торгов, используя в полной мере информацию о ценах и объемах торгов, может эффективно идентифицировать средне-длинные тенденции. Фиксированная стратегия остановки и остановки непосредственно эффективна и полезна для блокирования части прибыли и управления рисками.

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

Анализ рисков

Эта стратегия чрезмерно зависит от среднелинейных индикаторов, и в случае колебаний в диапазоне она может привести к ошибочным сигналам. Фиксированные стоп-стопы также могут привести к преждевременному выходу из игры или чрезмерной потере. Только информация о ценах и объемах продаж рассматривается без учета других факторов.

Можно соответствующим образом расширить параметры средней линии, уменьшить ошибочный сигнал. Также можно ввести показатели, такие как волатильность, RSI и другие, чтобы помочь в суждении.

Направление оптимизации

  1. Тестирование оптимизации комбинации параметров EMA для поиска оптимальных параметров.

  2. Введение других технических показателей, формирование стратегии портфеля показателей.

  3. Применение машинного обучения для прогнозирования ценовых тенденций и повышения эффективности EMA.

  4. Оптимизация стратегии стоп-стоп в сочетании с механизмами отслеживания стоп-стоп, динамического стоп-стоп и т. д.

  5. Внедрение модуля управления капиталом, динамическая корректировка позиций.

  6. Параметры корректировки в соответствии с особенностями разновидности, формирование портфеля стратегий.

Подвести итог

Стратегия объединяет EMA и показатели объема сделок, чтобы определить тенденции средней и длинной линии. Однако существует проблема чрезмерной зависимости от средней линии и фиксированных стоп-стоп. Добавление большего количества показателей, чтобы оценить и оптимизировать стратегию стоп-стоп, может повысить стабильность стратегии и прибыльность. В целом, она обеспечивает использование информации о ценах и объеме сделок для отслеживания тенденций.

Исходный код стратегии
/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
strategy("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(false, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  linewidth=2, transp=25)

bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : ( close[1] * 2 )
if(takePartialProfits==true)
    strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])
    
strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  close<shortTakeProfit )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) and (tradeDirection=="SHORT") )

strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )