Ваши вопросы по языку MQL4

vlad_123

Местный знаток
Еще раз повторяю - это не стандартный глюк - глюк, который тупо появляется из ниоткуда...

Это нормальное (но далеко не очевидное) поведение компилятора в случае если переменные типа int.
Делишь z на 100, и если z меньше 50 (наверное ;) или 100) результат приводится к int, т.е. получается 0.
Потом уже на этот 0 и происходит второе деление.
В случае умножения int на double результат приводится к double, и второе деление происходит НЕ на 0.

Сам стал умножать переменные на 1.0 в расчетах, с тех пор как столкнулся с таким поведением.
 

vladradon

Программист
Это нормальное (но далеко не очевидное) поведение компилятора в случае если переменные типа int.
Делишь z на 100, и если z меньше 50 (наверное или 100) результат приводится к int, т.е. получается 0.
Потом уже на этот 0 и происходит второе деление.
В случае умножения int на double результат приводится к double, и второе деление происходит НЕ на 0.

Сам стал умножать переменные на 1.0 в расчетах, с тех пор как столкнулся с таким поведением.
Не, тезка, от перемены (смены) типа переменных, смысл и рез не меняется... Сам смысл глюка изначально не в этом!)))
 

mobidik

-----
Это нормальное (но далеко не очевидное) поведение компилятора в случае если переменные типа int.
Делишь z на 100, и если z меньше 50 (наверное ;) или 100) результат приводится к int, т.е. получается 0.
Потом уже на этот 0 и происходит второе деление.
В случае умножения int на double результат приводится к double, и второе деление происходит НЕ на 0.

Сам стал умножать переменные на 1.0 в расчетах, с тех пор как столкнулся с таким поведением.

Компилятор тут не причем, все зависит от входных данных. Наблюдал такую ситуацию: индюк наброшен на график, все работает нормально, переключаю ТФ и он пропадает, имею запись: zero divide. Пока просто, смотрел код, спустя время, набрасываю индюка на тот же график/ТФ - все нормально работает. Ответ очевиден - входные данные для расчетов изменились.

результат приводится к int, т.е. получается 0. - все верно, ниже приведу пример.


Ладно новичок, дерьжи:D
x=y/(z/100.0)

А вот тут eevviill2 прав на все 100, привожу скрипт, пример того, что мы можем получить варьируя типами переменных:
 

Вложения

  • Test_Data_Type.png
    Test_Data_Type.png
    182,2 КБ · Просмотры: 39
  • Test_Data_Type.mq4
    3,5 КБ · Просмотры: 15

vladradon

Программист
А вот тут eevviill2 прав
Варьировать данными - это само собой... Только все преобразования данных должны быть корректными: без strict, все переменные, которые можно описать как интовские (временные данные в секундах и т.п.), можно использовать напрямую, а со стриктом, обязательно преобразование с помощью функций...
 

vlad_123

Местный знаток
Не надо искать тайный умысел метаквотов и корявую работу МТ там, где их нет - в данном конкретном случае все работает по феншую.
Иногда кажущийся избыток знаний провоцирует несостоятельные умозаключения - остается только глубоко вздохнуть и принять к сведению обнаруженный факт. :)
 

Dersu

Местный знаток
Уважаемые, подскажите как историю работы ограничить в болванке?


PHP:
input int History=1000;

//---- buffers
double upBuffer[];
double downBuffer[];
double up=0;
double down=0;
double cnds;
double n;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   SetIndexStyle(0,,0,2);
   SetIndexBuffer(0,SupBuffer);
   SetIndexStyle(1,,0,2);
   SetIndexBuffer(1,downBuffer);
   SetIndexArrow(0,1);
   SetIndexArrow(1,1);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                     |
//+------------------------------------------------------------------+
int start()
  {
   int keyu=iBars(NULL,0);
   int keyd=iBars(NULL,0);
   int i,counted_bars=IndicatorCounted();
//----
  
      {      

            {
             
             break;            
            }
          }
        }
      }
    
      {      
 
            {
             
             break;
            }
           }
        }
      }
      i--;
     }
   return(0);
   }
  
  
//+------------------------------------------------------------------+
 
Последнее редактирование:

vladradon

Программист
А вот тут eevviill2 прав на все 100
Привет! Прикинь, все встало на свои места, когда прогнал проверку диска С в досовском режиме и с автоматическим исправлением порченных кластеров - штук 20 было испорчено и 2 раза комп даже в досе подвисал. Теперь все красиво и все работает. Короче, дело было не в глюке языка, а в операционке, похоже...
 

_SERG_

Активный участник
Привет! Прикинь, все встало на свои места, когда прогнал проверку диска С в досовском режиме и с автоматическим исправлением порченных кластеров - штук 20 было испорчено и 2 раза комп даже в досе подвисал. Теперь все красиво и все работает. Короче, дело было не в глюке языка, а в операционке, похоже...

Влад, если бэдами пометил, то делай резервные копии, диск сыпаться начинает.
 

vladradon

Программист
Влад, если бэдами пометил, то делай резервные копии, диск сыпаться начинает.
Это понятно, но нет, бэдов не было - просто тупо потерянные кластеры с непонятными данными, скандиск перезаписал из них инфу в отдельные файлы, а эти кластеры обнулил и сделал доступными для использования. Хотя, были кластеры с кусками системных файлов... А все свои наработки я периодически архивирую и храню на Яндекс диске.
 
Последнее редактирование:

eevviill2

Местный знаток
Передайте МетаКротам.
PHP:
////////////////////////////////////////////////////
void OnTimer()
{
All_f();
}

///////////////////////////////////////////////
void All_f()
 { 
 //trading is not allowed
 if(!IsTradeAllowed() || !IsTradeAllowed(Symbol(),TimeCurrent())) return;
...
 }
Включил только что(субота) советник на EURGBP а он долбит терминал, хочет открыть ордер.
 

vladradon

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

eevviill2

Местный знаток
Тебе, как новичку: у многих брокеров (это из личного опыта) проверка на возможность торговли теми командами, что ты указал, выдает все, что угодно, только не то, что нужно... И если ты щелкаешь кнопкой автоторговли, все равно ничего не меняется. Тут уж лучше внеси какой-нибудь блокиратор в настройках или кнопку выведи на график.
Ну так вот и передай им что их функции не работают.
Зачем ты продублировал моё сообщение:D
 

vladradon

Программист
Ну так вот и передай им что их функции не работают.
Зачем ты продублировал моё сообщение
Какое твое сообщение я дублировал? - У меня дубляжа нет...
А какой смысл мне им что-то передавать, если они и так все знают. Примерно пол года назад писал на 5-ке перевертыш под брокера "Открытие" для торгов на фьючах - написал все возможные комбинации с прямыми и отложками - сам заказчик уже у брокера спросил, почему некоторые функции просто не работают, а некоторые вообще в минус уводят, - был ответ типа "мы пока так и не настроили терминал". Вот, хоть тресни, а им по-барабану, что ты из-за их некомпетенции и безолаберности свои деньги теряешь...
 

alexshell

Элитный участник
Передайте МетаКротам.
PHP:
////////////////////////////////////////////////////
void OnTimer()
{
All_f();
}

///////////////////////////////////////////////
void All_f()
 { 
 //trading is not allowed
 if(!IsTradeAllowed() || !IsTradeAllowed(Symbol(),TimeCurrent())) return;

...
 }
Включил только что(субота) советник на EURGBP а он долбит терминал, хочет открыть ордер.

А почему не должен долбить?
IsTradeAllowed()-Возвращает информацию о возможности торговли при помощи экспертов.
возможность есть)))
Про вторую функцию Там ведь TimeCurrent() стоит . А она без тиков не меняется. Соответственно зависла когда еще можно торговать
 
Последнее редактирование:

eevviill2

Местный знаток
А почему не должен долбить?
IsTradeAllowed()-Возвращает информацию о возможности торговли при помощи экспертов.
возможность есть)))
Про вторую функцию Там ведь TimeCurrent() стоит . А она без тиков не меняется. Соответственно зависла когда еще можно торговать
Потому что в fxopen есть биткоины в котировках.
При запуске терминала(что я и сделал) терминальное время обновляется.

PHP:
Alert(TimeCurrent());
 

Вложения

  • алк.png
    алк.png
    53 КБ · Просмотры: 14
Последнее редактирование:

eevviill2

Местный знаток
Да. Ты прав.
Смотрел на время с реала. На демо нету биткоинов.
Спасибо.
 
Верх