[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 409

 

sss2019:



Mostre-me um exemplo, por favor, eu fiz. Não funcionou.


Eu fiz o roteiro desta maneira

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

Como resultado, a impressão produz o seguinte

0 4

1 4

Isso é tudo, por alguma razão o laço não imprime

2 4

3 4

Adicionei ao loop OrderSelect(i, SELECT_BY_POS, MODE_TRADES em vez de I 0, ou seja, a primeira ordem é sempre selecionada e o script funciona corretamente. Acontece que quando o loop apaga duas ordens, ele tenta selecionar a terceira ordem quando há apenas duas ordens na lista.

 
sss2019:


Fez o roteiro desta maneira

No final...

Exemplos
 
sss2019:

Por favor, me mostre um exemplo, eu fiz

for(i = OrdersTotal(); i > 0; i--)

Não ajudou.


porque você ainda tem que pensar.

for(i = OrdersTotal()-1; i >=0; i--)
 

Ajude-me a resolver este dilema

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

O roteiro procura a distância máxima entre as linhas. Ela emite todos os valores em todas as barras, o intervalo máximo é 1,6235 em uma barra e 1,6208 na outra.

Tento imprimir Print(maxrange); imprime 0,086, não entendo porque, estou dividindo por Point

 
sss2019:

Ajude-me a resolver este dilema

O roteiro procura a distância máxima entre as linhas. Ela emite todos os valores em todas as barras, o intervalo máximo é 1,6235 em uma barra e 1,6208 na outra.

Eu tento imprimir (maxrange); ele retorna 0,086, não entendo porque, estou dividindo por ponto


Isto não é um dilema. Um dilema é quando não se sabe qual das duas soluções é a melhor.

Bem, primeiro, a função iMA() tem sete parâmetros, não seis. Em segundo lugar, você declarou uma variável pela corda int i. E, mais adiante, a variável i não é inicializada em nenhum lugar com um valor. Como resultado, ou é zero ou contém lixo de memória que sobrou da atividade anterior. E, em terceiro lugar, o ciclo de tempo está arranjado incorretamente. Bem, digamos que a variável i é igual a zero após a inicialização. Vamos supor também que a expressão Ma1 > Ma2 também é verdadeira. Como resultado, a linha while(Ma1 > Ma2) iniciará o loop. Na próxima iteração do loop, descobriremos que a expressão (Ma1 > Ma2) não é mais verdadeira e que o loop será terminado. As variáveis Ma1 e Ma2 não conterão a distância que é máxima - a distância máxima foi uma vez. Esta condição só mostrará que Ma1 agora se tornou menor ou igual a Ma2.

Além disso, a variável maxrange será inicializada com um valor apenas na faixa de linha = (Ma1 - Ma2)/Ponto; Bem, e se a condição if(range > maxrange) nunca ocorrerá, porque você não inicializa a variável maxrange com um valor em qualquer outro lugar no código? Assim, acontece que você está comparando o resultado dos cálculos com o lixo das células de memória. Aqui você tem impressões incompreensíveis como resultado da execução do código.

 
O problema é que eu estava emitindo todos os valores de MA no loop, e todos os valores estão corretos, ou seja, todos os valores de MA para este período foram numerados. Mas o cálculo está errado neste lugar - intervalo = (Ma1 - Ma2)/Ponto;
if(range > maxrange) maxrange = range;
 
sss2019:
Este é o ponto, eu estava emitindo todos os valores de MA no loop e todos os valores estão corretos, ou seja, todos os valores de MA para este período foram pesquisados. Mas o cálculo está errado neste lugar - intervalo = (Ma1 - Ma2)/Ponto;
if(range > maxrange) maxrange = range;

*Ponto

intervalo = (Ma1 - Ma2)*Ponto





 
pako:

*Ponto

intervalo = (Ma1 - Ma2)*Ponto

MA1 = 0,6526, MA2 = 0,6516. MA1-MA2 = 0,6526-0,6516 = 0,0010. Ponto = 0,0001. Se multiplicada, é uma bilibrary. 0,0010 * 0,0001 = 0,0000001
 
sss2019:
O problema é que eu estava emitindo todos os valores de MA no loop, e todos os valores estão corretos, ou seja, todos os valores de MA para este período foram numerados. Mas o cálculo está errado neste lugar - intervalo = (Ma1 - Ma2)/Ponto;
if(range > maxrange) maxrange = range;

Bem, você precisa verificar o que está sendo introduzido. Quais valores variáveis estão envolvidos nos cálculos?
 

No tutorial MQL no capítulo Funções Padrão na seção Operações Gráficas há uma função WindowHandle com a seguinte descrição: "...retorna o descritor do sistema da janela (alça da janela) contendo o gráfico especificado".

Pergunta: o que significa "puxador de janela" (o que é) e para que serve?

P.S. A fim de não desorganizar o fórum, obrigado antecipadamente por sua resposta