Ejemplo n.º 1
0
        private void OpenPosition(OpenPositionData openPositionData)
        {
            try
            {
                BrokerPosition           = new Position(this);
                BrokerPosition.Direction = openPositionData.Direction;

                //Create opening order
                Order openingOrder = _orderFactory.CreateOpeningOrder(openPositionData.Direction, KrakenOrderType.stop_loss, openPositionData.EnteringPrice, openPositionData.Volume, openPositionData.CandleStickId, openPositionData.ConfirmationId, validateOnly: openPositionData.ValidateOnly);
                UpdateOpeningOrder(openingOrder);
                //Place opening order and wait until closed or canceled
                Log(LogEntryImportance.Info, "Placing opening order...", true);
                PlaceOrderResult openingOrderResult = _client.PlaceOrder(openingOrder, true);
                openingOrder = openingOrderResult.Order;
                UpdateOpeningOrder(openingOrder);
                bool ok = false;

                #region Handle opening-order result

                switch (openingOrderResult.ResultType)
                {
                case PlaceOrderResultType.error:
                    _client.HandleErrors(openingOrderResult.Errors);
                    break;

                case PlaceOrderResultType.success:
                    Log(LogEntryImportance.Info, "Opening order filled", true);
                    UpdateEmergencyOrder(_orderFactory.CreateEmergencyExitOrder(openingOrder));
                    ok = true;
                    break;

                case PlaceOrderResultType.partial:
                    Log(LogEntryImportance.Info, string.Format("Opening order partially filled: {0}/{1}", openingOrder.VolumeExecuted, openingOrder.Volume), true);
                    ok = true;
                    break;

                case PlaceOrderResultType.txid_null:
                    Log(LogEntryImportance.Error, "An error occured while attempting to place an opening order: txid is null (unknown reason. Maybe the ValidateOnly argument was set to true)", true);
                    break;

                case PlaceOrderResultType.canceled_not_partial:
                    Log(LogEntryImportance.Info, string.Format("The opening order was canceled: {0}", openingOrder.Reason), true);
                    break;

                case PlaceOrderResultType.exception:
                    Log(LogEntryImportance.Error, string.Format("An error occured while attempting to place an opening order: {0}", openingOrderResult.Exception.Message), true);
                    break;

                default:
                    Log(LogEntryImportance.Error, string.Format("Unknown PlaceOrderResultType {0}", openingOrderResult.ResultType), true);
                    break;
                }

                #endregion


                if (!ok)
                {
                    return;
                }

                //if nothing went wrong, place exiting order
                Order closingOrder = _orderFactory.CreateStopLossOrder(openingOrder, openPositionData.ExitingPrice, openPositionData.ValidateOnly);
                UpdateClosingOrder(closingOrder);
                //Place closing order and wait until closed or canceled
                Log(LogEntryImportance.Info, "Placing closing order...", true);
                PlaceOrderResult closingOrderResult = _client.PlaceOrder(closingOrder, true);
                closingOrder = closingOrderResult.Order;
                UpdateClosingOrder(closingOrder);

                #region Handle closing-order result

                switch (closingOrderResult.ResultType)
                {
                case PlaceOrderResultType.error:
                    _client.HandleErrors(closingOrderResult.Errors);
                    break;

                case PlaceOrderResultType.success:
                    Log(LogEntryImportance.Info, "Closing order filled", true);
                    UpdateEmergencyOrder(null);
                    break;

                case PlaceOrderResultType.partial:
                    Log(LogEntryImportance.Info, string.Format("Closing order partially filled: {0}/{1}", closingOrder.VolumeExecuted, closingOrder.Volume), true);
                    break;

                case PlaceOrderResultType.txid_null:
                    Log(LogEntryImportance.Error, "An error occured while attempting to place a closing order: txid is null (unknown reason. Maybe the ValidateOnly argument was set to true)", true);
                    break;

                case PlaceOrderResultType.canceled_not_partial:
                    Log(LogEntryImportance.Info, string.Format("The closing order was canceled: {0}", closingOrder.Reason), true);
                    break;

                case PlaceOrderResultType.exception:
                    Log(LogEntryImportance.Error, string.Format("An error occured while attempting to place a closing order: {0}", closingOrderResult.Exception.Message), true);
                    break;

                default:
                    Log(LogEntryImportance.Error, string.Format("Unknown PlaceOrderResultType {0}", closingOrderResult.ResultType), true);
                    break;
                }

                #endregion
            }
            catch (Exception ex)
            {
                Log(LogEntryImportance.Error, string.Format("An exception occured in OpenPosition at line {0}. {1} {2}", ex.LineNumber(), ex.Message, ((ex.InnerException != null) ? ex.InnerException.Message : "")), true);
            }
        }