Jump to content
Programmer

Build 610/600/574/79/82 - кто что думает?

Recommended Posts

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

 

Возможно, нет времени спорить.


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
AntFX

Никакой ошибки компилятора нет. Есть только ошибка программиста. Если трактовать ваше отрицательное число как беззнаковое, то оно действительно окажется больше.

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Circle
Никакой ошибки компилятора нет. Есть только ошибка программиста. Если трактовать ваше отрицательное число как беззнаковое, то оно действительно окажется больше.

 

Так вот в этом все и дело надо перед сравнением преобразовывать не int в uint, а uint в int.

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


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
AntFX
Так вот в этом все и дело надо перед сравнением преобразовывать не int в uint, а uint в int.

 

Ну так ничто не мешает приводить, раз надо. kazakov.z показал, как это делается.

Допущение сравнения без явного приведения типов числа которое может оказаться отрицательным с числом беззнакового типа является логической ошибкой программиста. Компилятор не должен за вас решать, какой из типов к какому вы хотите приводить. Кстати, предупреждение компилятора о необходимости явного приведения типов при компиляции вы скорее всего получили, и проигнорировали. Только, наверное, не смогли прочитать, так как не знаете английского :lsmile:

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Circle
Ну так ничто не мешает приводить, раз надо. kazakov.z показал, как это делается.

Допущение сравнения без явного приведения типов числа которое может оказаться отрицательным с числом беззнакового типа является логической ошибкой программиста. Компилятор не должен за вас решать, какой из типов к какому вы хотите приводить. Кстати, предупреждение компилятора о необходимости явного приведения типов при компиляции вы скорее всего получили, и проигнорировали. Только, наверное, не смогли прочитать, так как не знаете английского :lsmile:

 

Судя по вашей логике тогда при сравнении long и int надо надо long преобразовывать в int, а не наоборот.

...

Мой английский не имеет ни какого отношения к делу, могу прочитать сообщение компилятора без знания разговорного английского, переводчик есть в конце концов.

...

Я вам пытаюсь сказать, что компиляторы которые следуют нормальной логике при неявном преобразование типов преобразовывают uint в int и int в long, а не наоборот, так как может быть потеря данных, а все продолжаете меня тролить и пытаетесь что то мне доказать, хотя сами наверно ни чего кроме типа int и не используете.

...

kazakov.z в отличии от вас дал дельный совет как не попасть на такую пакость от компилятора, а от вас кроме слов, что "сам ты дурак" не увидел.

  • Thanks 1

Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
AntFX
Я вам пытаюсь сказать, что компиляторы которые следуют нормальной логике при неявном преобразование типов преобразовывают uint в int и int в long, а не наоборот, так как может быть потеря данных

В отношении int и long понятно - long является более широким типом, так как обладает большей битностью и набором значений. А вот при преобразовании отрицательного int в ulong вы бы все равно получили ту же логическую ошибку. На каком основании uint вы считаете более широким типом, чем int, чтобы преобразование по умолчанию производилось именно в int, а не наоборот? В этом случае могла бы быть обратная ошибка, и большое положительное число в переменной uint могло бы стать отрицательным. Поэтому учите матчасть, а не обвиняйте компилятор. О чем вам также сказал kazakov.v

 

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

Edited by AntFX

1

Share this post


Link to post
Share on other sites
kazakov.v

В документации uint старше int, поэтому да, int приводится к uint.


Никому верить нельзя.

Мне - можно.

 

Share this post


Link to post
Share on other sites
Circle
....

 

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

 

Почему вы так решили?

 

Я мог бы не делиться об этом на форуме, и не заострять на это внимание.


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
Circle
В документации uint старше int, поэтому да, int приводится к uint.

 

Странно, как то не логично. Ведь при приведении будет потеря данных.

 

З.Ы.

 

Хотя да, посмотрел справку если uint будет больше 2 147 483 647 и если его преобразовать в int то тоже будет потеря данных.

 

Вообщем не надо полагаться на компилятор и явно приводить.

Edited by Circle

Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
AntFX
Почему вы так решили?

 

Я мог бы не делиться об этом на форуме, и не заострять на это внимание.

 

Согласитесь, странно не заострять внимание на главном. Компилятор вас предупредил, что, возможно, вы совершили логическую ошибку. Вы проигнорировали предупреждение и стали писать на форуме, что компилятор глючный. Гениальная логика :lsmile:

Тип int не является более широким типом, чем uint, чтобы преобразование должно было идти по умолчанию в этом направлении. Наборы значений этих типов одинаковы, только они разные - в одном случае включены отрицательные значения, в другом нет. И битность представления чисел одинаковая. При этом при преобразовании uint в int возможна точно такая же логическая ошибка, когда положительное число вдруг станет отрицательным.


1

Share this post


Link to post
Share on other sites
kazakov.v

Вообще, тема sign/unsig довольно скользкая и в С.

Бывает представление отрицательных чисел в виде знак-модуль.

Т.е. привычная -1 для нас 0xffff выглядит как 0x8001, а так же есть +0 и -0.

Да и при переходе с х32 на х64 непонятки могут возникнуть.

 

В данном случае, я так понимаю, uint был выбран для контроля значений? Т.е. типа тейк не может быть отрицательным? А нулю может быть равен? Или 100500?

Сейчас же есть классы, и можно создать простенький класс для верификации параметров, например:

 

class iParametr
 {
private:
  int               value;
  int               min;
  int               max;
public:
  int get()
    {
     return value;
    }
  int set(int in)
    {
     if(in<min || in>max) value=min;
     else value=in;
     return value;
    }
  //constructors
  void iParametr()
    {
     value=0;
     min=INT_MIN;
     max=INT_MAX;
    }
  void iParametr(int from,int to)
    {
     value=from;
     min=from;
     max=to;
    }
 };
iParametr TakeProfit(50,500);


Никому верить нельзя.

Мне - можно.

 

Share this post


Link to post
Share on other sites
Circle
Согласитесь, странно не заострять внимание на главном. Компилятор вас предупредил, что, возможно, вы совершили логическую ошибку. Вы проигнорировали предупреждение и стали писать на форуме, что компилятор глючный. Гениальная логика :lsmile:

Тип int не является более широким типом, чем uint, чтобы преобразование должно было идти по умолчанию в этом направлении. Наборы значений этих типов одинаковы, только они разные - в одном случае включены отрицательные значения, в другом нет. И битность представления чисел одинаковая. При этом при преобразовании uint в int возможна точно такая же логическая ошибка, когда положительное число вдруг станет отрицательным.

 

Ну да именное так, я считал что int "длиннее" uint, но у нас же как с начало делается, а потом читается инструкция (документация)


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
Circle
...

 

В данном случае, я так понимаю, uint был выбран для контроля значений?...

 

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

...

Класс для проверки значений это хорошо но для простого эксперта для личного пользования думаю это лишнее.


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
kazakov.v

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

Меня вот ломает каждый раз писать OrderSend(.........................................) ))


Никому верить нельзя.

Мне - можно.

 

Share this post


Link to post
Share on other sites
AntFX

А меня ломает каждый раз писать

for(int i=OrdersTotal()-1; i>=0; i--)

if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

/// .....

:)

Это можно заменить на

while(GetOrder())

/// ....

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

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Circle
Не, ну один раз набить свою библиотеку, потом работа резко ускоряется.

Меня вот ломает каждый раз писать OrderSend(.........................................) ))

 

Про библиотеку не спорю это да я для этого класс создал. Меня тоже напрягает писать каждый раз одно и тоже.

 

Я вот проверку введенных значений можно и не делать, если не хочешь заниматься распространение своих творений.


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
MW

Хорошие нововедения. Появилось множество невыявленых ошибок в коде индикатора. Ребята, как теперь обрабатывать тики в индикаторе? При тик==1 начинались все вычисления. Всё нормально, но при переключениях периодов на графике, переменная Tick++ в функции Start не обнуляется.


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
AntFX
Хорошие нововедения. Появилось множество невыявленых ошибок в коде индикатора. Ребята, как теперь обрабатывать тики в индикаторе? При тик==1 начинались все вычисления. Всё нормально, но при переключениях периодов на графике, переменная Tick++ в функции Start не обнуляется.

Если вдруг какая-то переменная не обнуляется при смене ТФ, то это решается элементарно, не так ли?

static int period=0;

if(period==0) period=Period();

if(period!=Period()) Tick=0;


1

Share this post


Link to post
Share on other sites
kazakov.v

Да, накосячили малость.

Раньше после init один раз независимо от тиков вызывался start.

Сейчас start(OnCalculate) без тиков не вызывается.

Поправят может быть когда-нибудь.


Никому верить нельзя.

Мне - можно.

 

Share this post


Link to post
Share on other sites
AntFX
Да, накосячили малость.

Раньше после init один раз независимо от тиков вызывался start.

Сейчас start(OnCalculate) без тиков не вызывается.

Поправят может быть когда-нибудь.

 

Так вроде бы логично, чтобы OnCalculate и OnTick вызывался только при поступлении тиков или как? В советниках start без прихода тиков не вызывался и раньше.


1

Share this post


Link to post
Share on other sites
kazakov.v

В индикаторах один раз вызывался без тиков.

 

как вариант, можно временно в init вписать вызов start() (т.е. в старой нотации - не OnCalculate)


Никому верить нельзя.

Мне - можно.

 

Share this post


Link to post
Share on other sites
MW
Если вдруг какая-то переменная не обнуляется при смене ТФ, то это решается элементарно, не так ли?

static int period=0;

if(period==0) period=Period();

if(period!=Period()) Tick=0;

 

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


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
AntFX
Так, но заставляет дублировать множество переменных из глобального модуля для обычной операции.

 

Да ничего дублировать не нужно. Максимум из init лишний раз вызвать start или OnCalculate


1

Share this post


Link to post
Share on other sites
ОТ и ТБ

Здравствуйте. По поводу MQL5. Я не сколько не сомневаюсь в том, что МТ5 «закроет» МТ4, но в каком состоянии.? Этот язык действительно теоретически дает большие возможности в программировании своих идей, но вот практически слишком много вопросов на которые я так и не получил внятных или понятных мне ответов.

Решил переделать свои индюки с MQL4, но ничего не вышло. Моя система, как и практически все реальные системы строится на исторических данных применяемого инструмента (тайм серия, показания индикаторов). Конкретно одна из проблем, показания индикатора с заданным периодом таймфрема (МА –Н1) при переключении таймфреймов графика дает глюки. Подкачка данных, циклы и т.д. все это выводит терминал из себя или поток данных прерывается.

В статьях, примерах ничего толкового нет одни лишь картинки, форум предлагает только «а может это», что наводит меня на мысли (прагматичные, пессиместические):

- МТ5 находится в стадии теста и будут еще обновления с исправлениями самой программы;

- трейдеров отделяют от программирования, подсаживая тем самым на платные сигналы и на маркет с сомнительными экспертами.

Последнее усложняет работу трейдера, придется все в ручную делать.


123

Share this post


Link to post
Share on other sites
DVargo

Очень сложно МТ5 закрыть МТ4 - большинство форекс трейдеров не периваривает неттинг позиций.

И до тех пор пока нетинг и МТ5 неразделимы, то МТ5 ни че не светит.

 

Меня лет этак семь назад посещали крамольные мысли - нарезать базу данных индикаторов в файл и периодически их от туда считывать.

Это все запросто и МТ4 делает. А если его отменят, то есть старые билды МТ4 типа 224, 226 ...,

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

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

А расчеты можно вести и в фоновом режиме советником или скриптом не грузя систему.

 

Но другая крамольная мысль была - а у ну их индикаторы, "реальные" системы обходятся и без них.

 

Никто так не усложняет работу трейдера, как он сам.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×