Вопрос к знатокам MQL - страница 8

 

Благодарю.

 

Всем добрый день.

Пож. подскажите.  Индикатор отображает ценовые линии инструментов и

справа текстовый коммент, - их названия и размеры позиций.

 

Все работает нормально. До тех пор, пока я не ставлю индюк на график инструментов с 5-ти значными котировками.

Ценовые линии рисуются. Но коммент справа пропадает совсем. Либо, вместо размеров позиций отображаются нули. 

А журнал выдает ZERO DIVIDY (СМ. график с Альпари)

  - по EURUSD  и GBPUSD - вместо размера отображены нули...

 

 

 

Думаю, что это связано с расчетом размеров позиций:

double vol1=1, vol2, vol3, k1;

  k1=MarketInfo(Symbol_1, MODE_TICKVALUE)*iOpen(Symbol_1,0,0)/
     MarketInfo(Symbol_1, MODE_TICKSIZE);

  vol2=k1/(MarketInfo(Symbol_2, MODE_TICKVALUE)*iOpen(Symbol_2,0,0)/
           MarketInfo(Symbol_2, MODE_TICKSIZE))*vol1;

  vol3=k1/(MarketInfo(Symbol_3, MODE_TICKVALUE)*iOpen(Symbol_3,0,0)/
           MarketInfo(Symbol_3, MODE_TICKSIZE))*vol1;

    // пишем комментарий в окне индикатора с правой стороны: 
 object("Symbol1", DoubleToStr(N1,0)+"*"+Symbol_1+" -"+DoubleToStr(vol1,2), 10, indicator_color1, 5);
 object("Symbol2", DoubleToStr(N2,0)+"*"+Symbol_2+" -"+DoubleToStr(vol2,2), 10, indicator_color2, 18);
 object("Symbol3", DoubleToStr(N3,0)+"*"+Symbol_3+" -"+DoubleToStr(vol3,2), 10, indicator_color3, 31);
 object("SymbolS", "AVERAGE", 10, indicator_color4, 44);   
           

Отношение k1=MarketInfo(Symbol_1, MODE_TICKVALUE).... /MarketInfo(Symbol_1, MODE_TICKSIZE) 

дает "деление на нуль" при 5-ти знаке.

Пож. подскажите, как это исправить ? 

 

Пожалуйста подскажите существует ли скрипт или индикатор которые показывает сделки совершенные ранее по истории например с такгото по такаое то число. Оч. полезная штука на мой взгляд

Спасибо,

Юрий

 
leonid553:

Всем добрый день.

Пож. подскажите, как это исправить ? 


  Если по простому, попробуй вместо MODE_TICKSIZE поставить MODE_POINT. Но вообще-то нужно код переписывать, что бы учитывать нулевые MarketInfo()
 
tyn:

Пожалуйста подскажите существует ли скрипт или индикатор которые показывает сделки совершенные ранее по истории например с такгото по такаое то число. Оч. полезная штука на мой взгляд

Спасибо,

Юрий

https://www.mql5.com/en/code  - скрипт.  Временной интервал задайте в истории счёта терминала.

VisualOrders.mq4  -  индикатор 

Файлы:
 

Добрый день. 

В мт4 дц EXNESS мои "мультивалютные"  индикаторы,  почему-то,  работают только при подключенном инете (В отличие от мт4 др. дц).

Без инета - линии индюков не отражаются, а только пустые окна с комментом. Журнал выдает "зеро дивиди".

При подключении  инета, зачастую, нужно сначала перещелкнуть тф, чтобы линии индюков появились.

Подскажите пож., в чем дело и как это устранить?

При откл. инете: 

 

При подключенном:

 

 
leonid553:

Добрый день.

В мт4 дц EXNESS мои "мультивалютные" индикаторы, почему-то, работают только при подключенном инете (В отличие от мт4 др. дц).

Без инета - линии индюков не отражаются, а только пустые окна с комментом. Журнал выдает "зеро дивиди".

При подключении инета, зачастую, нужно сначала перещелкнуть тф, чтобы линии индюков появились.

Подскажите пож., в чем дело и как это устранить?

При откл. инете:

При подключенном:


Нормальная вещь. Частенько бывает.И не всегда с этим удается справиться. Хотя деление на ноль можно исправить. Проблема в отсутствии рыночного окружения чаще всего.
 

Не совсем понял, Виктор.

Разве это "нормальная вещь"? Это явный глюк!

Мне непонятен термин - "отсутствие рыночного окружения".

Если мы исправим деление на нуль, - то ценовые линии появятся? Не думаю. 

Комментарий в пр. углу индикаторного окна отображается нормально. Т.е. ф-и ObjectCreate и т.п. работают нормально.

Так же нормально работают и математические вычисления, цифры которых задаются в комменте.

Остаются только сами ценовые линии индикатора. Т.к. больше там ничего нет.

 Ценовые линии задаются в буферах. Каждая ценовая линия - это всего лишь разность двух МА:

int start() {
     int limit;  int counted_bars=IndicatorCounted();
  //---- проверка на возможные ошибки
     if(counted_bars<0) return(-1);
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars-=10;      limit=Bars-counted_bars;
  //---- основной цикл
 for(int i=0; i<limit; i++)       {
 
   Symbol1[i]= N1*
     (iMA(Symbol_1,Period(),MA_fast,0,MA_Mode,MA_Price,iBarShift(Symbol_1,0,Time[i],false))-
     iMA(Symbol_1,Period(),MA_per,0,MA_Mode,MA_Price,iBarShift(Symbol_1,0,Time[i],false)))  ;
  .... ....

Значит, именно эта часть дает  "зеро дивиди"! Но деления здесь нет вообще и, тем более - деления на нуль!

Следовательно, ошибка в данном случае возвращается сервером (или платформой) от фонаря? Или  разработчики мт4 не предусмотрели такой глюк и  задали возврат "зеро дивиди" не совсем соответствующий сути такой ошибки.

И почему в мт4 др.  ДЦ индикатор работает нормально?

Чем могут отличаться одинаковые платформы, чтобы вот такой простейший код работал в них по разному?

 

С делением на ноль справиться можно, но нужна еще и корректная работа индикатора. С этим сложнее.

 

А в чем теоретически может быть некорректность вот такого простого кода (для 4-х линий)):

int start() {
     int limit;  int counted_bars=IndicatorCounted();
  //---- проверка на возможные ошибки
     if(counted_bars<0) return(-1);
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars-=10;
     limit=Bars-counted_bars;

  //---- основной цикл
 for(int i=0; i<limit; i++)       {
   //РИСУЕМ ЛИНИИ СИМВОЛОВ, ЕСЛИ ИМЕЮТСЯ БАРЫ

   Symbol1[i]= N1*
     (iMA(Symbol_1,Period(),MA_fast,0,MA_Mode,MA_Price,iBarShift(Symbol_1,0,Time[i],false))-
     iMA(Symbol_1,Period(),MA_per,0,MA_Mode,MA_Price,iBarShift(Symbol_1,0,Time[i],false)))  ;
   Symbol2[i]= N2*
     (iMA(Symbol_2,Period(),MA_fast,0,MA_Mode,MA_Price,iBarShift(Symbol_2,0,Time[i],false))-
     iMA(Symbol_2,Period(),MA_per,0,MA_Mode,MA_Price,iBarShift(Symbol_2,0,Time[i],false)))  ;
   Symbol3[i]= N3*
     (iMA(Symbol_3,Period(),MA_fast,0,MA_Mode,MA_Price,iBarShift(Symbol_3,0,Time[i],false))-
     iMA(Symbol_3,Period(),MA_per,0,MA_Mode,MA_Price,iBarShift(Symbol_3,0,Time[i],false)))  ; 
   Symbol4[i]= N4*
     (iMA(Symbol_4,Period(),MA_fast,0,MA_Mode,MA_Price,iBarShift(Symbol_4,0,Time[i],false))-
     iMA(Symbol_4,Period(),MA_per,0,MA_Mode,MA_Price,iBarShift(Symbol_4,0,Time[i],false)))  ;
    
      
      
   }
   return (0);
} // конец функции СТАРТ 
Причина обращения: