[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 579

 
lottamer:

eh...porque não foi possível escrever assim a condição para verificar as ordens abertas:

se EncomendasTotal() > 0

tudo é claro e compreensível... seria...

Há uma hora que estou tentando descobrir COMO escrever esta condição...


Por que não? Você pode, mas será acionado se houver ordens abertas ou pendentes sobre qualquer símbolo.
 
rigonich:

Por que não? você pode, mas será acionado se houver ordens em aberto ou pendentes em qualquer instrumento.


Gostaria que funcionasse - tenho uma posição e uma ferramenta.

Mas não funciona!

Diz que há um erro no código.

a isto

---------------------------

int start()

{

//----

se EncomendasTotal()>0

PlaySound ("alert.wav");

//----

retorno(0);

}

-----------------------------

desiste de 8 erros!!!

 

//---------------------------

int start()

  {

//----

   if (OrdersTotal()>0)

PlaySound ("alert.wav");

//----

  }

 return(0);

 
//-----------------------------

Que tal isso?
 
BeerGod:

Que tal isso?


:)))))))))))))))))))

lindíssimo! Obrigado

 
Desead:


Portanto, deinit é chamado quando eu excluo um robô de um gráfico - não consigo rastrear esta condição de outra forma..... é provavelmente mais fácil escrever um script separado que apague todos os robôs pendentes restantes, não há outra forma.

A propósito, outro pensamento sobre o assunto:

Acho que resolvi o problema da eliminação de ordens pendentes. Eu determino a quantidade de ordens "necessárias" (a serem removidas) em uma função separada, chamada esta função e depois, enquanto com condição (Total>0), então o ciclo de remoção para(int i=Total-1;i<=0l; i--), novamente calculando"necessário" e contador de tentativas de remoção com saída deenquanto quando o nível dado for alcançado. Desta forma, tudo é apagado.

Um loop infinito pode ocorrer aqui caso uma das ordens desapareça após o momento da contagem por qualquer motivo


Por que isso não pode ser feito? Por exemplo, criar uma variável global em nível terminal, atribuir um valor a ela e verificar o início e a mudança de valor desta variável através do serviço -->variáveis globais antes de ser desligada.
 
BeerGod:

E assim ?


E posso perguntar: o que eles estão tentando fazer com isso?

for(int i=0; i<OrdersTotal(); i++)

parece que eles estão tentando contar posições abertas usando o método da força bruta.

 

Bom dia!!! Não é possível encontrar uma solução bonita para a situação. Aqui está uma configuração típica de ordem. Mas se eu der zero ao meu robô em parâmetros, ou seja, sem paradas e takeprofits, nada vai funcionar.

 if(!srabotka){
           OrderSend (Symbol( ), OP_BUY, lot ,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (stop*Point),Digits),   NormalizeDouble( Ask+( 45*Point),Digits), NULL, 450, 0, CLR_NONE);
           int Error=GetLastError();if (Error==0){  
           Sleep(2000); RefreshRates(); 
           OrderSend (Symbol( ), OP_SELL,  lot ,NormalizeDouble(Bid, Digits), 5, NormalizeDouble( Bid+ (stop*Point),Digits), NormalizeDouble( Bid-( 45*Point),Digits), NULL, 450, 0, CLR_NONE); 
           Error=GetLastError();
           if (Error==0){  profit = NormalizeDouble( Ask+( 45*Point),Digits); //tsena=Ask; perenos = false;  
           srabotka= true; }}}
           
           if (Error!=0){ string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}
 

Também podemos definir um "se" e inserir um pedido com zeros pela segunda vez, mas isso é um pouco incômodo.

 
lottamer:


E posso perguntar o que eles estão tentando fazer aqui?

for(int i=0; i<OrdersTotal(); i++)

parece que está a tentar contar as posições em aberto...


Bem, ele seleciona as ordens por parâmetros especificados.

por exemplo, https://www.mql5.com/ru/forum/131859/page3#434221

Função NúmeroOfPosições().

Esta função retorna o número de posições abertas no momento. A seleção mais precisa das posições contadas é especificada por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições do instrumento especificado. O valor padrão "" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - identificador de posição, MagicNumber. O valor padrão de -1 significa qualquer identificador.
  • //+----------------------------------------------------------------------------+
    //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
    //+----------------------------------------------------------------------------+
    //|  Версия   : 19.02.2008                                                     |
    //|  Описание : Возвращает количество позиций.                                 |
    //+----------------------------------------------------------------------------+
    //|  Параметры:                                                                |
    //|    sy - наименование инструмента   (""   - любой символ,                   |
    //|                                     NULL - текущий символ)                 |
    //|    op - операция                   (-1   - любая позиция)                  |
    //|    mn - MagicNumber                (-1   - любой магик)                    |
    //+----------------------------------------------------------------------------+
    int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
      int i, k=OrdersTotal(), kp=0;
    
      if (sy=="0") sy=Symbol();
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==sy || sy=="") {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
              if (op<0 || OrderType()==op) {
                if (mn<0 || OrderMagicNumber()==mn) kp++;
              }
            }
          }
        }
      }
      return(kp);
    }

 
lottamer:


E posso perguntar o que eles estão tentando fazer com isso?

for(int i=0; i<OrdersTotal(); i++)

parece que estão a tentar contar as posições em aberto...

...Mas não ceda aos seus sentimentos, mas consulte as regras. Neste caso, o loop está tentando parâmetros (na "lista" de ordens) envolvendo uma variável inteira i, e seu valor é incrementado em 1 a cada iteração. O número da ordem está sendo testado. :)))
 
BeerGod:

Desta forma, ele seleciona as ordens de acordo com determinados parâmetros.

por exemplo, https://www.mql5.com/ru/forum/131859/page3#434221

Função NúmeroOfPosições().

Esta função retorna o número de posições em aberto no momento. Uma seleção mais precisa das posições a serem contadas é especificada por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições do instrumento especificado. O valor padrão "" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão -1 significa qualquer identificador.


obrigado...vou adicionar esse tópico do fórum aos meus favoritos. :))