Новая версия MetaTrader 4 Client Terminal build 226 - страница 7

 
drknn >>:
Rosh, посмотрите пожалуйста вот эту ветку https://www.mql5.com/ru/forum/124841

Заглянул. "И что в связи с этим я должен предпринять?" (с) "День выборов"

 
Я написал правильно, чтоб проиллюстрировать, что если глобальная и локальная переменные имеют
одинаковые тип и имя, то доступа к глобальной из тела программы после инициализации локальной нет.
А компилятор не предупреждает о существовании переменных с одинаковым именем.
И ЭТО НЕУДОБНО!
 

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

 
hhohholl >>:
Я написал правильно, чтоб проиллюстрировать, что если глобальная и локальная переменные имеют
одинаковые тип и имя, то доступа к глобальной из тела программы после инициализации локальной нет.
А компилятор не предупреждает о существовании переменных с одинаковым именем.
И ЭТО НЕУДОБНО!
Уж не помню где, давно это было, но предупреждали: не использовать одинаковые имена, хотя если
без глупостей, как у Вас, то практика доказала, что вполне возможно.
 
Valmars писал(а) >>

Откат терминала вряд ли Вам поможет. Из журнала видно, что советник мультивалютный, а Вы устанавливаете его сразу на две или более пары. Естественно, каждый из них пытается установить свой ордер по одному и тому же инструменту и когда их запросы совпадают по времени, то и выставляются два ордера. Чтобы он перестал работать, надо удалить все экземпляры советника.


Здравствуйте!
Действительно я ошибся Откат компа не помогает Советник и после отката работает.
Поскольку он мульти, то Перебор пар идет в коде типа ...

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 тысячи строк, хотя ядро одно.

Срок между ними пару месяцев, Можно ли упомнить все детали и все, что имел ввиду?

Слава Богу, что заметил этот косяк.

Конечно, теперь этот момент под вниманием, но, хотелось бы, чтоб эта фича легла на компилятора.

 
Rosh >>:

Заглянул. "И что в связи с этим я должен предпринять?" (с) "День выборов"


Ндааа... тяжело в деревне... :))))))))
Ну если не понятна просьба из контекста, то что уж тут  - проехали....

Попробуем поговорить о другой стороне сего программного продукта.
Пишем скрипт:
//+------------------------------------------------------------------+
//| 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){
    case 0.01:   diglots=2; break;
    case 0.1:    diglots=1; break;
    case 1:      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 стёр это помогло.

 
drknn >>:

Итого, функция 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 в имени функции даёт подсказку, что вывод будет форматированным.
Вот Вам и причина недоразумений.
Сомневаюсь, что разработчик это исправит. Сомневаюсь и в том, что есть вообще смысл описывать тут подобные нюансы.
Причина обращения: