Stop-Loss setzen, wenn Kurs Limit überschreitet (außer einer)
StrategyQuantPlugins
Setzt automatisch einen Stop-Loss für offene Orders, wenn deren Eröffnungskurs ein bestimmtes Limit überschreitet, mit Ausnahme einer festgelegten Order. Ideal für die Verwaltung mehrerer Positionen, ohne Verlustpositionen sofort zu schließen.
Setzt den Stop-Loss auf ein festgelegtes Niveau, wenn die openPrice-Order über (bei Long-Position) oder unter (bei Short-Position) einem Kurslimit liegt.
Wenn Sie mehrere Positionen geöffnet haben, wird vermieden, einen Stop-Loss bei Verlustpositionen zu setzen. Dies könnte die Position sofort schließen
As we open several market orders, we may have to close all orders except one position ("Magic Number Excluded")
Here is the code :
package SQ.Blocks.Order.Modify;
import SQ.Functions.OrderFunctions;
import SQ.Internal.ActionBlock;
import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;
// Modified in France by Emmanuel Evrard for the StrategyQuantX Community :)
@BuildingBlock(name="(SIO) Set Stop Loss if Possible Except One", display="Set Stop Loss if Possible Except One", returnType = ReturnTypes.Action)
@Help("Sets Stop Loss to a specified level if the openPrice order is above (for long position) or below (for short position) a price Limit except for one order : 'Magic Number Excluded'. If SL already exists it will be moved.")
@SortOrder(500) // In AlgoWizard, this is a dropbox position (400 or 500 or 600 etc.) of this function in the menu of "Add New Condition", you may have to adjust it depending on the function already installed on the same dropbox.
@CategoryOrder(200)
@IgnoreInBuilder
@NotSupportedFor(engines="EL")
public class SetStopLossIfPossibleExceptOne extends ActionBlock
{
@Parameter(defaultValue="Current", category="Order identification", showIfDefault=false, allowAny=true)
public String Symbol;
@Parameter(defaultValue="0", category="Order identification", showIfDefault=false)
@Editor(type=Editors.Selection, values="Long=1,Short=-1")
public int Direction;
@Parameter(defaultValue="MagicNumber", category="Order identification", showIfDefault=false)
@Help("Magic number that can identify the order.")
@Editor(type=Editors.SelectionVariablesWithAny)
public int MagicNumber;
@Parameter(defaultValue="", category="Order identification", showIfDefault=false)
@Help("Comment can be also used to identify the order. In case of Comment, order matches if the order comments contains the text specified here.")
public String Comment;
@Parameter(defaultValue="MagicNumber", category="Order identification", showIfDefault=false)
@Help("MagicNumber of the Excluded order, this order will not be taken into account")
@Editor(type=Editors.SelectionVariables)
public int MagicNumberExcluded;
@Parameter(category="Price Limit")
@Help("Price limit of order, only Long Order with higher Open Price will be selected or only Short Order with lower Open price will be selected")
@Editor(type=Editors.Formula, formulaName="RangeLevel")
public IFormula PriceLimit;
@Parameter(category="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)
{
if (Direction != 1 && openPrice >= PriceLimit.evaluateFormula(Strategy, Symbol, openPrice, Direction))
{
double sl = StopLoss.evaluateFormula(Strategy, Symbol, openPrice, Direction);
order.setSL(sl).Send();
}
if (Direction != -1 && openPrice <= PriceLimit.evaluateFormula(Strategy, Symbol, openPrice, Direction))
{
double sl = StopLoss.evaluateFormula(Strategy, Symbol, openPrice, Direction);
order.setSL(sl).Send();
}
}
}
}
}
}