我正试图想出一个公式来计算平均进场/持仓价格,以进一步更新我的止损和获利。
例如,当价格为20000时,打开了金额为1的BTC买入头寸。后来,当价格降到19000时,我们又用同样的1;平均";中间的位置,所以以19500的位置结束,数量为2。
我很纠结的是,如果我们想增加每个价格的订单量怎么办。
假设20000时为1,19500时为1.5,19000时为2,依此类推
或者进行相同金额但距离较短的新购买。
初始买入价为20000。然后是19000,然后是19150
或者将这两种变体结合起来。
我主要使用Python和Pandas。也许后一个有一些我不知道的内置功能。我查看了Pandas的官方文档,但只发现了正则均值函数。
由于Yuri建议研究VWAP,我想出了以下代码,它更高级,允许您使用不同的合同/数量大小和增加/减少"距离";订单之间。
作为这里的一个例子,我使用了20000 BTC的平均价格,并使用1.1的乘数增加了步距,同时增加了音量。按照币安期货条款操作,您可以以10美元的价格购买至少1份合约。
这个想法是找到订单距离、数量、止损和获利的最佳点,同时避免下跌。
# initial entry price
initial_price = 20000
# bottom price
bottom_price = 0
# enter on every 5% price drop
step = int(initial_price*0.05)
# 1.1 to increase distance between orders, 0.9 to decrease
step_multiplier = 1.1
# initial volume size in contracts
initial_volume = 1
# volume_multiplier, can't be less than 1, in case of use float, will be rounded to decimal number
volume_multiplier = 1.1
# defining empty arrays
prices = []
volumes = []
# checking if we are going to use simple approach with 1 contract volume and no sep or volume multiplier
if step_multiplier == 1 and volume_multiplier == 1:
prices = range(initial_price,bottom_price,-step)
else:
# defining current price and volume vars
curr_price = initial_price
curr_volume = initial_volume
# Checking if current price is still bigger then defined bottom price
while curr_price > bottom_price:
# adding current price to the list
prices.append(curr_price)
# calulating next order price
curr_price = curr_price-step*step_multiplier
# checking if volume multiplier is bigger then 1
if volume_multiplier > 1:
# adding current volume to the list
volumes.append(int(curr_volume))
# calulating next order volume
curr_volume = curr_volume*volume_multiplier
print("Prices:")
for price in prices:
print(price)
print("Volumes:")
for volume in volumes:
print(volume)
print("Prices array length", len(prices))
print("Volumes array length", len(volumes))
a = [item1 * item2 for item1, item2 in zip(prices, volumes)]
b = volumes
print("Average position price when price will reach",prices[-1], "is", sum(a)/sum(b))