Михаил Сухов Rebelion P.S. Работал через QuikTrader (если эта инфа может что дополнительное дать).
Нам пишут, что мол в новых версий что-то не работает. А у вас все наоборот. Не просто работает, да еще и своей жизнь зажило.
Скорее всего ошибка не в коннекторе.
Михаил, я, собственно, не претендую на истину в последней инстанции и не пытаюсь доказать, что всё плохо. Наоборот, всё кул. Не будь S#, то у мну не было бы нормальной торговой платформы для бота. Просто хотел акцентировать внимание, что код, стабильно работающий в 4.1.19.1 пару раз закосячил в 4.2.1.3. Вполне вероятно, что у меня руки из жопы растут. Т.к. пока у мну нет подробного описания функционала кроме того, что идёт в стандартной комплектации, то работаю методом проб и ошибок, если честно. После НГ планирую пойти на курсы по S#, да. Пока что просто денег нет.
Просто хотел акцентировать внимание на то, что была проблема после перехода на новую версию. И что новичкам типа меня не стоит со стабильной версии переходить на более новую пока что, ибо чревато... :-(
Если ткнёте мордой в ошибки моего кода, приводящего к таким последствиям, - я и проставиться могу, в случае чего.
Code
if (isNewEntranceSignalUp && Position <= 0 || isNewEntranceSignalDown && Position >= 0 || isNeedtoBeClose)
{
CancelActiveOrders();
SuspendRules();
if (Position != 0)
{
var orderDirectionToClose = Position < 0 ? OrderDirections.Buy : OrderDirections.Sell;
var orderPriceToClose = Position < 0 ? Security.MaxPrice : Security.MinPrice;
var oldPositionToClose = this.CreateOrder(orderDirectionToClose, orderPriceToClose, Math.Abs(Position));
oldPositionToClose.Comment = "Main";
RegisterOrder(oldPositionToClose);
}
var newOrderDirection = isNewEntranceSignalUp == true ? OrderDirections.Buy : OrderDirections.Sell;
var newOrderPrice = isNewEntranceSignalUp == true ? Security.MaxPrice : Security.MinPrice;
var newPositionToOpen = this.CreateOrder(newOrderDirection, newOrderPrice, 1);
newPositionToOpen.Comment = "Main";
newPositionToOpen.WhenMatched().Do(() => newPositionToOpen.WhenNewTrades().Do(OnNewOrderTrades).Apply(this)).Apply(this);
RegisterOrder(newPositionToOpen);
ResumeRules();
}
Code
private void OnNewOrderTrades(IEnumerable<MyTrade> myTrades)
{
var protectiveStrategies = myTrades.Select(t =>
{
if (t.Order.Comment.CompareTo("Main") == 0)
{
var newStrategyFromTrade = new StopLossStrategy(t, new Unit(TraderHelper.ShrinkPrice(t.Trade.Security, stopLossParameter * (decimal)currentParams.candleSize))) { IsTrailing = true, UseQuoting = false, PriceOffset = (decimal)currentParams.candleSize * pricePieces, DisposeOnStop = true, ProtectiveVolume = t.Trade.Volume, MaxRegisterFailCount = 5, };
externalogManager.Sources.Add(newStrategyFromTrade);
return newStrategyFromTrade;
}
else
return null;
});
foreach (var s in protectiveStrategies)
{
if (s != null)
ChildStrategies.Add(s);
}
base.OnNewMyTrades(myTrades);
}
Собственно,
Code
isNewEntranceSignalUp, isNewEntranceSignalDown, isNeedtoBeClose
- логические переменные, определяющие вход в позицию.
В основном, всё остальное стандартно - у бота ноги растут, как можно понять, из SampleSMA.