8. 4. 2022

5 0

Fixer le Stop Loss à l'exception d'un seul

Lorsque nous ouvrons plusieurs ordres de marché, il se peut que nous devions clôturer tous les ordres à l'exception d'une position ("Nombre magique exclu").

Par exemple, 5 positions longues sont ouvertes, nous voulons toutes les clôturer sauf une position longue ("Nombre magique exclu").

Voici le 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.* ;

// Modifié en France par Emmanuel Evrard pour la communauté StrategyQuantX :)
@BuildingBlock(name="(SLO) Set Stop Loss Except One", display="Set Stop Loss Except One", returnType = ReturnTypes.Action)
@Help("Fixe le Stop Loss à un niveau spécifié sauf pour un ordre : 'Magic Number Excluded' . Si le SL existe déjà, il sera déplacé.")
@SortOrder(300) // Dans AlgoWizard, il s'agit d'une position de boîte de dépôt (400 ou 500 ou 600 etc.) de cette fonction dans le menu "Ajouter une nouvelle condition", vous devrez peut-être l'ajuster en fonction de la fonction déjà installée sur la même boîte de dépôt.
@CategoryOrder(200)
@IgnoreInBuilder
@NotSupportedFor(engines="EL")
public class SetStopLossExceptOne 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,Any=0")
    public int Direction ;

    @Parameter(defaultValue="MagicNumber", category="Order identification", showIfDefault=false)
    @Help("Numéro magique permettant d'identifier la commande")
    @Editor(type=Editors.SelectionVariablesWithAny)
    public int MagicNumber ;

    @Parameter(defaultValue="", category="Identification de la commande", showIfDefault=false)
    @Help("Le commentaire peut également être utilisé pour identifier la commande. Dans le cas d'un commentaire, la commande correspond si le commentaire de la commande contient le texte spécifié ici.")
    public String Comment ;

    @Parameter(defaultValue="MagicNumber", category="Order identification", showIfDefault=false)
    @Help("Numéro magique de la commande exclue, cette commande ne sera pas prise en compte")
    @Editor(type=Editors.SelectionVariables)
    public int MagicNumberExcluded ;
    
    @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)
                {
                    double sl = StopLoss.evaluateFormula(Strategy, Symbol, openPrice, Direction) ;
                    order.setSL(sl).Send() ;
                }
            }
        }
    }
}

 


 

S'abonner
Notification pour
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires

Postes connexes