どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 640

 

同志の皆さん、こんにちは。

MT5には、「パルスエリオット波」と「修正エリオット波」という、とても便利で素晴らしいツールがあります。

問題は、MT5からこれらのツールをMT4に統合できるかということです。

MT4で取引しているので、MT5に移行して分析するのは不便です。

または:問題を解決するための他の方法は何か?

 
こんにちは、この言語にはMarketInfo(Symbol(),MODE_TICKVALUE)といったマーケットパラメータがあります。この値の算出方法を大まかに教えてください。
 
mql_writer:
こんにちは、この言語にはMarketInfo(Symbol(),MODE_TICKVALUE)といったマーケットパラメータがあります。この値の算出方法を一般論として教えてください。

1.00ロット時の入金通貨の最小価格変動(1pip)の値です!計算方法は簡単で、1.00(ロット)/1.36030(現在のユーロの相場)=0.7351(ユーロ)です。
 
borilunad:

1.00ロット時の入金通貨の最小価格変動(1pip)の値です!簡単に計算すると、1.00(ロット)/1.36030(現在のユーロの相場)=0.7351(ユーロ)です。

ただし、marketinfoでリクエストすると、なぜか円以外のペアで10が返ってくる ))))


この数式はどこから入手したのですか?

 
evillive:

ただし、marketinfoで検索すると、円以外のすべてのペアでなぜか10が返される ))))


この数式はどこから入手したのですか?


計算式は全部自分でやっているのですが、今度は自分のチャートから取ってみました。

そして、こちらはドキから。

mode_tickvalue を指定します。

16

預け入れ通貨におけるシンボル価格の最小変化 量の大きさ

計算結果は共有されません。

 
borilunad:


数式はすべて自分で作っていて、今は自分のチャートから取得しています。

そして、これはドックのものです。

MODE_TICKVALUE

16

預け入れ通貨における最小限の商品価格の変化の大きさ

計算結果は共有されません。


1ユーロドルロットの場合、1ピップは実質10ドルなので、OKですが。

そして計算は、見せることを恥じる人だけに見せるべきものではありません。

MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - ユーロの場合 クロスと円では 計算式が少し異なります。

 
Top2n:


正直なところ、どう塗ればいいのかがわからないんです。あと1ミリ、あと少しで完成というところでやめてしまうのはもったいない。

タスク、オブジェクト時間(第2パラメータ+3600秒>現在)||(第1パラメータ時間-第2パラメータ時間)<3600秒)の場合、配列に価格を書き込まない。

なぜエラーをエミュレートするのか?

エラーは、システムの制限や故障に関連する何らかの理由で、アルゴリズムが実行されず、何らかの(当然ながら制限された、しかし)保証のある結果を得ることができなかったことを知らせるものである。FillAndPrint()関数は、ちょうどエラーの状況が何を意味し、何を意味しないかを雄弁に物語る。エラーが発生した場合は、結果を印刷しようともしない。エラーがなければ、その結果は信頼できる。エラーあり/なし」というロジックは、そうやって構築されるべきなのです。

しかし、ここではアルゴリズムを変更する必要がある。追加のフィルターを適用する必要があるのだ。

それが、あるべき姿です。

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

まず、オブジェクトの種類とパラメータで「フィルタリング」を行い、利用可能なすべてのオブジェクトの中から必要なものだけを選択し、さらにフィルタを適用する。大体、人がやるような感じです。それが人というものでしょう?

このような小さなサブタスクの一つ一つに、別の機能が必要なのです。

数値は、例えば2倍する必要があり、この2倍がアルゴリズムの本質である場合など、非常に特殊な場合を除き、式の中に入れてはならない。そうすると、数字の2がそのまま式の中で使えるようになります。その他にも、そのような非常に稀なケースもあります。

その他の場合は、ニーモニックを使用する必要があります。第一に、その場で起きていることの理解を大きく深めることができるため、ミスをする確率を下げることができます。そして第二に、数値そのものが一箇所に設定されているため、必要に応じて変更することが容易であり、アルゴリズム内で繰り返し使用され、ニーモニックを使用せずにアルゴリズムの数箇所で数値を修正しなければならない場合に比べ、間違いが起こりにくくなることです。

実行の結果

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

オブジェクトは一つも見つかりません。両方のニーモニックの値を10回ずつ増やして36000(10時間)にし、再度実行します。

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

一つのトレンドは、すでにフィルタリングを「通過」している。ここで、最初のニーモニックの値を3600に戻し、実行します。

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

現在、両方のトレンドラインがフィルタリングを「通過」していることがわかります。ちなみに、このようなデバッグは、1つのブランチだけでなく、すべてのブランチ(部分)に対して行うことをお勧めします。

なんとなく形式的に理解できるように、このように説明してみます。プログラムというのは、どうやら計画のようです。

計画の各大項目は、より小さなサブ計画の項目に分解することができます。小さいものをさらに小さいものへ。最小のサブプランのポイントは直接実行されます。

各プラン、サブプラン、そして最小のサブプランのポイントまでもが、プログラムの中の機能に対応している。最小のサブプランの項目は、システム関数を呼び出すだけ、あるいは呼び出さない「エンド」関数に対応し、例えば、AddValue()やDiffInSecs()は上記の議論における例である。上のサブプランの項目は、下のサブプランの項目を実装する関数を 呼び出す関数に対応しています。上述したものでは、MassTrendNumber()、AddValueIfFound()、AddValueIfFiltered()がこれにあたります。また、「低レベル」の関数は「高レベル」の関数を呼び出してはならず、「高レベル」の関数は基本的に数レベル下にジャンプしてはならない、つまり、基本的に下のレベルの関数を呼び出すだけであるべきである。このルールは、"低レベル "の方が "高レベル "よりもはるかに厳しい。

このようなツリー構造で結ばれた(短い)関数として、誰が誰を呼ぶかという感覚で、プログラム中のアクションを整理して作ってみてください。

このプログラムは、1本の枝が何度も「枝分かれ」する「縮退木」になっています。そして、それは2つの小さな枝ではなく、1つの枝に「分岐」します。しかし、「高水準」の機能が「低水準」の機能を一貫して呼び出している点は、見て取れる。今回の修正では、この構造にもう1つのレベル、もう1つの「分岐していない枝」であるAddValueIfFiltered()を挿入しています。

 
スレッドを直ぐに見れなくてすみません。
https://www.mql5.com/ru/forum/152102 質問があるのですが
 
borilunad:

すべて正解です!4桁の気配値では常に1だったのが、5桁の気配値では10倍のpipsがある(しかも浅い)ので、10に なったのです。そして、min.tickの値は現在の価格から計算されるべきです!

私は今4桁の数字を持っていますが、ewardollarでは1ロットで1ポイントが10ドルで、ずっとそうでした。クロスの場合、コストは8~16になりますが、計算式はもう少し複雑です。

例えば、ユーロポンドの場合、marketinfoは16.984を返し、ポンドドルの為替レートは 1.6984、つまりユーロポンドの1ポイントは1ポンドの価値があり、ポンドドルのポイント値は常に10.0(100000 * 0.0001 = 10.0 または100000 * 0.00010 = 10.0 - 好きな方を選択)であることを掛け合わせています。


これらの計算はすべて、あなたの口座がドル建てである場合にのみ正しく行われます。

この場合、xUSD(EURUSD、GBPUSDなど)の場合、tickvalue = lot*point = 100000*0.0001 = 10.0となります。

USDx(USDCHF、USDJPYなど)の場合 tickvalue = lot*point/Bid = 100000*0.01/101.93 = 9.8107

xUSD/yUSD(EURGBP)の場合 tickvalue = Bid(yUSD)*lot*point = 1.6980*100000*0.0001 = 16.98となります。

クロス円xUSD/USDy(EURJPY)の場合 tickvalue = lot*point/Bid(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

ewoldollarで1ロット1ポイント10ドルで、今4桁持っていますが、いつもそうしています。クロスの場合、コストは8~16になりますが、計算式はもう少し複雑です。

例えば、ユーロポンドの場合、marketinfoは16.984、evodollarの為替レート=1.3604、ポンドドルの為替レート=1.6984を返します。つまり、ユーロポンドの1ピップは1ポンドの価値があり、これにポンドドルのポイント値(常に10.0(100000 * 0.0001 = 10.0 or 100000 * 0.00010 = 10.0 - 何でもよい)を乗じたものと見なされます。




私のはシンプルで実用的ですまた、4桁の相場があった当時は、まだプログラムを書いていなかったので、判断がつかないのです。:)

おやすみなさい!