/// <summary> /// Controlla ed effettua la modifica in break-even se le condizioni le permettono /// </summary> private void _checkBreakEven(Position position, BreakEvenData breakevendata) { if (breakevendata == null || breakevendata.Activation == 0) { return; } switch (position.TradeType) { case TradeType.Buy: if ((Symbol.Bid >= (position.EntryPrice + Symbol.PipsToDigits(breakevendata.Activation))) && (position.StopLoss == null || position.StopLoss < position.EntryPrice)) { if (breakevendata.Distance == 0) { position.ModifyStopLossPrice(position.EntryPrice); } else { position.ModifyStopLossPips(breakevendata.Distance * -1); } } break; case TradeType.Sell: if ((Symbol.Ask <= (position.EntryPrice - Symbol.PipsToDigits(breakevendata.Activation))) && (position.StopLoss == null || position.StopLoss > position.EntryPrice)) { if (breakevendata.Distance == 0) { position.ModifyStopLossPrice(position.EntryPrice); } else { position.ModifyStopLossPips(breakevendata.Distance * -1); } } break; } }
/// <summary> /// Filtra e rende disponibili le informazioni per la strategia monitorata. Eventualmente Chiude e gestisce le operazioni /// </summary> public Information Update(bool closeall, BreakEvenData breakevendata, TrailingData trailingdata, TradeType?filtertype = null) { // --> Raccolgo le informazioni che mi servono per avere il polso della strategia Positions = _allPositions.FindAll(Label, Symbol.Name); // --> Resetto le informazioni Info = new Information(); double tmpVolume = 0; foreach (Position position in Positions) { // --> Per prima cosa devo controllare se chiudere la posizione if (closeall && (filtertype == null || position.TradeType == filtertype)) { position.Close(); continue; } // --> Poi tocca al break even _checkBreakEven(position, breakevendata); // --> Poi tocca al trailing _checkTrailing(position, trailingdata); Info.TotalNetProfit += position.NetProfit; tmpVolume += position.VolumeInUnits; switch (position.TradeType) { case TradeType.Buy: Info.BuyPositions++; break; case TradeType.Sell: Info.SellPositions++; break; } if (Info.FirstPosition == null || position.EntryTime < Info.FirstPosition.EntryTime) { Info.FirstPosition = position; } if (Info.LastPosition == null || position.EntryTime > Info.LastPosition.EntryTime) { Info.LastPosition = position; } if (Info.MinVolumeInUnits == 0 || position.VolumeInUnits < Info.MinVolumeInUnits) { Info.MinVolumeInUnits = position.VolumeInUnits; } if (Info.MaxVolumeInUnits == 0 || position.VolumeInUnits > Info.MaxVolumeInUnits) { Info.MaxVolumeInUnits = position.VolumeInUnits; } } // --> Restituisce una Exception Overflow di una operazione aritmetica, da approfondire // Info.MidVolumeInUnits = Symbol.NormalizeVolumeInUnits(tmpVolume / Positions.Length,RoundingMode.ToNearest); Info.MidVolumeInUnits = Math.Round(tmpVolume / Positions.Length, 0); return(Info); }