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