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;
}