エラー、バグ、質問 - ページ 2020 1...201320142015201620172018201920202021202220232024202520262027...3185 新しいコメント fxsaber 2017.10.05 06:14 #20191 Kirill Belousov:OrderCalcMargin関数が証拠金計算時に始値を考慮しない件これはバグですか、それともそうすべきですか?もちろん、バグです。SDに書き込む。Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));この行はそのまま動作しますが、実行順序を推測する必要があるため、確認しました。この点については、こちらで 議論しています。 Kirill Belousov 2017.10.05 06:59 #20192 fxsaber:もちろん、バグです。SDに書き込む。この行は当然のように動作しますが、実行順序を推測する必要があるため、確認しました。この点については、こちらで 議論しています。Print()内の式の計算順序は、右から左の順です。なんとなく...今のところ...また、事前に確認しました :)MQL4/5のリファレンスに直接的な矛盾が あると、確信が持てない。MQL5 ReferenceLanguage FundamentalsFunctionsParameter Passing備考つまり、最後のパラメータが最初に計算されて渡され、次にその次のパラメータ が渡されるというように、パラメータは関数に逆順に 渡されることを覚えておいてください。開き括弧の後の最初のパラメータが計算され、最後に関数に渡されます。MQL5 リファレンス言語の基礎操作と式その他の操作引数x1, x2,..., xnを持つ関数呼び出し。各引数は、対応する型の定数、変数、式とすることができる。渡された引数はカンマで区切り、括弧で囲む必要があり、開始括弧は関数名の後になければならない。式の値は、関数が返す値である。関数の戻り値の型がvoidの場合、代入操作の右側に関数呼び出しを配置することはできません。なお、式x1,..., xnの順序は 保証 されている。今のところ、パラメータを逆順に渡すことに重点を置いています。 Alexey Viktorov 2017.10.05 07:01 #20193 Kirill Belousov:隣のスレッドでOrderCalcMarginに関する質問が出ていましたhttps://www.mql5.com/ru/forum/216697/page3テスト:異なる開始価格を 代入して、2種類の保証金計算方法を確認してみましょう。以下はLOGです。OrderCalcMargin関数は証拠金計算時に始値を考慮しないこれは、見積もり通貨の為替レートが関係しているようで、時間と始値を再計算する必要があります。提示通貨が米ドル(口座通貨も米ドル)の場合、計算される証拠金は始値によって変化します。GBPUSDのログバグなのか、そうであるべきなのか?特にAUDUSDとUSDJPYは計算に関与しており、その相場は計算時に一定であるため、おそらくそうなるはずです。そう思うと、確認したくなる...。MetaQuotes-Demo口座ではマーケット概要にGBPUSDが表示されていますが、ロボ口座では表示されていません...。 Kirill Belousov 2017.10.05 07:07 #20194 Alexey Viktorov:特にAUDUSDとUSDJPYは計算に関与しており、計算時に相場が変化しないため、そうなっているのでしょう。そう思うと、確認したくなる...。GBPUSDはMetaQuotes-Demoアカウントには存在するが、Roboアカウントには存在しない...。ただ、お伝えしたいのは、バグがあるということです。OrderCalcMarginの 計算でMargin=0とした場合の状況は既に再現しています。ただ、まだ投稿していないだけです。 fxsaber 2017.10.05 07:23 #20195 Alexey Viktorov:MetaQuotes-Demo口座ではマーケットウォッチにGBPUSDが表示されるが、Robo口座では表示されない...。Market Watch(一般的なシンボルリストと混同しないように)に存在する可能性が高いが、表示されていない。 Kirill Belousov 2017.10.05 07:33 #20196 Alexey Viktorov:特にAUDUSDとUSDJPYは計算に関与しており、計算時に相場が変化しないため、そうなっているのでしょう。そう思うと、確認したくなる...。MetaQuotes-Demo口座では、マーケット概要にGBPUSDが存在しますが、ロボ口座では存在しません...ここでテストです。#define TOSTRING(A) #A+" = "+(string)(A) void OnStart() { double margin_1=999,price_1; Print(TOSTRING(price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK))); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print(TOSTRING(price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID))); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print(TOSTRING(price_1=10.0)); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print(TOSTRING(price_1=1.0)); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1))); //выведем признак выбранности мажоров Print(TOSTRING(SymbolInfoInteger("GBPUSD",SYMBOL_SELECT))); Print(TOSTRING(SymbolInfoInteger("USDJPY",SYMBOL_SELECT))); Print(TOSTRING(SymbolInfoInteger("USDCAD",SYMBOL_SELECT))); Print(TOSTRING(SymbolInfoInteger("AUDUSD",SYMBOL_SELECT))); Print(TOSTRING(SymbolInfoInteger("NZDUSD",SYMBOL_SELECT))); Print(TOSTRING(SymbolInfoInteger("USDCHF",SYMBOL_SELECT))); Print(TOSTRING(SymbolInfoInteger("EURUSD",SYMBOL_SELECT))); for(int i=SymbolsTotal(false)-1;i>=0;i--) { //проверим для каждого символа брокера ситуацию, когда OrderCalcMargin()==true, а маржа=0 if(OrderCalcMargin(ORDER_TYPE_BUY,SymbolName(i,false),0.1,SymbolInfoDouble(SymbolName(i,false),SYMBOL_ASK),margin_1)==true && margin_1==0) { Print(TOSTRING(SymbolName(i,false))," ",TOSTRING(margin_1)," "); } } } // Альтернатива OrderCalcMargin bool MyOrderCalcMargin(const ENUM_ORDER_TYPE action,const string symbol,const double volume,const double price,double &margin) { double MarginInit,MarginMain; const bool Res=SymbolInfoMarginRate(symbol,action,MarginInit,MarginMain); margin=Res ? MarginInit*price*volume*SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE)/ (SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE)*AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0; return(Res); }1.MarketWatchでクロスを選択し、USDですべてを隠す。2) DSHBTCのシンボルを追加し、そのチャートを開きます。3.クローズ端子4) 端子を開ける5.DSHBTCのテストを開始します。以下はLOGです。JM 0 09:26:05.485 test (DSHBTC,H1) price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK) = 0.07183 QK 0 09:26:05.487 test (DSHBTC,H1) price_1= 0.07183 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true KO 0 09:26:05.487 test (DSHBTC,H1) price_1= 0.07183 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true QN 0 09:26:05.487 test (DSHBTC,H1) price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID) = 0.07079000000000001 NJ 0 09:26:05.487 test (DSHBTC,H1) price_1= 0.07079000000000001 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true HO 0 09:26:05.487 test (DSHBTC,H1) price_1= 0.07079000000000001 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true LL 0 09:26:05.487 test (DSHBTC,H1) price_1=10.0 = 10.0 EE 0 09:26:05.487 test (DSHBTC,H1) price_1= 10.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true QF 0 09:26:05.487 test (DSHBTC,H1) price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true HD 0 09:26:05.487 test (DSHBTC,H1) price_1=1.0 = 1.0 EN 0 09:26:05.487 test (DSHBTC,H1) price_1= 1.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true OM 0 09:26:05.487 test (DSHBTC,H1) price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true EN 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(GBPUSD,SYMBOL_SELECT) = 0 GI 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(USDJPY,SYMBOL_SELECT) = 0 DS 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(USDCAD,SYMBOL_SELECT) = 0 JL 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(AUDUSD,SYMBOL_SELECT) = 0 JF 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(NZDUSD,SYMBOL_SELECT) = 0 MQ 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(USDCHF,SYMBOL_SELECT) = 0 HK 0 09:26:05.487 test (DSHBTC,H1) SymbolInfoInteger(EURUSD,SYMBOL_SELECT) = 0 LH 0 09:26:05.488 test (DSHBTC,H1) SymbolName(i,false) = DSHBTC margin_1 = 0.0 RS 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = NZDJPY margin_1 = 0.0 FE 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = NZDCHF margin_1 = 0.0 QO 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = NZDCAD margin_1 = 0.0 RP 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = GBPNZD margin_1 = 0.0 JD 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = GBPCAD margin_1 = 0.0 CN 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = GBPJPY margin_1 = 0.0 KP 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = GBPCHF margin_1 = 0.0 JK 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = GBPAUD margin_1 = 0.0 QL 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = EURNZD margin_1 = 0.0 RG 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = EURJPY margin_1 = 0.0 RH 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = EURGBP margin_1 = 0.0 HS 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = EURCHF margin_1 = 0.0 CD 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = EURCAD margin_1 = 0.0 GO 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = EURAUD margin_1 = 0.0 QP 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = CHFJPY margin_1 = 0.0 JJ 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = CADJPY margin_1 = 0.0 JL 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = CADCHF margin_1 = 0.0 QF 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = AUDNZD margin_1 = 0.0 NI 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = AUDJPY margin_1 = 0.0 JS 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = AUDCHF margin_1 = 0.0 EF 0 09:26:05.489 test (DSHBTC,H1) SymbolName(i,false) = AUDCAD margin_1 = 0.0 全てのクロスはmargin=0を表示し、NO CROSS MAJORSが選択 されています。もう一度、DSHBTCでスクリプトを実行します。LOGHF 0 09:29:07.268 test (DSHBTC,H1) price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK) = 0.07185999999999999 IQ 0 09:29:07.268 test (DSHBTC,H1) price_1= 0.07185999999999999 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true KP 0 09:29:07.268 test (DSHBTC,H1) price_1= 0.07185999999999999 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true DE 0 09:29:07.269 test (DSHBTC,H1) price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID) = 0.07087 OQ 0 09:29:07.269 test (DSHBTC,H1) price_1= 0.07087 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true MQ 0 09:29:07.269 test (DSHBTC,H1) price_1= 0.07087 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true QP 0 09:29:07.269 test (DSHBTC,H1) price_1=10.0 = 10.0 HI 0 09:29:07.269 test (DSHBTC,H1) price_1= 10.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true LK 0 09:29:07.269 test (DSHBTC,H1) price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true MH 0 09:29:07.269 test (DSHBTC,H1) price_1=1.0 = 1.0 HR 0 09:29:07.269 test (DSHBTC,H1) price_1= 1.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true NP 0 09:29:07.269 test (DSHBTC,H1) price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true GR 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(GBPUSD,SYMBOL_SELECT) = 1 FM 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(USDJPY,SYMBOL_SELECT) = 0 JG 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(USDCAD,SYMBOL_SELECT) = 1 DP 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(AUDUSD,SYMBOL_SELECT) = 1 DJ 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(NZDUSD,SYMBOL_SELECT) = 1 OE 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(USDCHF,SYMBOL_SELECT) = 1 FO 0 09:29:07.269 test (DSHBTC,H1) SymbolInfoInteger(EURUSD,SYMBOL_SELECT) = 1 DD 0 09:29:07.269 test (DSHBTC,H1) SymbolName(i,false) = DSHBTC margin_1 = 0.0 大きな構成銘柄はありませんが、USDJPYのみ です。すべてのテストはMetaQuotesで行われました。 Alexey Viktorov 2017.10.05 07:46 #20197 fxsaber:マーケットウォッチ(一般的なシンボルリストと混同しないように)には存在するが、表示されていない可能性が高い。私たちは、同じことを別の方法で話している。 fxsaber 2017.10.05 07:49 #20198 Alexey Viktorov:私たちは、同じことを別の方法で話している。その通りです。Market Watchでは表示されないが、そこに ある。 fxsaber 2017.10.05 07:49 #20199 Kirill Belousov: for(int i=SymbolsTotal(false)-1;i>=0;i--) 調整する。 Kirill Belousov 2017.10.05 07:58 #20200 fxsaber: 直してください。完了!追伸:リザーブ解除を忘れていました :) 1...201320142015201620172018201920202021202220232024202520262027...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
OrderCalcMargin関数が証拠金計算時に始値を考慮しない件
これはバグですか、それともそうすべきですか?
もちろん、バグです。SDに書き込む。
この行はそのまま動作しますが、実行順序を推測する必要があるため、確認しました。この点については、こちらで 議論しています。
もちろん、バグです。SDに書き込む。
この行は当然のように動作しますが、実行順序を推測する必要があるため、確認しました。この点については、こちらで 議論しています。
Print()内の式の計算順序は、右から左の順です。なんとなく...今のところ...また、事前に確認しました :)
MQL4/5のリファレンスに直接的な矛盾が あると、確信が持てない。
MQL5 ReferenceLanguage FundamentalsFunctionsParameter Passing
備考
つまり、最後のパラメータが最初に計算されて渡され、次にその次のパラメータ が渡されるというように、パラメータは関数に逆順に 渡されることを覚えておいてください。開き括弧の後の最初のパラメータが計算され、最後に関数に渡されます。
MQL5 リファレンス言語の基礎操作と式その他の操作
引数x1, x2,..., xnを持つ関数呼び出し。
各引数は、対応する型の定数、変数、式とすることができる。渡された引数はカンマで区切り、括弧で囲む必要があり、開始括弧は関数名の後になければならない。
式の値は、関数が返す値である。関数の戻り値の型がvoidの場合、代入操作の右側に関数呼び出しを配置することはできません。なお、式x1,..., xnの順序は 保証 されている。
今のところ、パラメータを逆順に渡すことに重点を置いています。
隣のスレッドでOrderCalcMarginに関する質問が出ていましたhttps://www.mql5.com/ru/forum/216697/page3
テスト:異なる開始価格を 代入して、2種類の保証金計算方法を確認してみましょう。
以下はLOGです。
OrderCalcMargin関数は証拠金計算時に始値を考慮しない
これは、見積もり通貨の為替レートが関係しているようで、時間と始値を再計算する必要があります。
提示通貨が米ドル(口座通貨も米ドル)の場合、計算される証拠金は始値によって変化します。
GBPUSDのログ
バグなのか、そうであるべきなのか?
特にAUDUSDとUSDJPYは計算に関与しており、その相場は計算時に一定であるため、おそらくそうなるはずです。
そう思うと、確認したくなる...。MetaQuotes-Demo口座ではマーケット概要にGBPUSDが表示されていますが、ロボ口座では表示されていません...。
特にAUDUSDとUSDJPYは計算に関与しており、計算時に相場が変化しないため、そうなっているのでしょう。
そう思うと、確認したくなる...。GBPUSDはMetaQuotes-Demoアカウントには存在するが、Roboアカウントには存在しない...。
ただ、お伝えしたいのは、バグがあるということです。
OrderCalcMarginの 計算でMargin=0とした場合の状況は既に再現しています。
ただ、まだ投稿していないだけです。
MetaQuotes-Demo口座ではマーケットウォッチにGBPUSDが表示されるが、Robo口座では表示されない...。
Market Watch(一般的なシンボルリストと混同しないように)に存在する可能性が高いが、表示されていない。
特にAUDUSDとUSDJPYは計算に関与しており、計算時に相場が変化しないため、そうなっているのでしょう。
そう思うと、確認したくなる...。MetaQuotes-Demo口座では、マーケット概要にGBPUSDが存在しますが、ロボ口座では存在しません...
ここでテストです。
1.MarketWatchでクロスを選択し、USDですべてを隠す。
2) DSHBTCのシンボルを追加し、そのチャートを開きます。
3.クローズ端子
4) 端子を開ける
5.DSHBTCのテストを開始します。
以下はLOGです。
全てのクロスはmargin=0を表示し、NO CROSS MAJORSが選択 されています。
もう一度、DSHBTCでスクリプトを実行します。
LOG
大きな構成銘柄はありませんが、USDJPYのみ です。
すべてのテストはMetaQuotesで行われました。
マーケットウォッチ(一般的なシンボルリストと混同しないように)には存在するが、表示されていない可能性が高い。
私たちは、同じことを別の方法で話している。
私たちは、同じことを別の方法で話している。
その通りです。Market Watchでは表示されないが、そこに ある。
直してください。
完了!
追伸:リザーブ解除を忘れていました :)