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

            Button btn = (Button)sender;

            switch (btn.Name)
            {
            case "btnBuy":
            {
                MT4Bridge.OrderType type = MT4Bridge.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 = 0;
                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();
                }

                JournalMessage jmsg = new JournalMessage(JournalIcons.OrderBuy, DateTime.Now, string.Format(symbol + " " + Data.PeriodMTStr + " " +
                                                                                                            Language.T("An entry order sent") + ": " + Language.T("Buy") + " {0} " + (lots == 1 ? Language.T("lot") : Language.T("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)));
                AppendJournalMessage(jmsg);

                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.
                    if (Configs.PlaySounds)
                    {
                        Data.SoundError.Play();
                    }

                    if (bridge.LastError == 0)
                    {
                        jmsg = new JournalMessage(JournalIcons.Warning, DateTime.Now,
                                                  Language.T("Operation execution") + ": " + Language.T("MetaTrader is not responding!").Replace("MetaTrader", Data.TerminalName));
                    }
                    else
                    {
                        jmsg = new JournalMessage(JournalIcons.Error, DateTime.Now,
                                                  Language.T("MetaTrader failed to execute order! Returned").Replace("MetaTrader", Data.TerminalName) + ": " +
                                                  MT4Bridge.MT4_Errors.ErrorDescription(bridge.LastError));
                    }
                    AppendJournalMessage(jmsg);
                    Data.WrongStopLoss = stopLossPips;
                    Data.WrongTakeProf = OperationTakeProfit;
                }
            }
            break;

            case "btnSell":
            {
                MT4Bridge.OrderType type = MT4Bridge.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 = 0;
                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();
                }

                JournalMessage jmsg = new JournalMessage(JournalIcons.OrderSell, DateTime.Now, string.Format(symbol + " " + Data.PeriodMTStr + " " +
                                                                                                             Language.T("An entry order sent") + ": " + Language.T("Sell") + " {0} " + (lots == 1 ? Language.T("lot") : Language.T("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)));
                AppendJournalMessage(jmsg);

                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.
                    if (Configs.PlaySounds)
                    {
                        Data.SoundError.Play();
                    }

                    if (bridge.LastError == 0)
                    {
                        jmsg = new JournalMessage(JournalIcons.Warning, DateTime.Now,
                                                  Language.T("Operation execution") + ": " + Language.T("MetaTrader is not responding!").Replace("MetaTrader", Data.TerminalName));
                    }
                    else
                    {
                        jmsg = new JournalMessage(JournalIcons.Error, DateTime.Now,
                                                  Language.T("MetaTrader failed to execute order! Returned").Replace("MetaTrader", Data.TerminalName) + ": " +
                                                  MT4Bridge.MT4_Errors.ErrorDescription(bridge.LastError));
                    }
                    AppendJournalMessage(jmsg);
                    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();
                }

                JournalMessage jmsg = new JournalMessage(JournalIcons.OrderClose, DateTime.Now, string.Format(symbol + " " + Data.PeriodMTStr + " " +
                                                                                                              Language.T("An exit order sent") + ": " + Language.T("Close") + " {0} " + (lots == 1 ? Language.T("lot") : Language.T("lots")) + " " +
                                                                                                              Language.T("at") + " {1}", lots, price.ToString(Data.FF)));
                AppendJournalMessage(jmsg);

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

                if (responseOK)
                {
                    Data.AddBarStats(OperationType.Close, lots, price);
                }
                else
                {
                    if (Configs.PlaySounds)
                    {
                        Data.SoundError.Play();
                    }

                    if (bridge.LastError == 0)
                    {
                        jmsg = new JournalMessage(JournalIcons.Warning, DateTime.Now,
                                                  Language.T("Operation execution") + ": " + Language.T("MetaTrader is not responding!").Replace("MetaTrader", Data.TerminalName));
                    }
                    else
                    {
                        jmsg = new JournalMessage(JournalIcons.Error, DateTime.Now,
                                                  Language.T("MetaTrader failed to execute order! Returned").Replace("MetaTrader", Data.TerminalName) + ": " +
                                                  MT4Bridge.MT4_Errors.ErrorDescription(bridge.LastError));
                    }
                    AppendJournalMessage(jmsg);
                }
                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 = 0;
                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;

                JournalMessage jmsg = new JournalMessage(JournalIcons.Recalculate, DateTime.Now, 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)));
                AppendJournalMessage(jmsg);

                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
                {
                    if (Configs.PlaySounds)
                    {
                        Data.SoundError.Play();
                    }

                    if (bridge.LastError == 0)
                    {
                        jmsg = new JournalMessage(JournalIcons.Warning, DateTime.Now,
                                                  Language.T("Operation execution") + ": " + Language.T("MetaTrader is not responding!").Replace("MetaTrader", Data.TerminalName));
                    }
                    else
                    {
                        jmsg = new JournalMessage(JournalIcons.Error, DateTime.Now,
                                                  Language.T("MetaTrader failed to execute order! Returned").Replace("MetaTrader", Data.TerminalName) + ": " +
                                                  MT4Bridge.MT4_Errors.ErrorDescription(bridge.LastError));
                    }
                    AppendJournalMessage(jmsg);
                    Data.WrongStopLoss = stopLossPips;
                    Data.WrongTakeProf = OperationTakeProfit;
                }
            }
            break;

            default:
                break;
            }

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