[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 99

 
Lisi4ka330:


Boa tarde! Por favor, ajude-me com a função ArrayMo (ela retorna o máximo da curva de densidade).

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

As seguintes questões foram levantadas:

1.Qual é o propósito de criar uma matriz temporária

m[][2]

Não está claro de onde os valores da matriz temporária serão retirados e, portanto, não está claro como esta matriz pode ser pesquisada:

n=ArraySearchDouble(m, e)

3. e então geralmente para mim a verdade é profundamente escondida))))) Uma vez constatado que não há valor, começamos a determinar o tamanho do conjunto de "valores pouco claros".

Eu ficaria muito grato por um raio de luz nesta história))))


Afinal, acho que a função não está escrita muito corretamente. A principal razão é que, após o anúncio.

double m[][2];

é necessário

ArrayResize(m,0);

caso contrário(cito)

int ArrayResize( matriz vazia[], int new_size)
Define o novo tamanho na primeira dimensão da matriz. Se bem sucedida, a função retorna o número de todos os elementos contidos na matriz após o redimensionamento, caso contrário, retorna -1 e a matriz não é redimensionada.
Nota: um array declarado localmente em qualquer função, que foi redimensionado, permanecerá inalterado após a função ser executada. Quando a função for chamada novamente, tal array terá um tamanho diferente do tamanho declarado!!!!

E assim com múltiplas chamadas a função "cairá no passado")

Sobre como o algoritmo funciona. A matriz m[][2] em si é uma representação direta da distribuição empírica do número de acertos da variável x[i] por seus diferentes valores. Ou seja, cada elemento da matriz consiste em dois números - o número de acertos em algum valor (o primeiro campo) e o próprio valor. O loop procura o mesmo valor no array m para cada x[i], e se for encontrado, o campo numérico é adicionado, caso contrário um novo elemento é criado usando o ArrayResize() e nosso x[i] é escrito lá.

Em seguida, uma vez povoada a matriz, basta encontrar o elemento com o número máximo de acessos, ou seja, por definição, o módulo de distribuição x.

Isto é feito por cordas

    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];

Embora me pareça (não tenho certeza sobre a matriz multidimensional), você poderia ter apenas

    s=m[ArrayMaximum(m)][1];

Em suma, posso dizer (com o devido respeito ao autor do código) que mesmo ao corrigir todos os defeitos, este algoritmo é extremamente ineficiente e pode muitas vezes dar resultados errados. A razão é que estamos trabalhando com o dobro do tipo, o que significa que a probabilidade de os valores x[i] estarem próximos, mas ainda assim distinguíveis, é bastante alta. Isto pode não ser tão perceptível quando o tamanho da amostra é muito maior (centenas de vezes ou mais) do que o número total de intervalos nos quais x[i] é definido. Entretanto, nos muitos casos em que esta restrição não for cumprida, haverá muitos cálculos errados.

A maneira mais correta de calcular a modalidade é esta: uma função de distribuição empírica (não confundir com a distribuição de freqüência) é construída, depois é interpolada de linear por partes para suave, e finalmente o ponto de máxima derivada é procurado. Tal algoritmo está livre dos inconvenientes listados acima e funciona de forma bastante eficaz mesmo com amostras de tamanho pequeno. Pelo menos, eu tinha que resolver apenas a tarefa de procurar modos em amostras de 50-100 elementos com um número comparável de intervalos usando MQL - e tudo estava bem. A única desvantagem é que as interpolações geralmente causam uma queda significativa na velocidade de cálculo, é claro, se quisermos suavizar qualitativamente.

 
Olá estimados membros do fórum, com quem posso falar sobre como escrever um EA. Uma EA sem indicadores baseados na duplicação de um movimento não em nossa direção.
 
Glazunov:
Olá estimados membros do fórum, com quem posso falar sobre como escrever um EA. Uma EA sem indicadores baseados na duplicação de um movimento não em nossa direção.
aqui: https://www.mql5.com/ru/job
 
ilunga:
aqui: https://www.mql5.com/ru/job

Obrigado. Talvez haja mais opções.
 
Glazunov:

Obrigado. Talvez haja mais opções.
Tente digitar "martingale" em uma busca no site - você ficaria surpreso
 
YOUNGA:
Tente digitar "martingale" em uma busca no site e você ficará surpreso

Já olhou! Mas o que eu quero está faltando(
 
Glazunov:
Olá estimados membros do fórum, com quem posso falar sobre como escrever um EA. Uma EA sem indicadores baseados na duplicação de um movimento não em nossa direção.


Dê uma olhada aqui

https://www.mql5.com/ru/forum/136747

 

Olá. Comecei agora na MQL4.

Por favor, informe sobre a função OrderModify. Os manuais e exemplos mostram que esta função é utilizada para arrasto, ou seja, mudança de stop loss. Preciso mudar apenas para ter lucro em uma ordem aberta. O stop loss não é definido quando a ordem é aberta e também deve permanecer em 0 durante a modificação .

Como deve ser o cálculo e a seleção dos pedidos?

O alvo final deve ser algo parecido com isto

se (OrderType()==OP_BUY && OrderOpenPrice()-Bid>kof*Point) // houver uma compra, mas ela foi reduzida por kof
{
OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+tpnew*Point,0,CLR_NONE);// nós movemos TP mais baixo do que o anteriormente colocado

O mesmo para venda.

Obrigado por qualquer resposta.

 

Olá novamente :)

Como eu pensava, surgiram problemas. Aqui está o código. A questão é que as ordens no testador são fechadas pelo TP, e pela função TP é removida quando a ordem é modificada durante a Trailing Stop.

double my_ord[31][2];                                           //ордера советника
                                                                //[][0] Ticket
                                                                //[][1] Вид операции 
//---------------------------------------------------------------------------------

void FindMyOrders()                                             //ищем свои ордера(от советника)
   {
    for (int a = 0;a<32;a++)                                    //во избежание ошибок заполняем все нулями
      {
       my_ord[a][0]=0;
       my_ord[a][1]=0;
      }
    int pos = 0;
    for(int i=0; i<32; i++)
      {
       if (Mas_Ord_New[i][8]==1)                                //есть ли комментарий
         {
          int num = Mas_Ord_New[i][4];
          OrderSelect(SELECT_BY_TICKET, num);
          string str = OrderComment();
          if (str == "AO Day Profiter Trade")                   //наш ли это комментарий
            {
             my_ord[pos][0] = num;
             my_ord[pos][1] = Mas_Ord_New[i][6];                //если наш, записываем Ticket и вид операции
             pos++;
            }
          else { }
         }
       else { }
      }
   }
//---------------------------------------------------------------
void TrailStop(int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
    int minDist = MarketInfo(symb, MODE_STOPLEVEL);
    if (TStop<minDist)
      {
       TStop = minDist;
      }
    else { }
    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, 0, 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, 0, 0, Blue);                           //ordertakeprofit!!
                return;
               }
             else { }
            }
          else { }
         }
       else { }
      }
    else { }
    }
//-----------------------------------а это кусочек Start(), отвечающий за трейлинг стоп
   for (int i = 0; i<32; i++)                                   //трейлинг стоп для наших ордеров
      {
       if (my_ord[i][0]>0)
         {
          TrailStop(my_ord[i][0], TralingStop);
         }
       else {break;}
      }
O que significa que a parada móvel não é executada, e não houve erros com TP e SL errados no registro do testador. Então, o que está errado?
 

Caros profissionais, por favor, me aconselhem sobre esta questão:

Tenho uma matriz de cordas unidimensional previamente escrita em um arquivo de texto

EURUSD 1654.31

GBPUSD -1654.61

USDCAD 110.98

USDJPY 1180.17

Suponha que o lucro total do USDCAD tenha mudado e eu precise substituir a 3ª linha por "USDCAD 115,64".

Li estes dados como uma matriz de cordas unidimensional, mas não posso substituir apenas este elemento no arquivo de texto (alguém pode escrever uma função?)

Ou é melhor não incomodar e sobrescrever todo o conjunto?

Eu só tenho dados que vêm de EAs em pares diferentes - cada par tem uma corda diferente - é claro que seria melhor mudar apenas 1 elemento provavelmente.