[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 489

 

Veuillez aider à rendre cette fonction vice versa :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    Кроме того, функция MovingInWL() предполагает наличие глобальных переменных (внешних параметров скрипта или советника):
//|    int LevelProfit - Уровень профита в пунктах, которого должна достигнуть позиция для того, чтобы её стоп был перенесён на уровень безубытка.
//|    int LevelWLoss - Уровень безубытка в пунктах, на который будет перенесён стоп позиции после того, как её профит достигнет уровня LevelProfit в пунктах.
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
      if (OrderType()==OP_BUY) {
        if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
          if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
          }
        }
      }
      if (OrderType()==OP_SELL) {
        if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
          if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
          }
        }
      }
    }
  }
}

En d'autres termes, si le prix passe à une perte à partir d'un ordre ouvert par le nombre de pips LevelProfit (vous pouvez l'appeler LevelLoss), vous devez déplacer TakeProfit à zéro ou à une perte de 1 pip 2, etc., selon ce que vous mettez dans le paramètre LevelWLoss, de sorte que si le prix se retourne même, il n'y aurait plus de profit. Ou peut-être en avez-vous un de prêt ?

Merci d'avance))

 

Bonjour ! Vous savez, il suffit de couper le code de la section init de l'EA, (j'ai été le déboguer pour le week-end - pas de ticks !), déplacé au démarrage. Suppression de la boucle fora extérieure. Je l'ai compilé.

C'est codé - 'continue' - 'break' ou 'continue' utilisé dans un certain cycle seulement C:\Alpari\experts\Outputs.mq4 (69, 20)

