double MinLot; // минимальный лот по символуdouble MaxLot; // максимальный лот по символуdouble LotStep; // шаг лота по символуint dig; // знаковость лота узнали из функции CountSignedDigitsdouble NL(double lot)
{
if (lot<=MinLot) return(MinLot); // проверка на минимальныйdouble d=MathFloor((lot-MinLot)/StepLot); // сколько ЦЕЛЫХ шагов умещается в проверяемом лоте
lot=MinLot+StepLot*d; // рассчитали по этому целому числу
lot=MathMin(lot, MaxLot); lot=NormalizeDouble(lot, dig);// не забыли проверить на максимальный// нормализовалиreturn(lot); // вернули
}
voidOnStart() {
Print(CountSignedDigits(110.0));
Print(CountSignedDigits(11.0));
Print(CountSignedDigits(1.1));
Print(CountSignedDigits(0.11));
Print(CountSignedDigits(0.011));
Print(CountSignedDigits(0.0011));
Print(CountSignedDigits(0.00011));
}
int CountSignedDigits(double x) {
for (int i = 0; i < 1000; i++, x *= 10)
if (x - MathFloor(x) < DBL_MIN * 2)
return i;
return -1;
}
結果
2011.07.0313:15:21 test (EURUSD,M5) 52011.07.0313:15:21 test (EURUSD,M5) 42011.07.0313:15:21 test (EURUSD,M5) 18 - Здесь только у меня бяка вылазиет?
2011.07.0313:15:21 test (EURUSD,M5) 22011.07.0313:15:21 test (EURUSD,M5) 12011.07.0313:15:21 test (EURUSD,M5) 02011.07.0313:15:21 test (EURUSD,M5) 0
次のオプション(CountSignedDigits関数も同じ)。
void OnStart() {
doublevalue = 110.0;
int count = 9;
while (count) {
Print(DoubleToString(value), " - ", CountSignedDigits(value));
value /= 10;
count--;
}
}
結果
2011.07.0313:23:32 test (EURUSD,M5) 0.00000110 - 22 - Почему-то здесь бяка...
2011.07.0313:23:32 test (EURUSD,M5) 0.00001100 - 21 -
2011.07.0313:23:32 test (EURUSD,M5) 0.00011000 - 52011.07.0313:23:32 test (EURUSD,M5) 0.00110000 - 42011.07.0313:23:32 test (EURUSD,M5) 0.01100000 - 3 - Здесь уже все нормально. Почему результаты разные?!
2011.07.0313:23:32 test (EURUSD,M5) 0.11000000 - 22011.07.0313:23:32 test (EURUSD,M5) 1.10000000 - 12011.07.0313:23:32 test (EURUSD,M5) 11.00000000 - 02011.07.0313:23:32 test (EURUSD,M5) 110.00000000 - 0
どなたか、ボリュームの 有効桁数を計算するコードを準備している方はいらっしゃいませんか?
SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)のようなもので、ボリュームにのみ対応。
例えば、SymbolInfoDouble( _Symbol,SYMBOL_VOLUME_STEP) = "1.0" の場合、答えは "0", "0.1" - "1", "0.01" となる。- "2 "など。
ニュアンスをはっきりさせましょう。0.1"、"0.01"、"0.001 "のようなボリュームステップの場合、私は持っています。
0.2"、"0.11"、"0.023 "など、次のような場合に動作するはずです。
音量に 特化したコードはありません。何にでもあります。
予告編で確認するための台本です。予告編で確認するための台本。
そういうことか...、と思いつつ、発注前に許容ロットを確認した方がいいのかなと思いました。
;)
彼が何を望んでいるのか、よくわからないんです。テレパシーを練習してるんだ;)
どなたか、ボリュームの有効桁数を計算するための既成のコードをお持ちの方はいらっしゃいませんか?
SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)のようなもので、ボリュームにのみ対応。
例えば、SymbolInfoDouble( _Symbol,SYMBOL_VOLUME_STEP) = "1.0" の場合、答えは "0", "0.1" - "1", "0.01" となる。- "2 "など。
ニュアンスをはっきりさせましょう。0.1"、"0.01"、"0.001 "のようなボリュームステップの場合、私は持っています。
0.2"、"0.11"、"0.023 "などの場合、コードが動作するはずです。
具体的にボリュームを出すのは、簡単なことです。
sergeev
MetaDriver
Valmars
よく練られた質問は、答えの半分です。:)すみません、もう寝てしまったので、課題を正確に説明することができませんでした。もう一度挑戦してみます。
取引注文に 正規化されたボリュームを 渡すという話です。
その対価をどうするかである。
価格の正常化......それは誰の目にも明らかだと思います。
私の時(MT4以降)は、MTの記事のどこかに、出来高も正規化するのが望ましいと書いてありました。
実装№2 です。実は、ブローカーの条件に従って、出来高の最小値を求めるために、GetVolumeDigits(string Symbol)という関数を書きました。少なくとも2つの実装がある(結果は同じ)。
実装その1。
どちらもmin step = 1.0, 0.1, 0.01, 0.001, などのバリエーションで完全に動作します。すなわち,最小ステップが1.0であれば0を,0.1であれば1を返す,という具合である。
例えば、最小ステップが1.1、0.11、0.011の場合はどうでしょうか。このアルゴリズムでは、最下位桁が誤って表示されます。
もちろん、「実際にはそのようなケースはない」と断言してもいい。Expert Advisorでそのような仮想的な可能性を考えるだけにしておきたい。もしかしたら、この件に関して、誰かが経験を共有してくれるかもしれないと思ったので...。
正規化された出来高を 取引注文に 送ることです。
Expert Advisorでこのような仮説の可能性を考えてみたいのです。
どの「仮説」ツールのことを言ってるんだろう?
1.MetaDriverからの バリアントが適しています。CountSignedDigitsは、任意のロットの文字数を表示します。
2.掘る 桁数がわかっていれば、次のように正規化することができます。
セルゲイエフ
ロット検証機能ありがとうございました。同じような構造・分岐のチェックを使っています。
私の質問は、ロットの中で最も若い場所を見つけること、それを正常化することに重点を置いています。
特に、MetaDriverは「すべて」に対する構築をあげています。:)しかし、欠点がないわけではありません(あるいは私のコンパイラが不具合を起こしている)。以下は、そのコードと実行結果です。
結果
次のオプション(CountSignedDigits関数も同じ)。
結果
OnStartの以下の行を変更しました。
結果
私のやり方が間違っているのか(修正してください)、MetaDriverが(アルゴリズムを設計 する際に)理論的に間違えたのか、どちらかです。
私の質問は、正規化するためにロットの中で最も低い場所を決定することに重点を置いています。
ロット変数に取引要求を出しても、ゴミ(小数点以下2桁)になり、端末自体で拒否されます。
少なくとも、このデザインを数年間使っていて、問題が起きたことはありません。
そして、再保険する場合は、小数点以下8桁まで正規化することができます(積立金あり)。「正しい」正規化の後にゴミが出れば、もっと遠くなります。