Fonctions utiles de KimIV - page 21

 

La fonction isCloseLastPosByStop().

Cette fonction renvoie un drapeau pour fermer la dernière position par arrêt. Le drapeau est levé - Vrai - Le StopLoss s'est déclenché. Drapeau abaissé - Faux - le poste a été fermé pour une autre raison. Une sélection plus précise des positions à prendre en compte est établie à l'aide de 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é. 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 -1 signifie tout identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
P.S. Vous trouverez ci-joint un script pour tester la fonction isCloseLastPosByStop().
Dossiers :
 
Lukyanov:
KimIV:

Fonction OpenPosition() en ligne.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
//-- skip --
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip -- 
J'ai branché la fonction OpenPosition() dans EA on real, erreur 4059, changé NULL en Symbol(), disparu, puis le message est apparu
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30 : expert arrêté
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30 : les appels de fonctions expertes ne sont pas autorisés ; 'stdlib'-'ErrorDescription'.
Retour à la ligne de base, tout fonctionne... (stdlib.mqh && stderror.mqh sont dans le dossier include de la livraison de la base MT)
 
teraptor2 писал (а):
J'ai connecté la fonction OpenPosition() dans mon Expert Advisor sur le réel, l'erreur 4059

L'erreur 4059 signifie que la fonction n'est pas disponible en mode test. L'identificateur d'erreur est ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. Les fonctions suivantes génèrent l'erreur : MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.

teraptor2 a écrit (a) :
a changé NULL en Symbol(), il a disparu, puis un message est apparu
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30 : expert arrêté
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30 : les appels de fonctions expertes ne sont pas autorisés ; 'stdlib'-'ErrorDescription'.
 

La fonction isCloseLastPosByTake().

Cette fonction renvoie un drapeau pour clôturer la dernière position au moment du Take Profit. Le drapeau est levé - Vrai - TakeProfit a été déclenché. Drapeau abaissé - Faux - le poste a été fermé pour une autre raison. Une sélection plus précise des positions à prendre en compte est spécifiée à l'aide de paramètres externes :

  • sy - Nom de l'instrument de marché. Si vous définissez ce paramètre, la fonction ne prendra en compte que les positions de l'instrument spécifié. La valeur par défaut "" signifie tout instrument de marché. NULL signifie l'instrument actuel.
  • op - Opération commerciale, type de poste. Valeurs valables : 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 -1 signifie tout identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
HH. Vous trouverez ci-joint un script pour tester la fonction isCloseLastPosByTake().
Dossiers :
 

La fonction isLossLastPos().

Cette fonction renvoie le drapeau de perte de la dernière position fermée. Drapeau vers le haut - Vrai - la dernière position a été fermée avec une perte. Drapeaux vers le bas - Faux - la dernière position a été fermée soit à zéro, soit avec un bénéfice. Cette fonction ne tient pas compte des swaps et des commissions. La sélection des positions est définie par des paramètres externes :

  • sy - Nom de l'instrument de marché. Si vous spécifiez ce paramètre, la fonction ne prendra en compte que les positions de l'instrument spécifié. La valeur par défaut "" signifie tout instrument de marché. NULL signifie l'instrument actuel.
  • op - Opération commerciale, type de poste. Valeurs valables : 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 -1 signifie tout identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
P.S. Vous trouverez ci-joint un script pour tester la fonction isLossLastPos().
Dossiers :
 

La fonction isTradeToDay().

Cette fonction renvoie le drapeau commercial pour aujourd'hui. Le drapeau est levé - Vrai - il y avait des positions ouvertes aujourd'hui. Drapeau en baisse - Faux - aucune position ouverte aujourd'hui. 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é. NULL signifie l'instrument actuel.
  • op - Opération commerciale, type de poste. Valeurs valables : 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 -1 signifie tout identifiant.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  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 (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
ZZY. Vous trouverez ci-joint un script pour tester la fonction isTradeToDay().
Dossiers :
 
KimIV:

La fonction isCloseLastPosByStop().

Cette fonction renvoie un drapeau pour fermer la dernière position par arrêt. Le drapeau est levé - Vrai - Le StopLoss s'est déclenché. Drapeau abaissé - Faux - le poste a été fermé pour une autre raison. Une sélection plus précise des positions à prendre en compte est établie à l'aide de paramètres externes :

().

Après-midi . Lors de l'implémentation du code avec cette fonction, une certaine confusion est apparue. J'ai appliqué cette fonction comme ceci :

if (isCloseLastPosByStop(NULL,OP_BUY, MagicLong1))               {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
  for ( int rb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- )                {       
      if (OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES))                 { 
      //выбираем среди открытых и отложенных ордеров          
      if( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1))  {
         //закрываем все остальные позиции BUY
        OrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black );
       OrderDelete(OrderTicket());// и удаляем BUY-отложки   
        //  return(0); // выходим     
        }}}}

Jusqu'à ce point, tout fonctionne bien ! Toutes les positions d'achat sont fermées et les positions d'achat sont supprimées, comme je l'ai défini ! Mais ensuite, le conseiller expert réinitialise les ordres en attente en fonction de ses signaux d'entrée. Comme prévu.

Mais ces commandes sont instantanément supprimées ! Apparemment, le drapeau y est toujours accroché. Mais pourquoi est-elle là ? Les dernières positions n'ont pas été fermées par un Stop Loss mais par la force !

Comment dois-je faire face à cette situation ? Comment puis-je faire en sorte que mon Expert Advisor affiche ses ordres suivants normalement après l'exécution de la commande de fermeture de cet algorithme ?

 
rid писал (а):
Que dois-je faire dans cette situation ? Pour que l'EA puisse placer ses prochains ordres normalement après la commande de fermeture de ceux-ci ?

Cette question doit être abordée dans le contexte de l'ensemble de la tâche, car il ne s'agit pas d'une action unique, mais d'une interaction, et dans un certain ordre. Par conséquent, décrivez la tâche dans son intégralité. Vous n'avez pas besoin d'un code. Il suffit de décrire la tâche en mots.

Question d'échauffement. Pourquoi devez-vous supprimer des commandes et les remettre en place ? Je pense qu'il est préférable de modifier.

 

Mes ordres et mes positions sont regroupés dans des tableaux en fonction des bénéfices, des pertes, des ordres stop et limite, et d'autres raisons.

Dans ce cas particulier, je ferme le tableau des positions BUY qui ont été ouvertes à l'aide d'ordres stop et qui ont accumulé un profit déterminé. Et je supprime tous les autres ordres stop qui n'ont pas fonctionné.

//---------------------------------------------------------------------------------------------

 

Maintenant, j'ai mis en place une fonction de commentaire - Commentaire (isCloseLastPosByStop()) ;

Je regarde. Initialement, la fonction =0. Après la première fermeture d'un commentaire Stop Loss (isCloseLastPosByStop()) ; change à un, et ensuite - après la fermeture forcée d'autres positions, il ne revient pas à zéro, mais continue à être un !