De quoi s'agit-il ? Eh bien, in loop continuo, in loop, et alors ? Je ne parle pas beaucoup l'anglais. Si je peux comprendre certains mots, je ne peux pas leur donner un sens !

 if (strela1 < strela2)
    {Sleep(600);
        if (SELL > 0) udalenie (OP_SELL);Sleep(600);
        if (BUY == 0)
        {Sleep(600);RefreshRates();
           OrderSend (Symbol( ), OP_SELL, lot, NormalizeDouble (Bid, Digits), 5 , NormalizeDouble( Ask+ (stoplos*Point),Digits),   NormalizeDouble( Ask-( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE) ;            
           int Error=GetLastError(); 
           Sleep(600);
    if (Error==129)continue;    }
    
    
    }
    else if (strela1 > strela2)
    {Sleep(600);
        if (BUY > 0) udalenie (OP_BUY);Sleep(600);
        if (SELL == 0)
        {Sleep(600); RefreshRates();
             OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Bid- (stoplos*Point),Digits),   NormalizeDouble( Ask+( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE); 
            
           Error=GetLastError(); 
        if (Error==129)continue;  }
 
Dimka-novitsek:

Bonjour ! Vous savez, il suffit de couper le code de la section init de l'EA, (j'ai été le déboguer pour le week-end - pas de ticks !), déplacé au démarrage. Suppression de la boucle fora extérieure. Compilé.

Came up with-- 'continue' - 'break' or 'continue' used within some cycle only C:\Alpari\experts\Outputs.mq4 (69, 20)

De quoi s'agit-il ? Eh bien, dans la boucle, dans la boucle, et alors ? Je ne suis pas très bon en anglais. Si je comprends certains mots, je ne peux pas les comprendre tous !

Vous n'avez pas de boucle, mais vous avez l'opérateur continue (il n'est utilisé que dans les boucles).
 
Lians:

Veuillez aider à rendre cette fonction vice versa :

En d'autres termes, si le prix passe à une perte à partir d'un ordre ouvert par le nombre de pips LevelProfit (vous pouvez l'appeler LevelLoss), vous devez déplacer TakeProfit à zéro ou à une perte de 1 pip 2, etc., selon ce que vous mettez dans le paramètre LevelWLoss, de sorte que si le prix se retourne même, il n'y aurait plus de profit. Ou peut-être en avez-vous un de prêt ?

Je vous remercie d'avance))

La fonction peut être la suivante :

void fMoving_TPInBU (int fi_LevelLOSS,       // уровень Лосса в пп. (для цены) - ТОЛЬКО > 0
                     int fi_LevelBU,         // уровень БУ в пп. (для тэйкпрофита) - может быть и >= 0 и < 0
                     string fs_Symbol = "",  // Symbol
                     int fi_Type = -1,       // Type
                     int gi_MG = -1)         // MagicNumber
{
    double ld_Point, ld_Price;
    int    li_Type, li_cnt, li_total = OrdersTotal();
//----
    if (li_total == 0) return;
    if (fs_Symbol == "" || fs_Symbol == "0") fs_Symbol = Symbol();
    for (int li_pos = li_total - 1; li_pos >= 0; li_pos--)
    {
        if (!OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (gi_MG > -1) if (gi_MG != OrderMagicNumber()) continue;
        li_Type = OrderType();
        if (li_Type > 1) continue;
        if (li_Type > -1) if (li_Type != fi_Type) continue;
        RefreshRates();
        if (li_Type == 0) {li_cnt = 1; ld_Price = MarketInfo (fs_Symbol, MODE_BID);}
        else {li_cnt = -1; ld_Price = MarketInfo (fs_Symbol, MODE_ASK);}
        ld_Point = MarketInfo (OrderSymbol(), MODE_POINT);
        if (li_cnt * (OrderOpenPrice() - ld_Price) >= fi_LevelLOSS * ld_Point)
        {
            double ld_TP = NormalizeDouble (OrderOpenPrice() + li_cnt * fi_LevelBU * ld_Point, MarketInfo (fs_Symbol, MODE_DIGITS));
            //---- Проверка на "излишнюю" модификацию
            if (ld_TP - OrderTakeProfit() != 0.0)
            {OrderModify (OrderTicket(), ld_Price, OrderStopLoss(), ld_TP, 0);}
        }
    }
//----
}

N'oubliez pas de vérifier les contraintes MODE_STOPLEVEL et MODE_FREEZELEVEL lorsque vous modifiez un STOP.

 

Merci ! !! Jetons un coup d'oeil...

Pourquoi pas ? Et si (BUY == 0)- n'est-ce pas une boucle ? Bizarrement, je n'ai supprimé que la boucle extérieure, qui entourait tout le programme entre parenthèses. C'était nécessaire pour le débogage, donc je l'ai enlevé.

S'il n'est pas là, laissez-le passer si (strela1 < strela2), la logique du programme ne sera pas cassée.

 
Dimka-novitsek:

Merci ! !! Jetons un coup d'oeil...

Pourquoi pas ? Et si (BUY == 0)- n'est-ce pas une boucle ? C'est étrange, je n'ai enlevé que la boucle extérieure qui encadrait tout le programme au début.


Non. Pas une boucle. Vous avez enlevé exactement ce qui aurait dû être laissé. Lisez l'intégralité du tutoriel, notamment ici : "Exemple d'utilisation d'un opérateur composé dans un opérateur conditionnel. L'opérateur conditionnel if(expression) vient en premier, suivi de l'opérateur composé. L'opérateur composé contient une liste d'opérateurs exécutables."

 
Lecture.
 
AIDE ! S'il vous plaît, aidez-nous ! A titre d'exemple, je joins cette photo. Je ne suis pas un programmeur de cet indicateur à une certaine façon soudé, mais a ensuite rencontré un manque de connaissances et de compétences ont essayé une semaine entière pour afficher les flèches sur l'écran ne fonctionne pas. je vais expliquer l'essence. dans les zones sélectionnées, souligné en blanc, il ya une divergence claire (comme je le comprends) qui est la différence entre l'histogramme et la ligne de prix. dans la figure par exemple, j'ai marqué ces endroits numéros 1-2-3-4.Dans ces endroits, les valeurs de la ligne de l'indicateur diminue modulo, bien que le prix continue à mettre à jour le bas et ainsi nous sommes arrivés au point 5 dans celui-ci nous voyons la base du prix mis à jour bas et bas à la clôture, l'histogramme est également en croissance, mais la ligne montre une diminution.
Dossiers :
tjllfe2.zip  45 kb
 

TarasBY, merci pour les explications et la fonction !

Je prends la fonction pour ma collection, mais je ne comprends pas quelque chose :

Le paramètre fi_LevelBU a une valeur négative - il déplace le take profit, alors que s'il a une valeur positive, il montre le profit ou vice versa ?

Et deuxièmement : est-il préférable de vérifier les contraintes à l'intérieur de la fonction elle-même ou à l'extérieur de la fonction ?

 
Lians:

TarasBY, merci pour les explications et la fonction !

Je prends la fonction pour ma collection, mais je ne comprends pas quelque chose :

Si le paramètre fi_LevelBU est négatif, cela signifie le déplacement du TP vers le profit, tandis que s'il est positif, cela signifie le profit ou vice versa ?

C'est exact (et non l'inverse).

Lians:

Et la seconde : est-il préférable de vérifier les contraintes à l'intérieur de la fonction elle-même ou à l'extérieur de la fonction ?

Chacun en décide par lui-même. J'ai créé une bibliothèque qui est responsable de l'exécution des ordres de transaction et vérifie toutes les limitations.

P.S. Il y avait une petite erreur dans le code de la fonction (parenthèses supplémentaires) - je l'ai corrigée.