mql4言語の特徴、微妙なニュアンスとテクニック - ページ 6

 
fxsaber:
MQL5と異なり、MQL4では静的配列は サイズを変更することができます。
常にではない

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MetaTrader 5 build 1595 プラットフォームの新バージョン:価格履歴へのアクセス

fxsaber さん 2017.05.01 16:36

#property strict

template <typename T>
struct ARRAY
{
  T Simple[100];
};

void OnStart()
{
  int ArraySimple[100];
  ARRAY<int> Array;

  Print(ArrayResize(Array.Simple, 10)); // MQL4: -1
  Print(ArrayResize(ArraySimple, 10));  // MQL4: 10
  
  Print(ArraySize(ArraySimple));        // MQL4: 10
  Print(ArraySize(Array.Simple));       // MQL4: 100
}
 

MT4ではTrailing Stopに常にバグがあります。上下の強い値動きの時に見ると。
を見ると、SLが上下に動いているのがわかります。小さな動きが、何倍にも大きくなる。
2017.05.22 10:53:38.563 '9898616': トレーリングストップ #1465775202 -> 1.29765
2017.05.2210:53:38.483'9898616': トレーリングストップ #1465775202 ->1.29764
2017.05.2210:53:33.236'9898616': トレーリングストップ #1465775202 ->1.29763
2017.05.2210:53:33.130'9898616': トレーリングストップ #1465775202 ->1.29764
2017.05.22 10:53:32.813 '9898616': トレーリングストップ #1465775202 -> 1.29762
SL = 2 (わかりやすくするために最後の一桁)のとき、次のティックで価格が上がり、端末がSLを4に上げる命令を出したので、それを取得しました。
次のティックでは下がりましたが、SLはまだ2のままです。端末はSLを3まで上げる命令を出す。
首の長いキリンのようなサーバーが、最初の注文を処理し、SLを4まで上げた。サーバーは2番目の注文を処理し、SLを3まで減少させた。
そのため、端末は意味のない注文を余分に送り、サーバーの負荷を高めてしまうのです。
また、SLが逆行することにより、トレーダーが不要な損失を被る危険性もある。
また、EAやスクリプトによる プログラムの末尾にも適用されます 一部、SLを3...5pips単位で移動させることで修正しています。

何をするのか最後のOrderModifyで発行されたSLの値を保存する。
そして、この値に基づいて次のオーダーを計算する。
サーバーへの注文が2つ減り、SLだけが前に進み、コンピューターのCPU負荷が減る、というような感じでしょうか。
2017.05.22 10:53:38.563 '9898616': トレーリングストップ #1465775202 -> 1.29765
2017.05.22 10:53:33.130 '9898616': トレーリングストップ #1465775202 ->1.29764
2017.05.22 10:53:32.813 '9898616': トレーリングストップ #1465775202 -> 1.29762

 

注文を修正する場合、以前のTP/SLと修正する新しい値を比較する必要があることがよくあります。もし、古い値で修正しようとすると、エラー#1が発生します。

USDJPY(桁数=2)の古いSL(100.03)と新しいSL(100.02)を比較する例で考えてみましょう。ヘルプに書いてあります

2つ目の方法は、2つの実数の差を正規化したものをゼロ値で比較する方法である。 正規化された数値の差をゼロと比較することは無意味です。正規化された数値を用いたいかなる数学的演算の結果も非正規化された数値になるからです。

つまり、このように比較する必要があるのです。

if(NormalizeDouble(100.03 - 100.02, Digits) != 0) // можно модифицировать

しかし、時にはブローカーが正規化されていない価格を提示することがあります。そして、例えば、100.02ではなく、100.025という価格が出ました。上記の方式で比較すると、差は0.01となり、修正可能であることがわかります。しかし、桁数100.025に正規化された修正に合格したため、実際には100.03を通過してしまい、その結果、エラー#1が発生することになります。

一般に、これまでの経験から、修正する桁数が等しい場合は、正規化した数値の差をゼロと比較した方が良いという結論に達しました(ヘルプでは推奨されていませんが)

確認するスクリプトです。

void OnStart()
{
  double a = 0.02;
  double b = 0.015;
  
  Print(" norm1 dif=", ND(a - b));            // результат = 0.01
  Print(" norm2 dif=", ND(a) - ND(b));        // результат = 0.0
}

double ND(double d) {return NormalizeDouble(d, 2);}
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
 
if(MathAbs(a-b)>=Point)
 
Yurij Kozhevnikov:
はい、できます。これはヘルプで最初に示された比較の方法です。私自身、ドキュメントで推奨されている2番目の方法を使って、実数正規化の罠にはまったことを指摘しただけです。
 
このトピックに関係のないコメントは、「受注サイクルの整理」に移動しました。
 

MT4のOrderProfit()とは異なり、OrderCommission()はセント単位に丸められないデータを格納します。


SZZ OrderPrint()において、手数料が丸められます(GUIと同様)。

 
fxsaber:

MT4のOrderProfit()とは異なり、OrderCommission()はセント単位に丸められないデータを格納します。


SZZ OrderPrint()において、手数料が丸められます(GUIと同様)。

そこで、OrderProfit()+OrderComission()+OrderSwap()の値を正しく取得するためにはどうしたらよいでしょうか。

 
Artyom Trishkin:

したがって、OrderProfit()+OrderComission()+OrderSwap()の値を正しく取得するには、どうしたらよいでしょうか?

何もない!これが最も正しい値です。この手数料のおかげで、GUIで表示される数字の合計と手数料の合計が1セント違っていることがわかるのです。

 
fxsaber:

何もない!これが最も正しい値です。この手数料のおかげで、GUIで表示される数字の合計と手数料の合計が1セント違っていることが確認できる。

では、まったく理解できない。OrderCommission()は、セントに丸められないデータを格納 する」とはどういう意味ですか?どこに丸みがあるのか?また、どのように丸めているのでしょうか?