[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 98

 

Per favore, aiutatemi con la funzione ArrayMo (restituisce il massimo della curva di densità).

double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}

Sono sorte le seguenti domande:

1.Qual è lo scopo di creare un array temporaneo

m[][2]

2. Non è chiaro da cosa saranno presi i valori dell'array temporaneo, e quindi non è chiaro come si possa cercare questo array:

n=ArraySearchDouble(m, e)

3. E poi generalmente per me la verità è profondamente nascosta))))) Una volta accertato che non c'è nessun valore, cominciamo a determinare la dimensione dell'array di "valori incomprensibili".

Apprezzerei molto un raggio di luce in questa storia))))


 
Foxy, e il codice della funzione ArraySearchDouble, c'è? Senza di esso, capire cosa fa il programma sarebbe molto più difficile)
 

Ciao, ecco la funzione di trailing stop, controlla se è corretta. Poiché il mio codice cambierà drasticamente, sarà difficile gestire gli errori quando inizierò a cambiarlo

void TrailStop(int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
    if (TStop>0)
      {
       OrderSelect(ticket, SELECT_BY_TICKET);
       if(OrderType()==OP_BUY)
         {
          if(Bid - OrderOpenPrice()>Point*TStop)
            {
             if(OrderStopLoss()<Bid-Point*TStop)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Bid-Point*TStop, OrderTakeProfit(), 0, Blue);
                return;
               }
             else { }
            }
            else{ }
         }
       else if (OrderType()==OP_SELL)
         {
          if(OrderOpenPrice() - Ask>Point*TStop)
            {
             if(OrderStopLoss()>Ask + TStop*Point)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Ask+Point*TStop, OrderTakeProfit(), 0, Blue);
                return;
               }
             else { }
            }
          else { }
         }
       else { }
      }
    else { }
    }
 
gogent:

Ciao, ecco la funzione di trailing stop, controlla se è corretta. Cambierò drasticamente il mio codice, sarà difficile gestire gli errori quando inizierò a cambiarlo.

Non tieni conto dello Stoplevel, quindi se non hai ECN/NDD, potresti ottenere l'errore "stop sbagliato".

E in generale, dopo OrderModify è meglio gestire tutti gli errori, per sicurezza.

 
alsu:
Foxy, e il codice della funzione ArraySearchDouble, c'è? Senza, sarebbe molto più difficile capire cosa fa il programma)


Queste sono tutte funzioni di KimIV, che è quello che sto cercando di capire. Ecco il codice:


Questa funzione cerca un elemento di una matrice usando un valore di tipo doppio e restituisce l'indice dell'elemento trovato o -1. La funzione trova solo un elemento e smette di cercare se il risultato è positivo.

  • m - L'array in cui si cerca l'elemento.
  • e - Il valore di tipo doppio da trovare nell'array m.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Выполняет поиск элемента массива по значению                   |
//|             и возвращает индекс найденного элемента или -1.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    e - значение элемента                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchDouble(double& m[], double e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}
 
Professionisti, cosa sto sbagliando? Ho bisogno di ridisegnare la finestra dell'indicatore quando appare una nuova barra. If (Bars != Prebars) WindowRedraw();
non funziona. PreBars è uguale al numero di barre del tick precedente. Forse l'ho messo nel posto sbagliato o nella funzione sbagliata?
 
kon12:
Professionisti, cosa sto sbagliando? Ho bisogno di ridisegnare la finestra dell'indicatore quando appare una nuova barra. se (Bars != Prebars) WindowRedraw();
non porta a nulla. Forse l'ho messo nel posto sbagliato o c'è qualcosa che non va?

Bisogna prima disegnare per poter ridisegnare qualcosa.
 
sergeev:

Per ridisegnare qualcosa, bisogna prima disegnarla.


Tutto è disegnato perfettamente, l'indicatore è basato su uno zigzag, ma quando appaiono nuove barre, la curva dovrebbe essere ridisegnata da capo, ma aggiunge solo il valore dell'indicatore in una nuova barra...

int init() {
SetIndexBuffer(0,ZZ);
SetIndexStyle(0,DRAW_SECTION);
SetIndexEmptyValue(0,0.0);

 
kon12:


Tutto è disegnato bene, l'indicatore è basato su uno zigzag, ma quando appaiono nuove barre, la curva dovrebbe essere ridisegnata da capo, ma aggiunge solo il valore dell'indicatore nella nuova barra...

int init() {
SetIndexBuffer(0,ZZ);
SetIndexStyle(0,DRAW_SECTION);
SetIndexEmptyValue(0,0.0);

WindowRedraw() ridisegna gli oggetti grafici. Non ha niente a che fare con i buffer.
 
Zhunko:
WindowRedraw() ridisegna gli oggetti grafici. Non ha niente a che fare con i buffer.

Capito... Se un altro modo con il ridisegno?
Motivazione: