エキスパートアドバイザー - 雑多な質問 - ページ 4 1234567891011...43 新しいコメント William Roeder 2016.11.29 20:24 #31 そうです、彼らはそれを多用しています。これらはすべて、通貨しかなかったときに書かれたものです。現在では金属もあり、tick size != point は完全に間違っています。 02:00:00.069- カスタムエキスパートEURUSD,H1:| _lotSize -NormalizeDouble: 0.070000000000001OPは2倍を15桁までプリントアウトし続け、なぜそれが0.07ぴったりでないのか理解できないのです。ある数字が正確に表現できないからだ 1/8はできる 1/10はできない Max Enrik 2016.11.29 22:38 #32 honest_knave:double LotCalculator(double lots) { ... return(NormalizeDouble(lots,2)); }このコメントは本当に私に多くのことを助け、これは便利ですが、それは私に多くの小数を与える。(私はすでにそれについて読んだので(より多くの小数点は正常です)。私はまだ'NormalizeDouble'を心配し、私は別の方法を探しています。ありがとうございます!このコメントは本当に私に多くのことを助ける。 Max Enrik 2016.11.29 23:11 #33 コメントを書いてくださった方、ありがとうございました。whroeder1- あなたのコメント(/リンク)を広く研究します大きな感謝。Marco- LotSize LotStep問題の後に使用することにします。ありがとうございます。 honest_knave 2016.11.29 23:19 #34 Max Enrik:このコメントは本当に私をたくさん助け、これは便利ですが、それは私に多くの小数点を与える。(私はすでにそれについて読んだので(より多くの小数は正常です)。私はまだ'NormalizeDouble'を心配し、私は別の方法を探しています、それは'NormalizeDouble'よりも優れている。ありがとうございます。おそらく、あなたが達成しようとしているものを正確に確立するのが最善でしょう。もし、注文を出すのに有効なロットサイズを返す関数が 欲しいのであれば、NormalizeDouble() を使う必要はないでしょう。私のオリジナルコードやWHRoederのコードで実現できます。両者の間には微妙な違いがあり、それは個人の好みの問題でしょう。しかし、ロットの値をそのままPrint()すると、0.070000000000001のような「奇妙な」結果が得られるかもしれません。これはOrderSend()では問題にはなりませんが、あなたが期待するものとは異なるかもしれません。 もし、「普通の」方法で表示される数字を見たいのであれば、2つの選択肢があります。1.関数内でNormalizeDouble() を使用することができます。標準的なプリントアウトの場合、期待通りの値が表示されます。しかし、(手動で)小数点以下の桁数を十分に印刷すると、やがてその数値が思った通りでないことがわかるでしょう。これがWHRoederの言わんとするところです(と私は思っています)。この解決策は最もエレガントなものではありませんが、最もシンプルなものです。あるいは...2.ロットサイズをそのままにしておいて (つまりNormalizeDouble を使わないで)、 必要なときに表示用に値を調整することもできます。必要に応じて、DoubleToStr()、StringFormat()、printf()を使用して、これを実現することができます。これは、より柔軟なアプローチです。実際の値とその表示方法は同じである必要はないことに注意しましょう。正確に0.07を格納することはできないのです。 double myVal=0.07; printf("%.24f",myVal);Result: 0.070000000000000006661338しかし、必要であれば0.07を表示することができます。 Max Enrik 2016.11.29 23:29 #35 honest_knave:おそらくそれはあなたが達成しようとしているものを正確に確立することが最善であろう。...わー、いいこと書いてますね、あなたのコメントのようにほとんど理解しています。 というわけで、近々、新しいコメントを書きますね。//--- 2回目の編集私が述べたように、私はLotSizeとLotStepが表示されているだけで正しい必要はありません、私はLotSizeとLotStepがどこでも同じことを示すことができる 必要があります。 ちょうど私はそれが心配です。 Marco vd Heijden 2016.11.29 23:55 #36 まあ、ダイナミックなロットサイズなら、シンプルなギアボックスでもいいんですけどね。//Gearbox//double Lots; Balance=AccountInfoDouble(ACCOUNT_BALANCE);if(Balance>10000){Lots=10;Print(" Gear Two");}if(Balance>100000){Lots=100;Print(" Gear Three");}if(Balance>1000000){Lots=1000;Print(" Gear Four");}if(Balance>10000000){Lots=10000;Print(" Gear Five");}if(Balance<10000000){Lots=1000;Print(" Gear Four");}if(Balance<1000000){Lots=100;Print(" Gear Three");}if(Balance<100000){Lots=10;Print(" Gear Two");}if(Balance<10000){Lots=1;Print(" Gear One");}if(Balance>1000000000){Lots=0;} Max Enrik 2016.11.30 00:06 #37 私はあなたと私のEAの一部を投稿する必要があるので、私はあなたがより明確に私を理解するのに役立つことを願っています。 それで、私はそれが良いコードか何かを知る必要がありますか?良い(明確な)アドバイスやヘルプをお願いします、よろしくお願いします。void OnChartEvent(const int id , // Event ID const long & lparam , // Parameter of type long event const double & dparam , // Parameter of type double event const string & sparam // Parameter of type string events ){ _lotCalc(); //-------Process Button---------------------------------------------------------| if ( sparam == _btnLotMinus ) { ObjectSetInteger( 0, _btnLotMinus, OBJPROP_STATE, false ); _lotSize -= _lotStep; if ( NormalizeDouble( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin; _calcUpdade( CALC_CHANGE_LOT ); Print( " | Lot: ", _lotSize ); return; } //---if Close // ...}double _lotCalc(){ //--- _lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN ); _lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX ); _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP ); //--- return( NormalizeDouble( _lotSize, 2 ) );} expert advisor - miscellaneous "Unexpected end of program" CHARTEVENT_OBJECT_CLICK honest_knave 2016.11.30 00:28 #38 Max Enrik:私はあなたと私のEAの一部を投稿する必要があるので、私はあなたがより明確に私を理解するのに役立つことを願っています。 だから、私はそれが良いコードか何かを知る必要がありますか?私に良い(明確に)アドバイスやヘルプを与えてください、事前に感謝します。夜遅く、コンパイルされていない、テストされていない。あなたが最初に _lotSize を設定した場所がわかりません... _lotSize が常に _lotStep の倍数であることを確認する必要があることを思い出してください。OnChartEvent()と_lotCalc()の間で分割するのではなく、すべてのロット計算を一緒にしておくと、より良いものになると思います。min / max / stepをチェックし、インクリメント / デクリメントを行う関数を 1つ用意します。void OnChartEvent(const int id , // Event ID const long & lparam , // Parameter of type long event const double & dparam , // Parameter of type double event const string & sparam // Parameter of type string events ){ _lotCalc(); //-------Process Button---------------------------------------------------------| if ( sparam == _btnLotMinus ) { ObjectSetInteger( 0, sparam, OBJPROP_STATE, false ); _lotSize = fmax(_lotMin, _lotSize-_lotStep); _calcUpdade( CALC_CHANGE_LOT ); printf( " | Lot: %.2f ", _lotSize ); return; } //---if Close // ...}void _lotCalc(){ //--- _lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN ); _lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX ); _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP ); //---} expert advisor - miscellaneous 初心者の方からの質問 MQL5 MT5 MetaTrader Errors, bugs, questions Max Enrik 2016.11.30 17:40 #39 honest_knave:夜遅く、未パイル、未テストです。 ロットサイズ(_lotSize)を最初に設定した場所がわかりません。_lotSizeが常に_lotStepの倍数であることを確認する必要があります。 OnChartEvent()と_lotCalc()の間で分割するのではなく、すべてのロット計算を一緒にしておくと、より良いものになると思います。min / max / stepをチェックし、インクリメント / デクリメントを行う関数を1つ用意します。それは私のlotSizeと losStepの 問題を解決したことを意味し、それは私がたくさん助けました。 本当にありがとうございます。#Lot 0 (ゼロ) & (解決済みのLot SizeとLot Step問題の間)- Closed Max Enrik 2016.11.30 20:35 #40 そうそう、lotSizeのコードを忘れてしまったので、init 関数の 中で使っています。 それは_lotSizeのための良い場所ですか?ありがとうございます。int OnInit(){ _pip = Point; if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point; _lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT ); //...} 1234567891011...43 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
{
...
return(NormalizeDouble(lots,2));
}
このコメントは本当に私に多くのことを助け、これは便利ですが、それは私に多くの小数を与える。
(私はすでにそれについて読んだので(より多くの小数点は正常です)。
私はまだ'NormalizeDouble'を心配し、私は別の方法を探しています。
ありがとうございます!このコメントは本当に私に多くのことを助ける。
コメントを書いてくださった方、ありがとうございました。
whroeder1- あなたのコメント(/リンク)を広く研究します大きな感謝。
Marco- LotSize LotStep問題の後に使用することにします。ありがとうございます。
このコメントは本当に私をたくさん助け、これは便利ですが、それは私に多くの小数点を与える。
(私はすでにそれについて読んだので(より多くの小数は正常です)。
私はまだ'NormalizeDouble'を心配し、私は別の方法を探しています、それは'NormalizeDouble'よりも優れている。
ありがとうございます。
おそらく、あなたが達成しようとしているものを正確に確立するのが最善でしょう。
もし、注文を出すのに有効なロットサイズを返す関数が 欲しいのであれば、NormalizeDouble() を使う必要はないでしょう。私のオリジナルコードやWHRoederのコードで実現できます。両者の間には微妙な違いがあり、それは個人の好みの問題でしょう。
しかし、ロットの値をそのままPrint()すると、0.070000000000001のような「奇妙な」結果が得られるかもしれません。
これはOrderSend()では問題にはなりませんが、あなたが期待するものとは異なるかもしれません。
もし、「普通の」方法で表示される数字を見たいのであれば、2つの選択肢があります。
1.関数内でNormalizeDouble() を使用することができます。標準的なプリントアウトの場合、期待通りの値が表示されます。しかし、(手動で)小数点以下の桁数を十分に印刷すると、やがてその数値が思った通りでないことがわかるでしょう。これがWHRoederの言わんとするところです(と私は思っています)。この解決策は最もエレガントなものではありませんが、最もシンプルなものです。あるいは...
2.ロットサイズをそのままにしておいて (つまりNormalizeDouble を使わないで)、 必要なときに表示用に値を調整することもできます。必要に応じて、DoubleToStr()、StringFormat()、printf()を使用して、これを実現することができます。これは、より柔軟なアプローチです。
実際の値とその表示方法は同じである必要はないことに注意しましょう。正確に0.07を格納することはできないのです。
printf("%.24f",myVal);
Result: 0.070000000000000006661338
おそらくそれはあなたが達成しようとしているものを正確に確立することが最善であろう。
...
わー、いいこと書いてますね、あなたのコメントのようにほとんど理解しています。
というわけで、近々、新しいコメントを書きますね。
//--- 2回目の編集
私が述べたように、私はLotSizeとLotStepが表示されているだけで正しい必要はありません、私はLotSizeとLotStepがどこでも同じことを示すことができる 必要があります。
ちょうど私はそれが心配です。
まあ、ダイナミックなロットサイズなら、シンプルなギアボックスでもいいんですけどね。
double Lots;
Balance=AccountInfoDouble(ACCOUNT_BALANCE);
if(Balance>10000)
{Lots=10;Print(" Gear Two");}
if(Balance>100000)
{Lots=100;Print(" Gear Three");}
if(Balance>1000000)
{Lots=1000;Print(" Gear Four");}
if(Balance>10000000)
{Lots=10000;Print(" Gear Five");}
if(Balance<10000000)
{Lots=1000;Print(" Gear Four");}
if(Balance<1000000)
{Lots=100;Print(" Gear Three");}
if(Balance<100000)
{Lots=10;Print(" Gear Two");}
if(Balance<10000)
{Lots=1;Print(" Gear One");}
if(Balance>1000000000)
{Lots=0;}
私はあなたと私のEAの一部を投稿する必要があるので、私はあなたがより明確に私を理解するのに役立つことを願っています。
それで、私はそれが良いコードか何かを知る必要がありますか?
良い(明確な)アドバイスやヘルプをお願いします、よろしくお願いします。
const long & lparam , // Parameter of type long event
const double & dparam , // Parameter of type double event
const string & sparam // Parameter of type string events
)
{
_lotCalc();
//-------Process Button---------------------------------------------------------|
if ( sparam == _btnLotMinus )
{
ObjectSetInteger( 0, _btnLotMinus, OBJPROP_STATE, false );
_lotSize -= _lotStep;
if ( NormalizeDouble( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
_calcUpdade( CALC_CHANGE_LOT );
Print( " | Lot: ", _lotSize );
return;
} //---if Close
// ...
}
double _lotCalc()
{
//---
_lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN );
_lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX );
_lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );
//---
return( NormalizeDouble( _lotSize, 2 ) );
}
私はあなたと私のEAの一部を投稿する必要があるので、私はあなたがより明確に私を理解するのに役立つことを願っています。
だから、私はそれが良いコードか何かを知る必要がありますか?
私に良い(明確に)アドバイスやヘルプを与えてください、事前に感謝します。
夜遅く、コンパイルされていない、テストされていない。
あなたが最初に _lotSize を設定した場所がわかりません... _lotSize が常に _lotStep の倍数であることを確認する必要があることを思い出してください。
OnChartEvent()と_lotCalc()の間で分割するのではなく、すべてのロット計算を一緒にしておくと、より良いものになると思います。min / max / stepをチェックし、インクリメント / デクリメントを行う関数を 1つ用意します。
const long & lparam , // Parameter of type long event
const double & dparam , // Parameter of type double event
const string & sparam // Parameter of type string events
)
{
_lotCalc();
//-------Process Button---------------------------------------------------------|
if ( sparam == _btnLotMinus )
{
ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
_lotSize = fmax(_lotMin, _lotSize-_lotStep);
_calcUpdade( CALC_CHANGE_LOT );
printf( " | Lot: %.2f ", _lotSize );
return;
} //---if Close
// ...
}
void _lotCalc()
{
//---
_lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN );
_lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX );
_lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );
//---
}
夜遅く、未パイル、未テストです。
ロットサイズ(_lotSize)を最初に設定した場所がわかりません。_lotSizeが常に_lotStepの倍数であることを確認する必要があります。
OnChartEvent()と_lotCalc()の間で分割するのではなく、すべてのロット計算を一緒にしておくと、より良いものになると思います。min / max / stepをチェックし、インクリメント / デクリメントを行う関数を1つ用意します。
それは私のlotSizeと losStepの 問題を解決したことを意味し、それは私がたくさん助けました。
本当にありがとうございます。
#Lot 0 (ゼロ) & (解決済みのLot SizeとLot Step問題の間)- Closed
そうそう、lotSizeのコードを忘れてしまったので、init 関数の 中で使っています。
それは_lotSizeのための良い場所ですか?
ありがとうございます。
{
_pip = Point;
if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point;
_lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT );
//...
}