Fonctions utiles de KimIV - page 114

 

Bon après-midi.

Je suis encore novice en matière de programmation, si quelqu'un peut me donner un conseil.

Question. Nous avons un ou plusieurs ordres ouverts. Nous savons qu'ils clôtureront avec un profit de 20 $.

Nous devons savoir à quel prix les ordres seront clôturés avec un profit de 20 $.

Nous calculons le volume total des lots ouverts, et ensuite !

Veuillez me conseiller sur la manière de procéder.

Peut-être existe-t-il une fonction de préparation ?

Merci d'avance.

 
KimIV:

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 vous souhaitez une mise en œuvre spécifique de l'une de ces options, écrivez vos demandes ici. 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 modèle pour expérimenter la fonction DistMarketAndPos().


BonjourKimIV, la fonction est très bien, elle fonctionne, je la retourne, elle fonctionne aussi, mais je n'arrive pas à relier les deux moitiés.

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, 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, "")<0) p=0.00001; 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);

}  


 

S'il vous plaît, retournez-le pour moi, tout le monde dit que c'est mal mais ça marche.
 
Nouveaux arrivants, posez vos questions dans le fil de discussion dédié.
 

Nouvelle version de la fonction Message().


La fonction Message( ) a subi deux changements depuis sa publication ici. La première modification a ajouté la possibilité de désactiver la sortie dans le journal expert par Print() et la possibilité de ne sortir que le premier message d'une série de messages similaires. La deuxième modification a ajouté des directions de sortie, c'est-à-dire qu'en plus des fonctions existantes Comment() et Print(), les fonctions Alert(), SendMail() et SendNotification() ont été utilisées. C'est ce dernier changement que je publie.

La fonction Message() est conçue pour sortir le message texte dans différentes directions. Il peut être utilisé à la fois à des fins de débogage et dans des applications prêtes à l'emploi pour expliquer la situation actuelle du trading, pour enregistrer le fonctionnement du programme, pour informer en temps utile un trader des changements importants, etc. La fonction accepte trois paramètres, dont les deux derniers sont facultatifs :
  • ms - Chaîne, message textuel à sortir, transmis.
  • nv - Une chaîne de drapeaux qui spécifie la direction de la sortie du message. Cinq drapeaux représentent cinq endroits importants. Chaque face de drapeau avec zéro active et un désactive une direction de sortie particulière. De gauche à droite, dans l'ordre, il s'agit de Alert, Comment, Print, SendMail et SendNotification. La valeur par défaut est "01100", c'est-à-dire que les fonctions Commentaire et Impression sont activées, les autres sont désactivées.
  • am - Logique, True - sortie de tous les messages, False - à partir d'une série de messages identiques, sortie uniquement du premier. La valeur par défaut est False.

En ce qui concerne les directions de sortie Alert et Print (espaces 1 et 3), il convient de noter qu'elles sont capables de sortir le message ligne par ligne. En d'autres termes, s'il y a un saut de ligne dans le texte du message - caractère de contrôle "\n", chaque ligne sera imprimée indépendamment. Essayez le script de test dans la pièce jointe, je pense que vous l'apprécierez :-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

SZY. Vous trouverez ci-joint un script pour tester la fonction Message().

Dossiers :
 
KimIV:

Nouvelle version de la fonction Message().


La fonction Message( ) a subi deux changements depuis sa publication ici. La première modification a ajouté la possibilité de désactiver la sortie dans le journal expert par Print() et la possibilité de ne sortir que le premier message d'une série de messages similaires. La deuxième modification a ajouté des directions de sortie, c'est-à-dire qu'en plus des fonctions existantes Comment() et Print(), les fonctions Alert(), SendMail() et SendNotification() ont été utilisées. C'est ce dernier changement que je publie.

