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

 
Roman:

Porque os prazos mínimos abaixo de H1 retornam os valores corretos.
Como descrito na ajuda, eles retornam o valor do tempo, não uma constante fora da caixa.

Que bobagem?

Limpe seus olhos, mostrei-lhe a representação interna de ENUM_TIMEFRAMES

bit 16 que é definido determina o cronograma semanal e mensal

bit 15 set define o tempo horário TF, onde TF D1 = 1000000011000 --> 11000 --> 24, ou seja, os desenvolvedores compararam D1 a 24 horas e o tempo horário restante TFs correspondem à conversão decimal

os prazos mínimos são os mesmos que os horários, mas os bits altos são reiniciados


outra questão é que você pensou que as funções que retornam ENUM_TIMEFRAMES retornam o tempo da TF em minutos - isso não é verdade, essas funções retornam a enumeração de ENUM_TIMEFRAMES - nem mais nem menos, apenas ENUM_TIMEFRAMES

veja o exemplo da ajudaem https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

enumeração também pode ser com atribuição de qualquer valor constante a um membro da enumeração

Você pode criar sua própria enumeração para atender às suas necessidades

 

Muito obrigado! Foi owchar_t que ajudou! Eu li sobre isso, ele armazena 2 bytes por personagem, ao contrário do char.


extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)

{

        str = L" - 889 - dsa - просто!";

        return L"--- Привет! ---";

}


Mas o parâmetro da função "str" ainda não retorna o valor atribuído a ele. Eu me pergunto por que...

 

Olá, você poderia me dizer como resolver um problema? Quero escrever um EA baseado em um indicador (amarrado ao ferro) que constrói muitos níveis (linhas) no gráfico, o número de linhas pode chegar a 500.

Tudo que eu quero implementar é abrir um pedido ou qualquer outro evento (como alerta ou mensagem) quando o preço cruzar linhas no gráfico. Mas o problema é que o indicador não retorna nenhum valor e apenas desenha linhas horizontais (objetos com nomes) - não há mais nada no gráfico.

Tentei encontrar uma solução através da função iCustom que recupera os níveis de preços através da variável "_preço", mas a EA não abre negócios quando as linhas são tocadas. Eu não sei o que fiz de errado.

void OnTick()
  {
  
ENUM_OBJECT typeObj = OBJ_HLINE;
string   ArrLines[];
  
  double 
  Price;
  Price=Bid;
  
//ВАРИАНТ 1 (не получился). Я хотел, чтобы ордер открывался при пересечении любой из линий на графике   
  
//вызовем индикатор: (пара, таймфрейм, индикатор...)
iCustom(Symbol(), 0, "ITS-Level Gun", 0, 0); 

int i, k = ObjectsTotal();

ArrayResize(ArrLines, 0);

//в цикле перебираем все объекты на графике
for (i=k-1; i>=0; i--) {
  
  //узнаем имя объекта на графике
  string _name = ObjectName(i);

{

    //узнаем координату цены линии
    double _price = NormalizeDouble(ObjectGetDouble(0, _name, OBJPROP_PRICE), Digits);
  } 
}

if(Price==_price)
{OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}

    // И ВСЁ, дальше не знаю, что делать


     
    } 
 
  }

OPÇÃO 2: Uma ordem é aberta na linha que especifiquei nas configurações, funciona e abre negócios no nível que especifiquei nos parâmetros EA.


extern string h="@Line_week_open-0"; //ИЗМЕНЕНИЕ ННАЗВАНИЯ ЛИНИИ В СВОЙСТВАХ СОВЕТНИКА.ВАРИАНТ 2.

if(ObjectFind(h)>-1)

    {

     double prise = ObjectGet(h, OBJPROP_PRICE1);

     if (Price==prise)

      {OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}       

    } 
Arquivos anexados:
we3s6_kgeqx.jpg  151 kb
 
Fib0 RU:

Olá, você poderia me dizer como resolver um problema? Quero escrever um EA baseado em um indicador (amarrado ao ferro) que constrói muitos níveis (linhas) no gráfico, o número de linhas pode chegar a 500.

Tudo que eu quero implementar é abrir um pedido ou qualquer outro evento (como alerta ou mensagem) quando o preço cruzar linhas no gráfico. Mas o problema é que o indicador não retorna nenhum valor e apenas desenha linhas horizontais (objetos com nomes) - não há mais nada no gráfico.

Tentei encontrar uma solução através da função iCustom que recupera os níveis de preços através da variável "_preço", mas a EA não abre negócios quando as linhas são tocadas. Eu não sei o que fiz de errado.

OPÇÃO 2, uma ordem é aberta na linha que especifiquei nas configurações; ela funciona e abre negócios nesse nível, que especifiquei nos parâmetros EA



