📄 trader3.java
字号:
import swarm.Globals;
import swarm.defobj.Zone;
import swarm.objectbase.SwarmImpl;
public class Trader3 extends SwarmImpl
{
public static final int NUM=10;
public static final int T=500;
public static final double limitPrice=300;
public static final double R=1.0,A=0.0;
public int tradetime=0;
//public double bprice,sprice;//bprice是买方开价。sprice是此买者卖时的心理价位
public static double bargainprice[]=new double[T+1];
public double beta=0.1,gama=0.6;
public double max,sellmax,roalprice;//max为买时价格;sellmax为卖时价格
public double tao[]=new double[T+1];
public static double expectedPrice[]=new double[T+1];
public static double slopeProfit[]=new double[T+1];
public double randomEncounterProb=0.1,probability=0.2;
public static boolean isSold;
public static double price[]=new double[NUM];
public static double sellprice[]=new double[NUM];
public double seller[]=new double[NUM];
public int updateseller;
public TraderMarket tradermarket;
public Trader3(int numTraders){
//number=numTraders;
isSold=false;
tradetime=0;
tao=new double[T+1];
slopeProfit=new double[T+1];
expectedPrice=new double[T+1];
bargainprice=new double[T+1];
}
public double getPrice(){
double a;
a=tradeprocess();
return a;
//return bargainprice[time];
}
/*public Object setPrice(double pr){
bprice=pr;
return this;
}*/
/*public double getSlopeProfit(int t){
return slopeProfit[t];
}*/
/*public void init(){
int i,k,k1;
double max=0.0;
price[0]=300+400*Math.random();//定义第一个买家的喊价(随机)
sellprice[0]=price[0]*(1+0.1);//0.1是市场当时的平均收益率
System.out.println("price[0]="+price[0]+" "+"sellprice[0]="+sellprice[0]);
System.out.println("sellprice[0]="+sellprice[0]);
for(k=1;k<NUM;k++)//根据第一个买家喊价,以后的买家依次喊出的价格
{
double temp=0.0;
sellmax=0.0;
for(k1=0;k1<k;k1++)
{temp=price[k1]+temp;}
//price[k]=(temp/k)-100+200*Math.random();//后面的买家的喊价是用前面两个买家的喊价的加权平均算出的,要在加权平均的基础上加个随机数
//sellprice[k]=price[k]*(1+0.1);//根据市场平均收益率算出卖时心理价位(0.1为市场当时的平均收益率),如有可能将加入一个收益的随机扰动。
//price[k]=price[k-1]-100+200*Math.random();
//System.out.println("price["+k+"]="+price[k]+" "+"sellprice["+k+"]="+sellprice[k]);
}
}*/
public double tradeprocess(){
//从可以开价的交易者群体中,随机选出一个“买方”h,其开价为price[h]。
double ep,sp;
TraderMarketModelSwarm3 solder=new TraderMarketModelSwarm3(getZone());
TraderMarket a=new TraderMarket();
tradetime=tradetime+1;
a.init();
int h=(int)(NUM*Math.random());
System.out.println("h="+h);
price[h]=a.price[h];
sellprice[h]=a.sellprice[h];
System.out.println("price["+h+"]="+price[h]);
System.out.println("sellprice["+h+"]="+sellprice[h]+"\n");
//确定一个买方后,买卖双方相遇,进行交易
//if(Math.random()<=randomEncounterProb)
int l=0;
//System.out.println(l);
for(int r=0;r<NUM;r++)
{
if(price[h]>=a.sellprice[r])
{
isSold=true;
System.out.println(isSold);
//bargainprice=price[h];
System.out.println("sellprice["+r+"]="+a.sellprice[r]);
seller[l]=a.sellprice[r];
System.out.println("seller["+l+"]="+seller[l]);
l=l+1;
}
}
//System.out.println("l="+l);
if(isSold==true) //交易成功
{
int s=(int)(l*Math.random());//当有多个卖家满足条件可以与买家进行交易时,随机选出一个卖家,并更新其边际收益
double temp_price=seller[s];
for(int k=0;k<NUM;k++)
{
//通过遍历比较,记录下进行交易活动的卖家的编号,以便于下一轮交易开始之前更新此卖家的卖价和买价。
if (a.sellprice[k]==temp_price)
updateseller=k;
}
System.out.println("\n"+"s="+s); //随机选出的卖家的编号
System.out.println("updateseller="+updateseller);
expectedPrice[1]=seller[s];
slopeProfit[1]=(seller[s]+tao[0])/limitPrice-1;
System.out.println("slopeProfit[1]="+slopeProfit[1]);
System.out.println("expectedPrice[1]="+expectedPrice[1]);
//System.out.println("tradetime="+tradetime);
//System.out.println("expectedPrice[tradetime]="+expectedPrice[tradetime]);
this.updateSlope(expectedPrice[tradetime],price[h],tradetime);//更新随机选出的卖家的边际收益
/*solder.calculateExpectedPrice(tradetime);//由更新之后的边际收益计算得出该卖家下一时刻的喊价
sellprice[updateseller]=expectedPrice[tradetime+1];//通过更新已进行交易的卖家的期望价格也即卖价来更新sellprice数组
price[updateseller]=expectedPrice[tradetime+1]/(1+0.1);//根据sellprice数组反算更新price数组
System.out.println("sellprice[updateseller]="+expectedPrice[tradetime+1]);
System.out.println("price[updateseller]="+price[updateseller]);*/
//ep=solder.calculateExpectedPrice(tradetime);
ep=calculateExpectedPrice(tradetime);
sellprice[updateseller]=ep;
sp=ep/(1+0.1);
price[updateseller]=sp;
System.out.println("sellprice[updateseller]="+ep);
System.out.println("price[updateseller]="+sp);
for(int k=0;k<NUM;k++){
if(k!=updateseller)
System.out.println("price["+k+"]="+a.price[k]+" "+"sellprice["+k+"]="+a.sellprice[k]);
else
System.out.println("price["+k+"]="+price[updateseller]+" "+"sellprice["+k+"]="+sellprice[updateseller]);
}
//System.out.println("tradetime="+tradetime);
//System.out.println("成交价格捕捉"+price[h]);
bargainprice[tradetime]=price[h];
}
else //交易不成功
System.out.println("This trading is not successful!");
return bargainprice[tradetime];
}
public Object updateSlope(double p,double q,int t){
//添加更新边际收益的方法内容
tao[0]=0;
roalprice=R*q+A;
tao[t]=tao[t-1]*gama+beta*(roalprice-p)*(1-gama);
slopeProfit[t+1]=(p+tao[t])/limitPrice-1;
return this;
}
public double calculateExpectedPrice(int t){
int t2=0;
expectedPrice[t+1]=limitPrice*(1+slopeProfit[t+1]);
t2=t+1;
return expectedPrice[t2];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -