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

 
Ilya Malev:
Вставьте текст в OnCalculate созданного по умолчанию в рекдаторе индикатора. Поместите на любой график. В верхнем левом углу окна графика будете видеть работу индикатора. После выбора "Удалить" из списка индикаторов, работа не прекращается, это будет видно в левом верхнем углу. И даже после закрытия окна она не прекращается. А после открытия нового окна, она продолжается уже в новом окне. Причем, это окно не обязательно того же символа, что было в начале :) 
Только при закрытии терминала работа индикатора прекращается. И то неизвестно, прекращается или нет - только что пришлось убирать терминал через диспетчер задач вручную для перезапуска...

В то время как в справке функции IsStopped сказано, что работа программы принудительно завершается через 3 секунды, если поступила команда завершить выполнение mql-программы.

 Причем если while(true) заменить на while(!IsStopped()) то при удалении с графика индикатор успешно завершает работу.

Всё понятно. Сделали послабление на обычное удаление.

При закрытии терминала всё будет жёстко. Не более 3 секунд.

И я не уверен, что мы будем писать это в документации, 1. чтобы не потворствовать написанию таких безбашенных индикаторов (Вы это написали с целью проверить?) 2. Как ослабили, так и ужесточили.

 
Alexandre:

Забавная причина ошибки Internal Compiler Error ( функция используется в индикаторе ):

...

Лечение очевидно, однако согласитесь - весьма забавный глюк. :)))

Спасибо за сообщение!

Написал Вам личное сообщение.
 
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

 

 

Приветствую, для того, чтобы Вам помогли найти ошибку - Вам нужно прикрепить код как минимум. Писать за Вас тут никто не будет - здесь принято помогать найти ошибку и исправить ее посоветовать. Либо - обращайтесь в фриланс. 
 

Вот код: 

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
         {int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
         z=1;

         Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

 if ((TimerNull>=n)&&(z==1))         

       {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

        z=2;}

Также пробовал и вот так:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
         {int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
         z=1;

         Timer=Time[0];}

TimerNull=Time[0];

 if ((TimerNull>=(Timer+2700))&&(z==1))  //Как пример здесь вместо n я поставил 2700 секунд, что при тестировании означало 3 15-минутные свечи)        {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

        z=2;}

И еще вот так:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
         {int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
         z=1;

         Timer=Time[0];}

TimerNull=Time[0];

 if ((CurrentTime()>=(Timer+2700))&&(z==1))  

      {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //В этом случае когда я убирал 2700 то вторая сделка открывалась сразу же после первой в том же баре, и это логично. И даже когда я вместо 2700 ставил любую цифру до 600, вторая сделка так же открывалась в том же баре. При значении больше 600 вторая сделка не открывалась никогда. Не могу понять в чем проблема. Буду очень благодарен за помощь.

Параметры Timer и TimerNull имеют формат datetime.  


 

в вашем примере нет перебора например позиций 

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))

поэтому он всегда выбирает 0 позицию.  

 
Я пока пишу черновой вариант, чтобы работала основная логика. После этого буду дорабатывать. В данном случае, может я и ошибаюсь, проблема во второй части кода.
 
Slawa:

Всё понятно. Сделали послабление на обычное удаление.

При закрытии терминала всё будет жёстко. Не более 3 секунд.

И я не уверен, что мы будем писать это в документации, 1. чтобы не потворствовать написанию таких безбашенных индикаторов (Вы это написали с целью проверить?) 2. Как ослабили, так и ужесточили.

Ну так и ужесточите уже, или исправьте справку. Потворствовать не потворствовать - это не серьезный разговор. От Вас программисты ожидают не "опеки", а понятного, хорошо документированного софта.

Разумеется у этого кода нет никакого предназначения кроме демонстрации, которую Вы сами попросили. И это вполне безобидно, безбашенно получится, если убрать Sleep и Comment заменить на Print. От спама гигабайтов принта в лог нет никакой защиты ни в четверке ни в пятерке.

 
Dmitri Custurov:

Вот код: 

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
         {int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
         z=1;

         Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

 if ((TimerNull>=n)&&(z==1))         

       {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

        z=2;}

Также пробовал и вот так:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
         {int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
         z=1;

         Timer=Time[0];}

TimerNull=Time[0];

 if ((TimerNull>=(Timer+2700))&&(z==1))  //Как пример здесь вместо n я поставил 2700 секунд, что при тестировании означало 3 15-минутные свечи)        {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

        z=2;}

И еще вот так:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
         {int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
         z=1;

         Timer=Time[0];}

TimerNull=Time[0];

 if ((CurrentTime()>=(Timer+2700))&&(z==1))  

      {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //В этом случае когда я убирал 2700 то вторая сделка открывалась сразу же после первой в том же баре, и это логично. И даже когда я вместо 2700 ставил любую цифру до 600, вторая сделка так же открывалась в том же баре. При значении больше 600 вторая сделка не открывалась никогда. Не могу понять в чем проблема. Буду очень благодарен за помощь.

Параметры Timer и TimerNull имеют формат datetime.  


Вот одна из возможных реализаций. данный советник должен открывать ордер через указанное количество баров. И учимся правильно вставлять код советников, кнопочка SRC на панели сообщения.

 

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111 

 

Вопрос, наверное, к разработчикам сайта или администраторам сервиса Фриланс

---

Было: выполнено 568 работ, 75% персональных

Добавилось 13 работ (все персональные) и стало: выполнено 581, 75% персональных

--- 

Поэтому вопрос: расшифруйте плз, что означает 75% ?

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