Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1358

 

MakarFX , а вот эта связка: какую функцию выполняет ?


input int    BarTrade   = 5;  // понимаю что это кол-во отслеживаемых периодов их 5. 

int TimeBarTrade=BarTrade*Period()*60;  // а здесь как понять? почему именно на 60 умножается?

 
Alexey Belyakov:

MakarFX , а вот эта связка: какую функцию выполняет ?


input int    BarTrade   = 5;  // понимаю что это кол-во отслеживаемых периодов их 5. 

int TimeBarTrade=BarTrade*Period()*60;  // а здесь как понять? почему именно на 60 умножается?

BarTrade*Period()*60

количество баров * текущий таймфрем * 60 секунд

т.е. количество баров переводим в секунды

 
MakarFX:

BarTrade*Period()*60

количество баров * текущий таймфрем * 60 секунд

т.е. количество баров переводим в секунды

Можно так.

int TimeBarTrade = PeriodSeconds()*BarTrade;
 
MakarFX:

Если исключить ошибки связанные с

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT

то сов не будет долбить сервер

Макар- большое спасибо, что подсказал какие проверки надо сделать чтобы избежать терзания сервера и бана советникаJ

Проверки сделал вот так

моде стоп левел для стопа

         //ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА 
         if(sl<MarketInfo(Symbol(),MODE_STOPLEVEL)) // ЕСЛИ СТОПОЛС МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          sl= MarketInfo(Symbol(),MODE_STOPLEVEL);//СТОП  ЛОССУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }

 моде стоп левел для профита

      // ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ
      
  if(tp<MarketInfo(Symbol(),MODE_STOPLEVEL)) // ЕСЛИ ПРОФИТ МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          tp= MarketInfo(Symbol(),MODE_STOPLEVEL);// ПРОФИТУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
         


 Проверка на разрешение торговых операций

//---- ПРОВЕРКА НА РАЗРЕШЕНИЕ ТОРГОВ ПЕРЕД ОТКРЫТИЕМ ОРДЕРОВ
   if(MarketInfo(Symbol(),MODE_TRADEALLOWED)==true)
   {// начало есл торговля разрешена
  /*
куча проверок на условия открытия и само открытие ордеров
*/
} // КОЕНЦ ПРОВЕРКИ НА РАЗРЕШЕНИЕ ТОРГОВЛИ
          
          else //ИНАЧЕ ЕСЛИ ТОРГОВЛЯ НЕ РАЗРЕШЕНА 
          
          { // НАЧАЛО ЭЛС ЕСЛИ ТОРГИ НЕ РАЗРЕШЕНЫ 
          
          Print("ТОРГИ НЕ РАЗРЕШЕНЫ- ПЫТАТЬСЯ ОТКРЫТЬ ОРДЕРА НЕ БУДЕМ");
          }  // КОЕНЦ ЭЛС ЕСЛИ ТОРГИ НЕ РАЗРЕШЕНЫ

 Проверка на макс и мин лот

Вначале получил значение макс лот и мин лот в перемененные вот так

  double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);   // МИНИМАЛЬНЫЙ ЛОТ РАЗРЕШЁННЫЙ БРОКЕРОМ
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);     // МАКСИМАЛЬНЫЙ ЛОТ РАЗРЕШЁННЫЙ БРОКЕРОМ

 А потом где-то ниже по ходу написания Грааля делаю проверку

  if(lot<Min_Lot) lot=Min_Lot; //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ МЕНЬШЕ ЧЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ЛОТ ПРИСВАЕМАЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА
if(lot>Max_Lot) lot=Max_Lot;  //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ БОЛЬШЕ ЧЕМ МАКСИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ОЛТ ПРИСВАЕВАЕМ МАКС ЛОТ У БРОКЕРА

Верно я эти проверки прописал или где-то ошибся?

Проверку на шаг изменения лота не стал делать т.к лот рассчитывается в проценте от депозита и там это значение помножается на пойнт и нормализуется- значит эту проверку можно и опустить- правильно, или всё равно надо проверитиь? Если нужно всё равно проверить, то как написать эту проверку?

И суть всех этих проверок чтобы всегда было корректное значение стопа, профита, размера лота и чтобы впринципе можно было начинать открывать ордера. Если все эти параметры гуд то советник не будет насиловать сервер- правильно я понимаю всю эту кухню?

 
DanilaMactep:

Макар- большое спасибо, что подсказал какие проверки надо сделать чтобы избежать терзания сервера и бана советникаJ


//ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА
// ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ

Здесь может возникнуть ошибка 130 из-за проскальзывания.

Я бы сделал так

         //ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА 
         if(sl<MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5) // ЕСЛИ СТОПОЛС МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          sl= MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5;//СТОП  ЛОССУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
      // ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ
      
  if(tp<MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5) // ЕСЛИ ПРОФИТ МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          tp= MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5;// ПРОФИТУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
         
 

Всем здравствуйте! У кого-нибудь возникала проблема с висящими точками на графике, найденными через iHighest/iLowest

Предыстория: опыт в программировании минимальный, пишу индикатор на mql4, который должен отображать точки на графике, найденные по условиям в if и соединять их линиями. Точки-то он, по логике, ищет правильно, а вот рисует их со смещениями, то на 2 бара, то на 3 бара уводит. Как с этим бороться? файл с кодом приложила тоже.


int start()
  {
   int counted_bars=IndicatorCounted(); //хранит количество посчитанных индикатором баров. Функция IndicatorCounted() возвращает количество неизмененных баров после прошлого вызова функции start().
   int n,limit;
   int val_index;
   
  if(counted_bars>0)
      counted_bars--;
   limit=Bars-counted_bars; //количество последних баров, которые нужно пересчитать.
   if(limit>barsToProcess)
      limit=barsToProcess;

   for(n=0; n<=limit; n++)
     {
      if((Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2]) || (Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3]))
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer[n]=Low[val_index];
        }
      else
         if((Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2]) || (Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3]))
          {
            val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
            myAZBuffer[n]=High[val_index];
            ExtHighBuffer[n]=High[val_index];
           }
     }
   return (0);
  }
Файлы:
AZforum.mq4  8 kb
 
azolotta:

Всем здравствуйте! У кого-нибудь возникала проблема с висящими точками на графике, найденными через iHighest/iLowest? 

Предыстория: опыт в программировании минимальный, пишу индикатор на mql4, который должен отображать точки на графике, найденные по условиям в if и соединять их линиями. Точки-то он, по логике, ищет правильно, а вот рисует их со смещениями, то на 2 бара, то на 3 бара уводит. Как с этим бороться? файл с кодом приложила тоже.


точки рисуются правильно, без смещения

если условие выполнено, а iHighest/iLowest больше или меньше текущих High / Low

то рисует


 
MakarFX:

точки рисуются правильно, без смещения

если условие выполнено, а iHighest/iLowest больше или меньше текущих High / Low

то рисует


так, я кажется, начинаю осознавать свою ошибку) Получается, чтобы визуально отобразить на верном месте эти точки, мне надо ввести какой-то отдельный счетчик вместо n для myAZBuffer[n], ExtLowBuffer[n], ExtHighBuffer[n] ? но как это сделать
 
azolotta:
так, я кажется, начинаю осознавать свою ошибку) Получается, чтобы визуально отобразить на верном месте эти точки, мне надо ввести какой-то отдельный счетчик вместо n для myAZBuffer[n], ExtLowBuffer[n], ExtHighBuffer[n] ? но как это сделать

нет, правильно понимаете.

в условии используются два или три бара из истории,

поэтому и рисует через 2-3 бара когда условие выполнено

 
MakarFX:

нет, правильно понимаете.

в условии используются два или три бара из истории,

поэтому и рисует через 2-3 бара когда условие выполнено

ок, а как тогда переработать код, если мне надо, скажем, из последних 3-ёх баров (отвечающим условиям в if) выбрать самый высокий хай и на нём поставить точку (прямо на этом хае!), затем также найти точку лоу.