Erros, bugs, perguntas - página 2101

 
damirqa:

Olá! comecei a estudar a MQL5 desdehttps://www.mql5.com/ru/articles/100. Lancei o código e recebi o erro 4756. Dei uma vista de olhos na documentação e não foi melhor. Pensei em começar com algo simples (Alerta/Impressão...). Uma das funções mais importantes é a de OrderSend. Comecei a pesquisar através do fórum/documentação sobre como utilizar o OrderSend. Encontrei este artigohttps://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions e encontrei o código para abrir uma posição de compra. Recebi o erro 4756 e o retcode 10030. Compreendi que 10030 - é a propriedade OrderSend, mas não compreendi como esta propriedade deve ser usada (olhei para o código de outra pessoa) e para que é usada principalmente. Depois abrihttps://www.mql5.com/ru/docs/trading/ordersend, copiei o código, lancei-o, está tudo bem, funcionou.
Mas ainda não compreendo por que razão aparece o erro 4756 e como se livrar dele, bem como o 10030.

Veja-se o código entre

e este aqui.

Parecem-me quase idênticos, não vejo onde aparecem estes erros (4756 e 10030). Aponte o dedo e explique por favor

Um campo na estrutura não é preenchido. E não é suficiente, mas não é um tal erro.

Execução Instantânea

Uma ordem de negociação para abrir uma posição no modo Instant Execution (o modo de negociação a preços de streaming). São necessários 9 campos:

  • acção
  • símbolo
  • volume
  • preço
  • sl
  • tp
  • desvio
  • tipo
  • type_filling

Pode também especificar campos mágicos e de comentários.

Execução do Mercado

Uma ordem de negociação para abrir uma posição no modo de Execução do Mercado. Requer 5 campos a serem especificados:

  • acção
  • símbolo
  • volume
  • tipo
  • type_filling

Pode também especificar campos mágicos e de comentários.


 

que actualização chegou, 1736, o que há nela, onde posso lê-la?

 

Proponho dar uma oportunidade de determinar programmaticamente qual o buffer indicador que está a desenhar no gráfico.

Suponha que um comerciante inicia os seus próprios indicadores, não sabemos quantos amortecedores são utilizados para o cálculo e quantos são utilizados para desenhar o indicador no gráfico.

Abordagem de indicadores personalizados através de

intChartIndicatorGet(
longchart_id,// identificador do gráfico
intsub_janela// número da subjanela
const string indicador_nome_do_código // nome do indicador curto
);


Também podemos solicitar a gama de amortecedores de desenho

intChartIndicatorGet(
longchart_id,// identificador do gráfico
intsub_janela// número da janela
const string indicador_nome_do_código // nome do indicador curto

int & IndicatorVisualBuffer[] // números tampão de desenho... );


Isto aumentará a possibilidade de trabalhar com indicadores desconhecidos instalados no gráfico.

 
Vladimir Pastushak:

Proponho dar uma oportunidade de determinar programmaticamente qual o buffer indicador que está a desenhar no gráfico.

Suponhamos que um comerciante inicia os seus indicadores, não sabemos quantos amortecedores são utilizados para calcular e quantos são utilizados para desenhar o indicador no gráfico.

Dirigir-se ao indicador através de

intChartIndicatorGet(
longchart_id,// ID do gráfico
intsub_janela// número da subjanela
const string indicador_nome_do_código // nome do indicador curto
);


Também podemos solicitar a matriz de tampões de desenho

intChartIndicatorGet(
longchart_id,// identificador do gráfico
intsub_janela// número da janela
const string indicador_nome_do_código // nome do indicador curto

int & IndicatorVisualBuffer[] // números tampão de desenho... );


Isto aumentará a possibilidade de trabalhar com indicadores desconhecidos instalados no gráfico.

O que é que regressa?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

e qual será a utilidade de o acrescentar? Quer adicionar um parâmetro de entrada e receber o mesmo manípulo indicador em resposta...

E, se não se importa, para que fim é necessário? Não estou a ser irónico. Afinal, se algo é sugerido, deve, na minha opinião, dar um argumento convincente da necessidade do sugerido.

 
Alexey Viktorov:

O que é que retorna

e de que serviria adicioná-lo? Propõe-se adicionar um parâmetro de entrada e obter o mesmo manípulo indicador em resposta...

E se não for difícil, para que fins surgiu tal necessidade? A questão é sem ironia. Afinal de contas, se algo é oferecido, é necessário, na minha opinião, dar argumentos convincentes na necessidade do oferecido.


O utilizador coloca qualquer indicador.

O Expert Advisor encontra-o automaticamente e utiliza dados tampão para receber o sinal.


Agora temos de utilizar o iCustom e se conseguirmos escrever a lista de parâmetros, aqui está o problema com buffers....

É possível contar a quantidade de tampões através de Copiar, mas é impossível compreender qual deles está a desenhar ...

 
Vladimir Pastushak:

O utilizador coloca qualquer indicador.

O Expert Advisor encontra-o automaticamente e utiliza dados tampão para obter o sinal.


Agora temos de utilizar o iCustom e se pudermos escrever a lista de parâmetros, aqui está o problema com buffers....

É possível contar a quantidade de tampões usando a cópia programática, mas é impossível compreender qual deles está a desenhar ...

Porque é impossível? O INDICADOR_CALCULÁRIO DE TROCULAÇÃO pode ser retirado através do iCustom()?

É uma questão interessante, mas não neste tópico para a discutir. Pessoalmente, tenho dúvidas de que possa de alguma forma melhorar ou simplificar o trabalho do programador. Os indicadores são demasiado diferentes e as condições da sua aplicação são demasiado diferentes. Então teremos de pedir para poder determinar o tipo de traçado gráfico e algumas outras coisas, e os nossos pedidos internos serão uma bola de neve.

 
Alexey Viktorov:

Porque é que não é possível? O tampão INDICADOR_CALCULATIONS pode ser alcançado através do iCustom()?

A questão é interessante, mas não neste tópico para a discutir. Pessoalmente tenho dúvidas de que possa de alguma forma melhorar ou facilitar o trabalho do programador. Existem indicadores demasiado diferentes e condições demasiado diferentes para a sua aplicação. Depois teremos de pedir para poder determinar o tipo de traçado gráfico e depois algumas outras coisas, e os pedidos serão "bola de neve".


Teoricamente, o que está escrito no indicador por defeito, não estou a falar do código do programador, deve estar disponível a partir do exterior ... Buffers o seu número, tipo de trama, cor, e outros padrões ...

 

Este é o problema que eu encontrei:

Decidi usar como magia o resto da divisão de ChartID por 1000 ou 10000, não importa realmente.

Mas por alguma razão com ChartID() diferente, o resto da divisão é subitamente o mesmo. Pergunta: porquê?

Verificação do guião

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

Resultado

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

Eu esperava ver 74907 e 74908 respectivamente, porque o resto da divisão deveria ser o mesmo.


Estou também à espera de uma resposta a esta pergunta.

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

Alexey Viktorov, 2018.01.09 14:21

No testador MT5 o objecto "Campo de entrada" OBJ_EDIT não permite editar o valor nele contido. É assim que é concebido ou é um insecto?

Em terminais e MT4 tester é editável, mas em MT5 tester não quer, o valor introduzido programmaticamente ao criar o objecto desaparece de todo.


 
Alexey Viktorov:

Mas por alguma razão diferente ChartID() produz subitamente o mesmo resíduo da divisão. Pergunta: porquê?

Porque o fmod de entrada é o dobro. O dobro não pode armazenar um grande número de inteiros. Por exemplo, este é o seu caso:

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

Façam isto.

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


Usando a bóia como exemplo, pode rapidamente compreender a peculiaridade do duplo

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


Resultado

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


O duplo SZY não perde a informação de todo o alcance, não tanto com o longo prazo.

 
fxsaber:

Porque a fmod de entrada é o dobro. O dobro não pode armazenar um grande número de inteiros. Por exemplo, o seu caso:

Façam isto.

Claro, vou verificar esta amostra agora, mas também tinha um código de verificação como este

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

o resultado é

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

Indica que não deve haver truncagem de valores.


Mas aqui verifiquei esta variante e alterei ligeiramente a proposta

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

e obteve a variante esperada.

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

Surge outra questão,

Se MathMod, bem como fmoddevolve o resto real após a divisão de dois números. E % de acordo com a documentação

O resto dos minutos = tempo % 60;


porque é que existe uma diferença?