La fonction Message() est conçue pour sortir le message texte dans différentes directions. Il peut être utilisé à la fois à des fins de débogage et dans des applications prêtes à l'emploi pour expliquer la situation actuelle du trading, pour enregistrer le fonctionnement du programme, pour informer en temps utile un trader des changements importants, etc. La fonction accepte trois paramètres, dont les deux derniers sont facultatifs :
  • ms - Chaîne, message textuel à sortir, transmis.
  • nv - Une chaîne de drapeaux qui spécifie la direction de la sortie du message. Cinq drapeaux représentent cinq endroits importants. Chaque face de drapeau avec zéro active et un désactive une direction de sortie particulière. De gauche à droite, dans l'ordre, il s'agit de Alert, Comment, Print, SendMail et SendNotification. La valeur par défaut est "01100", c'est-à-dire que les fonctions Commentaire et Impression sont activées, les autres sont désactivées.
  • am - Logique, True - sortie de tous les messages, False - à partir d'une série de messages identiques, sortie uniquement du premier. La valeur par défaut est False.

En ce qui concerne les directions de sortie Alert et Print (espaces 1 et 3), il convient de noter qu'elles sont capables de sortir le message ligne par ligne. Autrement dit, s'il y a un saut de ligne dans le texte du message - caractère de contrôle "\n", alors chaque ligne sera imprimée indépendamment. Essayez le script de test dans la pièce jointe, je pense que vous l'apprécierez :-)


SZY. Vous trouverez ci-joint un script pour tester la fonction Message().

Avez-vous ajouté une vérification de l'arrêt du jeu à votre fonction OpenPosition ?
 
sv.:
Avez-vous ajouté une vérification du nivellement de l'arrêt à votre fonction OpenPosition ?


Non... à quel type de contrôle faites-vous référence ? Bon, disons que l'arrêt et la prise ont échoué le chèque, que faire ? Il existe des options :

  1. Ne pas ouvrir,
  2. Ajustez l'arrêt et l'emport.

 
KimIV:


non... à quel type de contrôle faites-vous référence ? Bon, disons que l'arrêt et la prise n'ont pas passé le contrôle, que faites-vous ? Il existe des options :

  1. Ne pas ouvrir,
  2. Ajustez l'arrêt et la prise.

Vous pourriez introduire un commutateur personnalisé entre les éléments 1 et 2, en suivant le modèle :
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Nouvelle version de la fonctionOpenPosition() dans le script de test.

Quoi de neuf ?

1. Lorsque l'erreur 130 Invalid Stops et la valeur de la variable NumberOfTry>1 sont définies, la fonction essaiera d'ajuster les niveaux de prix StopLoss et TakeProfit aux valeurs de MODE_STOPLEVEL+MODE_SPREAD par rapport à Bid pour OP_SELL et Ask pour OP_BUY.

Note :

La variable globaleNumberOfTry doitêtre supérieure à 1 pour déclencher la correction des niveaux de prix. Cela est dû aufait que la première tentative d'ouverture d'une position révèle l'erreur 130 et corrige les niveaux de prix, tandis que la deuxième et les suivantes tentent d'ouvrir une position avec des niveaux corrigés.

Dossiers :
 
KimIV, c'est bon de te revoir ici avec de nouvelles fonctionnalités.
 

Bon après-midi.

Est-il possible de compléter la bibliothèque de fonctions utiles de KimIV avec des fonctions simples comme :

1. leprix ouvert, sélectionné par une position de critères (symbole, type, taille de lot, numéro magique). Ce prix peut être stocké dans des variables globales et utilisé comme un certain niveau de prix, à partir duquel l'algorithme du conseiller expert peut être construit.

Renvoie un ticket sélectionné selon certains critères d'une position ou d'un ordre (symbole, type, taille de lot, numéro magique). Le billet est un identifiant important, il peut être utilisé partout et même comme un drapeau d'existence.

Plus il y aura de fonctions simples de ce type, plus il sera facile de trouver celles qui vous conviennent le mieux, sans craindre de faire une erreur en modifiant les fonctions existantes.

Merci pour vos fonctions.

Raison: