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

 
AlexeyVik:

Meu entendimento é que ele precisa obter parâmetros de objetos de outro gráfico.

Se a partir de outro gráfico, deixe-o usar a variante de função com o identificador do gráfico.

também não há problema.

 
sergeev:

Se for de um gráfico diferente, deixe-o usar uma variante de função com um identificador de gráfico.

também não há problema.

Absolutamente certo, mas ainda não precisei usar um identificador gráfico e estou apenas teoricamente familiarizado com ele, por isso sugeri a opção de mapear objetos para o gráfico atual.
 
rov_kvn:



Isso é ótimo! Esse era exatamente o ponto. Obrigado, querido camarada!
 
sergeev:

Se for de um gráfico diferente, deixe-o usar uma variante de função com um identificador de gráfico.

Também não há problema.


Pelo que entendi, as únicas opções são ObjectGetDouble() para preço e ObjectGetInteger() para data no meu caso.

Eu tento obter o preço no TF atual com chart_id = 0

double price1 = ObjectGetDouble(0,"Supply",3);

- valor como deve ser. Eu tentei tanto IDs como valores daqui https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes ao invés de 0, mas ele retorna 0. Como deve ser um "correto" chart_id?

 
.roman.:

Pelo que entendi, as únicas opções são ObjectGetDouble() para preço e ObjectGetInteger() para data no meu caso.

Estou tentando obter o preço no TF atual com chart_id = 0

- valor como deve ser. Eu tentei tanto IDs como valores daqui https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes ao invés de 0, mas ele retorna 0. Como deve ser um "correto" chart_id?

chart_id = 0 não é o TF, é o gráfico atual. Você precisa encontrar o chart_id para o chart_id que tem o objeto desejado. Foi o que não fiz porque era temporariamente desnecessário.
 
.roman.:

Pelo que entendi, as únicas opções são ObjectGetDouble() para preço e ObjectGetInteger() para data no meu caso.

Tentando obter o preço no TF atual com chart_id = 0

double price1 = ObjectGetDouble(0,"Supply",3);


o que é 3?



- O valor é como deve ser. Eu tentei tanto IDs como valores daqui https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes ao invés de 0, mas ele retorna 0. Como deve ser um "correto" chart_id?

O que os períodos TF têm a ver com o chart_id?


você tem um buraco irrealista em sua compreensão do que usar


Descreva seu problema, não fique muito obscuro e ao redor do intestino.

De que preciso para recuperar dados de um objeto?

- ObjectGet Por que você não gostou?

 
sergeev:

o que é 3?


O valor do preço do limite inferior do retângulo. https://docs.mql4.com/constants/objectconstants/enum_object_property


o que os períodos da TF têm a ver com a identificação do gráfico?

Não tenho a menor idéia de como. É por isso que eu mesmo estou tentando fazer isso e pergunto, já que falhei.

sergeev:
descrever sua tarefa, não ficar escuro e tatear. o que exatamente você precisa? obter dados de um objeto? - ObjectGet What's wrong with it?

Você está perguntando seriamente? Já escrevi 3 vezes que preciso obter dados retangulares (2 coordenadas de preço e duas coordenadas de tempo usadas para construir retângulos) de dois outros períodos de tempo (H4 e D), enquanto estou no terceiro (H1).

ObjectGet não é adequado porque não pode receber nada de outro período de tempo.

O indicador desenha retângulos em todos os períodos de tempo e eu acrescentei código a ele, ele transmitirá coordenadas retangulares de outros períodos de tempo sem mudar para eles. Não sei como explicá-lo de outra forma.

 
.roman.:

O valor do preço do limite inferior do retângulo. https://docs.mql4.com/constants/objectconstants/enum_object_property



Não tenho a menor idéia de como. É por isso que estou tentando fazer isso por intuição e pergunta, porque não funcionou.

Você está perguntando seriamente? Já escrevi 3 vezes que preciso obter dados retangulares (2 coordenadas de preço e duas coordenadas de tempo para construir retângulos) de dois outros períodos de tempo (H4 e D), enquanto estou no terceiro (H1).

A ObjectGet não é adequada porque não consigo obter nada de outro prazo com ela.

Ele desenha retângulos em todos os períodos de tempo e eu estou adicionando código a ele, pelo qual ele passará as coordenadas de retângulos de outros períodos de tempo sem mudar para eles. Eu não sei como explicar de outra forma.

Basta entender, outro cronograma e outro gráfico ou gráfico são conceitos diferentes e, conseqüentemente, abordagens diferentes para resolver problemas.
 
AlexeyVik:
Entenda que um TF diferente e um gráfico ou gráfico diferente são conceitos diferentes e, portanto, abordagens diferentes para resolver problemas.

Portanto, só estou feliz em compreender e aceitar qualquer solução, se eu tiver idéias. É por isso que estou pedindo conselhos sobre como implementá-la.
 
Top2n:

Obrigado! Entendido. Exceto que, com o erro OrderSelect, não está claro como parar, exceto paracontinuar.

Apagada a mensagem tardia, fez quase o mesmo que o descrito.

Às vezes é possível combinar valor de retorno e sinal de erro. Quando faz sentido tomar algum valor como um sinal de erro. Por exemplo, um preço médio igual a 0.

Então, assim que OrderSelect() retorna um sinal de erro, nossa função retorna um sinal de erro de uma só vez:

#property strict

/******************************************************************************/
double CenaUsrednenija(const int type,const int Magic){
  double nn = 0, bb = 0;

  for(int i = OrdersTotal() - 1; i >= 0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderSymbol() == Symbol() && OrderType() == type && OrderMagicNumber() == Magic)
      {
        double op = OrderOpenPrice();
        double llot = OrderLots();

        bb += op * llot;
        nn += llot;
        Print("  type = ", type, " Цена открытия = ", op, " Лот = ", llot, " itog = op * llot = ", op * llot, " factb = bb / nn = ", bb / nn);
      }
    } else {
      return 0; // Цена == 0 - признак ошибки (OrderSelect() не смогла выбрать ордер)
    }
  }

  return nn != 0 ? NormalizeDouble(bb / nn, _Digits) : 0; // Делить на 0 не следует
}

/******************************************************************************/
void OnStart() {
  Print("CenaUsrednenija(OP_BUY, 536525) = ", CenaUsrednenija(OP_BUY, 536525));
}

Executei-o por conta própria, eu o consegui:

23:32:03 Script 1 EURUSD,H1: loaded successfully
23:32:03 1 EURUSD,H1: initialized
23:32:03 1 EURUSD,H1:   type = 0 Цена открытия = 1.36626 Лот = 0.1 itog = op * llot = 0.136626 factb = bb / nn = 1.36626
23:32:03 1 EURUSD,H1:   type = 0 Цена открытия = 1.36931 Лот = 0.1 itog = op * llot = 0.136931 factb = bb / nn = 1.367785
23:32:03 1 EURUSD,H1: CenaUsrednenija(OP_BUY, 536525) = 1.36779
23:32:03 1 EURUSD,H1: uninit reason 0
23:32:03 Script 1 EURUSD,H1: removed

Parece ser verdade...

Sim, eu não usei uma expressão condicional em Print() para evitar uma divisão hipotética por 0 porque esta Print() é uma debug...