[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 665

 
Roger:
Ne comptez pas les hauts et les bas à partir de la barre zéro mais à partir de la première barre, sur la barre zéro l'offre ne peut être inférieure au minimum.
C'est-à-dire : i=1 ; ? Et ne pas toucher à l'offre et à la demande ?
 
eugggy:
double
Min=Enchère, déclaration de variable

Max=Enchère,

____________________________________________________________________________________________

for (i=0;i<=20-1;i++) critères d'ouverture

{
si (Low[i]<Min) Min=Low[i] :
si (High[i]>Max) Max=High[i] ;

}

si (................. &&Ask>Max)

{

Opn_B=true ; //ouverture de Buy

}

si (................ &&Bid<Min)

{

Opn_S=true ; //ouvrir le Sell

}

___________________________________________________________________________________________

Je suis désolé que ce soit si moche - j'ai dû l'écrire de mémoire car le code ne fonctionnait pas et je l'ai supprimé. Mais vous, en tant que professionnel, devriez être compréhensible (je l'espère).

____________________________________________________________________________________________

Vous me flattez :)) Je suis un débutant tout comme vous...

extremumprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int  Quant_Bars  =30;                    // Количество баров
bool        OpnBuy      =false,
            OpnSell     =false;
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int i;                                       // Номер бара 
   double Minimum=Bid,                          // Минимальная цена
          Maximum=Bid;                          // Максимальная цена
 
   for(i=0;i<=Quant_Bars-1;i++)                 // От нуля (!) до..
     {                                          // ..Quant_Bars-1 (!)
      if (Low[i]< Minimum)                      // Если < известного
         Minimum=Low[i];                        // то оно и будет мин
      if (High[i]> Maximum)                     // Если > известного
         Maximum=High[i];                       // то оно и будет макс
     }
//--------------------------------------------------------------------

   if (iOpen(NULL,0,1)>Maximum)
      {
         OpnBuy =true:
         OpnSell=false;
      }
   if (iOpen(NULL,0,1)<Minimum)
      {
         OpnSell=true;
         OpnBuy =false:
      }   
//-------------------------------------------------------------------
//  А тут код открытия позиций.  if (OpnBuy)  {открываем Бай};
//                               if (OpnSell) {открываем Селл};
// Но обязательно нужно сделать проверку на существование уже открытой позиции,
// иначе они будут открываться на каждом тике пока присутствует сигнал...
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
Ça donne quelque chose comme ça. Je ne l'ai pas vérifié, je l'ai juste écrit sur le champ...
 
artmedia70:

Voici donc la logique :

1. définir l'ordre en attente avec un nombre magique, disons 101, et réinitialiser le drapeau pour convertir l'ordre en position, disons ConvOrd=false ;

2. vérifier si la position avec la magie 101 est apparue ; si oui, activer l'indicateur de conversion ConvOrd=true ;

3. vérifier la vérité de ConvOrd et si ConvOrd==vrai,
nous vérifions si la position avec le numéro magique 101 existe - et si elle est manquante
cela signifie qu'il est déjà fermé.

{désélectionner ConvOrd=false ; définir un nouveau en attente;}.

Je pense que nous pouvons nous passer de drapeaux...


Je comprends la logique, mais je ne sais pas comment l'implémenter en code. J'ai essayé beaucoup de variantes mais je n'ai pas eu de résultat. Je pense que je suis une idiote. C'est pourquoi j'ai écrit ici. A la p.663 je vous ai montré mon code. Si vous êtes intéressé, veuillez me dire comment l'améliorer ou du moins me dire comment l'améliorer. Merci.
 
artmedia70, Roger merci pour votre aide. Je pense avoir trouvé la solution, en effet le prix à la barre 0 ne peut pas être inférieur ou supérieur au minimum et au maximum, je n'y avais pas pensé et j'ai ajouté Ask comme valeur de la variable Min, maintenant cela semble fonctionner. artmedia70, comparé à moi, la plupart sont des professionnels))). Merci encore.
 
dimon74:
Je comprends la logique, mais je ne sais pas comment l'implémenter en code. J'ai essayé beaucoup de variantes mais je n'ai pas eu de résultat. Je pense que je suis un imbécile. C'est pourquoi j'ai écrit ici. A la p.663 je vous ai montré mon code. Si vous êtes intéressé, veuillez me dire comment l'améliorer ou du moins me dire comment l'améliorer. Merci.

Essayez une méthode plus simple, lorsque vous placez un ordre SellStop, rappelez-vous la valeur TakeProfit et si l'offre tombe en dessous de ce prix, placez-le sur Buy.
 
Roger:

Essayez une méthode plus simple, lorsque vous placez un ordre SellStop, rappelez-vous la valeur TakeProfit et si l'offre tombe en dessous de ce prix, placez-le sur Buy.
Merci pour cette astuce ! J'ai déjà essayé cette variante mais elle ne convient pas à ma stratégie.
 
dimon74:
Merci pour le conseil ! J'ai déjà essayé cette option mais elle ne convient pas à ma stratégie.
Que les pros me pardonnent, mais je vais quand même vous donner une liste de fonctions utiles d'Igor Kim, peut-être que vous la construirez vous-même... :)
Dossiers :
 

Je ne comprends pas pourquoi il y a deux positions de verrouillage à la fois. La logique est la suivante :

Lorsque l'équité atteint un certain pourcentage du profit précédent, nous fermons toutes les positions... Cela fonctionne correctement... Suivant...

Si l'équité chute d'un certain pourcentage par rapport à sa valeur précédente, recherchez la position qui a subi la plus grande perte, identifiez qui elle est... Acheter ou vendre.

et ouvrir une position de verrouillage dans la direction opposée avec le double lot. Ensuite, nous regardons leur profit total (de la position perdante et de la position bloquée) et dès qu'il devient plus grand,

Disons 10 pips, fermez-les...

Logiquement, l'équité devrait être vérifiée au prochain tick et si tout est OK, on continue à travailler... Si tout est à nouveau en ordre, nous devrons chercher la prochaine poire...

Mais pour une raison quelconque, il ouvre deux positions de verrouillage à la fois... et Acheter et Vendre, et si le lot était de 0,1, alors le premier verrouillage ouvre le double du lot = 0,2,

et le second le double à nouveau et ouvre avec 0,4 lot ... Respectivement, que diable y a-t-il, s'ils se battent entre eux pour une place sous le Soleil ... :(

Je joins le code, peut-être que quelqu'un pourrait me donner un coup de main avec son... doigt.

//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------
            
   if (Equ_NEW>=Equ_OLD+EquPerc)                       // Новое эквити больше старого на процент прибыли..
   {                                         
//      ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
      ClosePosFirstProfit(NULL, -1, -1);           // Закрываем все позиции, сначала прибыльные
      DeleteOrders(NULL, -1, -1);                  // Удаляем ордера
      Equ_NEW=AccountEquity();                     // Запоминаем новое значение эквити
      Equ_OLD=Equ_NEW;                             // и вписываем его в "старое"
      CountClsEQU++;                               // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
      LockBuy51 =true;                             // Разрешаем открытие локирующих
      LockSell51=true;                             // позиций Buy и Sell
      OpnBuy51  =true;                             // и вообще разрешаем открываться
      OpnSell51 =true;                             // в любую сторону... 
   }

//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
               
   if (Equ_NEW<=Equ_OLD-EquPerc/2)                 // Новое эквити меньше старого на столько-то процентов...
      {                                         
         Trade=false;                              // Запрещаем торговлю
//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- 
        
         if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES))    // Выбираем убыточную позицию (если её тикет
            {                                                        // ранее был сохранён в TicketLoss)
               double prloss=OrderProfit()+OrderSwap();              // Размер профита убыточной позиции
               int typeloss =OrderType();                            // Тип убыточной позиции
               int mnloss   =OrderMagicNumber();                     // Magic убыточной позиции
            }
         if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES))    // Выбираем локирующую позицию (если её тикет
            {                                                        // ранее был сохранён в TicketLock)
               double prlock=OrderProfit()+OrderSwap();              // Размер профита локирующей позиции
               int typelock =OrderType();                            // Тип локирующей позиции
            }
         if (prloss+prlock>=10*Point)                                // Если их суммарный профит больше 10 пунктов
            {
                ClosePositions(NULL, typelock, 5100);           // Закрываем локирующую позицию
               ClosePositions(NULL, typeloss, mnloss);         // Закрываем убыточную позицию
            }
//--------------- Поиск убыточной позиции и установка локирующей -------------------------  
       
         double Loss=0;                                        // Последнее значение убытка
         int    i, k=OrdersTotal(), OrdTicket=-1;

         for (i=k-1; i>=0; i--) {                              // Цикл по всем ордерам терминала
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
               if ((OrderProfit()+OrderSwap()<0)) {            // Если профит позиции меньше 0
                  if (Loss>OrderProfit()+OrderSwap()) {        // Если последнее значение убытка больше убытка позиции  
                     Loss=OrderProfit()+OrderSwap();           // Значит тут убыток больше, запоминаем как последнее
                     OrdTicket=i;                              // Запоминаем номер убыточной позиции
                  }
               }
            }
         }
            if (OrdTicket>=0) {
               if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) {   // Выбираем позицию по тикету
                  TicketLoss=OrdTicket;                                    // Запоминаем как тикет убыточной позы
                  if (OrderType()==OP_BUY)                                 // Если её тип Бай
                     {
                        Magic=5100;                                              // Задаём магик... 
                        New_Comm="Sell_M5_Стратегия_1_Локирующая позиция";       // Задаём комментарий для позиции
                        Lots_New=NormalizeLot(OrderLots()*2, False, NULL);       // Увеличим лот в два раза
                        if (!ExistPositions(NULL, OP_SELL, 5100, 0)){            // Если нет локирующего Sell
                        OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...
                        if (ExistPositions(NULL, OP_SELL, 5100, 0))              // Проверяем, заодно и выбираем её
                              {TicketLock=OrderTicket();}                        // Сохраняем тикет локирующего Sell
                     }
                  if (OrderType()==OP_SELL)
                     {
                        Magic=5100;                                              // Задаём магик... 
                        New_Comm="Buy_M5_Стратегия_1_Локирующая позиция";        // Задаём комментарий для позиции
                        Lots_New=NormalizeLot(OrderLots()*2, False, NULL);       // Увеличим лот в два раза
                        if (!ExistPositions(NULL, OP_BUY, 5100, 0)){             // Если нет локирующего Buy
                        OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...
                        if (ExistPositions(NULL, OP_BUY, 5100, 0))               // Проверяем, заодно и выбираем её
                              {TicketLock=OrderTicket();}                        // Сохраняем тикет локирующего Buy
                     }
               }
            }
         }

À partir de

//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------

...il y a un joint quelque part...

 

PAGE NUMÉRO "666" :-)

 
Effrayant... Whoo !!!