Problème avec le code EA 2 (gestionnaire SL) - page 4

 
diostar:

Il y a des chances que cela puisse offrir une certaine assistance, j'espère.

Au départ, mes symboles étaient à 4 chiffres, tous les stops suiveurs, les ordres d'arrêt/limite modifier, tout s'est passé comme prévu. Puis mon courtier a décidé de passer en fractionnel. J'ai fait les changements nécessaires et j'ai vu mes pips aller comme -3.4, -4.5, 0.1, 4.6, 7.3, etc, etc. Je pensais que c'était correct, mais en fait non : Supposons que je définisse ma limite = 7, et disons que les nouveaux tick 1, tick 2, tick 3 se produisent séquentiellement :

1) 7.3>limite, puis l'ordre est modifié... le courtier remplit 1 slippage en moins...

2) 7.5>limite, puis l'ordre est modifié.... le courtier remplit 0 slippage...

3) 7.1>limite, puis l'ordre est modifié...le courtier remplit 2 slippage off...

Donc en tout, mes ordres sont modifiés 3 fois pour les 3 ticks. Ayant réalisé cela, j'ai décidé d'utiliser MathRound() pour arrondir ces ordres à l'entier le plus proche, donc 1,2,3 devient

1) mathround(7.3) =7 >limite, PAS VRAI, pas modifié

2) mathround(7.5)=8 >limite, VRAI, l'ordre est modifié

3) mathround(7.1)=7>limite, PAS VRAI, pas modifié

En fait, je travaille toujours sur la façon d'améliorer ce qui précède ... jusqu'à présent, ils fonctionnent bien, mais je pense qu'il doit y avoir de meilleures façons, que la mienne.


Génial Diostar, ce sont des informations très très utiles pour moi en fait, surtout la partie que j'ai soulignée.

Donc si je règle mon problème, le mieux que je puisse espérer est :

chaque fois que mes conditions sont satisfaites à l'écart 00, 01, 02 etc., le mieux que je puisse espérer est 1,2,3 (respectivement) défilement de chaque ordre. Donc à l'écart 03, il modifiera mon ordre 02,01,00, puis 01,00,02 puis 00,02,01 jusqu'à ce que tous les ordres soient modifiés ? Si je les fais défiler vers l'avant, c'est la même chose, mais l'ordre est différent, etc...

Je pense que je pourrais être ok si cela se produit en fait... Cependant, je pourrais trouver la même chose que vous plus tard et vouloir le resserrer, mais je suis heureux de s'attaquer à un pont à la fois.... Merci pour la prévoyance !

toujours sur le point d'essayer ce forumula...

 
cette formule s'est bien passée aussi, merci pour le soutien de Diostar, j'ai passé des heures à apprendre le code, merci...
 

Comme toujours, avec le recul, il faut penser à une autre solution. .....

Juste pour mon apprentissage, le bloc ci-dessous aurait-il pu fonctionner comme une solution alternative à mon problème précédent ?


//---------------------------old attempt where it spammed modifies--------------------------------------
//---------------------------I got around this problem another way before-------------------------------
void ModifySellBlock()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//--------------------------any problems with this block?----------------------------------------------
 
 
//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];<-----then, arrayinitialize
    
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);<-----if(orderselect...

        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)<----orders >0
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)<---if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET)

        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;      
         
            can consider if(SL>0 || TP>0){
          
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}
 
diostar:


Merci pour le temps que vous avez consacré à cette question, Diostar. À l'époque, je n'avais pas les connaissances nécessaires pour trouver cette idée. Même maintenant, je l'ai en quelque sorte remodelée à partir de quelques morceaux de code, car j'apprends encore à faire des ARRAYS...

Honnêtement, je ne peux pas croire à quel point il était difficile de faire une section de code qui sélectionne tous les ordres et les modifie une seule fois... si le flux de données était envoyé ici à chaque coup...

J'apprécie votre temps avec vos ajouts, je vais leur donner un coup de pouce... Hey aussi Diostar, je crois que je remarque ce que tu as dit avant aussi, merci pour la prévoyance afin que je sache que ce n'était pas mon code..... Je vois le défilement des modifications (* #ordres que j'ai en cours), et je remarque un glissement à l'intérieur... Je vous tiendrai au courant si j'arrive à contourner le problème, peut-être avec le code ci-dessus pour commencer pour être honnête, merci encore ;)

 
Funky:


Merci pour le temps que vous avez consacré à cette question, Diostar. À l'époque, je n'avais pas les connaissances nécessaires pour trouver cette idée. Même maintenant, je l'ai en quelque sorte remodelée à partir de quelques morceaux de code, car j'apprends encore à faire des ARRAYS...

Honnêtement, je ne peux pas croire à quel point il était difficile de faire une section de code qui sélectionne tous les ordres et les modifie une seule fois... si le flux de données était envoyé ici à chaque coup...

J'apprécie votre temps avec vos ajouts, je vais les essayer... Hey aussi Diostar, je crois que je remarque ce que tu as dit avant aussi, merci pour la prévoyance afin que je sache que ce n'était pas mon code..... Je vois le défilement des modifications (* #ordres que j'ai en cours), et je remarque un glissement à l'intérieur... Je vous tiendrai au courant si j'arrive à contourner le problème, peut-être avec le code ci-dessus pour commencer pour être honnête, merci encore ;)

Vous êtes les bienvenus. Le slippage, tout comme le spread, déséquilibre le résultat dans toute modification de prix, sl, tp. Mais je commande toujours ordersend() avec un slippage nul, toujours. Il serait peut-être bon d'avoir 1 ou 2 points, mais jusqu'à présent, tout va bien.