再更新一版,统一了参数,另外把PID参数调整间隔改为10分钟。
主要是希望能够方便观察变化,改成10分钟对pi没啥影响,可能对d有点影响,但应该也不大吧。
其实我觉得这里也许PI控制就够了?D其实作用不大?
Pdex:内盘bitCNY价格
Pf: 当前喂价
premium:溢价百分比
Premium0: 更新周期前的溢价百分比
Tp=4;Ti=6; Td=1; ##PID的几个参数,Ti=6使得当premium>2%时,i在20小时内可从0增加到最大值。
get Pdex, Pf, premium;
premium0=premium;
p=Tp*premium;
i= Pf/Pdex-p-1; ##设置初始值使得初始喂价等于当前喂价
d=0;
while True:
get Pdex, Pf, premium;
if (上次执行后计时器已过去10分钟):
i+=premium/Ti;
if i>0.4: ##给i设定上下限,因为有总体调整幅度的限制,i太大或太小时已经起不到什么作用,反而会延缓回调的速度
i=0.4;
if i<-0.3:
i=-0.3;
d=Td*(premium-premium0);
premium0=premium;
p=Tp*premium;
if p+i+d>0:
feed price = Pdex*min(1+p+i+d, 1.5, 1.2*Pf/Pdex) ##向上调价时,喂价不超过内盘价1.5倍,不超过当前喂价1.2倍
else:
feed price = Pdex*max(1+p+i+d, 0.91*Pf/Pdex)##向下调价时,喂价不得低于当前喂价0.91倍。