Ошибки, баги, вопросы - страница 1550

 

Бывают сложные логики, которые работают многие сутки, но в один момент идет зависание. При этом это иногда происходит в EX5, исходники которых править нет возможности. Можно ли со стороны программно определить, что индикатор или советник зависли? Собирать статистику расчетной части того или иного индикатора?

С индикаторами, вроде, можно, поскольку они в подвисшем состоянии убивают обновление чартов по своему символу. Советником это можно отследить, пусть и без конкретизации, какой именно из индикаторов вызвал подвисание. 

 
Ставлю рекорды по банам. Во время банов мне отвечают на форуме, но могу только прочесть. А после снятия очередного бана очень сложно вспомнить, кто и где отвечал, чтобы продолжить. Возможно ли как-то решить этот вопрос (без рекомендаций не попадать больше в баню)? Да и вообще иногда прочтешь, а ответить времени сейчас сразу нет. Возможно ли какой-нибудь флаг-напоминание себе поставить "ответить позже"?
 
comp:
Ставлю рекорды по банам. Во время банов мне отвечают на форуме, но могу только прочесть. А после снятия очередного бана очень сложно вспомнить, кто и где отвечал, чтобы продолжить. Возможно ли как-то решить этот вопрос (без рекомендаций не попадать больше в баню)? Да и вообще иногда прочтешь, а ответить времени сейчас сразу нет. Возможно ли какой-нибудь флаг-напоминание себе поставить "ответить позже"?
Сначала нужно думать, а потом делать. А не наоборот. Тогда не будет проблем с памятью.
 
Karputov Vladimir:
Сначала нужно думать, а потом делать. А не наоборот. Тогда не будет проблем с памятью.
Золотые слова !!! 
 
Vladimir Pastushak:
Золотые слова !!! 
Полностью поддерживаю!!! Возможно ли ответить на вопрос-предложение
comp:
иногда прочтешь, а ответить времени сейчас сразу нет. Возможно ли какой-нибудь флаг-напоминание себе поставить "ответить позже"?
 
comp:
Возможно ли какой-нибудь флаг-напоминание себе поставить "ответить позже"?
Я отчасти вас понимаю. Каждый хочет решения своих насущных проблем. В вашем случае перебор какой-то. Вы, даже сидя в бане, пытаетесь построить разработчиков.
 

Вопрос по MathRound() в MQL4, которая "возвращает значение, округленное до ближайшего целого числа указанного числового значения".

Код:

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

Результат:


Добрые люди объясните, почему так? Если так и должно быть, то просьба к администрации - допишите в документации, что во внимание принимается только первая цифра после точки.

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

Коллеги, пожалуйста, помогите. Своих мозгов не хватает.

Нужно, чтобы робот, который выставил лимитные ордера, при закрытии открытой позиции (не важно, по стопу или профиту) удалил бы оставшуюся отложку, но не всякую, а ту, магический номер которой равен тикету закрытой позиции. Т.о. надо, чтобы триггером для удаления было именно событие закрытия позиции. Для меня не важно в данном случае, как эта позиция закрылась (просто по условию получится, что если закрытие по СЛ, то лимитов не остается, которые надо удалять). Но если детализировать и делать все правильно, то триггер - это ТП. 

У меня получается, что отложку робот удаляет, но не после того, как позиция закрылась, а сразу, как она была выставлена. И начинает бороться сам с собой, постоянно выставляя и удаляя отложенные ордера. Посмотрите, пожалуйста, что неправильно.

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
И начинает бороться сам с собой, постоянно выставляя и удаляя отложенные ордера. - - Категория: общее обсуждение
 
Подскажите, есть встроенный механизм определения на каком рынке запущен торговый робот, нужно определить рынки FOREX и FORTS.
 

Люди добрые, помогите, не могу поставить русский язык на MT4 на Macbook , он ,вроде, есть, но отображается иероглифами, а в meta editor все нормально. Ставил все через Play on mac ,

версия Wine 1.9.4. Буду очень признателен за помощь. 

Причина обращения: