[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 169

 

splxgf:

DhP:

Como você 'alivia' este ciclo? Demora muito tempo para contar.
 if(iHigh(NULL,60,i)>LOWprice && LOWprice>iLow(NULL,60,i)) if(LOWprice> bid) CountH++ else CountL++;

Ou melhor ainda, assim:

 if(iHigh(NULL,60,i)>LOWprice) if(LOWprice>iLow(NULL,60,i)) if(LOWprice> bid) CountH++ else CountL++;

Há também a idéia de gerar um conjunto de valores altos e baixos. Talvez isso acelere um pouco as coisas?

 
abolk:


o pedido é selecionado https://docs.mql4.com/ru/trading/OrderSelect - looping ou seleção por bilhete

então a função Ordem*() procura o parâmetro de ordem relevante

Desculpe as perguntas grosseiras, mas:

Se usarmos MODE_HISTORY como fonte de dados para seleção na função OrderSelect , ou seja, a ordem é selecionada entre ordens fechadas e excluídas, então como encontramos o número da ordem que foi fechada por último? Como estas ordens estão numeradas no programa? É do último para o primeiro ou vice versa?

 
Xaoss1990:

Desculpe, é claro, pelas perguntas estúpidas, mas:

se MODE_HISTORY é usado na função OrderSelect como fonte de dados, ou seja, a ordem é selecionada entre as ordens fechadas e apagadas, como encontro o número da ordem que foi fechada por último? Como estas ordens estão numeradas no programa? É do último para o primeiro ou vice versa?


há muitas perguntas desse tipo na internet

http://forum.alpari.ru/showthread.php?t=27708

 
Xaoss1990:

Desculpe pelas perguntas idiotas, mas:

se MODE_HISTORY é usado na função OrderSelect como fonte de dados para seleção, ou seja, a ordem é selecionada entre as ordens fechadas e excluídas, como encontro o número da ordem que foi fechada por último? Como estas ordens estão numeradas no programa? É do último para o primeiro ou vice versa?


A função para encontrar o último dos fechados é semelhante à função para encontrar a ordem com o tempo máximo de fechamento
 
LazarevDenis:


muitas destas perguntas já foram feitas na internet

http://forum.alpari.ru/showthread.php?t=27708

О! Encontrei-o, obrigado:

OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);

É isso mesmo, não é mesmo?!

 
DhP:

Como "facilitar" este ciclo? O cálculo leva muito tempo.

Enfeitiçado:

   INS = True;
   
   for (int i=1; i<=6000; i++)
   {
      if (INS)
      {
         if (LOWprice > iHigh(NULL,60,i))
         {
            INS = False;
            UPP = True;
            LOW = False;
            continue;
         }
         if (LOWprice < iLow (NULL,60,i))
         {
            INS = False;
            UPP = False;
            LOW = True;
            continue;
         }
      }
      else
      {
         if (UPP)
            if (LOWprice > iHigh(NULL,60,i))
               continue;
            else
            if (LOWprice < iLow (NULL,60,i))
            {
               // INS = "False"
               UPP = False;
               LOW = True;
               continue;
            }
         if (LOW)
            if (LOWprice < iLow (NULL,60,i))
               continue;
            else
            if (LOWprice > iHigh(NULL,60,i))
            {
               // INS = "False"
               UPP = True;
               LOW = False;
               continue;
            }
         
         INS = True;
      }
      
      if (LOWprice > Bid)
         CountH++;
      else
         CountL++;
   }

A lógica é que o preço está mais freqüentemente fora das barras históricas do que dentro delas.

INS = Por dentro.

Eu verifiquei a exatidão do código em um folheto. Eu não verifiquei a velocidade do código. Mas tenho certeza de que as variáveis booleanas dão uma boa vantagem.

 
MaxZ:

Enfeitiçado:

A lógica é que o preço está mais freqüentemente fora das barras históricas do que dentro delas.

INS = "Inside" (Dentro).

P.S.: Eu verifiquei a exatidão do código em um pedaço de papel. Eu não verifiquei a velocidade do código. Mas tenho certeza de que as variáveis booleanas dão uma boa vantagem.


Sim.

Você deve ser tão retorcido para transformar três linhas claras de código em código difícil de entender.

Se você tivesse a idéia de dividir o iLow, iHigh check, você poderia tê-lo dividido imediatamente:

          if(LOWprice> bid)if(iHigh(NULL,60,i)>LOWprice)if( LOWprice>iLow(NULL,60,i))CountH++;  
          if(LOWprice<=bid)if(iHigh(NULL,60,i)>LOWprice)if( LOWprice>iLow(NULL,60,i))CountL++;
e não mexer em nada
 
      int HourPrices[20000];     
      for(int i=1; i<=6000; i++)
	 for (double cPrice=iLow(NULL,60,i);cprice<=iHigh(NULL,60,i);cPrice+=Point)
	  HourPrices[cPrice/Point]+=1;

Encontrar níveis de resistência a partir de uma matriz desse tipo não é problema. Adicionar novas barras e remover as antigas ao mesmo tempo. E obter informações a partir dela são dois ciclos com uma condição ou ArrayMaximum dará o valor necessário de uma só vez.

 
abolk:


Certo.

Você tem que ficar tão distorcido a ponto de transformar três linhas claras de código em código que é difícil de entender.

Se você tivesse a idéia de separar o iLow, iHigh check, você poderia tê-lo dividido imediatamente:

e não brinque com nada

Uma variante semelhante àquela que sugeri acima (separando os "se").

E você nem sequer tentou entender minha idéia (embora eu tenha descrito brevemente a lógica). Quando o preço é alto, fazemos um cheque em vez de dois. O mesmo vale para o caso quando o preço é baixo. E quando o preço está dentro de barras históricas (o que é bastante raro - essa é a lógica e a idéia!), fazemos duas verificações (não há outra maneira).

O cheque é para o preço fora do bar, não para dentro. Antes eles estavam procurando uma agulha num palheiro, enquanto eu, se não vir outra agulha, também não a procurarei... A agulha se mostrará quando for necessária! :)))

 
MaxZ:

Uma variante similar que eu propus acima (separar se for).

E você nem sequer tentou entender minha idéia (embora eu tenha descrito brevemente a lógica). Quando o preço é alto, em vez de dois cheques, fazemos um. O mesmo vale para o caso quando o preço é baixo. E quando o preço está dentro de barras históricas (o que é bastante raro - essa é a lógica e a idéia!), fazemos duas verificações (não há outra forma).

         if (LOWprice > iHigh(NULL,60,i)) continue;
        if (UPPprice < iLow (NULL,60,i)) continue;
Sua versão pode ser reduzida a estas duas linhas adicionadas à versão do autor, e com algumas modificações das condições deve, em princípio, ser bastante rápida.