Fonctions utiles de KimIV - page 51

 
Cher Igor, je m'excuse si j'ai offensé quelqu'un... Je ne critiquais pas vraiment, c'est dommage que ça ressemble à ça. Dans tous les cas, le prototype affiché sera corrigé et affiné plus d'une fois. Pour qu'il n'y ait pas d'énigmes (je n'ai jamais prétendu être l'auteur), je vous enverrai le travail pour une révision d'auteur à l'avenir. Je me considère comme la première étape jusqu'à présent 25 pages. Dès que je l'aurai terminé, je l'enverrai à l'adresse mentionnée sur votre site. Merci pour votre travail inestimable et le partage désintéressé de votre expérience ! !!
 
rid писал (а) >>

Je pense que c'est possible. Apparemment, il est nécessaire de vérifier à chaque niveau (au croisement) quelle est la taille actuelle du lot de la position ouverte. Et c'est exactement selon ce critère que nous devrions mettre en place un mécanisme de fermeture !

Ces fonctions (qui renvoient la taille du lot) sont disponibles dans cette branche. Regardez les pp. 17 и 27

Merci beaucoup ! Hourra ! Maintenant je peux passer à autre chose. Merci beaucoup !

 

Afin de déterminer si des contrôles supplémentaires de la taille du lot sont nécessaires ou non dans la fonction OpenPosition(), il faut voir comment calcule la taille du lot et comment et où elle est appelée ; je n'ai pas vu cette fonction dans la branche

double ll=GetSizeLot();

J'ai peut-être manqué .

Si c'est calculé comme ça https://championship.mql5.com/2012/ru/news, vous risquez d'avoir une erreur de 134 et de manquer le championnat :-)

 

Salut KimIV.envoyé une chose, il faudra lui répondre. Je ne suis pas très bon en programmation et j'étudie pour être trader depuis 3 semaines. Ma grammaire n'est pas bonne non plus.

ici. Ma question est la suivante. Est-il possible de faire un EA en utilisant l'indicateur CCi ?

Niveaux CCi 250, 50, -50, -250. L'idée est que lorsqu'il atteint (croise) -50 et 50, respectivement, je vendrais ou achèterais. Réfléchissez au moment où l'opération doit s'arrêter :

1Puis (disons qu'il y a une vente) le graphique traverse -250, puis il traverse dans la direction opposée -250 (vous pouvez le voir sur l'image).

2 Le graphique n'a pas atteint 250 et croise à nouveau à 50.

Pour l'achat, c'est la même chose, mais vice versa.

Cotation Euro/Dollar, n'importe quel cadre temporel.

Combien coûterait un EA en peluche comme celui-ci ? ? ???

Si le prix est le même, pouvez-vous offrir quelque chose de mieux ?

Merci d'avance. Je l'espère. Eh bien, je suis allé à un cours de FOREX.

Au fait, le forex est un vrai moyen de gagner son pain et son beurre ????.

 

Salutations à tous.

J'ai trouvé cet indicateur, je l'ai modifié un peu - il crée de bonnes lignes de tendance.

Il serait intéressant de concocter une fonction... (c'est un peu une demande de KimIV).

Dossiers :
tlbs.mq4  8 kb
 
Prival писал(а) >>

Re.

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po) ;

Peut-être serait-il préférable d'appeler OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44) ;

Cette suggestion, Sergei, augmente la commodité de l'utilisation des stops et des prises fixées en pips. Qu'en est-il des cas où les arrêts et les prises sont fixés par les niveaux de prix ? Par exemple, un stop au niveau du plus bas ou du plus haut de la barre précédente. Ou par une sorte de ligne. Est-il converti en points avant d'appeler la fonction et reconverti en prix dans la fonction ? Il s'agit d'une opération redondante. Je vais donc laisser les choses en l'état.

Nous examinerons plus tard la fonction GetSizeLot() (d'ailleurs, elle s'appelle maintenant GetLots()). Tout d'abord, nous devons finir d'utiliser les bibliothèques b-ForTest.mqh et b-Positions.mqh.

 

La fonction CountOrders() pour le testeur.

Dans mes versions de test (destinées à être utilisées uniquement dans le testeur de MT4) des Expert Advisors, la fonction CountOrders() remplace les fonctions suivantes : ExistOrders(), ExistPositions(), NumberOfOrders() et NumberOfPositions(). C'est-à-dire qu'il peut donner des informations sur l'existence d'une position ou d'un ordre de n'importe quel type, ainsi que des informations sur le nombre de transactions de chaque type. Un tel échange a ses propres avantages, qui s'expriment par une référence unique à la base d'ordres pour un tick et l'obtention de toutes les informations nécessaires en une seule fois. Et les fonctions susmentionnées, surtout lorsqu'elles sont utilisées ensemble, fonctionnent chacune indépendamment avec une seule et même base de commande, de sorte qu'elles effectuent les mêmes appels de manière répétée. En conséquence, la fonction CountOrders() peut réduire le temps d'une passe de plusieurs secondes, ce qui permet de gagner des heures d'optimisation.

La fonction CountOrders() prend les paramètres suivants :

  • mo - Tableau du nombre de commandes par type. Après l'exécution de la fonction, le tableau comportera 6 (six) éléments. Élément zéro - nombre de transactions de type Achat, premier élément - nombre d'ordres de Vente, deuxième élément - BuyLimit, troisième élément - SellLimit, quatrième élément - BuyStop, cinquième élément - SellStop.
  • mn - Identifiant d'une position ou d'un ordre (MagicNumber). La valeur par défaut est -1 - tout MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize( mo)!=6) ArrayResize( mo, 6);
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ( mn<0 || OrderMagicNumber()== mn) mo[OrderType()]++;
    }
  }
}

P.S. Vous trouverez ci-joint un script pour tester la fonction CountOrders() en ligne.

Dossiers :
 

Bonjour, Igor et tous les autres aussi. J'ai un problème avec la fonction GetFractalBar(NULL,0, 0). - Elle renvoie le numéro de la barre fractale par son numéro. Pour être plus précis, le problème ne vient pas de la fonction. Mais quelque part près d'elle.

Tout est OK lorsque le commentaire est affiché avec ce paramètre. J'ai HAVE le numéro de la barre dans le coin du graphique.

int a;
... ...

int start()
  {
//----
if(Time[0] == prevtime)   return(0);//ждём нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

if ( isFractalUp() > isFractalDn() )  {//если это Down-фрактал

   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   
Comment( GetFractalBar(NULL,0, 0));            }

Et tout va bien lorsque j'affiche les numéros des commentaires dans le coin du graphique. Je vois les valeurs de prix minimum de la barre avec la fractale dans le coin gauche.

if ( isFractalUp() > isFractalDn() ) {//если это Down-фрактал
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));

Comment(iLow(NULL,0, GetFractalBar(NULL,0, 0)));          }

Mais plus généralement, ce n'est pas clair ! Dès que j'insère la variable "a" dans le commentaire au lieu de la fonction elle-même, le commentaire renvoie 1 dans le coin au lieu de la valeur du prix ! Ici :

if ( isFractalUp() < isFractalDn() ) {
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   Comment( a);                        }
Je suis assis depuis trois heures, je ne comprends pas ce qui ne va pas ! Dites-moi si vous pouvez....
 
Rita писал(а) >>
Dès que j'insère la variable "a" dans le commentaire au lieu de la fonction elle-même, le commentaire renvoie 1 dans le coin au lieu de la valeur du prix !

Vous avez déclaré la variable "a" comme une variable entière, c'est à dire

int a ;

Vous devez la déclarer comme une variable réelle, c'est-à-dire

double a ;

 

Fonction ModifyOrder() pour le testeur.

Il s'agit d'une version simplifiée de la fonction ModifyOrder(), publiée à la page 7, qui est conçue pour modifier les niveaux de prix absolus d'un ordre ou d'une position présélectionnés.

La fonction ModifyOrder() accepte les paramètres suivants :

  • pp - Prix de fixation de la commande. Si vous passez une valeur inférieure ou égale à zéro, la modification de ce niveau de prix ne sera pas effectuée. La valeur par défaut est -1.
  • sl - Niveau de prix d'arrêt. Si vous passez une valeur inférieure à zéro, la modification du niveau de prix ne sera pas effectuée. La valeur par défaut est 0.
  • tp - Niveau de prix de prise. Si vous passez une valeur inférieure à zéro, la modification du niveau des prix ne sera pas mise en œuvre. La valeur par défaut est 0.
  • ex - Date d'expiration de l'ordre en cours. La valeur par défaut est 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);

  if ( pp!= op || sl!= os || tp!= ot) {
    if (MathMod(OrderType(), 2)==0) cl= clModifyBuy; else cl= clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(", er,") modifying order: ", ErrorDescription( er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+ GetNameOP(OrderType())," pp=", pp," sl=", sl," tp=", tp);
    }
  }
}
Raison: