Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 115

 

Pessoal, aqui vai uma pergunta - como colocar valores variáveis em uma matriz unidimensional?

Não o envie para ajudar - não há exemplo para tal problema.


Digamos que existe uma variável a, que muda sob certas condições.

Quero um array para armazenar os 3 últimos valores desta variável. Como isto é implementado em mql4?


Estou escrevendo em massa[3];

mas[]=a; dentro do laço, após uma condição que muda a,

O compilador dá ']', mas nada funciona, embora logicamente deva funcionar. - expressão esperada, ele quer que eu coloque alguma expressão desconhecida dentro de parênteses em mas[]=a.

A MQL4 tem alguma função que preencha a matriz com um valor variável em cada iteração de loop?


 
Igor Makanu:

Peço desculpas por não ter encontrado o início da correspondência, mas gostaria de aconselhá-lo imediatamente a evitar condições e cálculos complexos neles - isto torna o código ilegível e como resultado complica a busca por erros lógicos, eu escreveria seu código desta forma:

Se você entender o que quero dizer, pode modificar o código que lhe dei um pouco mais, quero dizer colocá-lo em uma condição separadase(OrderType()==OP_BUY....

Então será muito mais fácil encontrar erros lógicos, imho

Inserir após cada EncomendaEnviar => devolver

ou fazer uma seleção através do interruptor :

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

Tentar isto e não funciona.

você tem poucos parâmetros de entrada em sua chamada de indicador personalizada - conte quantasvariáveis externas no indicadorMorning Flat? (externo) - é quantos parâmetros você deve passar ao usar o iCustom

 
John Smith:
.....

Eu escrevo int mas[3]=a; dentro do laço após a condição quando uma condição muda,

mas nada funciona, embora logicamente deva funcionar.

Aprender a fazer todas as ações passo a passo em vez de todas ao mesmo tempo.

Exemplo :

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

você tem poucos parâmetros de entrada em sua chamada de indicador personalizada - conte quantasvariáveis externas no indicadorMorning Flat? (externo) - é quantos parâmetros você deve passar ao usar o iCustom

Já experimentei todos eles.

Resolvi isso de outra forma. Inseri o código de cálculo de preço do indicador em meu Consultor Especialista.

 
Igor Makanu:

A lógica do código é a mesma, mas se você dividir as condições, é mais rápido encontrar onde está o erro lógico, e no seu caso, se você colocá-lo em uma condição separada, você obtém otimização - a condição será verificada uma vez e não 4 vezes:

em uma condição separada, obtemos uma otimização de código - a condição será verificada uma vez e não 4 vezes como no seu exemplo.

Verifique a saída no diário do Expert Advisor usando o

para registro para que você possa ver qual fragmento de código foi executado e com quais parâmetros

Obrigado por sua resposta. Dividir as condições até o limite. Verifiquei a lógica com comentários. Acontece que o fechamento da posição se baseia nas condições da primeira posição aberta. Isso significa que se primeiro abrirmos uma posição de Compra ou Venda com a Condição 1 e depois uma segunda posição aberta com a mesma condição mas com a Condição 2, essa condição de fechamento é ignorada e a segunda posição também é fechada com a Condição 1 independentemente do outro número mágico. O que eu devo fazer?

 
Vladimir Tkach:

Eu já passei por todas elas.

Eu resolvi o problema de uma maneira diferente. Coloquei o código de cálculo de preço de indicador para Expert Advisor.

Notei que o iCustom() não foi chamado corretamente, deveria ser assim:

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

Eu passo 7 parâmetros ao chamar o indicador, você o chamou com 3 parâmetros

Eu deixaria a chamada do indicador, mas modificaria o próprio indicador - removeria variáveis externas e objetos gráficos do código indicador


novichok2018:

Eu verifiquei a lógica com comentários. Verificou-se que as posições são fechadas de acordo com as condições da primeira posição aberta.

Parabéns! Você está no caminho certo, mas é melhor na fase de depuração imprimi-lo no diário (Print()) em vez de no comentário ( Commetn())

Mostre-me o código.

 
Igor Makanu:

Então, notei que você não chamou o iCustom() corretamente, deveria ser assim:

Eu passo 7 parâmetros ao chamar o indicador, e você o chamou com 3 parâmetros

Eu deixaria a chamada do indicador, mas modificaria o próprio indicador - removeria variáveis externas e objetos gráficos do código indicador


parabéns! Você está no caminho certo, mas é melhor na fase de depuração para sair no diário (Print()) em vez de no comentário ( Commetn())

mostrar o código.

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

Tirei as impressões digitais.

 
novichok2018:

Tirei as impressões digitais.

Eu não sei toda a lógica de seu código, mas após cada fechamento de ordem você definitivamente precisa sair do loop via break; e no próximo tick você precisa verificar as ordens em suas condições novamente - eu não sei comoOrderSelect() se comportaapós o fechamento da ordem - se a ordem é fechada, então o que é selecionado, ou há um erro?

Basicamente, seu problema é que você quer verificar e fechar tudo de uma só vez em um loop.

interruptor()

ou fazer uma função para fechar o pedido (há funções prontas para pedidos https://www.mql5.com/ru/forum/131859/page2#434206 )

ou usar intervalo após o fechamento do pedido em seu código

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

Eu não sei toda a lógica de seu código, mas após cada fechamento de uma ordem, você definitivamente precisa sair do loop via break; e no próximo tick você precisa verificar suas condições novamente - eu não sei como aOrderSelect() se comportaapós o fechamento da ordem - se a ordem é fechada, então o que é selecionado, ou há um erro?

Basicamente, seu problema é que você quer verificar e fechar tudo de uma só vez em um loop.

interruptor()

ou fazer uma função para fechar o pedido (há funções prontas para pedidos https://www.mql5.com/ru/forum/107476 )

ou usar intervalo após o fechamento do pedido em seu código

Obrigado. A quebra parece ter ajudado. Veremos o que acontece a seguir.