Nützliche Funktionen von KimIV - Seite 118

 
borilunad:
Dies und jenes, viele unnötige Aufrufe anderer Funktionen mit daraus resultierenden Fehlern!

Nun, Sie haben bereits Fehler gemacht...

Es ist einfach und unkompliziert: Sie können es nach Ihren Bedürfnissen bearbeiten.

 
KimIV:


Können Sie etwas Ähnliches wie das hier zeichnen...

Update...

Im Anhang finden Sie ein Skript zum Testen der Funktion ExistOPNearPrice()

Ich habe es gemacht, weiß aber nicht, ob es richtig ist.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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:

Nun, Sie haben bereits Fehler gemacht...

Es ist einfach und unkompliziert: Passen Sie es an Ihre Bedürfnisse an.

Ich danke Ihnen. Ja, das habe ich schon mit anderen Tricks gemacht.
 
khorosh:

Ich habe es gemacht, aber ich weiß nicht, ob es richtig ist.

Es scheint richtig zu sein... Es ist universell )))
 

Preiskorrektur().


In einem meiner EAs musste ich einmal die Anzahl von 130 "Invalid Stops"-Fehlern drastisch reduzieren. Meine Argumente, dass man keine kleinen Stopps und Take-Points verwenden sollte und dass es eine Grenze für deren Mindestwert gibt, die durch die Einstellung des Handelsservers namens STOPLEVEL festgelegt wird, überzeugten den Kunden nicht. Immerhin, sagte er, könnten wir diesen Fehler irgendwie verarbeiten, bevor wir eine Handelsanfrage an den Server senden. Ich wandte ein, wenn kein Fehler vorliege, wie könne er dann behandelt werden. Aber ein Gedanke setzte sich in mein Gehirn und es begann zu arbeiten und brachte diese Funktion hervor.

Die Funktion CorrectingPrice() dient dazu, die Hauptpreisniveaus von Aufträgen und Positionen zu korrigieren, um die STOPLEVEL-Anforderung zu erfüllen, bevor eine Handelsanfrage an den Server gesendet wird, d.h. bevor die Ausgangsdaten vorbereitet werden.

Alle Parameter dieser Funktion sind obligatorisch, es gibt keine Standardwerte. Außerdem werden die letzten drei Parameter per Referenz übergeben, d.h. sie enthalten das Ergebnis der Arbeit der Funktion. Die Funktion akzeptiert die folgenden Parameter:
  • sy - Name eines Handelsinstruments. Der leere Wert "" oder NULL steht für das aktuelle Handelsinstrument (Symbol).
  • op - Handelsoperation. Die folgenden Werte sind zulässig: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP und OP_SELLSTOP.
  • pp - Eröffnungs-/Einstellungskurs der Position/des Auftrags.
  • sl - StopLoss-Kursniveau.
  • tp - TakeProfit-Preisniveau.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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:

Preiskorrektur().


In einem meiner EAs musste ich einmal die Anzahl von 130 "Invalid Stops"-Fehlern drastisch reduzieren. Meine Argumente, dass man keine kleinen Stopps und Takes verwenden sollte, dass es eine Grenze für ihren Mindestwert gibt, die durch die Einstellung des Handelsservers namens STOPLEVEL festgelegt wird, haben den Kunden nicht überzeugt. Schließlich, so sagte er, könnten wir diesen Fehler irgendwie bearbeiten, bevor wir eine Handelsanfrage an den Server senden. Ich habe pariert, wenn es keinen Fehler gibt, wie könnte es gehandhabt werden. Aber ein Gedanke setzte sich in mein Gehirn und es begann zu arbeiten und brachte diese Funktion hervor.

Die Funktion CorrectingPrice() dient dazu, die Hauptpreisniveaus von Aufträgen und Positionen zu korrigieren, um die STOPLEVEL-Anforderung zu erfüllen, bevor eine Handelsanfrage an den Server gesendet wird, d.h. bevor die Ausgangsdaten vorbereitet werden.

