MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1386

 
Mikhail Mishanin:

おかしいな)そんなはずはないのですが......。)

戦闘が終わった場合 - 通常のスプレッドで取引し、入力でその「限界」を取り出し、スプレッドが限界を超えている場合、取引を無視するだけです。

スプレッドはロールオーバーすることなくディリングで伸ばすことができます。

10単位から45単位まで、かなりのスプレッドの振れ幅があるのですが

45の 上映まで待たねばならない。

同時に、この機能は平均17をカウントしており、非常に満足のいくものです。

ロールオーバー後1時間は100-140まで上がるので、コードを実行して挙動を確認します。

 
Vitaly Muzichenko:

しかし、このように処方することも可能です。

正常に動作するはずです。

このロジックは好きではない。

この関数への最初の入力。

res = 0;

したがって、この条件

if(dt.hour==22 && res<_sp)

が満たされない。

そして、これ以上細かいことは言いたくない。いきなりですが、この条件ってなんですか?

   if(tc>LONG_MAX-1)
その理屈は理解できない。
 
Alexey Viktorov:

このロジックは好きではない。

この関数への最初の入力。

res = 0;

その結果、条件

if(dt.hour==22 && res<_sp)

が満たされていない。

そして、これ以上突っ込みたくもない。いきなりですが、この条件ってなんですか?

   if(tc>LONG_MAX-1)
その理屈は理解 できない。

1.この条件は、時間が22時間の場合、ロールオーバー後1時間のみです。しかし、これは初回起動時のみで、ターミナルは常にExpert Advisorで動作するため、一度だけ空になることになります。

タイムフレームの変更に備えて、静的であることも宣言すべきかもしれません。

2. if(tc>LONG_MAX-1) = longの許容値を超えた場合、変数 tcをゼロに する。週末など、端末が過負荷になることもあるので、そのようなことはまずないでしょう。

---

コードを変更、これは最終的なものでなければならない。

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. テストに出す

追記コードを修正 しました

----

P.S.S.S. ロールオーバー後、1時間時間を追加しました。そうしないと、一部のディーラーで非常に高いスプレッドが 発生します。

最終的に20時間かけて完成させたものです。

1日の平均スプレッドは10~45ppsですが、ほとんどの場合10~17ppsで、平均スプレッドは19と計算されています。

参加者の皆さん、ありがとうございました。

 
Vitaly Muzichenko:

タイムフレームの変更に備え、静的な宣言も必要かもしれません。

私はそれを理解し、それが動作しているように見える、私は「それはいけない」と撤回する)、今私は本当にゼロイング/割り当ての瞬間を理解する必要があります。

 

フォーラムで議論を見たことがあるが、見つからない。

いつでも開けることのできるバーの1ポジションに限定する必要がある、これは今のオプションだが、私の意見では「重い」。

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

これをどう置き換えれば、より軽くなるのか。

 
Vitaly Muzichenko:

フォーラムで議論を見たことがあるが、見つからない。

いつでも開けることのできるバーの1ポジションに限定する必要がある、これは今のところオプションだが、私の意見では「重い」。

これをどう置き換えれば、より簡単になるのか。

"いつ空くかわからないバーのポジションを1つに絞ること..."

一般的な表現ですが、このシンボルのバーで一度だけOrderSendを 送れるということでしょうか?

 
Mikhail Mishanin:

"いつ開かれるかわからないバーの上で、一つのポジションに限定しなければならない..."

表現が大雑把すぎるのですが、このシンボルでは1バーにつき1回OrderSendを 送れるということでしょうか?

エキスパートアドバイザーはH1タイムフレームで動作しており、10:17にポジションを開くことができますが、11:00より前、つまり現在のバーで別のポジションを開く必要はありません。

 
Vitaly Muzichenko:

このEAはH1フレームで動作しており、10:17にポジションを開くことができます。

うん、やはり、悪魔は細部に宿るものだと思う。

ポジションを開く- 「禁止フラグ」の設定、および/または「時間」の保存(比較のために同じ(ソース)である限り、どちらか一方でも構いません。)

新しいバーが開かれる -「禁止フラグ」が立てられる

質問:何らかの理由で立場が変わった場合はどうするのですか?

新しいバーを定義する例 - doTB divisor in seconds, for H1 it is 3600.0

BARii[].time - M1のバーの時間.

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

私の意見では、「悪魔は細部に宿る」、テキストであれば簡単に言えば、再び不完全な状態です。

ポジションを開いた- 「禁止フラグ」を設定し、および/または「時間」を保存する(比較のために同じ(ソース)である限り、どちらか一方でもかまいません)。

新しいバーが開かれる -「禁止フラグ」が立てられる

質問:何らかの理由で立場が変わった場合はどうするのですか?

新しいバーを定義する例 - doTB divisor in seconds, for H1 it is 3600.0

BARii[].time - M1の小節の時間,ただし,任意の分割数.

その時、フラグを使ったオプションでは満足できず、理由は覚えていませんが、これを

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

OK、別の実装を考えてみる

 
Vitaly Muzichenko:

当時、国旗のオプションに不満があり、理由は忘れましたが、それに替えて

なるほど、別の実装を考えてみます。

そして、この実装が何を阻んでいるのか。私のコードと同様に、1つの "バー "に2回、または異なる回数が決定されます。ちょうど私のバリアントで "異なる "バー "で、あなたのバリアントで "真 "のときに、ちょうど比較== "0 "とバイパス特に整数、WO、そして私はおそらく> 0.0 または > 0.9 に条件を変更できますが、考える必要がある...。