Fonctions utiles de KimIV - page 118

 
borilunad:
Ceci et cela, beaucoup d'appels inutiles à d'autres fonctions avec les erreurs qui en résultent !

Eh bien, vous avez déjà fait des erreurs...

Il est simple et direct : vous pouvez le modifier en fonction de vos besoins.

 
KimIV:


Pouvez-vous dessiner quelque chose de similaire à celui-ci...

mise à jour...

Vous trouverez ci-joint un script permettant de tester la fonction ExistOPNearPrice().

Je l'ai fait, je ne sais pas si c'est correct.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets(string sy="", int op=-1, int mn=-1, double price = -1, int ds=1000000) {
  int i, k=OrdersTotal(), ot;

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.00001; else p=0.001;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (OrderSymbol()==sy) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
            if ((price<0 && MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price>0 && MathAbs(price-OrderOpenPrice())<ds*p)) 
               {
                return(True);
               }
          }
          if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
            if ((price<0 && MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price>0 && MathAbs(OrderOpenPrice()-price)<ds*p)) 
               {
                return(True);
               }
          }
        }
      }
    }
  }
  return(False);
}
 
artmedia70:

Eh bien, vous avez déjà fait des erreurs...

C'est simple et direct : ajustez comme vous le souhaitez.

Merci. Oui, je me suis déjà débrouillé avec d'autres astuces.
 
khorosh:

Je l'ai fait, je ne sais pas si c'est bien.

Il semble que ce soit juste... C'est universel ;)))
 

Corriger le prix().


Dans l'un de mes EA, j'ai eu besoin de réduire considérablement le nombre de 130 erreurs "Invalid Stops". Mes arguments selon lesquels il ne faut pas utiliser de petits stops et prises, qu'il existe une limite de leur valeur minimale qui est fixée par le paramètre du serveur de négociation appelé STOPLEVEL, n'ont pas convaincu le client. Après tout, a-t-il dit, nous pourrions d'une manière ou d'une autre traiter cette erreur avant d'envoyer une demande de transaction au serveur. J'ai parié, s'il n'y a pas d'erreur, comment pourrait-on la gérer. Mais une idée a germé dans mon cerveau, qui a commencé à fonctionner et a donné naissance à cette fonction.

La fonction CorrectingPrice() est destinée à corriger les niveaux de prix principaux des ordres et des positions afin de répondre à l'exigence STOPLEVEL avant d'envoyer une demande de transaction au serveur, c'est-à-dire avant de préparer les données initiales.

Tous les paramètres de cette fonction sont obligatoires, il n'y a pas de valeurs par défaut. En outre, les trois derniers paramètres sont passés par référence, c'est-à-dire qu'ils contiendront le résultat du travail de la fonction. La fonction accepte les paramètres suivants :
  • sy - Nom d'un instrument commercial. La valeur vide "" ou NULL indique l'instrument de négociation actuel (symbole).
  • op - Opération commerciale. Les valeurs suivantes sont autorisées : OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP et OP_SELLSTOP.
  • pp - Prix d'ouverture/de fixation de la position/de l'ordre.
  • sl - Niveau de prix du StopLoss.
  • tp - Niveau de prix TakeProfit.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2013                                                     |
