Impostare lo stop loss tranne uno
Quando si aprono diversi ordini a mercato, è possibile che si debbano chiudere tutti gli ordini tranne una posizione ("Magic Number Excluded").
Ad esempio, sono aperte 5 posizioni long, e vogliamo chiuderle tutte tranne una ("Magic Number Excluded").
Ecco il codice :
pacchetto SQ.Blocks.Order.Modify; importare SQ.Functions.OrderFunctions; importare SQ.Internal.ActionBlock; importare com.strategyquant.lib.*; importare com.strategyquant.datalib.*; importare com.strategyquant.tradinglib.*; // Modificato in Francia da Emmanuel Evrard per la comunità StrategyQuantX :) @BuildingBlock(name="(SLO) Set Stop Loss Except One", display="Imposta Stop Loss Except One", returnType = ReturnTypes.Action) @Help("Imposta lo Stop Loss a un livello specificato, tranne che per un ordine: 'Magic Number Excluded'. Se lo SL esiste già, verrà spostato.") @SortOrder(300) // In AlgoWizard, questa è una posizione di dropbox (400 o 500 o 600 ecc.) di questa funzione nel menu di "Aggiungi nuova condizione"; potrebbe essere necessario adattarla a seconda della funzione già installata nello stesso dropbox. @CategoriaOrdine(200) @IgnoreInBuilder @NotSupportedFor(motori="EL") public class SetStopLossExceptOne extends ActionBlock { @Parameter(defaultValue="Current", category="Order identification", showIfDefault=false, allowAny=true) public String Symbol; @Parameter(defaultValue="0", category="Identificazione ordine", showIfDefault=false) @Editor(type=Editors.Selection, values="Long=1,Short=-1,Any=0") public int Direzione; @Parameter(defaultValue="MagicNumber", category="Order identification", showIfDefault=false) @Help("Numero magico che può identificare l'ordine.") @Editor(type=Editors.SelectionVariablesWithAny) public int MagicNumber; @Parametro(defaultValue="", category="Identificazione ordine", showIfDefault=false) @Help("Il commento può essere utilizzato anche per identificare l'ordine. In caso di Commento, l'ordine corrisponde se i commenti dell'ordine contengono il testo qui specificato.") public String Comment; @Parametro(defaultValue="MagicNumber", category="Identificazione ordine", showIfDefault=false) @Help("Numero magico dell'ordine escluso, questo ordine non sarà preso in considerazione") @Editor(type=Editors.SelectionVariables) public int MagicNumberExcluded; @Parametro(categoria="Stop Loss") @Editor(type=Editors.Formula, formulaName="RangeLevel") public IFormula StopLoss; //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ @Override public void OnAction() throws TradingException { for(int i=0; i<Strategy.Trader.getOpenOrdersCount(false); i++) { ILiveOrder order = Strategy.Trader.getOpenOrder(i, false); double openPrice = order.isNettingMode() ? order.getLastOpenPrice() : order.getOpenPrice(); if(OrderFunctions.identify(order, Strategy, Symbol, Direction, MagicNumber, Comment)) { if (order.getMagicNumber() != MagicNumberExcluded) { double sl = StopLoss.evaluateFormula(Strategy, Symbol, openPrice, Direction); order.setSL(sl).Send(); } } } } }