for(int i = ObjectsTotal() - 1; i >=0; i--) {

        // все что не горизонтальные линии - игнорируем

        if(ObjectType(ObjectName(i)) != OBJ_HLINE) continue; 

        double PriceLine = NormalizeDouble(ObjectGet(ObjectName(i), OBJPROP_PRICE1), Digits());
	
	// измените условие Bid == PriceLine
        
	 if(Bid == PriceLine) {

                // ..... тут что-то происходит ... 

        }
}


MAS, e se a Licitação, por alguma razão, pulou a linha e não foi igual ao preço da linha, então o quê? Fornecer então pelo menos uma variável que armazene o tick anterior, e se era um tick novo cruzou sua linha - então faça alguma ação ... Mas, neste caso, não se esqueça de providenciar uma travessia "permissível", pois se o mercado abrir com uma grande brecha, ou se houver um grande salto no preço, você abrirá em muitas linhas de uma só vez e provavelmente não no lugar que você deseja. Se a travessia for maior do que o permitido - apenas uma mensagem será transmitida...

 
Vadim Lin:



MAS, e se a Proposta, por alguma razão, cruzasse a linha, e não fosse igual ao preço da linha, então o que...? Forneça então pelo menos uma variável, na qual o tick anterior esteja armazenado, e se houvesse um novo tick cruzando sua linha - então faça alguma ação... Mas, neste caso, não se esqueça de providenciar uma travessia "permissível", pois se o mercado se abrir com um Gap grande, ou apenas um grande salto no preço, você abrirá em muitas linhas de uma só vez e provavelmente não estará lá onde você quer. Se a travessia for maior do que o permitido - apenas uma mensagem será transmitida...

Código do problema.

 
Igor Makanu:

Que bobagem?

Limpe seus olhos, mostrei-lhe a representação interna de ENUM_TIMEFRAMES

bit 16 que é definido determina o cronograma semanal e mensal

bit 15 é ajustado para determinar o tempo horário TF e TF D1 = 1000000011000 --> 11000 --> 24, ou seja, os desenvolvedores compararam D1 a 24 horas e o tempo horário restante TFs correspondem à conversão decimal

os prazos mínimos são os mesmos que os horários, mas os bits altos são reiniciados


outra questão é que você pensou que as funções que retornam ENUM_TIMEFRAMES retornam o tempo da TF em minutos - isso não é verdade, essas funções retornam a enumeração de ENUM_TIMEFRAMES - nem mais nem menos, apenas ENUM_TIMEFRAMES

veja o exemplo da ajudaem https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

enumeração também pode ser com atribuição de qualquer valor constante a um membro da enumeração

Você pode criar sua própria enumeração para atender às suas necessidades

Igor, há muito tempo está claro sobre valores constantes.
É disso que estou falando, qual é o significado de 15 e 16 bits como um valor de retorno. Isto é apenas um disparate.
Por alguma razão antes das constantes M30 ENUM correspondiam aos valoresTIMFRAME !!!!.
E além disso, já corresponde a valores de alguns bits
. Onde diabos está a lógica nos caras.
Isto é um erro grosseiro. Se foi feito intencionalmente, é um desvio).
Variável _Período já contém todos estes valores de tempo da enumeração ENUM, eles não precisam de conversão adicional.
Portanto, estes valores constantes, devem corresponder aos valores de tempo, como indicado na ajuda. Não BITS!

 
Roman:

É definitivamente a hora da quarentena. Procure tudo o que foi dito sobre o assunto e leia-o a seu bel-prazer. Por que você acha que as pessoas ao seu redor têm que repetir tudo o que você escreveu?

 
Alexey Viktorov:

É definitivamente a hora de colocá-lo em quarentena. Pesquise tudo o que foi dito sobre o assunto e leia-o à sua vontade. Por que você acha que as pessoas ao seu redor deveriam repetir tudo o que você escreveu?

E por que você tolera as soluções erradas? Entreguei uma explicação lógica dos valores das constantes, não do que o desenvolvedor inventou.

 
Roman:

E por que você tolera as soluções erradas? Entreguei uma explicação lógica dos valores das constantes, não do que o desenvolvedor inventou.

Aparentemente, para você há apenas duas opiniões: a sua e a errada. Talvez você consiga encontrar uma explicação que lhe convém.
 
Alexey Viktorov:
Aparentemente, para você há apenas duas opiniões: a sua e a errada. Talvez você consiga encontrar uma explicação que lhe convém.

Tente usar o valor retornado pela variável _Periodo para períodos superiores a H1 em seus cálculos matemáticos.
E você entenderá imediatamente quem está errado.

Razão: