8. 4. 2022

5 0

Définir le Stop Loss si l'ordre OpenPrice est supérieur ou inférieur à un prix limite

Fixe le Stop Loss à un niveau spécifié si l'ordre openPrice est supérieur (pour une position longue) ou inférieur (pour une position courte) à une limite de prix.

Si vous avez plusieurs positions ouvertes, vous éviterez de fixer un stop loss sur les positions perdantes. Cela pourrait entraîner la fermeture immédiate de la position

 

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="(SLI) Set Stop Loss if Possible", display="Set Stop Loss if Possible", returnType = ReturnTypes.Action)
@Help("Fixe le Stop Loss à un niveau spécifié si l'ordre openPrice est au-dessus (pour une position longue) ou en dessous (pour une position courte) d'une limite de prix. Si le Stop Loss existe déjà, il sera déplacé.")
@SortOrder(400) // 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 SetStopLossIfPossible 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("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(category="Prix Min/Max")
    @Help("Limite de prix de l'ordre, seul l'ordre long avec un prix d'ouverture plus élevé sera sélectionné ou seul l'ordre court avec un prix d'ouverture plus bas sera sélectionné")
    @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= 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() ;
                }
            }
        }
    }
}

 

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

Postes connexes