protected virtual void UpdateItemInfo(TriplePairArbitrageInfo info)
        {
            double             profit    = info.Profit;
            OperationDirection direction = info.Direction;

            info.Calculate();
            if (info.Profit != profit || direction != info.Direction)
            {
                StrategyData.Add(new TriplePairInfoHistoryItem(info));
                if (EnableNotifications)
                {
                    SendNotification("dir = " + info.Direction + " profit = " + info.Profit.ToString("0.########") + " disb = " + info.Disbalance.ToString("0.########"));
                }
            }
            if (!DemoMode && !ShouldProcessArbitrage && info.IsSelected)
            {
                ShouldProcessArbitrage = true;
                if (!info.MakeOperation())
                {
                    info.IsErrorState = true;
                    Log(LogType.Error, GetLogDescription(info, "arbitrage failed. resolve conflicts manually."), 0, 0, StrategyOperation.MarketBuy);
                }
                if (info.OperationExecuted)
                {
                    info.OperationExecuted = false;
                    Log(LogType.Error, GetLogDescription(info, "operation executed"), 0, 0, StrategyOperation.MarketBuy);
                }
                ShouldProcessArbitrage = false;
            }
            info.IsUpdating = false;
        }
        protected override void OnTickCore()
        {
            if (!Enabled)
            {
                return;
            }
            for (int i = 0; i < Items.Count; i++)
            {
                if (ShouldProcessArbitrage)
                {
                    return;
                }

                TriplePairArbitrageInfo current = Items[i];
                current.DemoMode = DemoMode;

                if (current.IsUpdating)
                {
                    continue;
                }
                if (!current.ObtainingData)
                {
                    TickerCollectionUpdateHelper.Default.Update(current, this);
                    continue;
                }
            }
        }
 async Task UpdateArbitrageInfoTask(TriplePairArbitrageInfo info)
 {
     Task task = Task.Factory.StartNew(() => {
         TickerCollectionUpdateHelper.Default.Update(info, this);
     });
     await task;
 }
        private void bbShowHistory_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            TriplePairArbitrageInfo    info = (TriplePairArbitrageInfo)this.gridView1.GetFocusedRow();
            StaticArbitrageHistoryForm form = new StaticArbitrageHistoryForm();

            form.Info      = info;
            form.MdiParent = MdiParent;
            form.Show();
        }
        void OnUpdateTickers()
        {
            timer.Start();
            long lastGUIUpdateTime = 0;

            while (true)
            {
                for (int i = 0; i < Items.Count; i++)
                {
                    if (ShouldProcessArbitrage)
                    {
                        Thread.Sleep(10);
                        continue;
                    }
                    if (timer.ElapsedMilliseconds - lastGUIUpdateTime > 2000)
                    {
                        lastGUIUpdateTime = timer.ElapsedMilliseconds;
                        if (IsHandleCreated)
                        {
                            BeginInvoke(new Action(RefreshGUI));
                        }
                    }
                    if (this.bbMonitorSelected.Checked && !Items[i].IsSelected)
                    {
                        continue;
                    }
                    TriplePairArbitrageInfo current = Items[i];
                    if (current.IsUpdating)
                    {
                        continue;
                    }
                    if (!current.ObtainingData)
                    {
                        TickerCollectionUpdateHelper.Default.Update(current, this);
                        continue;
                    }
                    int currentUpdateTimeMS = (int)(timer.ElapsedMilliseconds - current.StartUpdateMs);
                    if (currentUpdateTimeMS > current.NextOverdueMs)
                    {
                        current.UpdateTimeMs   = currentUpdateTimeMS;
                        current.IsActual       = false;
                        current.NextOverdueMs += 3000;
                        if (IsHandleCreated)
                        {
                            BeginInvoke(new Action <TriplePairArbitrageInfo>(RefreshGridRow), current);
                        }
                    }
                    continue;
                }
            }
        }
 void IStaticArbitrageUpdateListener.OnUpdateInfo(TriplePairArbitrageInfo info, bool useInvokeForUI)
 {
     info.Calculate();
     if (!ShouldProcessArbitrage && info.IsSelected)
     {
         ShouldProcessArbitrage = true;
         if (!info.MakeOperation())
         {
             info.IsErrorState = true;
             XtraMessageBox.Show("Static Arbitrage Operation Failed. Resolve conflicts manually. " + info.Exchange + "-" + info.AltCoin + "-" + info.BaseCoin);
         }
         if (info.OperationExecuted)
         {
             info.OperationExecuted = false;
             BeginInvoke(new MethodInvoker(UpdateBalanceItems));
         }
         ShouldProcessArbitrage = false;
     }
     this.BeginInvoke(new Action <TriplePairArbitrageInfo>(RefreshGridRow), info);
     info.IsUpdating = false;
 }
 protected string GetLogDescription(TriplePairArbitrageInfo info, string text)
 {
     return(text + ". " + info.Exchange + "-" + info.AltCoin + "-" + info.BaseCoin);
 }
 void IStaticArbitrageUpdateListener.OnUpdateInfo(TriplePairArbitrageInfo info, bool useInvokeForUI)
 {
     UpdateItemInfo(info);
 }
 public void RefreshGridRow(TriplePairArbitrageInfo info)
 {
     this.gridView1.RefreshRow(this.gridView1.GetRowHandle(Items.IndexOf(info)));
 }