Caratteristiche utili da KimIV - pagina 118

 
borilunad:
Questo e quello, molte chiamate inutili ad altre funzioni con conseguenti errori!

Beh, hai già fatto degli errori...

È semplice e diretto: puoi modificarlo in base alle tue esigenze.

 
KimIV:


Puoi disegnare qualcosa di simile a questo...

aggiornamento...

In allegato uno script per testare la funzione ExistOPNearPrice()

Fatto, non so se è corretto.

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

Beh, hai già fatto degli errori...

È semplice e diretto: regolati come vuoi.

Grazie. Sì, mi sono già arrangiato con altri trucchi.
 
khorosh:

L'ha fatto, non so se è giusto.

Sembra essere giusto... È universale )))
 

CorreggerePrice().


In uno dei miei EA una volta avevo bisogno di ridurre drasticamente il numero di 130 errori "Invalid Stops". Le mie argomentazioni sul fatto che non si dovrebbero usare piccoli stop e take, che c'è un limite del loro valore minimo che è fissato dall'impostazione del server di trading chiamata STOPLEVEL, non hanno convinto il cliente. Dopo tutto, ha detto, potremmo in qualche modo elaborare questo errore prima di inviare una richiesta di scambio al server. Ho parato, se non c'è un errore, come potrebbe essere gestito. Ma un pensiero mi è entrato nel cervello e ha iniziato a funzionare e ha dato vita a questa funzione.

La funzione CorrectingPrice() è destinata a correggere i livelli di prezzo principali degli ordini e delle posizioni per soddisfare il requisito STOPLEVEL prima di inviare una richiesta di trading al server, cioè prima di preparare i dati iniziali.

Tutti i parametri di questa funzione sono obbligatori, non ci sono valori predefiniti. Inoltre, gli ultimi tre parametri sono passati per riferimento, cioè conterranno il risultato del lavoro della funzione. La funzione accetta i seguenti parametri:
  • sy - Nome di uno strumento commerciale. Il valore vuoto "" o NULL indicherà lo strumento di scambio corrente (simbolo).
  • op - operazione commerciale. Sono ammessi i seguenti valori: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP e OP_SELLSTOP.
  • pp - Prezzo di apertura/impostazione della posizione/ordine.
  • sl - livello di prezzo StopLoss.
  • tp - Livello di prezzo 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:

CorreggerePrice().


In uno dei miei EA una volta avevo bisogno di ridurre drasticamente il numero di 130 errori "Invalid Stops". Le mie argomentazioni sul fatto che non si dovrebbero usare piccoli stop e take point e che c'è un limite al loro valore minimo stabilito dall'impostazione del server di trading chiamata STOPLEVEL non hanno convinto il cliente. Dopo tutto, ha detto, potremmo in qualche modo elaborare questo errore prima di inviare una richiesta di scambio al server. Ho parato, se non c'è un errore, come potrebbe essere gestito. Ma un pensiero mi è entrato nel cervello e ha iniziato a funzionare e ha dato vita a questa funzione.

La funzione CorrectingPrice() è destinata a correggere i livelli di prezzo principali degli ordini e delle posizioni per soddisfare il requisito STOPLEVEL prima di inviare una richiesta di trading al server, cioè prima di preparare i dati iniziali.

Tutti i parametri di questa funzione sono obbligatori, non ci sono valori predefiniti. Inoltre, gli ultimi tre parametri sono passati per riferimento, cioè conterranno il risultato del lavoro della funzione. La funzione accetta i seguenti parametri:
  • sy - Nome di uno strumento commerciale. Il valore vuoto "" o NULL indicherà lo strumento di scambio corrente (simbolo).
  • op - operazione commerciale. Sono ammessi i seguenti valori: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP e OP_SELLSTOP.
  • pp - Prezzo di apertura/impostazione della posizione/ordine.
  • sl - livello di prezzo StopLoss.
  • tp - Livello di prezzo TakeProfit.

Igor, alcune società di brokeraggio usano Spread*2 invece di StopLevel, che ha valore zero. Rivedendo brevemente il codice, non ho notato il controllo per questa situazione. Sarebbe bene correggere il codice per controllare questa situazione, altrimenti causerà gli stessi errori del 130
 
artmedia70:
Igor, alcune società di brokeraggio usano Spread*2 invece di StopLevel che ha valore zero. Dopo un'occhiata sommaria al codice, non ho visto alcun controllo per questa situazione. Sarebbe bello modificare il codice per controllare questa situazione, altrimenti saranno gli stessi 130 errori


Artem, non ho incontrato tale DC... Puoi mandarmene un paio nel tuo messaggio personale? Leggerò il regolamento commerciale...

O c'è un modo più semplice per farlo? Potete dirmi se è abbastanza corretto usare tale correzione?

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

AGGIORNAMENTO: ho corretto la funzioneCorrectingPrice().

 

Una nuova versione della funzione CorrectTF().

Qualche tempo fa sono stato criticato per la funzioneCorrectTF() sostenendo che la sua funzionalità non corrisponde al suo nome. In effetti, regola l'orizzonte temporale al minimo più vicino e non solo a quello più vicino. Ho calcolato la media aritmetica dei valori tra i tempi standard e ho riscritto la funzione secondo la sua descrizione.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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, non ho incontrato tale DC... Puoi mandarmene un paio nel tuo messaggio personale? Leggerò il regolamento commerciale...

Caduto

Oppure si può fare qualcosa di più semplice. Potete dirmi se è abbastanza corretto usare tale correzione?

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

Naturalmente, tutto è corretto.

AGGIORNAMENTO: ho corretto la funzioneCorrectingPrice().

Igor, praticamente faccio lo stesso negli EA, leggo sempre i dati prima e assegno il valore richiesto al livello della variabile, poi controllo i calcoli con esso.
 
KimIV:


Artyom, non ho incontrato nessun DC così... Puoi mandarmene un paio nel tuo messaggio personale? Leggerò il regolamento commerciale...

Oppure potete farlo in un modo più semplice. Ditemi voi, è abbastanza corretto usare un tale emendamento?

AGGIORNAMENTO: ho apportato una modifica alla funzioneCorrectingPrice().

Ciao, colleghi, sto ancora studiando il codice, non riesco a capire bene le sottigliezze e sono un po' in difficoltà.

Da quanto ho capito, dobbiamo chiamare questa funzione per correggere i parametri prima di piazzare un ordine.

C'è una tale linea per aprire un ordine:

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

è qui che dovrebbe essere affrontato? E come farlo correttamente. O questo comando non ha bisogno diCorrectingPrice()?

Grazie in anticipo.