Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 547

 
moskitman:

Конечно же так и есть, однако...

Я сильно сомневаюсь в правильности конструкции

Вот здесь https://www.mql5.com/ru/forum/119342 хорошая функция для получения списка доступных в терминале символов, в данном случае не вижу большого смысла сравнивать символ ордера с именами символов брокера на данном счете, но в других случаях очень полезна.

А в данном случае, чтобы исключить суффиксы

string smbl=StringSubstr(OrderSymbol(),0,6);
if (smbl=="EURUSD") priceEU1=OrderOpenPrice();
 
Zolotai:

Не подскажите. Где раздел про то, какие параметры. То есть про оформление, галочки, стрелочки и тп.


Вы бы расшифровали о чем речь
 
Vinin:

Вы бы расшифровали о чем речь
"Лего"
 
GSB:

Благодарю.

Условие проходило, ошибка была в другой части кода. :)

 

 В справке написано, что:

"Следует иметь ввиду, что в MQL4 элементы структуры следуют непосредственно друг за другом без выравнивания." 

 Что имеется ввиду под Выравниванием?

 если я правильно понял, то выровненные элементы будут выглядеть так:

struct trade_settings
  {
   uchar  slippage;     // значение допустимого проскальзывания -размер 1 байт
   char   reserved1;    // 1 байт пропуска
   short  reserved2;    // 2 байта пропуска
   int    reserved4;    // еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
  };
а не выровненные так: 
struct trade_settings
  {
   uchar slippage;     // значение допустимого проскальзывания -размер 1 байт
   char reserved1;     // 1 байт пропуска
   short reserved2;    // 2 байта пропуска
   int reserved4;      // еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
  };

Верно?

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

 
hoz:

В справке написано, что:

"Следует иметь ввиду, что в MQL4 элементы структуры следуют непосредственно друг за другом без выравнивания."

Что имеется ввиду под Выравниванием?

если я правильно понял, то выровненные элементы будут выглядеть так:

а не выровненные так: Верно?

Все расшифровано в комментариях

еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт

Элементы Структуры могут иметь разный тип и соответственно различную длину в байтах, Но память под каждый элемент выделяется одинаковая - по макс члену. В примере это double 8байт.

Фактически в структуре всего 3 элемента, но первый занимает всего 1 байт и надо еще отвести 7 байт "пустыщек" для того чтобы выровнять его с последними двумя элементами. Конкретную структуру проще описать так

struct trade_settings
  {
   ulong slippage;     // значение допустимого проскальзывания, но потом наверняка понадобится приведение в int перед подстановкой в OrderSend()
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
  };
 

 Т.е. получается компилятор сам добавляет необходимое количество байт под каждый элемент? Имею ввиду пробелы, которые там в примере не нужны?

И, кстати, если

GSB:

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


Если оно так, и всё-равно память под каждый элемент выделяется одна, то какая разница в каком порядке расположить элементы структуры?
 
hoz:

Т.е. получается компилятор сам добавляет необходимое количество байт под каждый элемент? Имею ввиду пробелы, которые там в примере не нужны?

И, кстати, если


Если оно так, и всё-равно память под каждый элемент выделяется одна, то какая разница в каком порядке расположить элементы структуры?

Нет не добавляет, если поставили int slippage первым, то выделится 4 байта, потому и надо добавить до 8 ( int reserve) или вместо int использовать long

Цитата из Справки

Внимание: данный пример иллюстрирует неправильно спроектированные данные. 
Лучше было бы сначала объявить данные take и stop большего размера типа double, а затем объявить член slippage типа uchar. 
В этом случае внутреннее представление данных будет всегда одинаково независимо от значения

Правильный вариант, при котором не надо делать выравнивание

struct trade_settings
  {
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
   int slippage;       // значение допустимого проскальзывания
  };
 
Подскажите пожалуйста, пишу мультивалютный советник, вытаскиваю аск и бид других валют, нормализирую, но в цене все равно есть лишние цифры.
     USDCADAsk = NormalizeDouble(MarketInfo("USDCAD",MODE_ASK),Digits);            
     USDCADBid = NormalizeDouble(MarketInfo("USDCAD",MODE_BID),Digits);
     USDCHFAsk = NormalizeDouble(MarketInfo("USDCHF",MODE_ASK),Digits);
     USDCHFBid = NormalizeDouble(MarketInfo("USDCHF",MODE_BID),Digits);
     USDJPYAsk = NormalizeDouble(MarketInfo("USDJPY",MODE_ASK),Digits);
     USDJPYBid = NormalizeDouble(MarketInfo("USDJPY",MODE_BID),Digits);
     EURUSDAsk = NormalizeDouble(MarketInfo("EURUSD",MODE_ASK),Digits);
     EURUSDBid = NormalizeDouble(MarketInfo("EURUSD",MODE_BID),Digits);
     GBPUSDAsk = NormalizeDouble(MarketInfo("GBPUSD",MODE_ASK),Digits);
     GBPUSDBid = NormalizeDouble(MarketInfo("GBPUSD",MODE_BID),Digits);
     AUDUSDAsk = NormalizeDouble(MarketInfo("AUDUSD",MODE_ASK),Digits);
     AUDUSDBid = NormalizeDouble(MarketInfo("AUDUSD",MODE_BID),Digits);
     NZDUSDAsk = NormalizeDouble(MarketInfo("NZDUSD",MODE_ASK),Digits);
     NZDUSDBid = NormalizeDouble(MarketInfo("NZDUSD",MODE_BID),Digits);
 
Example2:
Подскажите пожалуйста, пишу мультивалютный советник, вытаскиваю аск и бид других валют, нормализирую, но в цене все равно есть лишние цифры.

Digits
тоже из соответствующего символа желательно "вытаскивать" ;)
Причина обращения: