private MovArgRobotTag GetTrendSide(string symbol) { // получить открытые ордера List <MarketOrder> openedOrders; GetMarketOrders(out openedOrders); openedOrders = openedOrders ?? new List <MarketOrder>(); openedOrders = openedOrders.Where(o => o.Symbol == symbol && o.ExpertComment == ExpertComment).ToList(); if (openedOrders.Count > 0 && !enterWhileOpened) { return(new MovArgRobotTag(0, 0)); } // получить еще и закрытые ордера - нужно 5 последних List <MarketOrder> closedOrders; robotContext.GetOrdersByFilter(robotContext.AccountInfo.ID, true, new OrderFilterAndSortOrder { filterMagic = Magic, filterTicker = symbol, takeCount = Math.Max(dealsToChangeTrend, MartingaleChainLength), filterExpertComment = ExpertComment, sortByTimeEnter = true, sortAscending = false }, out closedOrders); openedOrders.AddRange(closedOrders ?? new List <MarketOrder>()); if (openedOrders.Count == 0) { return(new MovArgRobotTag()); } openedOrders = openedOrders.OrderByDescending(o => o.TimeEnter).ToList(); var sideLength = 1; var lastTag = MovArgRobotTag.ParseComment(openedOrders[0].Comment); for (var i = 1; i < openedOrders.Count; i++) { var tag = MovArgRobotTag.ParseComment(openedOrders[i].Comment); if (tag.Trend != lastTag.Trend) { break; } sideLength++; } var newTrend = sideLength < dealsToChangeTrend ? lastTag.Trend : -lastTag.Trend; var martinChainNum = (openedOrders[0].IsClosed && openedOrders[0].ResultDepo > 0) ? 1 : lastTag.MartinChainNum + 1; return(new MovArgRobotTag(newTrend, martinChainNum)); }
private void OpenOrder(int dealSign, string symbol, CandleDataBidAsk lastCandle, MovArgRobotTag orderTag) { var volumeMultiplier = (100 + (MartingalePercent * (orderTag.MartinChainNum - 1))) / 100M; var volume = CalculateVolume(symbol, base.Leverage == null ? null : base.Leverage * volumeMultiplier, FixedVolume == null ? null : (int?) (FixedVolume.Value * volumeMultiplier)); if (volume == 0) { events.Add(string.Format("{0} {1} отменена - объем равен 0", dealSign > 0 ? "покупка" : "продажа", symbol)); return; } var enterPrice = dealSign > 0 ? lastCandle.closeAsk : lastCandle.close; var point = pointCost[symbol]; var stopLoss = enterPrice - dealSign * (float)point * StopLossPoints; var takeProfit = enterPrice + dealSign * (float)point * TakeProfitPoints; var order = new MarketOrder { AccountID = robotContext.AccountInfo.ID, Magic = Magic, Symbol = symbol, Volume = volume, Side = dealSign, StopLoss = stopLoss, TakeProfit = takeProfit, ExpertComment = ExpertComment, Comment = orderTag.MakeComment() }; var status = NewOrder(order, OrderType.Market, 0, 0); if (status != RequestStatus.OK) events.Add(string.Format("Ошибка добавления ордера {0} {1}: {2}", dealSign > 0 ? "BUY" : "SELL", symbol, status)); }
private void OpenOrder(int dealSign, string symbol, CandleDataBidAsk lastCandle, MovArgRobotTag orderTag) { var volumeMultiplier = (100 + (MartingalePercent * (orderTag.MartinChainNum - 1))) / 100M; var volume = CalculateVolume(symbol, base.Leverage == null ? null : base.Leverage * volumeMultiplier, FixedVolume == null ? null : (int?)(FixedVolume.Value * volumeMultiplier)); if (volume == 0) { events.Add(string.Format("{0} {1} отменена - объем равен 0", dealSign > 0 ? "покупка" : "продажа", symbol)); return; } var enterPrice = dealSign > 0 ? lastCandle.closeAsk : lastCandle.close; var point = pointCost[symbol]; var stopLoss = enterPrice - dealSign * (float)point * StopLossPoints; var takeProfit = enterPrice + dealSign * (float)point * TakeProfitPoints; var order = new MarketOrder { AccountID = robotContext.AccountInfo.ID, Magic = Magic, Symbol = symbol, Volume = volume, Side = dealSign, StopLoss = stopLoss, TakeProfit = takeProfit, ExpertComment = ExpertComment, Comment = orderTag.MakeComment() }; var status = NewOrder(order, OrderType.Market, 0, 0); if (status != RequestStatus.OK) { events.Add(string.Format("Ошибка добавления ордера {0} {1}: {2}", dealSign > 0 ? "BUY" : "SELL", symbol, status)); } }