/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Возвращает кол-во значимых цифр после запятой
вернёт 0 если число без значимой десятичной дробной части
вернёт -1 в случае ошибки во время разбора строки на массив
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/int GetDigits(double n)
{
ushort array[];
string st=(string)n; // явным образом формируем строку из числаint len=StringLen(st);
if(len<3) return(0); // число не может быть дробным если строка получилась меньше трёх символовif(StringToShortArray(st,array)!=len+1) return(-1); // разбираем строку на массив символовfor(int i=0;i<len;i++) if(array[i]=='.') return(len-i-1); // ищем в строке точку и если она есть, возвращаем кол-во символов от точки до конца строкиreturn(0);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Возвращает кол-во значимых цифр после запятой для чисел с точностью до 8 знаков
Вернёт 0 если число целое (в пределах 8 знаков после запятой)
Вернёт -1 в случае ошибки во время разбора строки на массив
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/int GetDigits(double n)
{
ushort array[];
if(StringToShortArray(StringFormat("%.8f",n),array)<10) return(-1); // число в строку и разбираем строку на массив символовint r=ArraySize(array)-2; // размер массива минус ноль-терминатор и минус нулевая база указателя for(;r>0 && array[r]=='0';r--); // ищем справа не нольfor(int l=0;l<=r;l++) if(array[l]=='.') return(r-l); // ищем слева точку и если она есть, возвращаем кол-во символов от точки до не нуля справаreturn(0);
}
アプリケーションは作成されたが、3日以上経っても誰も見ていない。
アプリケーションナンバーは何ですか?
ダブりの永遠のテーマ =)
開発者には、2つの標準機能の追加をお願いしています。
次のような仕様を提案します。
====
ラップ
この関数は、計測器の価格ステップにアライメントされる値を返します。
double Rp(
stringsymbol_name, // シンボル名
doublevalue// 調整する価格
);
パラメータ
シンボル名
[中】記号
価値
[in] 正の数です。
戻り値
取引 商品の価格ステップに丸められた最も近い数値 .
...
例
入力値です。
シンボル名 = ES-...
値 = 2000.55
出力=2000.50
(インストルメントESによる価格ステップ=0.25)。入力値です。
シンボル名 = SPX
値 = 2000.55
出力=2000.63
(SPXでは、ESと同様に価格の段階は0.25ですが、ベースオフセットがあり、気配値は以下の小数部分のみを持つことができます -- 13,38,63,88)
入力値です。
シンボル名 = RTS
値 = 82055,55
出力=82060
(RTS機器による価格ステップ=10)
...といった具合に。
さらに気になる2つ目の機能。
====
レヴュー
この関数は、楽器の音量ステップに合わせ、SYMBOL_VOLUME_MINから SYMBOL_VOLUME_MAXまでの範囲の値を返します。
double Rv(
stringsymbol_name, // シンボル名
doublevalue// 位置合わせするロット
);
パラメータ
シンボル名
[中】記号
価値
[in] 正の数です。
戻り値
取引 商品の数量ステップに切り上げられた最も近い数値 . SYMBOL_VOLUME_MAXより 大きく 、 SYMBOL_VOLUME_MINより 小さい数値には ならない。
...
======
私がこれらの関数に期待する主な特性は、世界中のすべての取引機器とあらゆる導入機器に対して有効であることです。
もし、どなたかすぐに解決できる方法をお持ちでしたら、開発者が行う限り共有してください。
まだないのが不思議 =/。
コメントから問題を解決するために、最も間抜けで不器用な関数を作りましたが、これでも多くの入力値で失敗しています。
ファンクションコードです。
要は、分数の有効部分を判断する手間を、演算子=(string)の代わりにコンパイラが挿入するメソッドに全部転嫁してしまったのがバカだったということです。
しかし、この方法では、printf() の g 型とほぼ同じ書式、つまり長い分数では科学的な書式で文字列が表示されることが判明したのです。
指数形式でなく、右の余分な桁もなく、手間なく=)任意のnの文字列に出力するにはどうしたらいいでしょうか?
また、もう一つの質問ですが、小数点以下は常にドットで区切られるのですか、それともシステム設定のデフォルトではコンマや他の何かで区切られるのですか?
コメントから問題を解決するために、最も間抜けで不器用な関数を作りましたが、これでも多くの入力値で失敗しています。
ファンクションコードです。
要は、分数の有効部分を判断する手間を、演算子=(string)の代わりにコンパイラが挿入するメソッドに全部転嫁してしまったのがバカだったということです。
しかし、この方法では、printf() の g 型とほぼ同じ書式、つまり長い分数では科学的な書式で文字列が表示されることが判明したのです。
指数形式でなく、右の余分な桁もなく、手間なく=)任意のnの文字列に出力するにはどうしたらいいでしょうか?
また、もう一つの質問ですが、小数点以下は常にドットで区切られるのですか、それともシステム設定のデフォルトではコンマや他の何かで区切られるのですか?
そして、Point()の何が気に入らないのか、Digits?
せめてDigitsLot() を用意し、ボリュームステップの精度を返すようにしてください。
もしかしたら、あなたのヒントがなかったかもしれません。Point()やDigits()で探しているものを得るための賢明な方法はないのでしょうか?
それでも、先に述べた2つの機能(価格とロットに対する有効なイコライザー)は本当に必要です。
FX厨は0.01刻みで出来高を受け付けることがほとんどで、明日どうなるかなんて誰も気にしないことは理解していますが、端末は発展途上ですからね。
ツールもどんどん増えています。全ロットの刻みを許さない自作デバイスは、もう使えない。最低ロット、例えば1/4がないなんて誰が言うんだ?バリエーションは多くない。
この解は絶対的(全ての値に対して)でなければ信頼できない。
そして、引用について。リクエストを送ると、サーバーは偶数でない価格を正規化(文字数で切る)するだけなら受け付けるが、それ以外の作業もある。
どんなシンボルでも本当の可能性のある見積もりを出せるようにするべきだが、トリミングしたものはダメだということに同意するのか。
コメントから問題を解決するために、最も間抜けで不器用な関数を作りましたが、これでも多くの入力値で失敗しています。
ファンクションコードです。
...純粋に数学的な問題のために、頑なに数字から文字列を作るなんて、そんな馬鹿なこと考えないでください。
最初は対数でやろうとしたんですが、もうどうしようもないくらい不具合になっちゃいました =(
自分を修正する。これなら大丈夫そうです。
純粋に数学的な問題で、数字から文字列を作るなんて、バカにしないでください。
最初は正直、対数でやろうとしたのですが、地獄のような不具合になってしまいました =(
念のため、NormalizeDouble()_Point _Digitsはいかがでしょうか?
なぜ、自転車を作るのですか?
念のため、NormalizeDouble() _Point _Digitsの何が問題なのでしょうか?
なぜ、自転車を作るのですか?
念のため、もう1度だけお答えします。NormalizeDouble() _Point _Digits」を使って、SYMBOL_VOLUME_STEPの 精度を調べる方法を教えてください。
また、任意の正の数からSYMBOL_VOLUME_STEPの倍数の値を得るにはどうしたらよいでしょうか。
次のような結果を得るには。
2000.55 (ESシンボル) -----> 2000.50
2000.55 (SPXシンボル) -----> 2000.63
1055.5555 (RTSシンボル) ------> 1060
今日(できれば明日)MT5ターミナルで利用可能な世界中のあらゆるシンボルに対して
"????????"
開発者が追加できる機能は2つだけで、端末の開発に合わせて修正することもできますし、さまざまな取引商品の特殊性をすべて知っているわけではありません。引用の存在さえもどこで確認できるのでしょうか?そして、NormalizeDouble()の結果ではなく、引用符が必要です。
このバイクが既に出ているのであれば-具体的な実装を突いてください、お願いします。自分がすでに見つけたものは、今、いくつかのシンボルでは使えない。
...
2000.55 (ESシンボル) -----> 2000.50
2000.55(シンボルSPX) -----> 2000.63
1055.5555(シンボルRTS) ------> 1060
...