Open only one position (openApiPy)
Open only one position (openApiPy)
30 Mar 2022, 08:41
I open the position inside "on message received" function, but this way it will open multiple position because of the loop, my goal is to open only one position, how can i do?
this is my code:
def onMessageReceived(client, message): # Callback for receiving all messages
if message.payloadType in [ProtoHeartbeatEvent().payloadType, ProtoOAAccountAuthRes().payloadType, ProtoOAApplicationAuthRes().payloadType, ProtoOASymbolsListRes().payloadType, ProtoOAGetTrendbarsRes().payloadType]:
return
print("\nMessage received: \n", Protobuf.extract(message))
if message.payloadType == ProtoOAExecutionEvent().payloadType:
print("Execution event received")
executionEvent = Protobuf.extract(message)
print(executionEvent.position.positionId)
positionId = executionEvent.position.positionId
if #some conditions:
symbolId = 1106
clientMsgId = None
volume = 2
request = ProtoOANewOrderReq()
request.ctidTraderAccountId = currentAccountId
request.symbolId = int(symbolId)
request.orderType = ProtoOAOrderType.MARKET
request.tradeSide = ProtoOATradeSide.SELL
request.volume = int(volume) * 100
deferred = client.send(request, clientMsgId = clientMsgId)
deferred.addErrback(onError)
Replies
prenven570
30 Mar 2022, 09:36
RE:
amusleh said:
Hi,
You can use a global variable to check if the position is already opened or not, ex:
isPositionsRequestSent = False def onMessageReceived(client, message): # Callback for receiving all messages if message.payloadType in [ProtoHeartbeatEvent().payloadType, ProtoOAAccountAuthRes().payloadType, ProtoOAApplicationAuthRes().payloadType, ProtoOASymbolsListRes().payloadType, ProtoOAGetTrendbarsRes().payloadType]: return print("\nMessage received: \n", Protobuf.extract(message)) if message.payloadType == ProtoOAExecutionEvent().payloadType: print("Execution event received") executionEvent = Protobuf.extract(message) print(executionEvent.position.positionId) positionId = executionEvent.position.positionId if isPositionsRequestSent is False: global isPositionsRequestSent isPositionsRequestSent = True symbolId = 1106 clientMsgId = None volume = 2 request = ProtoOANewOrderReq() request.ctidTraderAccountId = currentAccountId request.symbolId = int(symbolId) request.orderType = ProtoOAOrderType.MARKET request.tradeSide = ProtoOATradeSide.SELL request.volume = int(volume) * 100 deferred = client.send(request, clientMsgId = clientMsgId) deferred.addErrback(onError)
There are other solutions too, but this one is simplest one, it all depends on what you want to do and your design and architecture.
It's not something related to Open API or our package, these are basic programming stuff that you should know.
Perfect, thanks, this method worked:
global isPositionsRequestSent
if isPositionsRequestSent is False:
isPositionsRequestSent = True
@prenven570
amusleh
30 Mar 2022, 09:05
Hi,
You can use a global variable to check if the position is already opened or not, ex:
There are other solutions too, but this one is simplest one, it all depends on what you want to do and your design and architecture.
It's not something related to Open API or our package, these are basic programming stuff that you should know.
@amusleh