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

 
Denis Diakonov:

não, por exemplo, passar primeiro o caso 1, depois o caso 2, etc.

Os casos executam uma abertura de ordem

O pedido é aberto em mais de um lugar. Você tem que pensar exatamente como pensa neste código, e é difícil.

 
Se houver um ciclo dentro de um OnTick da EA que leva um tempo decente, ele será executado completamente, ou a chegada de um novo tick irá interromper tudo?
 
Alexey Viktorov:

Há mais de uma abertura. Em tal código, você tem que pensar exatamente como pensa, e isso é difícil.

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
Se houver um loop dentro do EA OnTick que leve um tempo decente, ele será executado completamente ou a chegada de um novo tick interromperá tudo isso?

Eu também não entendo, no meu caso o loop é aberto e nem todas as ordens são abertas, algumas são abertas duas vezes e algumas são puladas, entendo que um novo tick aciona o início e o código suspende sua execução e começa a funcionar novamente

 
Denis Diakonov:

Entendo que um novo tique aciona um início e o código pausa sua execução e começa a ser executado novamente.

não invente isso.

leia a ajuda, está claramente escrito lá que se houver cálculos complexos na EA, o novo tick será pulado

em algum lugar no artigo sobre funções de tratamento de eventos ou talvez em operações comerciais ou em RefreshRates

procure por erro lógico em seu código


HH: switch() - caso não é usado para condições lógicas complexas, melhores combinações de if() - assim você obtém ramos lógicos mais inequívocos

 
Igor Makanu:

não invente.

leia a ajuda, ela diz claramente que se houver cálculos complexos na EA, o novo tick será pulado

em algum lugar no artigo sobre funções de tratamento de eventos ou talvez em operações comerciais ou em RefreshRates

procure por erro lógico em seu código


SZY: switch() - caso não é usado para condições lógicas complexas, melhores combinações de if() else - assim são obtidos ramos lógicos mais inequívocos

sim, obrigado, já decidi escrever tudo também se-else

 
Denis Diakonov:

Por que você adicionou o interruptor aqui? É mais fácil obter a direção do negócio e o número de aberturas necessárias para a função e abrir tantas aberturas quantas forem especificadas no laço.

É por isso que eu digo que entender sua lógica está além da minha mente. Por que uma bagunça assim?

 
Alexey Viktorov:

Por que você adicionou o interruptor aqui? É mais fácil obter a direção do negócio e o número de aberturas necessárias para a função e abrir tantas aberturas quantas forem especificadas no laço.

É por isso que eu digo que entender sua lógica está além da minha mente. Por que uma bagunça assim?

Bem, meu código acabou de aumentar de tamanho, e eu pensei que seria muito mais fácil.

Na verdade, se o caso pudesse ser chamado quantas vezes eu quisesse durante a execução de uma função, seria mais fácil e o código seria compacto.

Não preciso abrir negócios semelhantes em loop e eles são abertos para símbolos diferentes simultaneamente (tanto quanto possível) após a ocorrência de um sinal.

caso 1 - audusd buy

caso 5 - gbpusd buy

caso 9 - eurusd buy

etc.

No primeiro caso eu tenho uma folha com estojo e no segundo com análise, se interagissem, seriam 500 linhas.

A segunda variante implica prescrever uma abertura de ordem específica dentro da função com análise e o total de linhas seria de 1200+, o que eventualmente afetaria a velocidade de execução do programa

 

Você pode me ajudar, por favor! O Expert Advisor utiliza o indicador Envelopes com cálculo dinâmico de desvio. Mas quando é exibido no gráfico, ele mostra toda a dinâmica do desvio do indicador em todas as barras anteriores.

envelopes dinâmicos

1. Existe uma maneira de fazer o indicador desenhar corretamente? Ou seja, ele desenharia o indicador com seu desvio somente em sua própria barra.

2. Como posso desativar o desenho do indicador em um Expert Advisor, deixando apenas seus cálculos? Quero habilitar a desativação do desenho do indicador em configurações especializadas )

 
Denis Diakonov:

Bem, no final meu código só cresceu em tamanho, enquanto eu pensava que seria mais simples.

De qualquer forma, se fosse possível chamar o caso quantas vezes eu quiser durante a execução de uma função, seria mais fácil e o código seria mais compacto.

Não preciso abrir negócios semelhantes em loop e eles são abertos para símbolos diferentes simultaneamente (tanto quanto possível) após a ocorrência de um sinal.

caso 1 - audusd buy

caso 5 - gbpusd buy

caso 9 - eurusd buy

etc.

No primeiro caso eu tenho uma folha com estojo e no segundo com análise, se interagissem, seriam 500 linhas.

A segunda variante implica prescrever uma abertura de ordem específica dentro da função com análise e o total de linhas seria de 1200+, o que acabaria por afetar a velocidade de execução do programa

Com o que você está digitando tantas linhas de código? Aqui está um dos meus últimos EA, ele trabalha com um conjunto de títulos em FORTS

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

Como muitos títulos serão listados nesta lista, tantos serão negociados. E esta EA com controle de dois prazos comerciais, com trailing e, é claro, com análise, apenas 326 linhas.

Se você quiser usar o interruptor, não é necessário adicionar abertura de posição em cada variante. É suficiente especificar o nome do símbolo, o tipo de operação comercial e o

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

Mas seria melhor, em minha opinião, embrulhar tudo isso em uma função definida pelo usuário.

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }
Razão: