Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 191

 
yan720:

Merci pour votre réponse. J'étais moi-même surpris qu'une telle question ait été soulevée. Bien que, peut-être, j'ai mal compris ce que j'ai vu et ce qui a causé la question.

Je regarde maintenant le code d'autres personnes pour voir quelles méthodes (différentes des miennes et peut-être plus efficaces) sont utilisées pour mettre en œuvre certains algorithmes. En ce moment, je regarde le fameux conseiller expert Ilan 1.6 (ci-joint). Je peux voir qu'il a été assemblé à partir de diverses pièces, puis reconstruit. Mais la ligne 337 contient une fonction de trailing stop définie par l'utilisateur (bien que l'indicateur de son utilisation soit effacé de force au début). Cette fonction est appelée à la ligne 52.

Ma question se pose car le trailing stop mentionné ci-dessus modifie les ordres ouverts (et il peut y en avoir plusieurs) par un stop loss en conservant leur TakeProfit initial mais en fixant la même valeur (AveragePrice, qui est calculé aux lignes 173 et 178) à ces ordres comme prix ouvert (deuxième paramètre de la fonction OrderModify).

Ou bien, ce paramètre (prix ouvert) est-il simplement ignoré par le serveur lors de la modification d'un ordre ouvert et le serveur peut-il fixer n'importe quel prix ?

Lors de la modification d'une position de marché, le prix doit être fixé et égal au prix d'ouverture : OrderOpenPrise()

PS Si j'étais vous, je ne chercherais pas des "algorithmes efficaces" dans ce code - on dirait que la personne a écrit du code sans vraiment savoir ce qu'elle y fait...

 
Aller à
 Alert("Исполнение программы");
    double p[100];
    int i =0;
    int n = OrdersTotal ();
    int t =0;
    
    for (i=0; i<=n+1; i++)
    {
    
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
     
      p[i+1] = OrderProfit();      // р - це прибуток ордера
     
     } 
    }
    for (i=0; i<=n+1; i++)
    {
    if (p[i+1]>0)                  // якщо ордер прибутковий, то його 
    {
      Alert("Є прибуток ордер ",i+1);
      OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES); 
      Alert("Маємо помилку ",GetLastError());
      Alert("Вибрали ордер ",i+1);
      double ld_Price;
      if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
      else ld_Price = NormalizeDouble (Ask, Digits);
      OrderClose (OrderTicket(), OrderLots(), ld_Price, 2);  // треба зачинити 
      Alert("Маємо помилку ",GetLastError());
      Alert("Закрили ордер ",i+1); 
       if ( OrderType()==OP_BUY)                              //  в залежності від того, якого типу ордер ми зачинили
       { 
        Alert("Ордер типу бай");
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);   // змінюється порядок відкривання наступних ордерів
        Alert("Відкрили ордер типу селл");
        Sleep(10000);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        }else
      {
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        Sleep(10000);
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);    
        Alert("Відкрили ордер типу селл");
      }
    } 
   } 
    Alert("Последняя ошыбка ",GetLastError()); 
//----
   return(0);
  }

trouver que la "bêtise" soit bonne, ayez pitié d'un homme torturé par Pascal.

 
artmedia70:
Lors de la modification d'une position de marché, le prix doit être fixé et égal au prix d'ouverture de la position : OrderOpenPrise()

Alors cette fonction, à votre avis, ne fonctionnera pas ? Je ne l'ai pas testé mais il me semble qu'il fait partie d'un code qui fonctionne (cet Ilan a manifestement été reconstruit à partir de quelque chose de débogué au mieux). Ou est-ce que c'est toujours un code minable ?

void TrailingAlls(int pType, int stop, double AvgPrice) {
   int profit;
   double stoptrade;
   double stopcal;
   if (stop != 0) {
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) {
               if (OrderType() == OP_BUY) {
                  profit = NormalizeDouble((Bid - AvgPrice) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Bid - stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  profit = NormalizeDouble((AvgPrice - Ask) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Ask + stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
 
Lorsque trois barres consécutives dans la même direction pour ouvrir un ordre d'achat ou de vente, stop loss mis sur le dessus de la barre précédente, après la fermeture de la bougie prend un stop loss sur prevedshego bar.
 
artmedia70:

PS Si j'étais vous, je ne chercherais pas des "algorithmes efficaces" dans ce code - on dirait que le gars a écrit le code sans vraiment savoir ce qu'il fait là...

Oui, le code est très spécifique avec beaucoup de redondances et pas seulement cela. Mais je ne m'intéresse pas tant aux algorithmes en tant que tels qu'à l'approche de la mise en œuvre de l'idée qui les sous-tend. Je regarde l'image générale, ou quelque chose comme ça. Ce qui est mis dans les fonctions individuelles, comment le même bras de remorquage est mis en œuvre, par opposition à mon propre bras, etc. Je suis autodidacte et c'est juste utile pour moi :)
 
artmedia70:
Au bon endroit - de quel endroit s'agit-il ?


Par exemple un ordre est déjà en position 1200 points... et le prix par exemple a baissé et les étoiles se sont alignées de sorte qu'à cet endroit un ordre doit être placé... et l'ordre est déjà là et ne pas baisser le solde en dessous de celui requis ne pas placer 2 ordres chacun, par exemple
 
yan720:

Alors pensez-vous que cette fonction ne fonctionnera pas ? Je ne l'ai pas testé, mais il me semble qu'il fait partie d'un code fonctionnel (cet Ilan a manifestement été reconstruit à partir de quelque chose de débugué au mieux). Ou est-ce que c'est toujours un code minable ?

Eh bien... le code n'est pas réel. Au minimum.

 
L'essence de la question est la suivante. Je veux changer le MACD standard simple Expert Advisor, mais je suis un zéro total en programmation.
Je veux modifier l'EA pour qu'il fonctionne avec une grille, des stops et un magik au lieu d'un seul ordre.
Voici les variables que je voulais ajouter :
Stoploss = est placé au même niveau pour l'ensemble de la grille, par exemple, est égal à EUR/USD = 200pp et est placé au niveau de 1.3450 pour tous les ordres de la grille.
MaxOnDer = Nombre maximum d'ordres dans la grille, par exemple, si=3, alors le nombre maximum d'ordres dans la grille sera de 3.
Dist = Distance entre deux ordres en attente

Lommultiplicateur = Le rapport de la taille du lot de l'ordre suivant dans la grille.

Magic= nombre magique

Nous sortons de la transaction comme dans le code initial, c'est-à-dire que tous les ordres de la grille seront fermés lorsque le 1er ordre sera fermé.

C'est tout
Si quelqu'un otvezvayut serait très reconnaissant !
Je serais très reconnaissant ! Peut-être quelqu'un a un conseiller expert prêt à l'emploi, qui est déjà mis en œuvre dans la vie, aussi, fera.
 
sannin:

il y a par exemple déjà un ordre à 1200 points... et le prix a baissé, par exemple, et les étoiles sont alignées de telle sorte qu'à cet endroit l'ordre doit être placé... et l'ordre est déjà là et ne pas faire baisser le solde en dessous de celui requis pour ne pas placer 2 ordres par un, disons

Ça donne quelque chose comme ça :

//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()!=op)          continue;
         if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
         }
      else Print("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
      }
   return(false);
}
//+----------------------------------------------------------------------------+

Pour vérifier s'il existe un ordre BuyStop sur le symbole actuel au prix de 1,35000 avec Magic, nous appelons la fonction :

//+----------------------------------------------------------------------------+
   if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
      // тут код, если нет такого ордера
      }
   else {
      // тут код, если есть такой ордер
      }
//+----------------------------------------------------------------------------+
 
atztek:

Si vous parlez de documentation, mettez le mot en surbrillance dans le MetEditor et appuyez sur F1. Ou vous pouvez aller sur Internet, par exemple :
https://docs.mql4.com/ru/customind/SetLevelStyle

Bien sûr, merci, mais si vous êtes trop paresseux pour lire la question, à quoi bon répondre ? Je peux modifier la valeur, l'épaisseur, la couleur et le style des niveaux de l'indicateur dans les deux fonctions dont je dispose. Je n'ai pas accès à la description. Je le demande à nouveau, quelqu'un connaît-il la réponse ? Je ne sais pas si je l'ai déjà vu.

J'ai joint une photo pour montrer ce dont j'ai besoin.