Caratteristiche utili da KimIV - pagina 14

 
KimIV:

Ma permette di fermare l'Expert Advisor premendo il pulsante "Expert Advisors" sulla barra degli strumenti.

Penso che andrà bene, grazie. Non ci sono troppi parametri per lasciare l'EA, non sarà difficile

 

Un esempio di utilizzo della funzione ClosePosBySizeProfitInCurrency()

Specialmente per dimostrare la funzione ClosePosBySizeProfitInCurrency(), ho scritto un Expert Advisor
e-CloseByProfitPosInCurrency, che chiude solo le posizioni in cui il profitto nella valuta di deposito supera un certo valore specificato. L'Expert Advisor può essere installato su un solo grafico o su diversi. Puoi specificare una lista di posizioni da chiudere usando parametri esterni dell'Expert Advisor:

  • symbol="0" - Strumento commerciale. Sono ammessi i seguenti valori: "0" - qualsiasi strumento di trading, "" - solo lo strumento corrente e qualsiasi valore dalla panoramica del mercato (EURUSD, GBPUSD, ecc.).
  • Operazione=-1- Operazione commerciale. Valori validi: -1 - qualsiasi operazione, 0 - OP_BUY, 1 - OP_SELL.
  • Profit=50- Profitto nella valuta del deposito.
  • MagicNumber=0- Identificatore della posizione.
 

Buon pomeriggio a tutti.

Tu, Igor, hai una funzione che chiude le posizioni in perdita in modo simile a ClosePosBySizeProfitInCurrency() quando viene raggiunta una determinata perdita. (O, forse, uno combinato, dove si può specificare la chiusura su profitto e su perdita).

Da quanto ho capito, possiamo semplicemente impostare nei parametri pr per OrderProfit() - con il segno meno e otterremo ciò che stiamo cercando.

È possibile impostare la soglia in punti (non in valuta di deposito)? Se sì, come? (TakeProfit e StopLoss non sono suggeriti)

 
rid писал (а):
Tu, Igor, hai una funzione che chiude le posizioni in perdita in modo simile a ClosePosBySizeProfitInCurrency() quando viene raggiunta una determinata perdita. (O forse uno combinato, dove si può specificare la chiusura su profitto e su perdita).

No, non ho ancora una tale funzione. Tuttavia, potete rifare ClosePosBySizeProfitInCurrency():


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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();
          }
        }
      }
    }
  }
}

Ho fatto in modo che la perdita possa essere passata come un numero positivo (perdita) e negativo (profitto con un segno meno).

rid ha scritto:
Come ho capito, possiamo semplicemente impostare nei parametri pr per OrderProfit() - con il segno meno e otterremo ciò che stiamo cercando.

È possibile impostare la soglia in punti (e non nella valuta del deposito)? Se sì, come? (Take Profit e Stop Loss non sono un'opzione)

Guarda il codice di e-CloseByProfit.

 
Grazie.
 

La funzione ClosePositions().

Questa funzione chiude le posizioni i cui parametri soddisfano i valori specificati:

  • sy - Nome dello strumento. Se impostate questo parametro, la funzione controllerà solo le posizioni dello strumento specificato. NULL significa lo strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Valore predefinito -1 - qualsiasi 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();
        }
      }
    }
  }
}
 
Per favore, aiutatemi!!... Sono 4 giorni che mi sto scervellando su un compito apparentemente semplice. Devo prescrivere, se il CCI è diventato più alto di 100, allora aprite la posizione Buy fino a quando il valore è inferiore a -100, e quando è inferiore a -100, allora aprite la posizione Sell fino a quando è superiore a 100.
 

La funzione ClosePosFirstProfit().

Questa funzione chiude le posizioni in un certo ordine, cioè prima le posizioni redditizie, seguite da tutte le altre posizioni. Una selezione più accurata delle posizioni da chiudere è definita da parametri esterni:

  • sy - Nome dello strumento. Se questo parametro è impostato, la funzione controllerà solo le posizioni dello strumento specificato. NULL significa lo strumento corrente, mentre "" (default) significa qualsiasi strumento.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Valore predefinito -1 - qualsiasi 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();
        }
      }
    }
  }
}
 

La funzione ClosePosWithMaxProfitInCurrency().

Questa funzione chiude una posizione con il massimo profitto positivo nella valuta di deposito. Cioè, su cinque posizioni, ognuna delle quali ha un profitto di -34, 15, 73, -90, 41, la posizione con un profitto di 73 unità nella valuta di deposito sarà chiusa. Una selezione più accurata delle posizioni da chiudere è specificata utilizzando parametri esterni:

  • sy - Nome dello strumento. Se impostiamo questo parametro, la funzione controllerà solo le posizioni dello strumento specificato. NULL significa lo strumento corrente, mentre "" (default) significa qualsiasi strumento.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Valore predefinito -1 - qualsiasi 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:
Se il valore CCI è superiore a 100, allora aprite una posizione di acquisto fino a quando il valore è inferiore a -100 e quando è inferiore a -100, allora aprite una posizione di vendita fino a quando è superiore a 100.

Per te, Dima, posso suggerire questa funzione:

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

Questa funzione restituisce 1 quando si compra e -1 quando si vende. Le condizioni di acquisto/vendita sono quelle che vuoi tu. Tutto quello che dovete fare ora è fare quanto segue su ogni spunta:

1. Ottiene il valore di GetTradeSignal().

2. Se il valore ricevuto =0, allora non fare nulla.

Se il valore ricevuto >0, allora chiudi tutte le vendite e compra.

4. Se il valore ottenuto è <0, allora chiudete tutti gli acquisti e vendete.

Motivazione: