I will test this when the market opens, this looks like a much cleaner implementation:

Code
void sync_pool_to_broker_position(){
	int tm = TradeMode, lp = LotsPool, lv = LotsVirtual, lph = LotsPhantom;
	LotsPool = brokerCommand(GET_POSITION,SymbolTrade);
	int lp_diff = LotsPool - lp;
	if(lp_diff){
		setf(TradeMode,TR_PHANTOM);
		Lots = abs(lp_diff);
		TRADE* pTr;
		if(lp_diff>0)
			pTr = enterLong();
		else if(lp_diff<0)
			pTr = enterShort();
		setf(pTr->flags,TR_NET);
		resf(pTr->flags,TR_PHANTOM);
	}
	TradeMode = tm; LotsVirtual = lv; LotsPhantom = lph;
}

void force_pool_order(){
	if(LotsPool==LotsVirtual) return;
	char algoname[16];
	strcpy(algoname,Algo);
	algo("HACK");
	int tm = TradeMode, lv = LotsVirtual, lph = LotsPhantom;
	setf(TradeMode,TR_PHANTOM);
	TRADE* pTr = enterLong(1);
	setf(pTr->flags, TR_PHANTOM|TR_NET);
	resf(TradeMode,TR_PHANTOM);
	exitTrade(pTr);
	TradeMode = tm; LotsVirtual = lv; LotsPhantom = lph;
	algo(algoname);
}

void set_broker_position(int pos){
	sync_pool_to_broker_position();
	if(LotsVirtual == pos){
		force_pool_order();
		return;
	}
	
	int tm = TradeMode, lv = LotsVirtual;
	int ph_diff = LotsPhantom - LotsVirtual;
	
	// close all virtual trades, this asset. No orders sent to broker.
	setf(TradeMode,TR_PHANTOM);
	for(open_trades){
		if(strcmp(TradeAsset,Asset)) continue;
		if(!TradeIsVirtual) continue;
		resf(ThisTrade->flags,TR_NET);
		exitTrade(ThisTrade);
		setf(ThisTrade->flags,TR_NET);
	}
	LotsVirtual = 0; LotsPhantom = ph_diff;
	if(!pos){
		force_pool_order();
	}
	else{
		resf(TradeMode,TR_PHANTOM);
		Lots = abs(pos);
		if(pos>0)
			enterLong();
		else if(pos<0)
			enterShort();
	}
	TradeMode = tm;
}


EDIT: Don't use this code, it's garbage. I need to give it one more try.

Last edited by AndrewAMD; 08/12/19 19:11. Reason: no good