Я написал правильно, чтоб проиллюстрировать, что если глобальная и локальная переменные имеют
одинаковые тип и имя, то доступа к глобальной из тела программы после инициализации локальной нет.
А компилятор не предупреждает о существовании переменных с одинаковым именем.
И ЭТО НЕУДОБНО!
а у меня билд226 с антивиром уже 2 недели не дружит, и никакие исключения из объектов для проверки непомогли, впрочем румус тоже неработал, тока изначально, от даты установки антивира.
hhohholl>>:
Я написал правильно, чтоб проиллюстрировать, что если глобальная и локальная переменные имеют
одинаковые тип и имя, то доступа к глобальной из тела программы после инициализации локальной нет.
А компилятор не предупреждает о существовании переменных с одинаковым именем.
И ЭТО НЕУДОБНО!
Уж не помню где, давно это было, но предупреждали: не использовать одинаковые имена, хотя если
без глупостей, как у Вас, то практика доказала, что вполне возможно.
Откат терминала вряд ли Вам поможет. Из журнала видно, что советник мультивалютный, а Вы устанавливаете его сразу на две или более пары. Естественно, каждый из них пытается установить свой ордер по одному и тому же инструменту и когда их запросы совпадают по времени, то и выставляются два ордера. Чтобы он перестал работать, надо удалить все экземпляры советника.
Здравствуйте!
Действительно я ошибся Откат компа не помогает Советник и после отката работает.
Поскольку он мульти, то Перебор пар идет в коде типа ...
for (int i=1;i<=5;i++)
{ //1
if (i==1) {OSyb="EURUSD";}
if (i==2) {OSyb="AUDJPY";}
if (i==3) {OSyb="EURJPY";}
if (i==4) {OSyb="EURCHF";}
if (i==5) {OSyb="NZDUSD";}
......... и т.д.
if (Открыт_ли_этот_инстр(OSyb,text)==1) continue;
Я так всегда делаю для мульти. К советнику вопросов нет Я С НИМ на реале уже месяцев 8.
Началось после установки 226 билда
Valmars>>:
Уж не помню где, давно это было, но предупреждали: не использовать одинаковые имена, хотя если
без глупостей, как у Вас, то практика доказала, что вполне возможно.
Изначально писал, что объединял два советника.
Каждый по 2-3 тысячи строк, хотя ядро одно.
Срок между ними пару месяцев, Можно ли упомнить все детали и все, что имел ввиду?
Слава Богу, что заметил этот косяк.
Конечно, теперь этот момент под вниманием, но, хотелось бы, чтоб эта фича легла на компилятора.
Заглянул. "И что в связи с этим я должен предпринять?" (с) "День выборов"
Ндааа... тяжело в деревне... :))))))))
Ну если не понятна просьба из контекста, то что уж тут - проехали....
Попробуем поговорить о другой стороне сего программного продукта.
Пишем скрипт:
//+------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------+int start(){
/*Скрипт попробует разбить лот = 1.11 пополам */Alert(" ---------------------------------- ");
string SMB=Symbol(),NameScript="My_Script";
double MinLots=(MarketInfo(SMB,MODE_MINLOT));
double Lot=1.11,Lot1;
// -------- отсекаем 50% от величины Lot -----------------
Lot1=Lot/100*50;// сделано. теперь нормализуем полученое значениеAlert("Lot1 до нормализации = ",Lot1);
Lot1=ProverkaLota(Lot1);
Alert("Суммарный лот = ",Lot1+Lot1);
Alert("Lot1 = ",Lot1);
Alert("Минимально-допустимый лот = ",MinLots);
Alert("Исходный лот ордера = ",Lot," Пробуем разбить его на 2 части, то есть, отсечь 50 процентов");
Alert("------------ ",SMB," ---- ",NameScript," ------------");
return(0);
}
//+-------------------------------------------------------------------// ------------- Пользовательские подпрограммы -----------------------//+-------------------------------------------------------------------// ============ ProverkaLota() =====================================================================// функция принимает нормализует лот ордера до разрядности минимально-допустимого//-------------------------------------------------------------------------------double ProverkaLota(double LotOrdera){
string SMB=Symbol(),Temp;
double MinLots=(MarketInfo(SMB,MODE_MINLOT));
double MaxLots=MarketInfo(SMB,MODE_MAXLOT);
double CorrectLot=0;
int diglots=0;
switch(MinLots){
case0.01: diglots=2; break;
case0.1: diglots=1; break;
case1: diglots=0; break;
default:
CorrectLot=0;
}
//Alert("Поступил LotOrdera = ",LotOrdera);
Temp=DoubleToStr(LotOrdera,diglots);// отбрасываем лишние числа//Alert("Temp = ",Temp);
CorrectLot=StrToDouble(Temp);
//Alert("Откорректировано до = ",CorrectLot);if(CorrectLot<MinLots){
CorrectLot=MinLots;
}
if(CorrectLot>MaxLots){
CorrectLot=MaxLots;
}
return(CorrectLot);
}
// =================================================================================================
Кидаем скрипт на график любой валютной пары. Что в результате имеем:
Итого, функция DoubleToStr() вместо того, чтоб просто скопировать в строку два числа после запятой у величины double, взяла и округлила сотые доли в большую сторону.
Казалось бы, округление прошло по правилам математики. Вроде всё верно. Кроме одного - что в справке метаэдитора об этом ни сном ни духом. Почему до такого нужно догадываться?
В МТ5 осуществлено то же самое?
P.S.
Чем долше я программлю на MQL4, тем больше и больше хочется от него отказаться :(
удалил всё что связано с терминалом, заново скачал с сервера дц установил, не дал обновиться с 225 до 226 билд, поставил в папку достоверные для антивира. Потом запустил терминал. УРА опять рработает! Ещё бы 2 недели мучил службы потдержки антивира и дц, прилежно отправляя им отчёты и исполняя светы (толку не было), вот когда билд226 стёр это помогло.
Итого, функция DoubleToStr() вместо того, чтоб просто скопировать в строку два числа после запятой у величины double, взяла и округлила сотые доли в большую сторону.
Казалось бы, округление прошло по правилам математики. Вроде всё верно. Кроме одного - что в справке метаэдитора об этом ни сном ни духом. Почему до такого нужно догадываться?
Я бы мог понять возмущение, если бы в справке к функции DoubleToStr было бы написано, что сначала отрасываются лишние знаки после запятой, и только затем производится преобразование, но там этого нет:
Преобразование числового значения в текстовую строку, содержащую
символьное представление числа в указанном формате точности.
Кроме того, вы сами можете средствами языка MQL4 реализовать любой требуемый Вам функционал, вплоть до преобразования из десятичной системы в римскую.
Зачем Вы ищете экзотические или пограничные случаи для использования языка, если не уверены - делайте свою реализацию. Для этого есть Математические функции и Арифметические
операции
Ладно, из каких-то соображений разработчик так сделал, пусть так, но почему же в справочной системе ни слова о том, что функция не просто возвращает в строку указанное количество цифр после запятой, но ещё и округляет?? А в результате потеря времени и сил, объяснения с заказчиком, переразбор кода, написание дополнительных функций.
Да, я могу реализовать нужный мне функционал средствами MQL4, правда не любой, как Вы говорите, ибо язык MQL4 - довольно-таки бедная штука и всё чаще приходится прибегать к средствам других языков. Но не об этом речь...
В том же Делфи есть функция FloatToStr() - она вернёт в строку то, что ей передали. Например код
procedure TForm1.Button1Click(Sender: TObject);
var
Stroka: String;
MyChislo: Extended;
begin
MyChislo:=7.256485;
Stroka:= FloatToStr(MyChislo);
Edit1.Text:=Stroka;
end;
вернёт в поле Edit1 текст, содержанием которого будет строка 7.256485
Для форматированного вывода есть другая функция - FloatToStrF(), где буква F в имени функции даёт подсказку, что вывод будет форматированным.
Вот Вам и причина недоразумений. Сомневаюсь, что разработчик это исправит. Сомневаюсь и в том, что есть вообще смысл описывать тут подобные нюансы.
Rosh, посмотрите пожалуйста вот эту ветку https://www.mql5.com/ru/forum/124841
Заглянул. "И что в связи с этим я должен предпринять?" (с) "День выборов"
одинаковые тип и имя, то доступа к глобальной из тела программы после инициализации локальной нет.
А компилятор не предупреждает о существовании переменных с одинаковым именем.
И ЭТО НЕУДОБНО!
а у меня билд226 с антивиром уже 2 недели не дружит, и никакие исключения из объектов для проверки непомогли, впрочем румус тоже неработал, тока изначально, от даты установки антивира.
Я написал правильно, чтоб проиллюстрировать, что если глобальная и локальная переменные имеют
одинаковые тип и имя, то доступа к глобальной из тела программы после инициализации локальной нет.
А компилятор не предупреждает о существовании переменных с одинаковым именем.
И ЭТО НЕУДОБНО!
без глупостей, как у Вас, то практика доказала, что вполне возможно.
Откат терминала вряд ли Вам поможет. Из журнала видно, что советник мультивалютный, а Вы устанавливаете его сразу на две или более пары. Естественно, каждый из них пытается установить свой ордер по одному и тому же инструменту и когда их запросы совпадают по времени, то и выставляются два ордера. Чтобы он перестал работать, надо удалить все экземпляры советника.
Здравствуйте!
Действительно я ошибся Откат компа не помогает Советник и после отката работает.
Поскольку он мульти, то Перебор пар идет в коде типа ...
for (int i=1;i<=5;i++)
{ //1
if (i==1) {OSyb="EURUSD";}
if (i==2) {OSyb="AUDJPY";}
if (i==3) {OSyb="EURJPY";}
if (i==4) {OSyb="EURCHF";}
if (i==5) {OSyb="NZDUSD";}
......... и т.д.
if (Открыт_ли_этот_инстр(OSyb,text)==1) continue;
Я так всегда делаю для мульти. К советнику вопросов нет Я С НИМ на реале уже месяцев 8.
Началось после установки 226 билда
Уж не помню где, давно это было, но предупреждали: не использовать одинаковые имена, хотя если
без глупостей, как у Вас, то практика доказала, что вполне возможно.
Изначально писал, что объединял два советника.
Каждый по 2-3 тысячи строк, хотя ядро одно.
Срок между ними пару месяцев, Можно ли упомнить все детали и все, что имел ввиду?
Слава Богу, что заметил этот косяк.
Конечно, теперь этот момент под вниманием, но, хотелось бы, чтоб эта фича легла на компилятора.
Заглянул. "И что в связи с этим я должен предпринять?" (с) "День выборов"
Ндааа... тяжело в деревне... :))))))))Ну если не понятна просьба из контекста, то что уж тут - проехали....
Попробуем поговорить о другой стороне сего программного продукта.
Пишем скрипт:
Кидаем скрипт на график любой валютной пары. Что в результате имеем:
Итого, функция DoubleToStr() вместо того, чтоб просто скопировать в строку два числа после запятой у величины double, взяла и округлила сотые доли в большую сторону.
Казалось бы, округление прошло по правилам математики. Вроде всё верно. Кроме одного - что в справке метаэдитора об этом ни сном ни духом. Почему до такого нужно догадываться?
В МТ5 осуществлено то же самое?
P.S.
Чем долше я программлю на MQL4, тем больше и больше хочется от него отказаться :(
удалил всё что связано с терминалом, заново скачал с сервера дц установил, не дал обновиться с 225 до 226 билд, поставил в папку достоверные для антивира. Потом запустил терминал. УРА опять рработает! Ещё бы 2 недели мучил службы потдержки антивира и дц, прилежно отправляя им отчёты и исполняя светы (толку не было), вот когда билд226 стёр это помогло.
Итого, функция DoubleToStr() вместо того, чтоб просто скопировать в строку два числа после запятой у величины double, взяла и округлила сотые доли в большую сторону.
Казалось бы, округление прошло по правилам математики. Вроде всё верно. Кроме одного - что в справке метаэдитора об этом ни сном ни духом. Почему до такого нужно догадываться?
Я бы мог понять возмущение, если бы в справке к функции DoubleToStr было бы написано, что сначала отрасываются лишние знаки после запятой, и только затем производится преобразование, но там этого нет:Преобразование числового значения в текстовую строку, содержащую символьное представление числа в указанном формате точности.
Зачем Вы ищете экзотические или пограничные случаи для использования языка, если не уверены - делайте свою реализацию. Для этого есть Математические функции и Арифметические операции
Да, я могу реализовать нужный мне функционал средствами MQL4, правда не любой, как Вы говорите, ибо язык MQL4 - довольно-таки бедная штука и всё чаще приходится прибегать к средствам других языков. Но не об этом речь...
В том же Делфи есть функция FloatToStr() - она вернёт в строку то, что ей передали. Например код
procedure TForm1.Button1Click(Sender: TObject); var Stroka: String; MyChislo: Extended; begin MyChislo:=7.256485; Stroka:= FloatToStr(MyChislo); Edit1.Text:=Stroka; end;вернёт в поле Edit1 текст, содержанием которого будет строка 7.256485Для форматированного вывода есть другая функция - FloatToStrF(), где буква F в имени функции даёт подсказку, что вывод будет форматированным.
Вот Вам и причина недоразумений.
Сомневаюсь, что разработчик это исправит. Сомневаюсь и в том, что есть вообще смысл описывать тут подобные нюансы.