[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 82

 
nemo811:
Obrigado pela ajuda. Entendi a lógica de colocar a bandeira e a função de devolver o número de pedidos. Mas também estou interessado no momento em que o pedido é fechado. Parece que a condição da bandeira tenta colocar uma ordem novamente, mas a função de devolução do número de ordem diz que diminuiu 1 e inicializa a abertura de uma posição também. Corrija-me se me escapou alguma coisa.


No código que você forneceu, a condição está em um lugar (BUY=true) e até que a bandeira mude, a reabertura não acontecerá...porque a chamada de função para abrir uma posição vem deste bloco de condição...E a bandeira neste código só pode mudar depois que a EA for reiniciada, quando a variável com o valor verdadeiro será inicializada.

Ou talvez eu não entenda a pergunta:)

 
NameLess:


A bandeira neste código só pode mudar após reiniciar o Expert Advisor, quando a variável com o valor verdadeiro é inicializada.

ou eu não entendo a pergunta:)


Obrigado, você acertou. Vou implementá-lo agora.
 
NameLess:


Esta é a versão que acabou funcionando. Muito obrigado a você e ao IgorM:

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3; 
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int ticket = -1;
while (ticket<0)
{
if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
Sleep(500);
}
return;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

Gente, nada ajuda! não consigo obter um valor com 5 casas decimais. tentei todas as opções que pude pensar, traduzi uma corda em um número, traduzi um substrato em um número, tirei os dígitos (exemplo acima) e estupidamente os adicionei um por um, além de 4 casas decimais ele simplesmente não adiciona e começa a arredondar para 4 casas decimais. mesmo assim, não é bom(

Será que Alerta não exibe variáveis duplas além do 4º sinal? Não sei o que pensar... algum tipo de mistério(

 

Escrevi dois EAs ligados entre si (eles não negociam, apenas criam gobals) e acho que posso usá-los para fazer um gráfico de volume equi semelhante ao gráfico de preço regular em mt4. Ou se alguém já tiver usado algo semelhante, por favor, compartilhe o código:)

Arquivos anexados:
eqvol.rar  3 kb
 
NameLess:

Será que o Alerta não exibe variáveis duplas além do 4º dígito? Não sei o que pensar... algum tipo de mistério(

Sim. Ele (como Imprimir) exibe os 4 dígitos padrão se apenas um número for emitido.

Use o DoubleToStr para ser mais preciso.

 

Rrrrrrrrrrrrrrr. direito, o terminal em Alerta não está exibindo mais de 4 caracteres. eu troquei o duplo de volta para a linha e tirei-o para olhar para a tela - tudo está correto.

matou meio dia por este absurdo. lata, e tudo estava funcionando inicialmente(

 
NameLess:

Gente, nada ajuda! não consigo obter um valor com 5 casas decimais. tentei todas as opções que pude pensar, traduzi uma string em um número, traduzi uma substring em um número, tirei números (exemplo acima) e estupidamente os adicionei um por um, além da 4ª casa decimal ela simplesmente não adiciona e começa a arredondar para a 4ª casa decimal. mesmo assim, adicionei a 6ª casa decimal. ainda assim ela falha(

Pode ser que o Alerta não apareça além do 4º sinal da variável duplo? (A corda mostra tudo) Eu já não sei o que pensar.

Bem, como sempre, todos descansam na experiência. Nós escrevemos o roteiro:

#property copyright ""
#property link      ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  string Stroka,Podstroka,SMB;
        int DGS,BezDrobi;
        double Rezult;
        SMB=Symbol();
        //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS=5;// дигитс задаём принудительно, чтоб можно было проверить на любой валюте
        // передаём левое значение в переменную
        Rezult=1.252546987;
        // возводим число в степень
        for(int i=1;i<=DGS;i++){
                Rezult=Rezult*10;
        }
        // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult);// функция отбрасывает дробную часть числа
        Alert("BezDrobi = ",BezDrobi);
        // теперь ставим на место запятую
        Rezult=BezDrobi*1.0;
        for(i=1;i<=DGS;i++){
                Rezult=Rezult/10;
                Alert("Rezult = ",Rezult);
        }
        Alert("----------- ",SMB," -----------");
        return(0);
}

Como podemos ver, há um cartão dll conectado ao roteiro. Ela tem apenas uma função que tira a parte fracionária do número. O arquivo dll está anexado a este post. Agora devemos aplicar o script sequencialmente a 2 pares de moedas. Coloquei-o sobre a libra e o euro-japonês. Na libra, eu tenho 4 casas decimais. Sobre o par de moedas euro-japonês - dois. Aqui está o resultado da operação do roteiro:

Na libra, você pode ver como a vírgula se move consistentemente. E você também pode ver que a última divisão deixa 4 dígitos na parte fracionária. Podemos assumir que, como meus dígitos = 4, o quinto dígito após o ponto decimal é cortado. Portanto, o eurojaponês também deve resultar em apenas 2 dígitos após o ponto decimal, uma vez que os dígitos sobre ele = 2. Entretanto, a experiência mostra que ela também rende 4 dígitos após o ponto decimal. Portanto, nossa suposição não está correta e o arredondamento pode estar ocorrendo. Vamos tentar substituir os 4 finais por 7. O resultado:

O que vemos? Os cinco resultantes agora se tornam um seis. Conseqüentemente, o arredondamento automático é realizado.

Não sei como o roteiro se comportará sobre o personagem de cinco dígitos, mas não fiquei satisfeito com o trabalho sobre os caracteres de quatro e dois dígitos - o terminal interferiu e completou sem ser solicitado a fazê-lo. Portanto, tenho que fazer perguntas aos desenvolvedores. Ou - opção 2 - fazer leituras indicadoras, colocá-las em uma string, enviar a string para uma dll, processar os dados lá conforme a necessidade e devolver a ordem de troca da dll.

Arquivos anexados:
experts.rar  42 kb
 

Informações da ajuda (De acordo com o Alerta):

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().

Vá descobrir porque os desenvolvedores fizeram isso...

 
drknn:


Obrigado, estudei o código, muito interessante. Tudo, como descrevi acima, acabou sendo mais simples: o terminal simplesmente não exibe mais do que o 4º dígito na janela. e todas as idéias funcionaram, apenas resolveram o problema da conversão de diferentes maneiras :)

zy. Mais uma vez estou convencido de que todos os problemas são resolvidos de forma lógica, e aqui a situação era originalmente ilógica, então estávamos procurando um engate no lugar errado :)