Nützliche Funktionen von KimIV - Seite 14

 
KimIV:

Es ist jedoch möglich, den Expert Advisor durch Drücken der Schaltfläche "Expert Advisors" in der Symbolleiste zu stoppen.

Ich denke, das wird reichen, danke. Es gibt nicht allzu viele Parameter, um den EA zu verlassen, es wird nicht schwer sein

 

Ein Beispiel für die Verwendung der Funktion ClosePosBySizeProfitInCurrency()

Speziell zur Demonstration der Funktion ClosePosBySizeProfitInCurrency() habe ich einen Expert Advisor geschrieben
e-CloseByProfitPosInCurrency, bei dem nur die Positionen geschlossen werden, bei denen der Gewinn in der Einzahlungswährung einen bestimmten Wert übersteigt. Der Expert Advisor kann auf nur einem oder auf mehreren Charts installiert werden. Sie können eine Liste von Positionen angeben, die über externe Parameter des Expert Advisors geschlossen werden sollen:

  • symbol="0" - Handelsinstrument. Die folgenden Werte sind zulässig: "0" - beliebiges Handelsinstrument, "" - nur das aktuelle Instrument und ein beliebiger Wert aus der Marktübersicht (EURUSD, GBPUSD, etc.).
  • Operation=-1- Handelsoperation. Gültige Werte: -1 - beliebiger Handel, 0 - OP_BUY, 1 - OP_SELL.
  • Gewinn=50- Gewinn in der Währung der Einlage.
  • MagicNumber=0- Kennung der Position.
 

Guten Tag an alle.

Haben Sie, Igor, eine Funktion, die verlustbehaftete Positionen ähnlich wie ClosePosBySizeProfitInCurrency() schließt, wenn ein bestimmter Verlust erreicht ist. (Oder vielleicht eine kombinierte, bei der man den Abschluss auf Gewinn und auf Verlust angeben kann).

So wie ich es verstehe, können wir einfach in den Parametern pr für OrderProfit() - mit Minuszeichen einstellen und wir werden bekommen, was wir suchen.

Ist es möglich, den Schwellenwert in Punkten (nicht in Einzahlungswährung) festzulegen? Wenn ja, wie? (TakeProfit und StopLoss werden nicht vorgeschlagen)

 
rid писал (а):
Haben Sie, Igor, eine Funktion, die verlustbehaftete Positionen ähnlich wie ClosePosBySizeProfitInCurrency() schließt, wenn ein bestimmter Verlust erreicht ist. (Oder vielleicht eine kombinierte, bei der Sie den Abschluss bei Gewinn und bei Verlust angeben können).

Nein, eine solche Funktion habe ich noch nicht. Sie können jedoch ClosePosBySizeProfitInCurrency() erneut ausführen:


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}

Ich habe es so eingerichtet, dass der Verlust als positive (Verlust) und negative (Gewinn mit Minuszeichen) Zahl übergeben werden kann.

rid schrieb:
So wie ich es verstehe, können wir einfach in den Parametern pr für OrderProfit() - mit Minuszeichen einstellen und wir werden bekommen, was wir suchen.

Ist es möglich, den Schwellenwert in Punkten (und nicht in der Einzahlungswährung) festzulegen? Wenn ja, wie? (Take Profit und Stop Loss sind keine Option)

Sehen Sie sich den Code von e-CloseByProfit an.

 
Ich danke Ihnen.
 

Die Funktion ClosePositions().

Mit dieser Funktion werden Positionen geschlossen, deren Parameter den angegebenen Werten entsprechen:

  • sy - Name des Instruments. Wenn Sie diesen Parameter setzen, prüft die Funktion nur die Positionen des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Standardwert -1 - eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
Bitte helfen Sie!!! Seit 4 Tagen rätsele ich über eine scheinbar einfache Aufgabe. Ich muss vorschreiben, dass, wenn der CCI höher als 100 ist, eine Kaufposition eröffnet wird, bis der Wert niedriger als -100 ist, und wenn er niedriger als -100 ist, eine Verkaufsposition eröffnet wird, bis er höher als 100 ist.
 

Die Funktion ClosePosFirstProfit().

Diese Funktion schließt Positionen in einer bestimmten Reihenfolge, d.h. profitable Positionen zuerst, gefolgt von allen anderen Positionen. Eine genauere Auswahl der zu schließenden Positionen wird durch externe Parameter definiert:

  • sy - Name des Instruments. Wenn dieser Parameter gesetzt ist, prüft die Funktion nur die Positionen des angegebenen Instruments. NULL bedeutet das aktuelle Instrument, während "" (Standard) ein beliebiges Instrument bedeutet.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Standardwert -1 - eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 

Die Funktion ClosePosWithMaxProfitInCurrency().

Diese Funktion schließt eine Position mit dem maximalen positiven Gewinn in der Einzahlungswährung. Das heißt, von fünf Positionen, von denen jede einen Gewinn von -34, 15, 73, -90, 41 aufweist, wird die Position mit einem Gewinn von 73 Einheiten in der Einzahlungswährung geschlossen. Eine genauere Auswahl der zu schließenden Positionen wird über externe Parameter festgelegt:

  • sy - Name des Instruments. Wenn wir diesen Parameter setzen, wird die Funktion nur die Positionen des angegebenen Instruments überprüfen. NULL bedeutet das aktuelle Instrument, während "" (Standard) ein beliebiges Instrument bedeutet.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Standardwert -1 - eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие одной позиции с максимальным положительным профитом   |
//|             в валюте депозита                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  }
}
 
B_Dima:
Wenn der CCI-Wert über 100 liegt, dann eröffnen Sie eine Kaufposition, bis der Wert unter -100 liegt, und wenn er unter -100 liegt, dann eröffnen Sie eine Verkaufsposition, bis er über 100 liegt.

Für Sie, Dima, kann ich diese Funktion vorschlagen:

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

Diese Funktion liefert 1, wenn gekauft wird, und -1, wenn verkauft wird. Die Kauf-/Verkaufsbedingungen sind so, wie Sie sie haben wollen. Jetzt müssen Sie nur noch für jedes Häkchen Folgendes tun:

1. Ermittelt den Wert von GetTradeSignal().

2. Wenn der empfangene Wert =0 ist, dann nichts tun.

Wenn der erhaltene Wert >0 ist, werden alle Verkäufe geschlossen und gekauft.

4. Wenn der ermittelte Wert <0 ist, schließen Sie alle Käufe und verkaufen Sie.