[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 323

 

Isto é o que acontece:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                           // Счётчик идущих друг за другом свечей с..
       cntDn,                                                                           // .. требуемыми признаками
       t;                                                                               // Счётчик всех просчитанных баров
       
   for (int i=i_AnyBarsToHistory; i>=1; i--, t++)
   {
      if (directionMA == CROSS_UP)                                                      // Если машки направлены вверх
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                   // .. прибавим 1 к счётчику
         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                 // .. счётчик обнуляем
                                                                                        
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);

         if (t == i_AnyBarsToHistory)
         {
             if (cntDn == i_sequentBarsСount)                                                // Если cnt баров в подряд медвежьи..
                 return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                     // .. Выходим из функции
         }
      }

      if (directionMA == CROSS_DN)                                                      // Если машки направлены вниз
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                   // .. прибавим 1 к счётчику
         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                 // .. счётчик обнуляем
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

         if (t == i_AnyBarsToHistory)
         {
             if (cntUp == i_sequentBarsСount)                                                // Если cnt баров в подряд бычьи..
                 return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                     // .. Выходим из функции
         }
      }
      return (REQUIRED_SEQUENTIAL_MISS);
   }
}

Na verdade, nem mesmo uma linha é impressa:

Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

Por isso, provavelmente há algum tipo de bug no acima mencionado.

O mais interessante é que uma vez adicionado um retorno padrão aqui, de alguma forma ele funciona o tempo todo. Refiro-me ao fio:

return (REQUIRED_SEQUENTIAL_MISS);

Embora seja óbvio que o código é elementar, e que não pode haver erros.

 

Saudações a todos! Caros gurus, você poderia me dizer por que v_s aumenta e diminui quando o lucro aumenta e diminui na moeda do depósito?

value_profit() é um cálculo de lucro na moeda do depósito.

valor duplo_stop,valor_step;
value_stop=((AccountBalance()/100)*1));
value_step=((AccountBalance()/100)*4);
duplo v_s;
if (value_profit()>=(value_step+value_stop))
para (int v=1;v<=100;v++)
{
if (value_profit()>=(value_step+(value_stop*v))
{
v_s=value_stop*v;
}
senão
{
se (value_profit()<=v_s)
close_all();
}
}
 
hoz:

Na verdade, nem mesmo uma linha é impressa:

1. Por que fazer a modularidade exatamente de uma só vez? É claro que cada um tem seu próprio estilo, mas eu primeiro poliria a versão compacta e depois, quando ela funciona como um relógio, a moveria para a modularidade. A variante compacta (sem funções inseridas Comércio, LastCandlesType, GetStateOfMA, GetGeneralSignal) foi mostrada como uma variante dos anúncios internos de início() na página anterior. Como isso funciona para você? Se funcionar, então divida-a em módulos.

2. O código me parece absolutamente idêntico ao anterior, já que o contador t muda absolutamente paralelo ao contador i. Por que então comparar com t se você pode comparar com i? E, indo mais além pela lógica, então por que comparar com i se temos um código que não funcionou?

3. desculpe a intromissão, mas como funcionaria esta variante ao retirar a saída do loop?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Entendo que também pode não funcionar, não importa, mas preciso ter certeza disso para descobrir mais a respeito.

4. Pura adaptação pessoal: digitar código não em meta editor, mas em qualquer outro editor com linhas numeradas, e imprimir em cada mudança de qualquer variável e em cada if ou verificação de troca, na mesma linha (após a última ponto-e-vírgula). Impressão em número de linha - valor(es) a ser verificado. Imprima-o depois de if(tracing) {Print(StringConcatenate("line_number: variable_name=", variable_name));} e declare uma variável no cabeçalho, como: bool tracing=false;//enable tracing. Neste caso, você terá um rastreamento completo e, portanto, uma depuração completa. Mas você tem que limpar os troncos com mais freqüência, é claro. Se você vai usar o meta editor diretamente, você pode primeiro fazer um modelo vazio como

/*001*/

...

/*999*/

no início das linhas (e funciona), e depois em uma cópia deste modelo para digitar o código. Mas isto é exatamente o que eu penso, na prática eu tentei desta forma, mas tentei de forma inconsistente.

 
rajak:

Saudações a todos! Caros gurus, você poderia me dizer por que v_s aumenta e diminui quando o lucro aumenta e diminui na moeda do depósito?

value_profit() é um cálculo de lucro na moeda do depósito.

valor duplo_stop,valor_step;
value_stop=((AccountBalance()/100)*1));
value_step=((AccountBalance()/100)*4);
duplo v_s;
if (value_profit()>=(value_step+value_stop))
para (int v=1;v<=100;v++)
{
if (value_profit()>=(value_step+(value_stop*v))
{
v_s=value_stop*v;
}
senão
{
se (value_profit()<=v_s)
close_all();
}
}
Após uma rápida olhada, vi imediatamente um bug com vírgulas invertidas. Ensine como usar a declaração de if.
 
gyfto:

3. desculpe a intromissão, mas afinal como funcionaria para você tirar a saída do loop?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Hm. Funcionou. Eu corri várias "telas" no visual, tudo está claro neste intervalo. Eu ainda preciso entender porque não funcionou da última vez. Será útil para evitar tropeçar nele no futuro.
 
hoz:

Hmm, está funcionando.


Glad))))

hoz:

Ainda é preciso descobrir por que não funcionou da última vez. Será útil para evitar tropeçar nele no futuro.

Porque no futuro, não desista antes de atingir Close[0] ou qualquer que seja o limite da janela em qualquer outro algoritmo. Não é enquanto.

 
gyfto:

1. Por que fazer a modularidade de uma só vez? É claro que cada um tem seu próprio estilo, mas eu primeiro poliria a versão compacta, e depois, quando ela funciona como um relógio, mudá-la para a modularidade. A variante compacta (sem funções inseridas Comércio, LastCandlesType, GetStateOfMA, GetGeneralSignal) foi mostrada como uma variante dos anúncios internos de início() na página anterior. Como isso funciona para você? Se funcionar, então divida-a em módulos.

Na verdade, estou acostumado a escrevê-lo dessa forma. E é mais fácil procurar por erros. Porque eu sabia imediatamente que o erro estava na funçãoLastCandlesType(). Mas ainda não descobri a razão, embora sua maneira tenha funcionado.

gyfto:

2. O código me parece absolutamente idêntico ao anterior, já que o contador t muda absolutamente paralelo ao contador i. Por que então comparar com t se você pode comparar com i? E, indo mais além pela lógica, então por que comparar com i se temos um código que não funcionou?

Tarde demais para escrever, ... sobrecarga moral, acho eu.

gyfto:

Entendo que também pode não funcionar, o que quer que seja, mas preciso ter certeza de que funciona para entendê-lo melhor.

Funciona! O que falta entender é por que esse código não funcionou. A primeira coisa que me chamou a atenção foi a saída da função quando o contador atingiu o valor i_seqqtBarstCounter. Mas, novamente, eu imprimi e o valor do contador só mostrava 1 o tempo todo, quando coloquei a saída padrão da funçãode retorno(REQUIRED_SEQUENTIAL_MISS);

Antes de colocá-la, tudo foi calculado corretamente, mas a coruja não estava negociando corretamente. Não havia absolutamente nada acontecendo. Embora, em teoria, se nenhuma das condições acima da saída padrão funcionou, isso significa que nenhuma das condições desencadeou e mesmo que coloquemos a saída padrão na condição de que ela não deveria funcionar. Por outro lado, se a condição se mantiver, ela deve se manter.


gyfto:

4. Pura adaptação pessoal: digite o código não em meta-editor, mas em qualquer outro editor com numeração de linha, e imprima em cada mudança de qualquer variável e em cada se ou verificação de troca, na mesma linha (após o último ponto-e-vírgula). Impressão em número de linha - valor(es) a ser verificado. Imprima-o depois de if(tracing) {Print(StringConcatenate("line_number: variable_name=", variable_name));} e declare uma variável no cabeçalho, como: bool tracing=false;//enable tracing. Neste caso, você terá um rastreamento completo e, portanto, uma depuração completa. Mas você tem que limpar os troncos com mais freqüência, é claro. Se você vai usar o meta editor diretamente, você pode primeiro fazer um modelo vazio como

/*001*/

...

/*999*/

no início das linhas (e funciona), e depois em uma cópia deste modelo para digitar o código. Mas isto é exatamente o que eu penso, na prática eu tentei desta forma, mas tentei de forma inconsistente.


Bem, nós imprimimos com base nos dados do Expert Advisor, não em números de linha. Por que você precisa de números de linha? Eu pessoalmente o utilizo para análise de código, uma vez que há momentos realmente úteis lá. Mas escrever e depurar o código contando com números de linha é um absurdo para mim.
 
hoz:

Resta saber por que esse código não funcionou.


A maneira como eu mesmo descobri isso. Lemos os cruzamentos das abas. Mais precisamente, três castiçais em alta ou em baixa após a travessia a qualquer momento. Quando a condição é cumprida, entramos no mercado. Mas a julgar pela descrição verbal, estes três ou mais castiçais que vêm em uma fila pertencem à borda direita da janela. De acordo com seu código, eles podem se referir ao meio da janela. Portanto, o Expert Advisor entrou no mercado quando a condição (três castiçais) foi atingida, enquanto que o último castiçal não pode ser o último.
 
gyfto:

Como eu mesmo descobri. Lemos a interseção dos ursos. Para ser mais exato, três castiçais em alta ou em baixa após a travessia a qualquer momento. Quando a condição é cumprida, entramos no mercado. Mas a julgar pela descrição verbal, estes três ou mais castiçais que vêm em uma fila pertencem à borda direita da janela. De acordo com seu código, eles podem se referir ao meio da janela. Portanto, a EA entrará no mercado quando a condição (três velas) for alcançada, mas a última vela pode não ser a última.


A conclusão é a seguinte: conhecendo a sintaxe, devemos também observar a lógica. Isto é muito importante. Tive ali apenas um erro lógico.

Parece simples, mas fiquei preso em algo e não consegui de imediato. Yikes. Isso acontece... :(

 

Boa tarde!

Minha pergunta será um pouco fora de tópico.

Você pode me dizer se é possível encontrar em algum lugar o fatiamento de formas de TA como arquivos CSV? Posso usar txt, xls ou qualquer outro formato que possa ser processado de forma programática.

Há exemplos de figuras de AT em vários artigos de AT, livros didáticos, mas é claro, como imagens comuns. Alguém tem mais ou menos grandes conjuntos de símbolos TA salvos como uma fatia da história de algum par de moedas nos períodos H1-H4, digamos?

Eu pesquisei no Google, não encontrei nenhum. Naturalmente, podemos percorrer manualmente a história, marcar as formas, exportar este pedaço de história como .csv; repetir o número necessário de vezes, coletar a base das formas no final. Mas se alguém já fez isso, gostaria de economizar tempo.

Obrigado antecipadamente :)