エラー、バグ、質問 - ページ 1167

 
Swan:
かもしれませんが、正しく送信されているようです。Global Variables ウィンドウが切り替わり、17桁の数字が表示されます。
18...
 
TheXpert:
ユニオンカーストで救われるmql5では構造体を介しても合法です。
MQL4です。何ができるのか?
 
artmedia70:
MQL4です。あなたは何をイメージできますか?
新型MQL4はMQL5に寄せているのでは?
 
marketeer:
新型MQL4はMQL5に寄せているのでは?
そうではありません。Helpから判断すると、ほぼ同じですが。しかし、私たちは判断しません。その結果に注目しています。
 
artmedia70:
MQL4です。何ができるのか?

えーと...

以下は、4と5の両方で動作するように、原理を説明したスクリプトです。

struct DoubleContainer
{
   double value;
};

struct LongContainer
{
   long value;
};

long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}

double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}

void OnStart()
{
   long l = 130462919691841406;
   double d1 = (double)l;
   long l1 = (long)d1;
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
}
 
Vinin:
そうではありません。ヘルプから判断すると、ほとんど同じものですが。しかし、私たちは判断するつもりはありません。私たちはその結果に興味があるのです。
TheXpertは、結果を出す方法を示してくれたと思います。5の構図はもう4で十分だろ。
 
TheXpert:

えーと...

以下はその原理を記したスクリプトで、4と5で動作するはずです。

これは本当におかしい...。

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long l = 130462919691841406;
   //--- приведение типов
   double d1 = (double)l;
   long l1 = (long)d1;
   //--- преобразование типов
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
   //--- поглядим чё натворили
   Print("long-значение l = "+IntegerToString(l));
   Print("long l привели к типу double d1 = "+DoubleToString(d1,Digits));
   Print("double d1 привели к типу long l1 = "+IntegerToString(l1));
   Print("long l преобразовали в double d2 = "+DoubleToString(d2,Digits));
   Print("double d2 преобразовали в long l2 = "+IntegerToString(l2));
   ToDoubleString(l);
  }
//+------------------------------------------------------------------+
struct DoubleContainer
{
   double value;
};
//+------------------------------------------------------------------+
struct LongContainer
{
   long value;
};
//+------------------------------------------------------------------+
long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}
//+------------------------------------------------------------------+
double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}
//+------------------------------------------------------------------+
double ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+IntegerToString(long_value)+", double_value = "+DoubleToString(double_value,Digits));
   return double_value;
}
//+------------------------------------------------------------------+

longをdoubleに変換すると0と表示されます。ただし、それ以降は通常、ダブルゼロはロングに変換し直されます。意味がわからない...。


なんだ...????????????

 
artmedia70:
そしてデバッガーを見る?そこには、ごく小さなゼロでない値がある。まだ使える、これ以上何が必要なんだ?
 
TheXpert:
そしてデバッガで調べる?そこには、ごく小さなゼロでない値が存在する。まだ使える、他に必要なものは?

ご覧ください。窓のID(長い)を地球儀の端末(2重になっている)に送信する。任意のチャートにインストールしたインジケータ(Expert Advisorが設定する)を、コントロールするExpert AdvisorのチャートのID値を読み取り、そのデータをまさにこのチャートに送信する必要があります。Expert Advisor は、これらのデータを処理し、動作させます。グローバルターミナルに0と表示され、インジケータが目的のチャートの必要なIDを受信し、そこにデータを送信するのかどうか、あまり自信がありません。ゼロを見る。また、Expert Advisorが動作するチャートのIDとは一致しません。確認が必要です。
うまく変換 できない場合は、csvファイルを使用することになります。しかし、損失なくデータ変換ができるように解決したい。そして、損失はなく、真値に2が加算される。

文字列に変換しようとしたところ、同じように、送信された値が2つ増え、130462919691841406となりました。

//+------------------------------------------------------------------+
void ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+long_value_str+", double_value = "+DoubleToString(double_value,Digits));
}
//+------------------------------------------------------------------+

の結果です。

2014.07.07 00:45:08.513 LongToDouble EURUSD,H4: long_value = 130462919691841406, double_value = 130462919691841408.00000

よくわからないけど...

 

タ・マァー...

転送前のロングからダブルを入れる必要があります。グローバル 変数の場合。1.34*e-307もあれば、4.29*e+120もある、長いビットがあるからです。

送信後、ダブりからロングに解凍してください。

それだけです。