Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1207

 

por que este ciclo não termina quando ... (acrescentei a segunda condição para i < 2000 quando percebi que o laço é infinito) MQL4

cv * tvp * (double)stop < ml


double tvp  = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),
          vm   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          vs   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),
          ml   = AccountEquity() * (risk / 100.0),
          cv   = -1.0;
   
   for(int i = 0; cv * tvp * (double)stop < ml && i < 2000; i++)
     {
      if( (vm + vs * (double)i) * tvp * (double)stop < ml ) { cv = vm + vs * (double)i; Print(i," ",cv,"/",ml); };
     };


 
Alexandr Sokolov:

por que este ciclo não termina quando ... (acrescentei a segunda condição para i < 2000 quando percebi que o laço é infinito)



O loop não terminará até

cv * tvp * (double)stop < ml

Para que o loop termine quando esta condição for preenchida, podemos escrever o seguinte no corpo do loop

for(int i = 0; i < 2000; i++)
{
  if(cv * tvp * (double)stop < ml)
    break
  ...
}

ou

for(int i = 0; cv * tvp * (double)stop >= ml; i++)
{
  if(i >= 2000)
    break;
  ...
}
 
Mihail Matkovskij:

Na MQL4 somente desta forma:

Resultado:


Mais uma vez obrigado por sua ajuda. Ficaria muito grato se você também pudesse me dizer como fazer o seguinte...
Que função ou construção de linguagem pode ser usada para calcular o valor de índice de um elemento de matriz que tinha o índice antes da ordenação.

Aqui, eu tenho a matriz A[] antes da classificação (a linha superior) e a mesma matriz após a classificação. Um elemento com valor 5 antes da ordenação estava no índice 9
, e um elemento com valor 5 após a ordenação está no índice 3.

Eu encontro uma célula com valor 5 na matriz ordenada e a função salva o número índice desta célula na matriz ordenada para W, que é igual ao índice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

PERGUNTA: Após o ArrayBsearch(), como o valor de índice de uma célula com valor 5 pode ser armazenado em uma variável que tenha uma matriz não classificada.

Ou seja, economize o valor de 9.
Obrigado por sua ajuda.

 
 

Olá a todos. Quem sabe como definir um valor negativo em um indicador personalizado e fazê-lo funcionar? ou seja, "Mude o indicador em relação à tabela de preços".

Exemplo: Se você colocar um valor -4 no indicador de Média Móvel, ele se move em relação ao gráfico à esquerda - e funciona.

Mas se você colocar este valor no código do indicador - então o indicador deixa de funcionar. e mostra todos os valores TF em vermelho.

Arquivos anexados:
 
ANDREY:

Obrigado novamente por sua ajuda. Ficaria muito grato se você também pudesse me dizer como fazer o seguinte...
Que função ou construção de linguagem pode ser usada para calcular o valor de índice de um elemento de matriz, que este elemento tinha antes da ordenação.

Aqui, eu tenho a matriz A[] antes da classificação (a linha superior) e a mesma matriz após a classificação. Um elemento com valor 5 antes da ordenação estava no índice 9
, e um elemento com valor 5 após a ordenação está no índice 3.

Eu encontro uma célula com valor 5 na matriz ordenada e a função salva o número índice desta célula na matriz ordenada para W, que é igual ao índice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

PERGUNTA: Após o ArrayBsearch(), como o valor de índice de uma célula com valor 5 pode ser armazenado em uma variável que tenha uma matriz não classificada.

Ou seja, economize o valor de 9.
Obrigado por sua ajuda.

mas não separe os dados ao acaso e apenas para nenhum propósito global.

A partir do projeto atual: pegue uma (breve) matriz, a saída será índices de elementos na ordem correta:

void BubleSortIndex5(double &data[5],int &index[5])
{
   for(int i=0;i<5;i++)
      index[i]=i;
   for(int i=0;i<4;i++) {
      for(int j=1;j<5;j++) {
         if (data[index[i]]>data[index[j]]) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
}


para matrizes maiores, precisamos mudar o algoritmo de classificação (borbulhar não funciona para matrizes maiores) - mudá-lo.

A mensagem principal é: não toque nos dados da fonte. Operar ou com referências ou, melhor ainda, com índices de matriz. Caso contrário, a informação é perdida, o que será muito necessário mais tarde.

 
ANDREY:

Obrigado novamente por sua ajuda. Ficaria muito grato se você também pudesse me dizer como fazer o seguinte...
Que função ou construção de linguagem pode ser usada para calcular o valor de índice de um elemento de matriz, que este elemento tinha antes da ordenação.

Aqui, eu tenho a matriz A[] antes da classificação (a linha superior) e a mesma matriz após a classificação. Um elemento com valor 5 antes da ordenação estava no índice 9
, e um elemento com valor 5 após a ordenação está no índice 3.

Eu encontro uma célula com valor 5 na matriz ordenada e a função salva o número índice desta célula na matriz ordenada para W, que é igual ao índice 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

PERGUNTA: Após o ArrayBsearch(), como o valor de índice de uma célula com valor 5 pode ser armazenado em uma variável que tenha uma matriz não classificada.

Isso é para economizar o valor de 9.
Obrigado por sua ajuda.

Para isso você precisa responder duas perguntas.o que você fará se:

1. Haverá múltiplos valores de 5, em diferentes células da matriz.

2. Não haverá um valor 5 na matriz.

Como a funçãoArrayBsearch (para dados classificados), no primeiro caso, dará o primeiro índice encontrado onde o valor da célula é 5, no segundo caso, dará um elemento próximo ao valor 5. Como você gostaria de lidar com uma matriz não classificada não está claro para mim.

 
sla100:

Olá a todos. Quem sabe como definir um valor negativo em um indicador personalizado e fazê-lo funcionar? ou seja, "Mude o indicador em relação à tabela de preços".

Exemplo: Se você colocar um valor -4 no indicador de Média Móvel, ele se move em relação ao gráfico à esquerda - e funciona.

Mas se você colocar este valor no código do indicador, o indicador deixa de funcionar. e mostra valores vermelhos para todos os TFs.

SetIndexShift.

O turno também é especificado no iMA:

iMA

Devolve o valor do indicadortécnico da Média Móvel.

duploiMA(
símbolo de corda,// nome do símbolo
inttimeframe,// prazo
intma_period,// período
intma_shift,// média de turnos
intma_method,// método de cálculo da média
intapplied_price,// tipo de preço
intturno// turno
);

Parâmetros

símbolo

[em] Nome do símbolo cujos dados serão usados para calcular o indicador.NULL significa símbolo atual.

cronograma

[em] Período. Pode ser um dos valores da enumeraçãoENUM_TIMEFRAMES. 0 significa o período do gráfico atual.

ma_período

[em] Período de cálculo da média para o indicador.

ma_shift

[em] Mudança de indicador em relação à tabela de preços.

ma_método

[em] Método de cálculo da média. Pode ser qualquer um dos valores da enumeraçãoENUM_MA_METHOD.

preço_aplicado

[em] Preço aplicado. Pode ser qualquer valor da enumeraçãoENUM_APPLIED_PRICE.

turno

[em] Índice do valor obtido do buffer de indicadores (deslocamento relativo à barra atual por um número especificado de períodos de retorno).

Valor retornado

Valordo indicador técnico médio móvel.

Exemplo:

AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);

https://docs.mql4.com/ru/indicators/ima

Aqui está um exemplo pronto, mas na MQL5: https://www.mql5.com/ru/docs/indicators/ima ,

que pode ser facilmente traduzida em MQL4.

SetIndexShift - Пользовательские индикаторы - Справочник MQL4
SetIndexShift - Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.
 

Não há nenhuma mudança nas configurações do indicador. Entrei no código e coloquei o turno -4 no código e o indicador parou de funcionar - ele mostra que todas as TFs estão vermelhas. Estou aqui sentado me perguntando por quê.

Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для совершения торговых операций на рынках, а вторые — для анализа котировок и выявления закономерностей в их изменении. При этом индикаторы могут использоваться непосредственно в роботах, образуя полноценную...
 
Mihail Matkovskij:

Para fazer isso, você precisa responder a duas perguntas.O que você fará se

1. Haverá vários valores de 5, em diferentes células da matriz.

2. O valor 5 não estará na matriz.

Como a funçãoArrayBsearch (para dados classificados), no primeiro caso, dará o primeiro índice encontrado onde o valor da célula é 5, no segundo caso, dará um elemento próximo ao valor 5. Como você gostaria de lidar com uma matriz não classificada não está claro para mim.

Muito obrigado por sua resposta rápida. No meu caso, cada valor de um elemento de matriz é único e existe em uma única instância. Ou seja, o valor 5, como outros valores, não é repetido.

No meu caso, o valor 5 pode não existir em uma matriz não classificada. Isso significa que algumas células em array não selecionado podem estar vazias.
Mas se o valor 5 não estiver em array não selecionado, então não posso especificar o valor 5 como segundo parâmetro na função ArrayBsearch(). Somente valores que necessariamente existem em array não selecionado entram nesta função.
Obrigado por sua ajuda

Razão: