private void _loop(Extensions.Monitor monitor, Extensions.MonenyManagement moneymanagement, Extensions.Monitor.BreakEvenData breakevendata, Extensions.Monitor.TrailingData trailingdata) { // --> Aggiorno le informazioni necessarie per gestire la strategia //monitor.Update(_checkClosePositions(monitor), breakevendata, trailingdata, null); // --> Condizione condivisa, filtri generali, segnano il perimetro di azione limitando l'ingresso bool sharedCondition = (!monitor.OpenedInThisBar && !monitor.InGAP(GAP) && !monitor.InPause(Server.Time) && monitor.Symbol.RealSpread() <= SpreadToTrigger && monitor.Positions.Length < MaxTrades); // --> Controllo la presenza di trigger d'ingresso tenendo conto i filtri bool triggerBuy = _calculateLongTrigger(_calculateLongFilter(sharedCondition)); bool triggerSell = _calculateShortTrigger(_calculateShortFilter(sharedCondition)); // --> Se ho entrambi i trigger qualcosa non va, lo segnalo nei log e fermo la routin if (triggerBuy && triggerSell) { Print("{0} {1} ERROR : trigger buy and sell !", monitor.Label, monitor.Symbol.Name); return; } // --> Calcolo la size in base al money management stabilito double volumeInUnits = Monitor1.Symbol.QuantityToVolumeInUnits(moneymanagement.GetLotSize()); // --> Se ho il segnale d'ingresso considerando i filtri allora procedo con l'ordine a mercato if (triggerBuy) { ExecuteMarketRangeOrder(TradeType.Buy, monitor.Symbol.Name, volumeInUnits, SLIPPAGE, monitor.Symbol.Ask, monitor.Label, SL, TP); } else if (triggerSell) { ExecuteMarketRangeOrder(TradeType.Sell, monitor.Symbol.Name, volumeInUnits, SLIPPAGE, monitor.Symbol.Bid, monitor.Label, SL, TP); } }
/// <summary> /// Evento generato quando viene avviato il cBot /// </summary> protected override void OnStart() { // --> Stampo nei log la versione corrente Print("{0} : {1}", NAME, VERSION); // --> Messaggio di avvertimento nel caso incui si eseguisse senza modifiche logiche /* * if (Chart.CanDraw(RunningMode)) * Chart.DrawStaticText(NAME, "ATTENTION : CBOT BASE, EDIT THIS TEMPLATE ONLY", VerticalAlignment.Top, HorizontalAlignment.Left, Extensions.ColorFromEnum(TextColor)); */ // --> Determino il range di pausa Pause1 = new Extensions.Monitor.PauseTimes { Over = PauseOver, Under = PauseUnder }; // --> Inizializzo il Monitor Monitor1 = new Extensions.Monitor(MyLabel, Symbol, Bars, Positions, Pause1); // --> Inizializzo il MoneyManagement MonenyManagement1 = new Extensions.MonenyManagement(Account, MyCapital, MyRisk, FixedLots, SL > 0 ? SL : FakeSL, Symbol); // --> Inizializzo i dati per la gestione del breakeven BreakEvenData1 = new Extensions.Monitor.BreakEvenData { Activation = BreakEvenActivation, Distance = BreakEvenDistance }; // --> Inizializzo i dati per la gestione del Trailing TrailingData1 = new Extensions.Monitor.TrailingData { Activation = TrailingActivation, Distance = TrailingDistance }; // --> Osservo le aperture per operazioni comuni Positions.Opened += _onOpenPositions; // --> Fissiamo la logica degli indicatori EMAfast = Indicators.ExponentialMovingAverage(Bars.ClosePrices, EmaFastPeriod); EMAslow = Indicators.ExponentialMovingAverage(Bars.ClosePrices, EmaSlowPeriod); SAR = Indicators.ParabolicSAR(0.02, 0.2); // --> Effettuo un test di apertura per verificare il funzionamento del sistema if (OpenOnStart != MyTradeType.Disabled) { _test((OpenOnStart == MyTradeType.Buy) ? TradeType.Buy : TradeType.Sell, MonenyManagement1); } }
private void _test(TradeType trigger, Extensions.MonenyManagement moneymanagement) { // --> Calcolo la size in base al money management stabilito double volumeInUnits = moneymanagement.Symbol.QuantityToVolumeInUnits(moneymanagement.GetLotSize()); switch (trigger) { case TradeType.Buy: ExecuteMarketRangeOrder(TradeType.Buy, moneymanagement.Symbol.Name, volumeInUnits, SLIPPAGE, moneymanagement.Symbol.Ask, "TEST", SL, TP); break; case TradeType.Sell: ExecuteMarketRangeOrder(TradeType.Sell, moneymanagement.Symbol.Name, volumeInUnits, SLIPPAGE, moneymanagement.Symbol.Bid, "TEST", SL, TP); break; } }