Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Code (c) alex rodriguez-mcinteer 2016
- This code is free to use, modify, and distribute, and is provided as is without warrenty
- youtube video mentioning this is available on the channel: https://www.youtube.com/channel/UCKd5FMMuMkQgtatSc5sSZPw
- if you enjoy my software, please subscribe to my youtube for more c;
- FYI, you need to install the controlP5 library on processing for this to work
- Please inform me of modifications you make, and I will gladly share them on youtube C:
- */
- import java.util.*;
- import controlP5.*;
- ControlP5 cp5;
- final int Range = 200;
- float Liquidity = 1;
- Exchange CommodityExchange;
- Trader Producers[];
- Trader Consumers[];
- void setup()
- {
- size( displayWidth, 700 );
- frameRate( -1 );
- cp5 = new ControlP5( this );
- CommodityExchange = new Exchange( 4000 );
- Producers = new Trader[2000];
- Consumers = new Trader[2000];
- for( int i = 0; i < 2000; i++ )
- {
- Producers[ i ] = new Trader( i, 10000, 200, true, false, 100, 1 );
- Consumers[ i ] = new Trader( i+2000, 10000, 200, false, true, 125, 1 );
- Producers[ i ].Trade( i );
- Consumers[ i ].Trade( i+2000 );
- }
- }
- void draw()
- {
- background( 0 );
- CommodityExchange.Draw();
- CommodityExchange.RunLogic();
- CommodityExchange.FillTradesLogic();
- for( int i = 0; i < ( CommodityExchange.Traders/2 ); i++ )
- {
- Producers[ i ].Trade( i );
- Consumers[ i ].Trade( i+2000 );
- }
- }
- class Trader
- {
- boolean Producer;
- boolean Consumer;
- boolean Trading;
- int EntryPoint;
- int PurchaseVolume;
- int Time;
- int Id;
- public Trader( int Id_, int m, int i, boolean p, boolean c, int pv, int t )
- {
- Id = Id_;
- Producer = p;
- Consumer = c;
- PurchaseVolume = pv;
- Time = t;
- Trading = false;
- EntryPoint = 0;
- }
- public void Trade( int ID )
- {
- if( second() % Time == 0 && Trading == false && random( 0, 1 ) >= .999 )
- {
- Trading = true;
- int BS = ( ( Integer ) ( ( ArrayList ) CommodityExchange.Bid.get( CommodityExchange.BidPrice ) ).get( ID ) );
- int AS = ( ( Integer ) ( ( ArrayList ) CommodityExchange.Ask.get( CommodityExchange.AskPrice ) ).get( ID ) );
- if( !Producer )
- {
- boolean t = ( random( 0, 1 ) < Liquidity );
- int level = ( int ) random( 0, 5 );
- if( true )
- {
- float Size = random( 0, 1 ) * PurchaseVolume;
- if( t )
- {
- EntryPoint = ( int ) max( 1, ( float ) ( CommodityExchange.AskPrice-level ) );
- ( ( ArrayList ) CommodityExchange.Bid.get( ( int ) min( ( float )Range - 1, max( 1, ( float ) ( CommodityExchange.AskPrice-level ) ) ) ) ).set( ID, BS + ( ( int ) ( Size ) ) );
- }
- else
- {
- EntryPoint = ( int ) max( 1, ( float ) ( CommodityExchange.BidPrice-level ) );
- ( ( ArrayList ) CommodityExchange.Bid.get( ( int ) min( ( float )Range - 1, max( 1, ( float ) ( CommodityExchange.BidPrice-level ) ) ) ) ).set( ID, BS + ( ( int ) ( Size ) ) );
- }
- }
- }
- else
- {
- Trading = true;
- boolean t = ( random( 0, 1 ) < Liquidity );
- int level = ( int ) random( 0, 5 );
- if( true )
- {
- float Size = random( 0, 1 ) * PurchaseVolume;
- if( t )
- {
- EntryPoint = ( int ) max( 1, ( float ) ( CommodityExchange.BidPrice+level ) );
- ( ( ArrayList ) CommodityExchange.Ask.get( ( int ) min( ( float )Range - 1, max( 1, ( float ) ( CommodityExchange.BidPrice+level ) ) ) ) ).set( ID, AS + ( ( int ) ( random( 0, 1 ) * PurchaseVolume ) ) );
- }
- else
- {
- EntryPoint = ( int ) min( ( float )Range - 1, max( 1, ( float ) ( CommodityExchange.AskPrice+level ) ) );
- ( ( ArrayList ) CommodityExchange.Ask.get( ( int ) min( ( float )Range - 1, max( 1, ( float ) ( CommodityExchange.AskPrice+level ) ) ) ) ).set( ID, AS + ( ( int ) ( random( 0, 1 ) * PurchaseVolume ) ) );
- }
- }
- }
- }
- else
- {
- if( Consumer )
- {
- if( CommodityExchange.BidPrice - EntryPoint > 5 )
- {
- Trading = false;
- ( ( ArrayList ) CommodityExchange.Bid.get( ( int ) min( 199, EntryPoint ) ) ).set( Id, ( ( int ) ( 0 ) ) );
- }
- }
- else
- {
- if( EntryPoint-CommodityExchange.AskPrice > 5 )
- {
- Trading = false;
- ( ( ArrayList ) CommodityExchange.Ask.get( ( int ) min( 199, EntryPoint ) ) ).set( Id, ( ( int ) ( 0 ) ) );
- }
- }
- }
- }
- }
- class Exchange
- {
- ArrayList Bid;
- ArrayList Ask;
- int Traders;
- int BidPrice;
- int AskPrice;
- Chart myChart;
- public Exchange( int T )
- {
- Bid = new ArrayList();
- Ask = new ArrayList();
- Traders = T;
- BidPrice = 49;
- AskPrice = 50;
- cp5.addSlider( "slider_demand" )
- .setPosition( 275, 525 )
- .setSize( width - 350, 20 )
- .setRange( 0, 200 )
- .setValue( 100 )
- ;
- cp5.addSlider( "slider_supply" )
- .setPosition( 275, 550 )
- .setSize( width - 350, 20 )
- .setRange( 0, 200 )
- .setValue( 100 )
- ;
- cp5.addSlider( "slider_liquidity" )
- .setPosition( 275, 575 )
- .setSize( width - 350, 20 )
- .setRange( 0, 1 )
- .setValue( 100 )
- ;
- myChart = cp5.addChart( "dataflow" )
- .setPosition( 275, 100 )
- .setSize( width - 300, 400 )
- .setRange( 0, Range )
- .setView( Chart.LINE ) // use Chart.LINE, Chart.PIE, Chart.AREA, Chart.BAR_CENTERED
- .setStrokeWeight( 1 )
- .setColorCaptionLabel( color( 40 ) )
- ;
- myChart.addDataSet( "tickflow_B" );
- myChart.setData( "tickflow_B", new float[480] );
- myChart.addDataSet( "tickflow_A" );
- myChart.setData( "tickflow_A", new float[480] );
- for( int i = 0; i < Range; i ++ )
- {
- Bid.add( new ArrayList() );
- Ask.add( new ArrayList() );
- for( int j = 0; j < Traders; j ++ )
- {
- ( ( ArrayList ) Bid.get( i ) ).add( ( int ) 0 );
- ( ( ArrayList ) Ask.get( i ) ).add( ( int ) 0 );
- }
- }
- }
- public void RunLogic()
- {
- int BP = 1;
- int AP = Range -3;
- for( int i = 1; i < Range -2; i ++ )
- {
- int BI1 = 0;
- int AI1 = 0;
- int BI2 = 0;
- int AI2 = 0;
- for( int j = 0; j < Traders; j ++ )
- {
- BI1 += ( ( Integer ) ( ( ArrayList ) Bid.get( i ) ).get( j ) );
- AI1 += ( ( Integer ) ( ( ArrayList ) Ask.get( i ) ).get( j ) );
- BI2 += ( ( Integer ) ( ( ArrayList ) Bid.get( i+1 ) ).get( j ) );
- AI2 += ( ( Integer ) ( ( ArrayList ) Ask.get( i-1 ) ).get( j ) );
- }
- if( BI2 == 0 && BI1 > 0 )
- {
- if( i > BP )
- {
- BP = i;
- }
- }
- if( AI2 == 0 && AI1 > 0 )
- {
- if( i < AP )
- {
- AP = i;
- }
- }
- }
- if( BP != 1 )
- {
- BidPrice = BP;
- }
- if( AP < Range-3 )
- {
- AskPrice = AP;
- }
- myChart.push( "tickflow_A", AskPrice );
- myChart.push( "tickflow_B", BidPrice );
- }
- public void FillTradesLogic()
- {
- for( int i = 0; i < Range-1; i++ )
- {
- for( int j = 0; j < Traders; j ++ )
- {
- int AskSize = ( ( Integer ) ( ( ArrayList ) Ask.get( i ) ).get( j ) );
- if( AskSize > 0 )
- {
- for( int x = BidPrice; x >=0; x-- )
- {
- for( int y = 0; y < Traders; y ++ )
- {
- if( AskSize > 0 && ( ( Integer ) ( ( ArrayList ) Bid.get( x ) ).get( y ) ) > 0 )
- {
- int BidSize = ( ( Integer ) ( ( ArrayList ) Bid.get( x ) ).get( y ) );
- if( BidSize < AskSize && BidSize > 0 )
- {
- ( ( ArrayList ) Bid.get( x ) ).set( y, 0 );
- ( ( ArrayList ) Ask.get( i ) ).set( j, AskSize-BidSize );
- Consumers[ y%( CommodityExchange.Traders/2 ) ].Trading = false;
- AskSize -= BidSize;
- }
- else if( BidSize > AskSize && AskSize > 0 )
- {
- ( ( ArrayList ) Bid.get( x ) ).set( y, BidSize-AskSize );
- ( ( ArrayList ) Ask.get( i ) ).set( j, 0 );
- Producers[ j%( CommodityExchange.Traders/2 ) ].Trading = false;
- AskSize = 0;
- }
- else if( BidSize == AskSize && BidSize > 0 )
- {
- Producers[ j%( CommodityExchange.Traders/2 ) ].Trading = false;
- Consumers[ y%( CommodityExchange.Traders/2 ) ].Trading = false;
- ( ( ArrayList ) Bid.get( x ) ).set( y, 0 );
- ( ( ArrayList ) Ask.get( i ) ).set( j, 0 );
- AskSize = 0;
- }
- }
- }
- }
- }
- }
- }
- }
- public void Draw()
- {
- fill( 0, 0, 128 );
- rect( 0, 0, 125, height );
- fill( 128, 0, 0 );
- rect( 125, 0, 125, height );
- for( int i = 0; i < Range; i++ )
- {
- int B = 0;
- int A = 0;
- for( int j = 0; j < Traders; j ++ )
- {
- B += ( ( Integer ) ( ( ArrayList ) Bid.get( i ) ).get( j ) );
- A += ( ( Integer ) ( ( ArrayList ) Ask.get( i ) ).get( j ) );
- }
- fill( 255 );
- stroke( 255 );
- text( i, 25, ( height/1.05 )*( ( ( float ) i ) / ( ( float ) Range ) ) + 25 );
- text( B, 65, ( height/1.05 )*( ( ( float ) i ) / ( ( float ) Range ) ) + 25 );
- text( i, 145, ( height/1.05 )*( ( ( float ) i ) / ( ( float ) Range ) ) + 25 );
- text( A, 175, ( height/1.05 )*( ( ( float ) i ) / ( ( float ) Range ) ) + 25 );
- }
- fill( 255 );
- stroke( 255 );
- text( "Bid: " + BidPrice, 275, 25 );
- text( "Ask: " + AskPrice, 275, 50 );
- }
- }
- void slider_supply( float level )
- {
- for( int i = 0; i < ( CommodityExchange.Traders/2 )+1; i++ )
- {
- Producers[ i ].PurchaseVolume = ( int ) level;
- }
- }
- void slider_demand( float level )
- {
- for( int i = 0; i < ( CommodityExchange.Traders/2 )+1; i++ )
- {
- Consumers[ i ].PurchaseVolume = ( int ) level;
- }
- }
- void slider_liquidity( float level )
- {
- Liquidity = level;
- }
Add Comment
Please, Sign In to add comment