Erros, bugs, perguntas - página 1550

 

Existem lógicas complexas que funcionam durante vinte e quatro horas, mas que a dada altura congelam. Isto acontece por vezes no EX5, cujo código fonte não pode ser editado. É possível determinar do exterior que um indicador ou um Expert Advisor está pendurado? Recolher estatísticas sobre a parte calculada de um determinado indicador?

Com indicadores, parece possível, porque estão num estado de suspensão, matam a actualização dos gráficos no seu símbolo. O Conselheiro Especialista pode localizá-lo, embora sem especificar qual o indicador que causou o pairar.

 
Estabelecimento de registos para proibições. Durante as proibições recebo respostas no fórum, mas só as posso ler. E depois de outra proibição ser levantada, é muito difícil lembrar quem e onde respondeu para poder continuar. É possível resolver este problema (sem conselhos para não ser mais banido)? E, em geral, por vezes lê, mas não tem tempo para responder de imediato. É possível colocar uma bandeira de advertência para "responder mais tarde"?
 
comp:
Estabelecimento de registos para proibições. Durante as proibições recebo respostas no fórum, mas só as posso ler. E depois de outra proibição ser levantada, é muito difícil lembrar quem e onde respondeu para poder continuar. É possível resolver este problema (sem conselhos para não ser mais banido)? E, em geral, por vezes lê, mas não tem tempo para responder de imediato. É possível colocar uma bandeira de advertência para "responder mais tarde"?
Primeiro é preciso pensar, e depois fazer. Não o contrário. Então não haverá problemas com a memória.
 
Karputov Vladimir:
Deve-se pensar primeiro e depois fazer. Não o contrário. Então não haverá problemas com a memória.
Palavras de ouro!!!
 
Vladimir Pastushak:
Palavras de ouro!!!
Totalmente apoiado!!! É possível responder à pergunta-sugestão
comp:
Por vezes lê-se e não se tem tempo para responder de imediato. É possível colocar uma espécie de bandeira de lembrete para si próprio para "responder mais tarde"?
 
comp:
É possível colocar uma bandeira de advertência para si próprio para "responder mais tarde"?
Compreendo-o em parte. Todos querem uma solução para os seus problemas imediatos. No seu caso, é demasiado. Você, mesmo sentado num balneário, está a tentar construir promotores.
 

Pergunta sobre MathRound() em MQL4, que "devolve um valor arredondado ao inteiro mais próximo de um valor numérico especificado".

Código:

#property strict
void OnStart()
  {
   Print("1) MathRound(10.50001) = ",MathRound(10.50001));  // 11.0
   Print("2) MathRound(10.49999) = ",MathRound(10.49999));  // 10.0
  }

Resultado:


Podem as pessoas amáveis explicar por que razão é este o caso? Se for assim, por favor acrescente na documentação que apenas o primeiro dígito após a paragem completa é tido em conta.

MathRound - Математические функции - Справочник MQL4
MathRound - Математические функции - Справочник MQL4
  • docs.mql4.com
MathRound - Математические функции - Справочник MQL4
 

Colegas, por favor ajudem. Não tenho cérebros próprios suficientes.

O robô, que fez encomendas limitadas, precisa de eliminar a encomenda restante ao fechar uma posição aberta (não importa se em paragem ou lucro), mas não todas as encomendas, mas aquela cujo número mágico é igual ao bilhete da posição fechada. Portanto, o gatilho para a eliminação deve ser o evento de fecho de posição. Para mim não importa, neste caso, como esta posição fechou (apenas por condição que se feche por SL, então não há limites, que devem ser removidos). Mas se detalharmos e o fizermos correctamente, o gatilho é um TP.

Assim, o robô apaga a ordem, mas não depois de a posição ter sido fechada, mas assim que foi aberta. E começa a combater-se a si próprio, colocando eapagando constantementeas ordens pendentes. Por favor, veja o que está errado.

input double   lot                  = 0.2;
input double   TakeProfitPips       = 50;
input double   StopLossPips         = 200;

int               bar=0;
int               shift=1;
int               tiket;
int               otkt;
double            price;
int               cnt;
double            TPp,SLp;
int               tkt;
int               n;
int               type;

    int _OrdersTotal = 0;
    // кол-во позиций, соответствующих критериям (текущий инструмент и заданный MagicNumber),
    // состоянием на текущий тик
    int now_OrdersTotal = 0;
    // кол-во позиций, соответствующих критериям (текущий инструмент и заданный MagicNumber),
    // состоянием на предыдущий тик
    static int pre_OrdersTotal = 0;
    // массив открытых позиций состоянием на текущий тик
    int now_OrdersArray[][2]; // [№ в списке][№ тикета, тип позиции]
    // текущий номер позиции в массиве now_OrdersArray (для перебора)
    int now_CurOrder = 0;
    // текущий номер позиции в массиве pre_OrdersArray (для перебора)
    int pre_CurOrder = 0;
    // массив для хранения количества закрытых позиций каждого типа
    int now_ClosedOrdersArray[6][3]; // [тип ордера][тип закрытия] 
 
    // временные флаги
    bool OrderClosed = true, PendingOrderOpened = false;
    // временные переменные
   

    int pre_OrdersArray[][2]; // [количество позиций][№ тикета, тип позиции]
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }


void OnTick()

  {

        if(OrdersTotal()== 0 && iTime(Symbol(),PERIOD_M1,1)==D'14.01.16 16:30')

        {
        
         price=Open[shift];

         tiket=OrderSend(Symbol(),OP_SELLLIMIT,lot,price,3,price+StopLossPips*Point,price-TakeProfitPips*Point);
         if(tiket<0)
           {
            Print("Ошибка OrderSend № - ",GetLastError());
           }
        }

     

   if(OrdersTotal()!=0)
     {
      for(cnt=0; cnt<OrdersTotal(); cnt++)

         OrderSelect(cnt,SELECT_BY_POS); // Если есть следующий
        {                                    // Анализ ордеров:
         price=OrderOpenPrice();
         otkt = OrderTicket();
         n=otkt;
         //--------------------------------------------------------------

 
         if(OrderType()==OP_SELL && OrderMagicNumber()==0)

           {
            tiket=OrderSend(Symbol(),OP_SELLLIMIT,lot*3,price+100*Point,1,price+StopLossPips*Point,price-TakeProfitPips*Point,"My order",n);
            tiket=OrderSend(Symbol(),OP_SELLLIMIT,lot*9,price+200*Point,1,price+StopLossPips*Point,price-TakeProfitPips*Point,"My order",n);
           }
        }

     }

  
        _OrdersTotal = OrdersTotal(); // запоминаем общее количество позиций
        ArrayResize( now_OrdersArray, _OrdersTotal ); // изменяем размер массива открытых позиций под текущее кол-во
        ArrayInitialize( now_OrdersArray, 0.0 ); // обнуляем массив
        now_OrdersTotal = 0; // обнуляем количество позиций, соответствующих критериям
        ArrayInitialize( now_ClosedOrdersArray, 0.0 ); // обнуляем массивы закрытых позиций и сработавших ордеров
       
 
        //+------------------------------------------------------------------+
        //| Перебираем все позиции и записываем в массив 
        //+------------------------------------------------------------------+
        for ( int z = _OrdersTotal - 1; z >= 0; z -- )
        {
            if ( OrderSelect( z, SELECT_BY_POS ) )
           
            {
                now_OrdersArray[now_OrdersTotal][0] = OrderTicket();
                now_OrdersArray[now_OrdersTotal][1] = OrderType();
                now_OrdersTotal ++;
            }
        }
        
        ArrayResize( now_OrdersArray, now_OrdersTotal ); // изменяем размер массива открытых позиций под кол-во позиций, соответствующих критериям
 
        //+------------------------------------------------------------------+
        //| Перебираем список позиций предыдущего тика, и считаем сколько закрылось позиций и
        //| сработало отложенных ордеров
        //+------------------------------------------------------------------+
        for ( pre_CurOrder = 0; pre_CurOrder < pre_OrdersTotal; pre_CurOrder ++ )
        {
            tkt = pre_OrdersArray[pre_CurOrder][0]; // запоминаем тикет и тип ордера
            type   = pre_OrdersArray[pre_CurOrder][1];
            
            OrderClosed = true; // предпологаем, что если это позиция, то она закрылась
           
            for ( now_CurOrder = 0; now_CurOrder < now_OrdersTotal; now_CurOrder ++ ) // перебираем все позиции из текущего списка открытых позиций
            {
                if ( tkt == now_OrdersArray[now_CurOrder][0] ) // если позиция с таким тикетом есть в списке,
                {   OrderClosed = false; // значит позиция не была закрыта (ордер не был удалён)
                    break;
                }
            }
           
            if ( OrderClosed )  // если была закрыта позиция (удалён ордер),
            {
                
                if (OrderSelect( tkt, SELECT_BY_TICKET )) // выбиаем ее
               
                    n = tkt; // присваеваем n номер тикета
                
            }   
      }  
     
        //+------------------------------------------------------------------+
        //| Удаляем ордер с магическим номером = тикету закрытой ранее позиции 
        //+------------------------------------------------------------------+
     for ( int z = _OrdersTotal - 1; z >= 0; z -- )
        {
            if ( OrderSelect( z, SELECT_BY_POS ) )
            otkt = OrderTicket();
            if (n == OrderMagicNumber ())
             {OrderDelete( otkt );}
         }
         
         return;
      }
Помогите отредактировать код, пожалуйста
Помогите отредактировать код, пожалуйста
  • www.mql5.com
И начинает бороться сам с собой, постоянно выставляя и удаляя отложенные ордера. - - Категория: общее обсуждение
 
Pode dizer-me se existe um mecanismo integrado para determinar em que mercado o robô comercial está a funcionar, precisa de identificar os mercados FOREX e FORTS.
 

A ajuda, pessoal, não pode colocar a língua russa no MT4 no Macbook, parece estar presente, mas é exibida em hieróglifos, mas no meta editor está bem. Construí tudo através do Play on Mac,

O vinho 1.9.4 seria muito apreciado.

Razão: