[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 333

 
Olá queridos programadores!

Há necessidade da seguinte análise - o programa deve analisar os parâmetros que lhe foram dados e emitir o resultado em uma janela separada na forma de uma tabela com um conjunto de datas. Isso significa que o programa deve analisar o histórico e exibir as datas necessárias.

É possível fazer isso na MQL4 ou é melhor exportar o histórico e analisar os dados usando um programa escrito em outro idioma?

Agradecemos antecipadamente!
 
GygaByte:


Correto, mas como a prática tem mostrado - nem sempre.

Se o quinto ponto decimal = 5 (1,xxxx5), o valor ainda está distorcido:

a pergunta ainda é válida...

P.S. Em geral, eu preciso atribuir um valor de preço ao MagicNumber. E digite MagicNumber - int, aqui e tente converter por

Quem mais pode me dar conselhos?

Obrigado.

Você está produzindo com arredondamentos diferentes - para não ver o número completo - e acha que algo está distorcido. Por padrão, ao emitir números reais, a saída é arredondada para o 4º dígito. Para números de 5 dígitos, você deve arredondar a saída explicitamente:

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

Veja sua própria imagem - lance de saída sem DoubleToStr() e com DoubleToStr().

 
hoz:

Artyom e Boris, obrigado por "mastigar" a minha pergunta. Eu tenho períodos em que posso ficar preso a coisas bastante simples, como foi o caso desta vez...

Agora há uma nova pergunta.

Adicionei à função que calcula a quantidade de ordens abertas t, procura ordens de um tipo especificado com lucros especificados e compara seus lucros com algum valor especificado (atualmente 0). Além disso, se não houver ordens abertas, 2 bandeiras com valor Verdadeiro são retornadas com a função FindOrders() parâmetros, significa que você pode enviar uma ordem, mas se houver ordens, o lucro é verificado para garantir que seja maior que o valor definido, se for menor que o valor definido, 2 bandeiras com valor Falso são retornadas com a função FindOrders() parâmetros, portanto, quando há ordens perdidas em alguma direção, não há investimentos na direção perdida.

Depois disso, chamo a função FindOrders() na função de sinal:

As ordens foram abertas. A lógica parece estar correta. Talvez, você pode ver onde eu cometi um erro?

Entendo que tudo pode ser feito mais facilmente com uma função separada e eu posso fazer isso. Mas eu quero entender porque não funciona nesta versão.

Victor, não consigo entender totalmente seu algoritmo, mas posso lhe dar alguns conselhos! Acontece comigo também, quando há um erro na lógica. O programa é inoperante se se revelar ambíguo ou mutuamente exclusivo em suas condições. Talvez você saiba o que quer, mas não consegue construir a lógica do código corretamente. Procure essas falhas e anote toda a ordem na qual você quer que as condições sejam executadas, uma a uma, em papel com setas para maior clareza! Boa sorte!
 
borilunad:
Victor, não consigo entender totalmente seu algoritmo, mas posso lhe dar alguns conselhos! Isto também me acontece quando há um erro de lógica. O programa é inoperante se se revelar ambíguo ou mutuamente exclusivo em suas condições. Talvez você saiba o que quer, mas não consegue construir a lógica do código corretamente. Procure estas falhas e anote toda a ordem na qual você quer que as condições sejam executadas, uma a uma em um pedaço de papel com setas para maior clareza! Boa sorte!


Portanto, há aí uma lógica simples. Se não houver ordens abertas, as ordens serão abertas pelo sinal.

E se houver ordens abertas, então as ordens devem ser abertas por um sinal específico, se o lucro das ordens em uma determinada direção (compra ou venda) for superior a um determinado valor, ou seja, pelo menos não em menos. (Eu defini 0 lá para testes).

Encontrei um erro lógico. Aqui está o que saiu:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

Agora as ordens de venda abrem corretamente, mas os longos não abrem de forma alguma. Embora a bandeira tenha valor de ambas as variáveis 1, ou seja, verdadeiro.

 

Eu tenho este problema com o mt4.

Com o lançamento do software de corretagem mt4 (ou seja, os 3 que tenho usado na última semana) no meu computador, recebo uma janela "Run as user" no meu computador (o mesmo que usar "run as user"). Com qualquer seleção de ação o mt4 abre normalmente.

Como posso fazer com que o mt4.eh volte a funcionar sem esta janela? Talvez quem saiba ou entenda o que está errado...

 

Boa tarde, encontrou a necessidade de cancelar rapidamente todas as ordens pendentes. OrderClose ignora as ordens pendentes. Qual operador é mais conveniente de usar, e esta opção está disponível?

 
Notter:

Boa tarde, encontrou a necessidade de cancelar rapidamente todas as ordens pendentes. OrderClose ignora as ordens pendentes. Qual operador é mais conveniente de usar, e esta opção está disponível?


Você pode fechar somente ordens de mercado e precisa que o operador OrderDelete apague as ordens pendentes.
 

hoz

Obrigado!

 
hoz:


Portanto, tudo é simples em sua lógica. Precisamos que, se não houver ordens abertas, as ordens serão abertas pelo sinal.

E se houver ordens abertas, então as ordens devem ser abertas por um sinal específico, se o lucro das ordens em uma determinada direção (compra ou venda) for superior a um determinado valor, ou seja, pelo menos não em menos. (Eu defini 0 lá para testes).

Encontrei um erro lógico. Aqui está o que saiu:

Agora as ordens de venda abrem corretamente, mas os longos não abrem de forma alguma. Embora a bandeira tenha valor das duas variáveis 1, ou seja, verdadeira.

Victor, faça algumas verificações! Ao comentar a compra longa, olhe no registro para ver como funciona a venda curta! E vice versa, então veja qual é a diferença e descubra porque não funciona!
 
borilunad:
Victor, vamos checar! Ao comentar o lado longo, verifique como funciona o lado curto no tronco! E vice versa, então veja qual é a diferença e descubra porque não funciona!


Boris, se você comentar uma das condições em GetGeneralSignal(), a abertura é clara.

Eu o localizei. A bandeira não muda seu valor quando a rentabilidade dos pedidos atualmente abertos está em déficit. Aqui está a função reescrita que deve definir os valores das bandeiras curtas e longas como falsos, ou seja, proibir-nos de abrir uma posição se houver menos ordens:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Aqui está a função de chamada:

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}
Razão: