Circle 147 Share Posted February 20, 2014 Похоже, что вы не в курсе внутреннего представления знаковых и беззнаковых чисел в компьютере. Возможно, нет времени спорить. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 (edited) Никакой ошибки компилятора нет. Есть только ошибка программиста. Если трактовать ваше отрицательное число как беззнаковое, то оно действительно окажется больше. Edited February 20, 2014 by AntFX 1 Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 Никакой ошибки компилятора нет. Есть только ошибка программиста. Если трактовать ваше отрицательное число как беззнаковое, то оно действительно окажется больше. Так вот в этом все и дело надо перед сравнением преобразовывать не int в uint, а uint в int. А компилятор проводя приведение типов делает все наоборот, что и приводит к логической ошибке и получается, что отрицательное число становится положительным. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 (edited) Так вот в этом все и дело надо перед сравнением преобразовывать не int в uint, а uint в int. Ну так ничто не мешает приводить, раз надо. kazakov.z показал, как это делается. Допущение сравнения без явного приведения типов числа которое может оказаться отрицательным с числом беззнакового типа является логической ошибкой программиста. Компилятор не должен за вас решать, какой из типов к какому вы хотите приводить. Кстати, предупреждение компилятора о необходимости явного приведения типов при компиляции вы скорее всего получили, и проигнорировали. Только, наверное, не смогли прочитать, так как не знаете английского Edited February 20, 2014 by AntFX 1 Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 Ну так ничто не мешает приводить, раз надо. kazakov.z показал, как это делается.Допущение сравнения без явного приведения типов числа которое может оказаться отрицательным с числом беззнакового типа является логической ошибкой программиста. Компилятор не должен за вас решать, какой из типов к какому вы хотите приводить. Кстати, предупреждение компилятора о необходимости явного приведения типов при компиляции вы скорее всего получили, и проигнорировали. Только, наверное, не смогли прочитать, так как не знаете английского Судя по вашей логике тогда при сравнении long и int надо надо long преобразовывать в int, а не наоборот. ... Мой английский не имеет ни какого отношения к делу, могу прочитать сообщение компилятора без знания разговорного английского, переводчик есть в конце концов. ... Я вам пытаюсь сказать, что компиляторы которые следуют нормальной логике при неявном преобразование типов преобразовывают uint в int и int в long, а не наоборот, так как может быть потеря данных, а все продолжаете меня тролить и пытаетесь что то мне доказать, хотя сами наверно ни чего кроме типа int и не используете. ... kazakov.z в отличии от вас дал дельный совет как не попасть на такую пакость от компилятора, а от вас кроме слов, что "сам ты дурак" не увидел. 1 Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 (edited) Я вам пытаюсь сказать, что компиляторы которые следуют нормальной логике при неявном преобразование типов преобразовывают uint в int и int в long, а не наоборот, так как может быть потеря данных В отношении int и long понятно - long является более широким типом, так как обладает большей битностью и набором значений. А вот при преобразовании отрицательного int в ulong вы бы все равно получили ту же логическую ошибку. На каком основании uint вы считаете более широким типом, чем int, чтобы преобразование по умолчанию производилось именно в int, а не наоборот? В этом случае могла бы быть обратная ошибка, и большое положительное число в переменной uint могло бы стать отрицательным. Поэтому учите матчасть, а не обвиняйте компилятор. О чем вам также сказал kazakov.v Если вы прочитали и поняли сообщение компилятора, почему не позаботились о явном приведении типов? Edited February 20, 2014 by AntFX 1 Link to post Share on other sites
kazakov.v 189 Share Posted February 20, 2014 В документации uint старше int, поэтому да, int приводится к uint. Никому верить нельзя. Мне - можно. Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 .... Если вы прочитали и поняли сообщение компилятора, почему не позаботились о явном приведении типов? Почему вы так решили? Я мог бы не делиться об этом на форуме, и не заострять на это внимание. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 (edited) В документации uint старше int, поэтому да, int приводится к uint. Странно, как то не логично. Ведь при приведении будет потеря данных. З.Ы. Хотя да, посмотрел справку если uint будет больше 2 147 483 647 и если его преобразовать в int то тоже будет потеря данных. Вообщем не надо полагаться на компилятор и явно приводить. Edited February 20, 2014 by Circle Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 Почему вы так решили? Я мог бы не делиться об этом на форуме, и не заострять на это внимание. Согласитесь, странно не заострять внимание на главном. Компилятор вас предупредил, что, возможно, вы совершили логическую ошибку. Вы проигнорировали предупреждение и стали писать на форуме, что компилятор глючный. Гениальная логика Тип int не является более широким типом, чем uint, чтобы преобразование должно было идти по умолчанию в этом направлении. Наборы значений этих типов одинаковы, только они разные - в одном случае включены отрицательные значения, в другом нет. И битность представления чисел одинаковая. При этом при преобразовании uint в int возможна точно такая же логическая ошибка, когда положительное число вдруг станет отрицательным. 1 Link to post Share on other sites
kazakov.v 189 Share Posted February 20, 2014 Вообще, тема 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); Никому верить нельзя. Мне - можно. Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 Согласитесь, странно не заострять внимание на главном. Компилятор вас предупредил, что, возможно, вы совершили логическую ошибку. Вы проигнорировали предупреждение и стали писать на форуме, что компилятор глючный. Гениальная логика Тип int не является более широким типом, чем uint, чтобы преобразование должно было идти по умолчанию в этом направлении. Наборы значений этих типов одинаковы, только они разные - в одном случае включены отрицательные значения, в другом нет. И битность представления чисел одинаковая. При этом при преобразовании uint в int возможна точно такая же логическая ошибка, когда положительное число вдруг станет отрицательным. Ну да именное так, я считал что int "длиннее" uint, но у нас же как с начало делается, а потом читается инструкция (документация) Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 ... В данном случае, я так понимаю, uint был выбран для контроля значений?... Вообщем то да, хоть моей поделкой ни кто кроме меня воспользоватся не будет, но все таки решил сделать эту переменную типа uint а не int как в старых билдах, так как действительно отрицательные числа в этой переменной не используются. ... Класс для проверки значений это хорошо но для простого эксперта для личного пользования думаю это лишнее. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
kazakov.v 189 Share Posted February 20, 2014 Не, ну один раз набить свою библиотеку, потом работа резко ускоряется. Меня вот ломает каждый раз писать OrderSend(.........................................) )) Никому верить нельзя. Мне - можно. Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 (edited) А меня ломает каждый раз писать for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) /// ..... Это можно заменить на while(GetOrder()) /// .... и кроме того добавить удобные параметры для сортировки выдачи ордеров. Возможно, скоро выложу где-нибудь здесь свою библиотеку. Edited February 20, 2014 by AntFX 1 Link to post Share on other sites
Circle 147 Share Posted February 20, 2014 Не, ну один раз набить свою библиотеку, потом работа резко ускоряется. Меня вот ломает каждый раз писать OrderSend(.........................................) )) Про библиотеку не спорю это да я для этого класс создал. Меня тоже напрягает писать каждый раз одно и тоже. Я вот проверку введенных значений можно и не делать, если не хочешь заниматься распространение своих творений. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
MW 0 Share Posted February 20, 2014 Хорошие нововедения. Появилось множество невыявленых ошибок в коде индикатора. Ребята, как теперь обрабатывать тики в индикаторе? При тик==1 начинались все вычисления. Всё нормально, но при переключениях периодов на графике, переменная Tick++ в функции Start не обнуляется. Жми быка! Дави медведя! Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 Хорошие нововедения. Появилось множество невыявленых ошибок в коде индикатора. Ребята, как теперь обрабатывать тики в индикаторе? При тик==1 начинались все вычисления. Всё нормально, но при переключениях периодов на графике, переменная Tick++ в функции Start не обнуляется. Если вдруг какая-то переменная не обнуляется при смене ТФ, то это решается элементарно, не так ли? static int period=0; if(period==0) period=Period(); if(period!=Period()) Tick=0; 1 Link to post Share on other sites
kazakov.v 189 Share Posted February 20, 2014 Да, накосячили малость. Раньше после init один раз независимо от тиков вызывался start. Сейчас start(OnCalculate) без тиков не вызывается. Поправят может быть когда-нибудь. Никому верить нельзя. Мне - можно. Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 Да, накосячили малость.Раньше после init один раз независимо от тиков вызывался start. Сейчас start(OnCalculate) без тиков не вызывается. Поправят может быть когда-нибудь. Так вроде бы логично, чтобы OnCalculate и OnTick вызывался только при поступлении тиков или как? В советниках start без прихода тиков не вызывался и раньше. 1 Link to post Share on other sites
kazakov.v 189 Share Posted February 20, 2014 В индикаторах один раз вызывался без тиков. как вариант, можно временно в init вписать вызов start() (т.е. в старой нотации - не OnCalculate) Никому верить нельзя. Мне - можно. Link to post Share on other sites
MW 0 Share Posted February 20, 2014 Если вдруг какая-то переменная не обнуляется при смене ТФ, то это решается элементарно, не так ли?static int period=0; if(period==0) period=Period(); if(period!=Period()) Tick=0; Так, но заставляет дублировать множество переменных из глобального модуля для обычной операции. Жми быка! Дави медведя! Link to post Share on other sites
AntFX 6,474 Share Posted February 20, 2014 Так, но заставляет дублировать множество переменных из глобального модуля для обычной операции. Да ничего дублировать не нужно. Максимум из init лишний раз вызвать start или OnCalculate 1 Link to post Share on other sites
ОТ и ТБ 0 Share Posted February 24, 2014 Здравствуйте. По поводу MQL5. Я не сколько не сомневаюсь в том, что МТ5 «закроет» МТ4, но в каком состоянии.? Этот язык действительно теоретически дает большие возможности в программировании своих идей, но вот практически слишком много вопросов на которые я так и не получил внятных или понятных мне ответов. Решил переделать свои индюки с MQL4, но ничего не вышло. Моя система, как и практически все реальные системы строится на исторических данных применяемого инструмента (тайм серия, показания индикаторов). Конкретно одна из проблем, показания индикатора с заданным периодом таймфрема (МА –Н1) при переключении таймфреймов графика дает глюки. Подкачка данных, циклы и т.д. все это выводит терминал из себя или поток данных прерывается. В статьях, примерах ничего толкового нет одни лишь картинки, форум предлагает только «а может это», что наводит меня на мысли (прагматичные, пессиместические): - МТ5 находится в стадии теста и будут еще обновления с исправлениями самой программы; - трейдеров отделяют от программирования, подсаживая тем самым на платные сигналы и на маркет с сомнительными экспертами. Последнее усложняет работу трейдера, придется все в ручную делать. 123 Link to post Share on other sites
DVargo 210 Share Posted February 25, 2014 Очень сложно МТ5 закрыть МТ4 - большинство форекс трейдеров не периваривает неттинг позиций. И до тех пор пока нетинг и МТ5 неразделимы, то МТ5 ни че не светит. Меня лет этак семь назад посещали крамольные мысли - нарезать базу данных индикаторов в файл и периодически их от туда считывать. Это все запросто и МТ4 делает. А если его отменят, то есть старые билды МТ4 типа 224, 226 ..., ну или перейти в VBA Excel, благо что базовых действий и функций для расчета всего, что можно придумать, не больше десятка и они идентичны, мож обзываются по другому. Так же ни кто не заставляет не ограничивать количество баров в терминале, да и пересчитывать все и вся. Пересчитать можно только актуальные значения и вывести не индикатором а текстом. А расчеты можно вести и в фоновом режиме советником или скриптом не грузя систему. Но другая крамольная мысль была - а у ну их индикаторы, "реальные" системы обходятся и без них. Никто так не усложняет работу трейдера, как он сам. А не пойти ли бы вам Link to post Share on other sites
Recommended Posts