どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 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 байт

構造体の各要素は、異なる型とそれに対応するバイト長を持つことができますが、各要素のメモリは同じように、最大メンバーで割り当てられます。この例では、ダブル8バイトです。

実際、構造体には3つの項目しかありませんが、最初の項目は1バイトしか占めないので、最後の2つの項目と揃えるために、さらに7バイトの「空」を割り当てなければなりません。具体的な構造については、次のように記述するとわかりやすいでしょう。

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

では、コンパイラは各要素に対して必要なバイト数を追加するのですか?スペースということですが、この例では必要ないのでしょうか?

ちなみに、もし

GSB:

構造体の種類やバイト数は違っても、各項目のメモリは同じように最大メンバーで割り当てられます。この例では、ダブル8バイトです。


もしそうだとしたら、どうせ各要素に1つしかメモリが割り当てられていないのだから、構造体の要素をどのような順番で配置してもいいのでは?
 
hoz:

では、コンパイラは各要素に対して必要なバイト数を追加するのですか?スペースということですが、この例では必要ないのでしょうか?

ちなみに、もし


もしそうで、どうせ1つの項目に1つのメモリしか割り当てられないのであれば、構造体の要素をどのような順番で並べたらよいのでしょうか?

int スリッページを最初に置くと、4 バイトが割り当てられるので、8 バイトに足すか(int リザーブ)、int の代わりに long を使用します。

ヘルプより引用

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

アライメントを必要としない正しい選択肢は、次のとおりです。

struct trade_settings
  {
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
   int slippage;       // значение допустимого проскальзывания
  };
 
アドバイスお願いします。多通貨EAを書いていて、他の通貨のaskとbidを取り出し、正規化しているのですが、まだ価格に余分な桁があります。
     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:
アドバイスお願いします。多通貨EAを書いていて、他の通貨のaskとbidを取り出し、正規化しますが、価格にまだ余分な桁があります。

桁は 、できれば適切な記号から「抜き」て欲しい;)