/// <summary> /// Shows current position on the status bar. /// </summary> void ShowCurrentPosition(bool showInJournal) { if (!Data.IsConnected) { SetPositionInfoText(null, String.Empty); return; } string format = Data.FF; string text = Language.T("Square"); JournalIcons icon = JournalIcons.PosSquare; Image img = Properties.Resources.pos_square; if (Data.PositionTicket > 0) { img = (Data.PositionType == 0 ? Properties.Resources.pos_buy : Properties.Resources.pos_sell); icon = (Data.PositionType == 0 ? JournalIcons.PosBuy : JournalIcons.PosSell); text = string.Format((Data.PositionType == 0 ? Language.T("Long") : Language.T("Short")) + " {0} " + (Data.PositionLots == 1 ? Language.T("lot") : Language.T("lots")) + " " + Language.T("at") + " {1}, " + Language.T("Stop Loss") + " {2}, " + Language.T("Take Profit") + " {3}, " + Language.T("Profit") + " {4} " + Data.AccountCurrency, Data.PositionLots, Data.PositionOpenPrice.ToString(format), Data.PositionStopLoss.ToString(format), Data.PositionTakeProfit.ToString(format), Data.PositionProfit.ToString("F2")); } SetPositionInfoText(img, text); if (showInJournal) { JournalMessage jmsg = new JournalMessage(icon, DateTime.Now, string.Format(Data.Symbol + " " + Data.PeriodMTStr + " " + text)); AppendJournalMessage(jmsg); } return; }
public JournalMessage(JournalIcons icon, DateTime time, string message) { Icon = icon; Time = time; Message = message; }
/// <summary> /// Copies data to Data and calculates. /// </summary> void SetDataAndCalculate(string symbol, MT4Bridge.PeriodType period, DateTime time, bool isPriceChange, bool isUpdateData) { lock (lockerDataFeed) { bool isUpdateChart = isUpdateData; MT4Bridge.Bars bars = bridge.GetBars(symbol, period); if (bars == null && JournalShowSystemMessages) { isSetRootDataError = true; Data.SoundError.Play(); JournalMessage jmsg = new JournalMessage(JournalIcons.Error, DateTime.Now, symbol + " " + period.ToString() + " " + Language.T("Cannot receive bars!")); AppendJournalMessage(jmsg); return; } if (bars.Count < MaxBarsCount((int)period) && JournalShowSystemMessages) { isSetRootDataError = true; Data.SoundError.Play(); JournalMessage jmsg = new JournalMessage(JournalIcons.Error, DateTime.Now, symbol + " " + period.ToString() + " " + Language.T("Cannot receive enough bars!")); AppendJournalMessage(jmsg); return; } if (isSetRootDataError && JournalShowSystemMessages) { isSetRootDataError = false; JournalMessage jmsg = new JournalMessage(JournalIcons.Information, DateTime.Now, symbol + " " + period.ToString() + " " + Language.T("Enough bars received!")); AppendJournalMessage(jmsg); } int countBars = bars.Count; if (countBars < 400) { return; } if (Data.Bars != countBars || Data.Time[countBars - 1] != bars.Time[countBars - 1] || Data.Volume[countBars - 1] != bars.Volume[countBars - 1] || Data.Close[countBars - 1] != bars.Close[countBars - 1]) { if (Data.Bars == countBars && Data.Time[countBars - 1] == bars.Time[countBars - 1] && Data.Time[countBars - 10] == bars.Time[countBars - 10]) { // Update the last bar only. Data.Open [countBars - 1] = bars.Open [countBars - 1]; Data.High [countBars - 1] = bars.High [countBars - 1]; Data.Low [countBars - 1] = bars.Low [countBars - 1]; Data.Close [countBars - 1] = bars.Close [countBars - 1]; Data.Volume[countBars - 1] = bars.Volume[countBars - 1]; } else { // Update all the bars. Data.Bars = countBars; Data.Time = new DateTime[countBars]; Data.Open = new double[countBars]; Data.High = new double[countBars]; Data.Low = new double[countBars]; Data.Close = new double[countBars]; Data.Volume = new int[countBars]; bars.Time.CopyTo(Data.Time, 0); bars.Open.CopyTo(Data.Open, 0); bars.High.CopyTo(Data.High, 0); bars.Low.CopyTo(Data.Low, 0); bars.Close.CopyTo(Data.Close, 0); bars.Volume.CopyTo(Data.Volume, 0); } // Calculate the strategy indicators. CalculateStrategy(true); isUpdateChart = true; } bool isBarChanged = IsBarChanged(Data.Time[Data.Bars - 1]); if (isTrading) { TickType tickType = GetTickType((DataPeriods)(int)period, Data.Time[Data.Bars - 1], time, Data.Volume[Data.Bars - 1]); if (tickType == TickType.Close || isPriceChange || isBarChanged) { if (JournalShowSystemMessages && tickType != TickType.Regular) { JournalIcons icon = JournalIcons.Warning; string text = string.Empty; if (tickType == TickType.Open) { icon = JournalIcons.BarOpen; text = Language.T("A Bar Open event!"); } else if (tickType == TickType.Close) { icon = JournalIcons.BarClose; text = Language.T("A Bar Close event!"); } else if (tickType == TickType.AfterClose) { icon = JournalIcons.Warning; text = Language.T("A new tick arrived after a Bar Close event!"); } JournalMessage jmsg = new JournalMessage(icon, DateTime.Now, symbol + " " + Data.PeriodMTStr + " " + time.ToString("HH:mm:ss") + " " + text); AppendJournalMessage(jmsg); } if (isBarChanged && tickType == TickType.Regular) { if (JournalShowSystemMessages) { JournalMessage jmsg = new JournalMessage(JournalIcons.Warning, DateTime.Now, symbol + " " + Data.PeriodMTStr + " " + time.ToString("HH:mm:ss") + " A Bar Changed event!"); AppendJournalMessage(jmsg); } tickType = TickType.Open; } if (tickType == TickType.Open && barOpenTimeForLastCloseEvent == Data.Time[Data.Bars - 3]) { if (JournalShowSystemMessages) { JournalMessage jmsg = new JournalMessage(JournalIcons.Warning, DateTime.Now, symbol + " " + Data.PeriodMTStr + " " + time.ToString("HH:mm:ss") + " A secondary Bar Close event!"); AppendJournalMessage(jmsg); } tickType = TickType.OpenClose; } CalculateTrade(tickType); isUpdateChart = true; if (tickType == TickType.Close || tickType == TickType.OpenClose) { barOpenTimeForLastCloseEvent = Data.Time[Data.Bars - 1]; } } } if (isUpdateChart) { UpdateChart(); } } return; }
/// <summary> /// Gets image for the icon type. /// </summary> private Image GetImage(JournalIcons icon) { Image image; switch (icon) { case JournalIcons.Information: image = Resources.journal_information; break; case JournalIcons.System: image = Resources.journal_system; break; case JournalIcons.Warning: image = Resources.journal_warning; break; case JournalIcons.Error: image = Resources.journal_error; break; case JournalIcons.Ok: image = Resources.journal_ok; break; case JournalIcons.Currency: image = Resources.currency; break; case JournalIcons.Blocked: image = Resources.journal_blocked; break; case JournalIcons.Globe: image = Resources.globe; break; case JournalIcons.StartTrading: image = Resources.journal_start_trading; break; case JournalIcons.StopTrading: image = Resources.journal_stop_trading; break; case JournalIcons.OrderBuy: image = Resources.ord_buy; break; case JournalIcons.OrderSell: image = Resources.ord_sell; break; case JournalIcons.OrderClose: image = Resources.ord_close; break; case JournalIcons.Recalculate: image = Resources.recalculate; break; case JournalIcons.BarOpen: image = Resources.journal_bar_open; break; case JournalIcons.BarClose: image = Resources.journal_bar_close; break; case JournalIcons.PosBuy: image = Resources.pos_buy; break; case JournalIcons.PosSell: image = Resources.pos_sell; break; case JournalIcons.PosSquare: image = Resources.pos_square; break; default: image = Resources.journal_error; break; } return(image); }
public JournalMessage(JournalIcons icon, DateTime time, string message) { this.icon = icon; this.time = time; this.message = message; }
/// <summary> /// Gets image for the icon type. /// </summary> /// <param name="icon"></param> /// <returns></returns> public Image GetImage(JournalIcons icon) { Image image; switch(icon) { case JournalIcons.Information: image = Properties.Resources.journal_information; break; case JournalIcons.System: image = Properties.Resources.journal_system; break; case JournalIcons.Warning: image = Properties.Resources.journal_warning; break; case JournalIcons.Error: image = Properties.Resources.journal_error; break; case JournalIcons.OK: image = Properties.Resources.journal_ok; break; case JournalIcons.Currency: image = Properties.Resources.currency; break; case JournalIcons.Blocked: image = Properties.Resources.journal_blocked; break; case JournalIcons.Globe: image = Properties.Resources.globe; break; case JournalIcons.StartTrading: image = Properties.Resources.journal_start_trading; break; case JournalIcons.StopTrading: image = Properties.Resources.journal_stop_trading; break; case JournalIcons.OrderBuy: image = Properties.Resources.ord_buy; break; case JournalIcons.OrderSell: image = Properties.Resources.ord_sell; break; case JournalIcons.OrderClose: image = Properties.Resources.ord_close; break; case JournalIcons.Recalculate: image = Properties.Resources.recalculate; break; case JournalIcons.BarOpen: image = Properties.Resources.journal_bar_open; break; case JournalIcons.BarClose: image = Properties.Resources.journal_bar_close; break; case JournalIcons.PosBuy: image = Properties.Resources.pos_buy; break; case JournalIcons.PosSell: image = Properties.Resources.pos_sell; break; case JournalIcons.PosSquare: image = Properties.Resources.pos_square; break; default: image = Properties.Resources.journal_error; break; } return image; }