Fonctions utiles de KimIV - page 15

 
KimIV:
B_Dima:
Si la valeur CCI est supérieure à 100, alors ouvrez une position d'achat jusqu'à ce que la valeur soit inférieure à -100, et lorsqu'elle est inférieure à -100, alors ouvrez une position de vente jusqu'à ce qu'elle soit supérieure à 100.

Pour toi, Dima, je peux te suggérer cette fonction :

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Cette fonction renvoie 1 lorsqu'il faut acheter et -1 lorsqu'il faut vendre. Les conditions d'achat et de vente sont celles que vous souhaitez. Il ne vous reste plus qu'à faire ce qui suit à chaque tique :

1. Obtenez la valeur de GetTradeSignal().

2. Si la valeur reçue ==0, alors ne rien faire.

Si la valeur reçue >0, alors fermez toutes les ventes et achetez.

4. Si la valeur calculée est <0, alors fermez toutes les transactions et vendez.

:)))) bien sûr merci pour l'aide, mais mon erreur, je n'ai pas expliqué assez précisément, l'indicateur CCI avec un intervalle de 50 montre la direction et le changement de tendance et l'ouverture se produit lorsque le prix touche l'EMA 8 et utilise également le stop-loss et le take-profit et d'autres indicateurs pour déterminer la correction. L'image est que lorsque le CCI franchit +100, une position d'achat est ouverte au contact de l'EMA et peu importe où se trouve le CCI (+10 ou -20), l'essentiel est que lorsqu'il franchit -100, une position de vente est ouverte. Dans le laps de temps entre le franchissement de 100 bougies et l'ouverture de 10 positions ou plus, le CCI>=+100 et le CCI<=-100 peuvent passer par 100 bougies. J'espère que c'est clair. Si vous avez des conseils à donner, je serai heureux de vous aider.

 
B_Dima писал (а):
C'est ma faute, je ne l'ai pas expliqué assez précisément,

Eh bien... C'est à vous de corriger votre erreur :-)

Je vous ai donné la bonne direction. Cela mènera au but. Alors, allez-y...

 
KimIV:

Exemples d'utilisation de la fonction ModifyOrder().

J'ai décidé de donner les tout premiers exemples que l'on m'a déjà demandés à maintes reprises. Il s'agit de l'ouverture de positions en termes d'exécution d'ordres de marché Market Watch. C'est lorsque nous ne pouvons pas simultanément donner un ordre d'ouverture de position au prix du marché et y attacher un ordre en attente. Une telle ouverture sur Market Watch doit être effectuée en deux étapes : d'abord, nous ouvrons une position, puis nous y attachons un ordre en suspens, c'est-à-dire que nous fixons des niveaux de prix StopLoss et TakeProfit.

1. Acheter 0,1 lot du symbole actuel et fixer un stop de 30 points

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Vendre 0,15 lot de l'instrument actuel et fixer un SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
Un script de travail avec des exemples est inclus dans la remorque.


Igor, vérifiez à nouveau - le script ne fonctionne pas :

1) Dans les sociétés de courtage normales, il n'y a pas de limite au nombre d'ordres ouverts (s'ouvre sans fin).

2) Dans les sociétés de courtage où les ordres sont ouverts au marché - (Error131). Vous pouvez le tester, par exemple avec NorthFinance.

 

Tant de fonctions utiles disposées... Peut-être qu'il y a un désir d'écrire un modèle pour écrire un EA de trading qui peut ouvrir et fermer des ordres en attente, des positions, définir des prises et des stoploss, modifier des ordres et des positions, selon des conditions définies par l'utilisateur... Un tel modèle vous permettra d'écrire rapidement un EA où seul le bloc de conditions est modifié (bien sûr, cette partie sera insérée par l'utilisateur en fonction de la stratégie)...


S'il existe des fonctions utiles de Kim, c'est-à-dire un certain niveau de polyvalence dans l'utilisation, alors pourquoi ne pas élaborer le code d'un modèle pour un EA de trading de Kim...

 
Set777 писал (а):
Igor, veuillez vérifier à nouveau - le script ne fonctionne pas :
1) Dans les sociétés de courtage normales, il n'y a pas de limite au nombre d'ordres ouverts (s'ouvre à l'infini)
2) Dans les sociétés de courtage où les ordres sont ouverts par le marché - (Erreur131). Vous pouvez le tester, par exemple NorthFinance.

1. Il n'y a pas de contrôle du nombre de positions ouvertes dans le script. Le nombre de fois que vous exécutez le script, le nombre de positions qu'il ouvrira.

Erreur 131 - Volume et taille de lot incorrects. Probablement, c'est 0.15. Remplacez-le par 0.2

 
kharko писал (а):
Tant de fonctionnalités utiles disposées...

Pas même un cinquième de ce que j'ai en tête pour le moment... Je vais ennuyer tout le monde ici jusqu'à l'automne. Alors soyez indulgent avec moi...

kharko a écrit (a) :
Peut-être qu'il y a un désir d'écrire un modèle pour écrire un conseiller de trading, qui peut ouvrir et fermer des ordres en attente, des positions, définir le take et le stoploss, modifier les ordres et les positions, selon les conditions définies par l'utilisateur...
Modèle... Modèle... Bonne idée ! Merci ! Mais d'abord les fonctions...
 

Fonction DistMarketAndPos().

C'est parti ! Voici des fonctions plus intéressantes ! Par exemple, il renvoie la distance en pips entre le marché et la position la plus proche. Une sélection plus précise des positions à contrôler est définie par des paramètres externes :

  • sy - Nom de l'instrument. Si ce paramètre est défini, la fonction vérifiera uniquement les positions de l'instrument spécifié. Le "" ou 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 - Identifiant de la position (MagicNumber). Valeur par défaut -1 - tout MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
 

Exemples d'utilisation de DistMarketAndPos().

Pourquoi aurait-on besoin d'une fonction qui détermine la distance entre le marché et la position la plus proche ? Je vois au moins quatre options de base :

  1. Acheté ou vendu. Le marché a évolué dans notre direction. Et dès qu'il passe une certaine distance, que les positions existantes ont gagné du profit, nous faisons immédiatement un dépôt - et entrons à nouveau dans la même direction.
  2. Nous achetons ou vendons. Le marché est allé dans notre direction. Une fois qu'il a parcouru une certaine distance et que les positions existantes ont réalisé un certain bénéfice, nous nous rendons immédiatement compte que c'est fini ! Le retournement est proche ! Il est temps de se retourner. Nous fermons nos positions actuelles et ouvrons dans la direction opposée.
  3. Nous achetons ou vendons. Le marché s'est retourné contre nous. Mais pour une raison quelconque, nous sommes sûrs d'avoir raison et, à une certaine distance du point d'entrée le plus proche, c'est-à-dire à un certain niveau de perte, nous faisons la moyenne et ouvrons dans la même direction.
  4. Nous achetons ou vendons. Le marché s'est retourné contre nous. Et nous avons réalisé que nous étions entrés sur le marché de manière incorrecte. Par conséquent, nous nous fixons sur un certain niveau de perte et nous ouvrons dans l'autre sens.

Si je veux passer un ordre avec la bonne méthode, il faut le faire dans le cadre des conditions du marché. Je répondrai à toutes les demandes dans le cadre de ce que j'ai énuméré ci-dessus.

ZZY-ZY. Vous trouverez ci-joint un script "modèle" pour expérimenter la fonction DistMarketAndPos().

Dossiers :
 
Cher KimIV Dans la fonction idPriceLevel() qui fait partie de votre Expert Advisor e-TFL_v2 il y a une erreur : dans la dernière condition gdUpPrice==0 est répétée deux fois. Probablement, dans le deuxième cas vous vouliez écrire gdDnPrice==0. Pour une raison quelconque, cet EA fonctionne dans le Strategy Tester en mode visuel, mais la position du compte de démonstration ne s'ouvre pas, bien que les commentaires informent sur les niveaux d'achat et de vente. Peut-être que tu peux me dire ce qui ne va pas.
 
khorosh:
il y a une erreur dans la fonction bool idPriceLevel() incluse dans e-TFL_v2 Expert Advisor : dans la dernière condition du texte gdUpPrice==0 est répétée deux fois, probablement, dans le deuxième cas vous vouliez écrire gdDnPrice==0.

Merci ! J'ai téléchargé la version corrigée de e-TFL_v2 sur le site web.


khorosh:
Pour une raison quelconque, cet EA fonctionne dans mon Strategy Tester en mode visuel, mais il n'ouvre pas de positions sur un compte de démonstration, bien qu'il signale les niveaux d'achat et de vente dans les commentaires. Vous pouvez peut-être me dire ce qui se passe.

Je ne sais pas... Je viens de finir de tester cet Expert Advisor sur une démo de NorthFinance. Hier, mon ami de Moscou m'a appelé. Il s'est plaint du même conseiller expert. Il dit qu'il ouvre des positions par ligne et ensuite de plus en plus jusqu'à ce que vous l'arrêtiez et qu'il ouvre de nombreuses positions. Il y avait donc deux objectifs pour les tests :

1. En ce qui concerne votre question. Vérification de la fonctionnalité générale.

2. Sur la question de mon ami. J'ai ouvert une seule position à partir d'une seule ligne.

Pour le vérifier, j'ai mis le Conseiller Expert e-TFL_v2 sur les timeframes 5 minutes EURUSD, GBPUSD, USDCHF et USDJPY. En utilisant les lignes de tendance, j'ai dessiné des canaux sur les 20-30 dernières barres. En conséquence, le conseiller expert a fonctionné comme il le devait. L'euro a été acheté sur la ligne du bas, tandis que le yen a été vendu sur la ligne du haut. Pour la livre et le chypre, tout était correct aussi. Vous devez donc le vérifier par vous-même. Le conseiller expert fonctionne.

Raison: