예제 #1
0
        /// <summary>
        ///     Manual operation execution.
        /// </summary>
        public override void BtnOperationClick(object sender, EventArgs e)
        {
            if (!Data.IsConnected)
            {
                if (Configs.PlaySounds)
                {
                    Data.SoundError.Play();
                }
                return;
            }

            var btn = (Button)sender;

            switch (btn.Name)
            {
            case "btnBuy":
            {
                const OrderType type     = OrderType.Buy;
                string          symbol   = Data.Symbol;
                double          lots     = NormalizeEntrySize(OperationLots);
                double          price    = Data.Ask;
                int             slippage = Configs.AutoSlippage
                                           ? (int)Data.InstrProperties.Spread * 3
                                           : Configs.SlippageEntry;

                int stopLossPips;
                if (OperationStopLoss > 0 && OperationTrailingStop > 0)
                {
                    stopLossPips = Math.Min(OperationStopLoss, OperationTrailingStop);
                }
                else
                {
                    stopLossPips = Math.Max(OperationStopLoss, OperationTrailingStop);
                }

                double stoploss   = stopLossPips > 0 ? Data.Bid - Data.InstrProperties.Point * stopLossPips : 0;
                double takeprofit = OperationTakeProfit > 0
                                                ? Data.Bid + Data.InstrProperties.Point * OperationTakeProfit
                                                : 0;

                if (Configs.PlaySounds)
                {
                    Data.SoundOrderSent.Play();
                }

                string message = string.Format(symbol + " " + Data.PeriodMtStr + " " +
                                               Language.T("An entry order sent") + ": " +
                                               Language.T("Buy") + " {0} " +
                                               LotOrLots(lots) + " " +
                                               Language.T("at") + " {1}, " +
                                               Language.T("Stop Loss") + " {2}, " +
                                               Language.T("Take Profit") + " {3}", lots,
                                               price.ToString(Data.Ff), stoploss.ToString(Data.Ff),
                                               takeprofit.ToString(Data.Ff));
                var jmsg = new JournalMessage(JournalIcons.OrderBuy, DateTime.Now, message);
                AppendJournalMessage(jmsg);
                Log(message);

                string parameters = "TS1=" + OperationTrailingStop + ";BRE=" + OperationBreakEven;

                int response = bridge.OrderSend(symbol, type, lots, price, slippage, stopLossPips,
                                                OperationTakeProfit, parameters);

                if (response >= 0)
                {
                    Data.AddBarStats(OperationType.Buy, lots, price);
                    Data.WrongStopLoss   = 0;
                    Data.WrongTakeProf   = 0;
                    Data.WrongStopsRetry = 0;
                }
                else
                {
                    // Error in operation execution.
                    ReportOperationError();
                    Data.WrongStopLoss = stopLossPips;
                    Data.WrongTakeProf = OperationTakeProfit;
                }
            }
            break;

            case "btnSell":
            {
                const OrderType type     = OrderType.Sell;
                string          symbol   = Data.Symbol;
                double          lots     = NormalizeEntrySize(OperationLots);
                double          price    = Data.Bid;
                int             slippage = Configs.AutoSlippage
                                           ? (int)Data.InstrProperties.Spread * 3
                                           : Configs.SlippageEntry;

                int stopLossPips;
                if (OperationStopLoss > 0 && OperationTrailingStop > 0)
                {
                    stopLossPips = Math.Min(OperationStopLoss, OperationTrailingStop);
                }
                else
                {
                    stopLossPips = Math.Max(OperationStopLoss, OperationTrailingStop);
                }

                double stoploss   = stopLossPips > 0 ? Data.Ask + Data.InstrProperties.Point * stopLossPips : 0;
                double takeprofit = OperationTakeProfit > 0
                                                ? Data.Ask - Data.InstrProperties.Point * OperationTakeProfit
                                                : 0;

                if (Configs.PlaySounds)
                {
                    Data.SoundOrderSent.Play();
                }

                string message = string.Format(symbol + " " + Data.PeriodMtStr + " " +
                                               Language.T("An entry order sent") + ": " +
                                               Language.T("Sell") + " {0} " +
                                               LotOrLots(lots) + " " +
                                               Language.T("at") + " {1}, " +
                                               Language.T("Stop Loss") + " {2}, " +
                                               Language.T("Take Profit") + " {3}", lots,
                                               price.ToString(Data.Ff), stoploss.ToString(Data.Ff),
                                               takeprofit.ToString(Data.Ff));
                var jmsg = new JournalMessage(JournalIcons.OrderSell, DateTime.Now, message);
                AppendJournalMessage(jmsg);
                Log(message);

                string parameters = "TS1=" + OperationTrailingStop + ";BRE=" + OperationBreakEven;

                int response = bridge.OrderSend(symbol, type, lots, price, slippage, stopLossPips,
                                                OperationTakeProfit, parameters);

                if (response >= 0)
                {
                    Data.AddBarStats(OperationType.Sell, lots, price);
                    Data.WrongStopLoss   = 0;
                    Data.WrongTakeProf   = 0;
                    Data.WrongStopsRetry = 0;
                }
                else
                {
                    // Error in operation execution.
                    ReportOperationError();
                    Data.WrongStopLoss = stopLossPips;
                    Data.WrongTakeProf = OperationTakeProfit;
                }
            }
            break;

            case "btnClose":
            {
                string symbol   = Data.Symbol;
                double lots     = NormalizeEntrySize(Data.PositionLots);
                double price    = Data.PositionDirection == PosDirection.Long ? Data.Bid : Data.Ask;
                int    slippage = Configs.AutoSlippage ? (int)Data.InstrProperties.Spread * 6 : Configs.SlippageExit;
                int    ticket   = Data.PositionTicket;

                if (ticket == 0)
                {
                    // No position.
                    if (Configs.PlaySounds)
                    {
                        Data.SoundError.Play();
                    }
                    return;
                }

                if (Configs.PlaySounds)
                {
                    Data.SoundOrderSent.Play();
                }

                string message = string.Format(symbol + " " + Data.PeriodMtStr + " " +
                                               Language.T("An exit order sent") + ": " +
                                               Language.T("Close") + " {0} " +
                                               LotOrLots(lots) + " " +
                                               Language.T("at") + " {1}",
                                               lots, price.ToString(Data.Ff));
                var jmsg = new JournalMessage(JournalIcons.OrderClose, DateTime.Now, message);
                AppendJournalMessage(jmsg);
                Log(message);

                bool responseOk = bridge.OrderClose(ticket, lots, price, slippage);

                if (responseOk)
                {
                    Data.AddBarStats(OperationType.Close, lots, price);
                }
                else
                {
                    ReportOperationError();
                }

                Data.WrongStopLoss   = 0;
                Data.WrongTakeProf   = 0;
                Data.WrongStopsRetry = 0;
            }
            break;

            case "btnModify":
            {
                string symbol = Data.Symbol;
                double lots   = NormalizeEntrySize(Data.PositionLots);
                double price  = Data.PositionDirection == PosDirection.Long ? Data.Bid : Data.Ask;
                int    ticket = Data.PositionTicket;
                double sign   = Data.PositionDirection == PosDirection.Long ? 1 : -1;

                if (ticket == 0)
                {
                    // No position.
                    if (Configs.PlaySounds)
                    {
                        Data.SoundError.Play();
                    }
                    return;
                }

                if (Configs.PlaySounds)
                {
                    Data.SoundOrderSent.Play();
                }

                int stopLossPips;
                if (OperationStopLoss > 0 && OperationTrailingStop > 0)
                {
                    stopLossPips = Math.Min(OperationStopLoss, OperationTrailingStop);
                }
                else
                {
                    stopLossPips = Math.Max(OperationStopLoss, OperationTrailingStop);
                }

                double stoploss   = stopLossPips > 0 ? price - sign * Data.InstrProperties.Point * stopLossPips : 0;
                double takeprofit = OperationTakeProfit > 0
                                                ? price + sign * Data.InstrProperties.Point * OperationTakeProfit
                                                : 0;

                string message = string.Format(symbol + " " + Data.PeriodMtStr + " " +
                                               Language.T("A modify order sent") + ": " +
                                               Language.T("Stop Loss") + " {0}, " +
                                               Language.T("Take Profit") + " {1}",
                                               stoploss.ToString(Data.Ff),
                                               takeprofit.ToString(Data.Ff));
                var jmsg = new JournalMessage(JournalIcons.Recalculate, DateTime.Now, message);
                AppendJournalMessage(jmsg);
                Log(message);

                string parameters = "TS1=" + OperationTrailingStop + ";BRE=" + OperationBreakEven;

                bool responseOk = bridge.OrderModify(ticket, price, stopLossPips, OperationTakeProfit,
                                                     parameters);

                if (responseOk)
                {
                    Data.AddBarStats(OperationType.Modify, lots, price);
                    Data.WrongStopLoss   = 0;
                    Data.WrongTakeProf   = 0;
                    Data.WrongStopsRetry = 0;
                }
                else
                {
                    ReportOperationError();
                    Data.WrongStopLoss = stopLossPips;
                    Data.WrongTakeProf = OperationTakeProfit;
                }
            }
            break;
            }
        }