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

 
DC2008:

double 型の 変数に == 条件を使用するのは正しくありません。このように比較することをお勧めします。


なお、遅ればせながら、「MQL4におけるdouble型数値 処理の特徴」という記事を作成しましたので、そちらもご参照ください。ここで述べたことは、実数(MQL5ではdoubleとfloat)を使った演算に関しては、どのプログラミング言語にも当てはまることです。
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

double 型の 変数に == 条件を使用するのは正しくありません。このように比較することをお勧めします。


極めて合理的であり、何よりも賢明なアプローチである。しかし、少なくとも最初の行はこうであるべきだったように思う。

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

ログには以下のメッセージが定期的に表示されます。

2010.06.15 14:48:09 MemoryException 4915200 bytes not available

どうしたらいいんだろう?

 
Prival:

ログには以下のメッセージが定期的に表示されます。

2010.06.15 14:48:09 MemoryException 4915200 bytes not available

どうしたらいいんだろう?

RAMが足りない。動的配列の サイズを確認してください。利用可能なメモリよりも多くのメモリを割り当てようとした可能性が高いです。
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

double 型の 変数に == 条件を使用するのは正しくありません。このように比較することをお勧めします。


質問の趣旨とは異なりますが、私の理解が正しければ、ユーザー関数の最後には必ずreturn演算子を置くべきでしょう
 
joo:
メモリが足りない。動的配列の サイズを確認してください。利用可能なメモリより多くのメモリを割り当てようとした可能性が高いです。
いいえ、そうではありません。 おそらくサーバーに問題があるのでしょう。何らかの作業が行われているのでしょう。 データに穴が開いている。 サーバーへの接続がよく切れる。 履歴がダウンロードされない。
 
sergey1294:
質問の趣旨とは異なりますが、私の理解が正しければ、演算子リターンは必ずユーザ関数の末尾に置かなければなりません

についての回答は本質的なものだったと思います。double型の 関数のどこかにreturn(...)があるはずなのです。必ずしも最後にとは限りません。if() return(); で == 演算子を使用すると、LotStep タイプが 0.100000000000001 の場合、誤った出力になることがあります。この場合、どのリターンも機能せず、関数は何も返しません。あなたの場合、returnはおそらくNormalizeDoubleの内部を好きではないのでしょうけど。動作するバージョンでは、最後を return(NormilizeDouble(lot,2)) に修正し、動作するかどうか確認してください。私自身も気になっています。

 
gpwr:

についての回答は本質的なものだったと思います。double型の 関数のどこかにreturn(...)があるはずなのです。必ずしも最後にとは限りません。if() return(); で == 演算子を使用すると、LotStep タイプが 0.100000000000001 の場合、誤った出力になることがあります。この場合、どのリターンも機能せず、関数は何も返しません。しかし、あなたの場合、returnはおそらくNormalizeDoubleの内部を好まないでしょう。動作するバージョンでは、最後を return(NormilizeDouble(lot,2)) に修正し、動作するかどうか確認してください。私自身も気になっています。

最後にreturn(...)があるはずですが、(If条件のいずれかがうまくいけば)そこに到達しないかもしれません...。
 
Interesting:
最後にreturn(...)があるはずですが、(If条件のいずれかがうまくいけば)来ないかもしれません...。
それこそ、4では最後に入れる必要はなかったのではと関心しました。
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
レナート

残高=100USD、必要証拠金=100EUR(119USD)の計算を忘れているのがミソです。

だから手術ができないのです。すべて正しいのです。

正しいマージン計算についての 質問に戻りたいと思います。私の計算でRenatが気づいたように、LotRqdMgn(1ロットの購入に必要な証拠金)は通貨の価格を考慮していません。このテーブルを見た記憶がある

識別子

商品説明

シンボルカルクモードFX

Forexモード - FXの利益とマージンの計算

マージン:ロット*契約サイズ/レバレッジ

利益:(クローズ価格-オープン価格)*契約サイズ*ロット数

シンボル_計算_モード_先物

先物モード - 先物の証拠金と利益を計算 します。

Margin: Lots *InitialMargin*Percentage/100

利益:(終値-始値)*TickPrice/TickSize*Lots

シンボルカルクモードCFD

CFDモード - CFDのマージンと利益の計算

マージン:ロット*契約サイズ*市場価格*百分率/100

利益:(クローズ価格-オープン価格)*契約サイズ*ロット数

シンボルカルクモードインデックス

CFDインデックスモード - インデックスによるCFDのマージンや利益の計算。

マージン:(ロット*契約サイズ*市場価格)*TickPrice/TickSize

利益:(クローズ価格-オープン価格)*契約サイズ*ロット

symbol_calc_mode_cfdleverage

CFDレバレッジモード - レバレッジ取引におけるCFDの証拠金と利益を計算します。

マージン:(ロット*契約サイズ*市場価格*比率)/レバレッジ

利益:(クローズ価格-オープン価格)*契約サイズ*ロット数

つまり、Lots*Contract_Size/Leverageではなく Price*Lots*Contract_Size/Leverageでなければならない、という誤りがあることが判明したのです。