//|  Описание : Выполняет корректирование ценовых уровней под STOPLEVEL.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование торгового инструмента                                 |
//|    op - торговая операция                                                  |
//|    pp - цена открытия/установки                                            |
//|    sl - ценовой уровень StopLoss                                           |
//|    tp - ценовой уровень TakeProfit                                         |
//+----------------------------------------------------------------------------+
void CorrectingPrice(string sy, int op, double& pp, double& sl, double& tp) {
  if (sy=="" || sy=="0") sy=Symbol();
  RefreshRates();
  int    di=MarketInfo(sy, MODE_DIGITS);
  int   msl=MarketInfo(sy, MODE_STOPLEVEL);
  int    sp=MarketInfo(sy, MODE_SPREAD);
  double mp=MarketInfo(sy, MODE_POINT);
  double pa=MarketInfo(sy, MODE_ASK);
  double pb=MarketInfo(sy, MODE_BID);
  double ds=NormalizeDouble(pp-sl, di);
  double dp=NormalizeDouble(pp-tp, di);

  if (msl==0) msl=2*sp;
  switch (op) {
    case OP_BUY:
      pp=pa;
      sl=pp-ds;
      tp=NormalizeDouble(pp-dp, di);
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELL:
      pp=pb;
      sl=NormalizeDouble(pp-ds, di);
      tp=pp-dp;
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_BUYLIMIT:
      if (pp>pa-msl*mp) {
        pp=pa-msl*mp;
        sl=pp-ds;
        tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_BUYSTOP:
      if (pp<pa+msl*mp) {
        pp=pa+msl*mp;
        if (sl>0) sl=pp-ds;
        if (tp>0) tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELLLIMIT:
      if (pp<pb+msl*mp) {
        pp=pb+msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_SELLSTOP:
      if (pp>pb-msl*mp) {
        pp=pb-msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    default:
      Message("CorrectingPrice(): Неизвестная торговая операция!");
      break;
  }
}

 
KimIV:

Corriger le prix().


Dans l'un de mes EA, j'ai eu besoin de réduire considérablement le nombre de 130 erreurs "Invalid Stops". Mes arguments selon lesquels il ne faut pas utiliser de petits stops et points d'arrêt et qu'il existe une limite à leur valeur minimale fixée par le paramètre du serveur de négociation appelé STOPLEVEL n'ont pas convaincu le client. Après tout, a-t-il dit, nous pourrions d'une manière ou d'une autre traiter cette erreur avant d'envoyer une demande de transaction au serveur. J'ai parié, s'il n'y a pas d'erreur, comment pourrait-on la gérer. Mais une idée a germé dans mon cerveau, qui a commencé à fonctionner et a donné naissance à cette fonction.

La fonction CorrectingPrice() est destinée à corriger les niveaux de prix principaux des ordres et des positions afin de répondre à l'exigence STOPLEVEL avant d'envoyer une demande de transaction au serveur, c'est-à-dire avant de préparer les données initiales.

Tous les paramètres de cette fonction sont obligatoires, il n'y a pas de valeurs par défaut. En outre, les trois derniers paramètres sont passés par référence, c'est-à-dire qu'ils contiendront le résultat du travail de la fonction. La fonction accepte les paramètres suivants :
  • sy - Nom d'un instrument commercial. La valeur vide "" ou NULL indique l'instrument commercial actuel (symbole).
  • op - Opération commerciale. Les valeurs suivantes sont autorisées : OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP et OP_SELLSTOP.
  • pp - Prix d'ouverture/de fixation de la position/de l'ordre.
  • sl - Niveau de prix du StopLoss.
  • tp - Niveau de prix TakeProfit.

Igor, certaines sociétés de courtage utilisent le Spread*2 au lieu du StopLevel, qui a une valeur nulle. En examinant brièvement le code, je n'ai pas remarqué la vérification de cette situation. Il serait bon de corriger le code pour vérifier cette situation, sinon il y aura les mêmes 130 erreurs
 
artmedia70:
Igor, certaines sociétés de courtage utilisent le Spread*2 au lieu du StopLevel qui a une valeur nulle. Après un coup d'œil rapide au code, je n'ai pas vu de vérification pour cette situation. Il serait bon de modifier le code pour vérifier cette situation, sinon ce sera les mêmes 130 erreurs.


Artem, je n'ai pas rencontré un tel DC... Pouvez-vous m'en envoyer quelques-unes dans votre message personnel ? Je vais lire les règlements commerciaux...

Ou existe-t-il un moyen plus simple de procéder ? Pouvez-vous me dire si c'est assez correct pour utiliser une telle correction ?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

MISE À JOUR: J'ai corrigé la fonctionCorrectingPrice().

 

Une nouvelle version de la fonction CorrectTF().

Il y a quelque temps, j'ai été critiqué pour la fonctionCorrectTF() en affirmant que sa fonctionnalité ne correspond pas à son nom. En fait, il ajuste le délai au minimum le plus proche et pas seulement au plus proche. J'ai calculé les valeurs moyennes arithmétiques entre les échéances standard et réécrit la fonction conformément à sa description.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.05.2013                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество минут).                               |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame) {
  if (TimeFrame>     1 && TimeFrame<    3) return(PERIOD_M1);
  if (TimeFrame>=    3 && TimeFrame<   10) return(PERIOD_M5);
  if (TimeFrame>=   10 && TimeFrame<   23) return(PERIOD_M15);
  if (TimeFrame>=   23 && TimeFrame<   45) return(PERIOD_M30);
  if (TimeFrame>=   45 && TimeFrame<  150) return(PERIOD_H1);
  if (TimeFrame>=  150 && TimeFrame<  840) return(PERIOD_H4);
  if (TimeFrame>=  840 && TimeFrame< 5760) return(PERIOD_D1);
  if (TimeFrame>= 5760 && TimeFrame<26640) return(PERIOD_W1);
  if (TimeFrame>=26640                   ) return(PERIOD_MN1);
}
 
KimIV:


Artem, je n'ai pas rencontré un tel DC... Pouvez-vous m'en envoyer quelques-unes dans votre message personnel ? Je vais lire les règlements commerciaux...

Abandonné

Ou vous pouvez faire quelque chose de plus simple. Pouvez-vous me dire si c'est assez correct pour utiliser une telle correction ?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

Bien sûr, tout est correct.

UPDATE: J'ai corrigé la fonctionCorrectingPrice().

Igor, je fais pratiquement la même chose dans les EAs, je lis toujours les données en premier et j'assigne la valeur requise au niveau de la variable, puis je vérifie les calculs avec celle-ci.
 
KimIV:


Artyom, je n'ai pas rencontré de DCs comme ça... Pouvez-vous m'en envoyer quelques-unes dans votre message personnel ? Je vais lire les règlements commerciaux...

Ou vous pouvez le faire d'une manière plus simple. Dites-moi vous-même, est-ce assez correct d'utiliser un tel amendement ?

MISE À JOUR: J'ai apporté une modification à la fonctionCorrectingPrice().

Bonjour, chers collègues, je suis encore en train d'étudier le code, je ne comprends pas bien les subtilités et suis un peu dans l'embarras.

Si je comprends bien, nous devons appeler cette fonction pour corriger les paramètres avant de passer une commande.

Il existe une telle ligne pour ouvrir une commande :

if(buy == true && Open[0]>UpTr && Trade) {

buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(),NormalizeDouble(op,Digits),slippage,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits), "T",Magic,0,MediumBlue) ;

est-ce là qu'il faut l'aborder ? Et comment le faire correctement. Ou cette commande n'a pas besoin deCorrectingPrice() ?

Merci d'avance.