Alle Parameter dieser Funktion sind obligatorisch, es gibt keine Standardwerte. Außerdem werden die letzten drei Parameter per Referenz übergeben, d.h. sie enthalten das Ergebnis der Arbeit der Funktion. Die Funktion akzeptiert die folgenden Parameter:
  • sy - Name eines Handelsinstruments. Der leere Wert "" oder NULL gibt das aktuelle Handelsinstrument (Symbol) an.
  • op - Handelsoperation. Die folgenden Werte sind zulässig: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP und OP_SELLSTOP.
  • pp - Eröffnungs-/Einstellungskurs der Position/des Auftrags.
  • sl - StopLoss-Kursniveau.
  • tp - TakeProfit-Preisniveau.

Igor, einige Maklerfirmen verwenden Spread*2 anstelle von StopLevel, das einen Nullwert hat. Bei einer kurzen Durchsicht des Codes habe ich die Prüfung für diese Situation nicht bemerkt. Es wäre gut, den Code zu korrigieren, um diese Situation zu überprüfen, sonst wird es die gleichen 130 Fehler
 
artmedia70:
Igor, einige Maklerfirmen verwenden Spread*2 anstelle von StopLevel, das den Wert Null hat. Nach einem flüchtigen Blick auf den Code habe ich keine Prüfung für diese Situation gefunden. Es wäre schön, den Code zu optimieren, um diese Situation zu überprüfen, sonst wird es die gleichen 130 Fehler sein


Artem, ich habe keinen solchen DC getroffen... Können Sie mir ein paar davon in Ihrer persönlichen Nachricht schicken? Ich werde die Handelsbestimmungen lesen...

Oder gibt es einen einfacheren Weg, dies zu tun? Können Sie mir sagen, ob es richtig ist, eine solche Korrektur zu verwenden?

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

UPDATE: Ich habe die FunktionCorrectingPrice() korrigiert.

 

Eine neue Version der Funktion CorrectTF().

Vor einiger Zeit wurde ich für die FunktionCorrectTF() kritisiert, weil ihre Funktionalität nicht mit ihrem Namen übereinstimmt. Tatsächlich wird der Zeitrahmen auf das nächstgelegene Minimum angepasst und nicht nur auf das nächstgelegene. Ich habe die arithmetischen Mittelwerte zwischen den Standardzeiträumen berechnet und die Funktion entsprechend ihrer Beschreibung neu geschrieben.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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, ich habe keinen solchen DC getroffen... Können Sie mir ein paar davon in Ihrer persönlichen Nachricht schicken? Ich werde die Handelsbestimmungen lesen...

Fallengelassen

Oder Sie könnten etwas Einfacheres machen. Können Sie mir sagen, ob es richtig ist, eine solche Korrektur zu verwenden?

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

Natürlich ist alles richtig.

UPDATE: Ich habe die FunktionCorrectingPrice() korrigiert.

Igor, ich mache praktisch dasselbe in EAs, ich lese immer zuerst die Daten und weise der Variablen den gewünschten Wert zu, dann prüfe ich die Berechnungen damit.
 
KimIV:


Artem, ich habe noch keine solchen DCs gefunden... Können Sie mir ein paar davon in Ihrer persönlichen Nachricht schicken? Ich werde die Handelsbestimmungen lesen...

Oder Sie können es auf einfachere Weise tun. Sagen Sie mir selbst, ob es richtig ist, einen solchen Änderungsantrag zu verwenden?

UPDATE: Ich habe eine Änderung an der FunktionCorrectingPrice() vorgenommen.

Hallo, liebe Kollegen, ich bin noch dabei, den Code zu studieren, ich kann die Feinheiten nicht gut verstehen und bin etwas ratlos.

So wie ich es verstehe, müssen wir diese Funktion aufrufen, um die Parameter zu korrigieren, bevor wir eine Bestellung aufgeben.

Es gibt eine solche Zeile, um eine Bestellung zu eröffnen:

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);

Ist dies der Ort, an dem es angesprochen werden sollte? Und wie man es richtig macht. Oder braucht dieser Befehl keinCorrectingPrice()?

Ich danke Ihnen im Voraus.