Fonctions utiles de KimIV - page 26

 
aceventura:

La fonction du nombre d'ordres ne fonctionnera pas, car l'EA est réglé différemment pour chaque paire. Et les ordres sont fixés pour différentes paires en même temps. Ensuite, si quatre ordres sont placés pour deux paires et qu'un ordre est déclenché, trois d'entre eux sont supprimés et l'ordre opposé devrait être supprimé pour toutes les paires.

Toutes les fonctions de KimIV vont "filtrer" les commandes par type+paire+magie. C'est-à-dire (pour moi ! :) pour ne pas courir et chercher - à partir de cette page "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) en appelant "Count there some" (Comptez-en quelques-uns) Vous obtiendrez certainement les ordres ouverts réels pour cette paire de devises ou même avec cet EA.

ZS Je voulais dire la fonction

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

de la page 12.

 
SergNF:

Toutes les fonctions de KimIV "filtrent" les commandes par type+paire+magie. C'est-à-dire (à moi ! :) pour ne pas courir et chercher - à partir de cette page "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) en appelant "Count there some" (Comptez-en quelques-uns) Vous obtiendrez certainement les ordres ouverts réels pour cette paire de devises ou même avec cet EA.

ZS Je voulais dire la fonction

de la page 12.

Merci ! Très utile ! Je vais m'en occuper.

 
Toutes nos excuses pour l'intrusion Aide pour les nuls Comment tracer des lignes parallèles dans MT4 rapidement et confortablement ?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Aidez-moi, s'il vous plaît. J'ai mis en place un EA simple utilisant un stop suiveur.

Comment faire pour que le stop suiveur soit mis une fois +5 pips et ne soit pas transféré plus loin, la fermeture se fait par

Comment utiliser le trailing stop s'il est déjà défini par les indicateurs ? Si vous pouvez donner un exemple ! !!
 
KimIV писал (а) >>

Probablement pas... Je n'en ai que deux : index et poignée... >> hee

Igor, j'ai le béguin pour toi, même si je ne suis pas gay. Après tout, vous pouvez aussi travailler comme Zadornov.

 

Fonction SecondsAfterOpenLastPos().

Cette fonction renvoie le nombre de secondes écoulées depuis la dernière ouverture de la position. La sélection des positions à prendre en compte est fixée par des paramètres externes :

  • sy - Nom de l'instrument de marché. Si ce paramètre est défini, la fonction ne prendra en compte que les positions de l'instrument spécifié. La valeur par défaut - "" signifie tout instrument de marché. La valeur NULL signifie l'instrument actuel.
  • op - Opération commerciale, type de poste. Valeurs valides : OP_BUY, OP_SELL ou -1. La valeur par défaut -1 signifie une position quelconque.
  • mn - Identificateur de position, MagicNumber. La valeur par défaut de -1 signifie n'importe quel identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. Vous trouverez ci-joint un script pour tester la fonction SecondsAfterOpenLastPos().
 

Je suis bien sûr sincèrement désolé, ce que vous faites est certainement une bonne chose.

Mais COMMENT vous le faites, je n'aime pas ça du tout.

1. le fait que vous décriviez les noms des variables est génial, mais chaque fois que vous devez regarder dans l'en-tête pour voir ce que l'abréviation sauvage suivante signifie, il est difficile de comprendre ce que la variable représente, vous oubliez ce que vous vouliez trouver dans le code. Ne pouvez-vous pas écrire un code auto-documenté de QUALITÉ, qui même sans commentaires sera compréhensible pour quelqu'un qui connaît l'anglais, d'autant plus que vous le faites pour les autres et que les autres avec cette qualité ne trouveront jamais une erreur dans le code, s'il y en a une.



2. Fonctions surchargées. La polyvalence est une MAUVAISE chose, 6 paramètres pour une fonction c'est trop.



3. Simplicité du code

Exemple.

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

C'est votre code. Voyons ce que vous pouvez faire avec :

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

On compare le code ? Il fait la même chose.

1. Oui, mon code est plus gros, mais après tout, nous ne vivons pas à l'époque des disquettes, n'y a-t-il pas assez d'espace ?

2. Mon code est beaucoup plus clair à l'intérieur. Même sans les commentaires, qui sont collés sur place.

3. Votre fonction a 7 imbrications, la mienne en a 2, y a-t-il une différence ?

4 C'est l'une des rares fonctions qui n'est pas surchargée, mais l'ouvrir, la modifier et ainsi de suite est un cauchemar.



SZZH : Respectez les personnes pour qui vous écrivez.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1. Pas d'accord. Tout me convient parfaitement, tant sur le plan de la forme que du contenu. Veuillez continuer exactement dans le même format.

Oui, mon code est plus grand.

Exactement. Et plus le code est petit, plus il est facile à lire. Je déteste les polices "étalées" sur 2-3 écrans. Une fonction doit se trouver sur un seul écran, sans avoir à le feuilleter. C'est pourquoi je suis pour la compacité.

Votre fonction a 7 imbrications, j'en ai 2, y a-t-il une différence ?

Est-il normal que vous ayez beaucoup de continuums facultatifs qui, d'ailleurs, détournent à nouveau l'attention du lecteur ?

 
Andrei(TheXpert), merci pour vos commentaires et suggestions ! Tous sont absolument justes et vous avez tout à fait raison dans vos déclarations !
 

Fonction DeleteOppositeOrders().

Cette fonction supprime un ou plusieurs ordres opposés à la position, dont le type est spécifié dans le paramètre op. Par exemple, pour une position d'achat, les ordres opposés seraient SellLimit et SellStop. La suppression de l'ordre opposé devient nécessaire si, par exemple, deux ordres opposés sont définis et que l'un d'eux se déclenche.

  • sy - Nom de l'instrument de marché. Si vous définissez ce paramètre, la fonction ne prendra en compte que les positions du symbole spécifié. La valeur par défaut "" signifie tout instrument de marché. La valeur NULL signifie l'instrument actuel.
  • op - Opération commerciale, type de poste. Valeurs valides : OP_BUY, OP_SELL ou -1. La valeur par défaut -1 signifie une position quelconque.
  • mn - Identificateur de position, MagicNumber. La valeur par défaut de -1 signifie n'importe quel identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
SZZ. Vous trouverez ci-joint un script pour tester la fonction DeleteOppositeOrders().
Dossiers :