Ejemplo n.º 1
0
void MarketMaker::makeAction(int a_OrderBookId, double a_currentTime)
{
	//m_linkToMarket->getOrderBook(a_OrderBookId)->cleanOrderBook();
		OrderType thisOrderType = getOrderType() ;

		if(thisOrderType == CANCEL_BUY ||thisOrderType == CANCEL_SELL)
		{
			if (a_currentTime == 0.0)// NO Cancellation at the initialisation of the process
			{
				return;
			}
			else
			{
				if(thisOrderType == CANCEL_BUY)
				{
					chooseOrdersToBeCanceled(a_OrderBookId,true,a_currentTime);
					return;
				}
				else
				{
					chooseOrdersToBeCanceled(a_OrderBookId,false,a_currentTime);
					return;
				}
			}
			return;
		}
		int spread = m_linkToMarket->getOrderBook(a_OrderBookId)->getAskPrice() - m_linkToMarket->getOrderBook(a_OrderBookId)->getBidPrice();
		
		if(spread < 2 *  m_linkToMarket->getOrderBook(a_OrderBookId)->getTickSize()){return; }

		if(spread >= 2 *  m_linkToMarket->getOrderBook(a_OrderBookId)->getTickSize()){
			int thisOrderPrice = getOrderPrice(a_OrderBookId, thisOrderType) ;
			int thisOrderVolume = getOrderVolume(thisOrderPrice, a_OrderBookId, thisOrderType) ;
			int tickSize = m_linkToMarket->getOrderBook(a_OrderBookId)->getTickSize();
			submitOrder(
				a_OrderBookId, a_currentTime,
				thisOrderVolume,
				thisOrderType,
				thisOrderPrice
			);

			if (thisOrderType==LIMIT_BUY){
				submitOrder(
					a_OrderBookId, a_currentTime,
					thisOrderVolume,
					LIMIT_SELL,
					thisOrderPrice+tickSize
			);
			}
			else if(thisOrderType==LIMIT_SELL){
				submitOrder(
					a_OrderBookId, a_currentTime,
					thisOrderVolume,
					LIMIT_BUY,
					thisOrderPrice-tickSize
			);
			}		
		}
}
Ejemplo n.º 2
0
void process_platform() {
	if(getOrderID() != MP.completed_order) {
		if(!(getOrderState()&ORDER_ACTIVE)) {
			switch(getOrderType()) {
				case(ORDER_TYPE_FORWARD):
					orderStartForward();
					break;
				case(ORDER_TYPE_LEFT_TURN):
					orderStartLeftTurn();
					break;
				case(ORDER_TYPE_RIGHT_TURN):
					orderStartRightTurn();
					break;
			}
		} else {
			if(MP._rotary_driver_state&ROTARY_DRIVER_ACTIVE) {
				if(rotaryDriverDone()) {
					deactivatePID();
					set_stop();
					setOrderDone();
					MP.completed_order = getOrderID();
					rotaryDriverStop();
					rotaryDriverReset();
					MP.adjust_state = 0;
				}
			} else {
				if(MP._state == PLATFORM_FORWARD) {
					if(getOrderTargetTicks() < cmtoticks(PLATFORM_PID_THRESHOLD)) {
						deactivatePID();
						//set_forward(MOTOR_DEFAULT_SPEED, MOTOR_DEFAULT_SPEED);
						if(getOrderCurrentTicks() >= getOrderTargetTicks()) {
							set_stop();
							setOrderDone();
							MP.completed_order = getOrderID();
							MP.adjust_state = 0;
						}
					} else {

						if(!MP.adjust_state&PLATFORM_ADJUST_DONE) {
							if(getOrderLengthToWall() < 7.0) {
								if(getOrderCurrentTicks() >= getOrderTargetTicks()*0.40 && getOrderCurrentTicks() <= getOrderTargetTicks()*0.60) {
									platformFineAdjust();
								}
							}
						}

						if(getOrderCurrentTicks() >= getOrderTargetTicks()*0.6) {

							if(!checkFrontRight()) {
								deactivatePID();
								set_forward(MP._originalLspeed, MP._originalRspeed);
							}

							if((!checkBackRight() && !checkFrontRight()) || (!checkBackLeft() && !checkFrontLeft())) {
								set_stop();
								deactivatePID();
								if(getOrderLengthToWall() >= 7.0) {
									rotaryDriverStartCM(8);
								} else {
									rotaryDriverStartCM(10);
								}

							}
						}
					}
				} else if(MP._state == PLATFORM_LEFT || MP._state == PLATFORM_RIGHT) {
					deactivatePID();
					if(getOrderCurrentTicks() >= getOrderTargetTicks()) {
						set_stop();
						setOrderDone();
						MP.completed_order = getOrderID();
					}
				}

			}
		}
	}

	if(change==1){
		switch(MP._state){
			case(PLATFORM_STOP):
				_stop();
				break;
			case(PLATFORM_FORWARD):
				_go_forward();
				break;
			case(PLATFORM_BACKWARD):
				_go_backward();
				break;
			case(PLATFORM_LEFT):
				_turn_left();
				break;
			case(PLATFORM_RIGHT):
				_turn_right();
				break;
			default:
				_stop();
				break;
		}
		change=0;
	}
}