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

 
Artyom Trishkin #:

ドブロロシア語でわかりやすく言うと

釣りをするんですね。

  1. 自宅のパントリーを開けて、頭をかいて閉じるんです。
  2. 釣りに行って、釣竿が必要なんですね。
  3. 釣竿を取りに物置に帰ります。
  4. 釣りに行って、釣竿を入れて魚を釣った、網が欲しい
  5. ネットのために物置に帰宅
  6. 釣りに行き、釣った魚を網で釣り針に浮かせ、釣った魚を保存するための容器が必要だったこと
  7. 帰って......のために。続けますか?

あるいは、パントリーから必要なものをそのまま取り出し(OnInit)、走り回らずに釣りをし、帰宅したらパントリーや冷蔵庫にすべて入れる(OnDeinit)ことも可能です。

この 掲示板でご存知の方も多いかもしれませんね。時には耳を傾けて、言われたことを聞くだけでいい。

そうでなければ、質問を受けて、答えを得て、「うそつき」と言って、思ったとおりに行動する。

まずはじっくりと考え、質問し、編集に取りかかることです。

プログラミングで最もシンプルなことは、コードを印刷することだということをご存知ですか?そして、開発の獅子奮迅の活躍はロジックの上で考えている。

とんでもない例えですね。その場合、すべての変数、クラスオブジェクトなどをグローバルにして、オンデマンドで作成しないようにしましょう。あるいは、グラフィカルオブジェクトは他のもの(確かに釣竿や網ではありません :)かもしれません。)?ですから、私のやり方は非常に合理的で正当なもので、ただmqlやメタトレーダーがしくじるだけです。

 
MakarFX #:
こうすることで、信号を見逃すことがない

私が鈍感なのか、それとも、オープンオーダーがあり、シグナルがあり、バーがすでに新しい場合は条件がないのか、どちらかです。

シグナルが1バー倍以上の長い場合は、バーの最初のティックでも動作します。

問題は、いつ注文を出すか、シグナルが出たときか、次のバーの最初のティックのときか、だけです。
 
Valeriy Yastremskiy #:

私が鈍感なのか、それとも、オープンオーダーがあり、シグナルがあり、バーがすでに新しい場合は条件がないのか、どちらかです。

シグナルが1バー倍以上の長い場合は、バーの最初のティックでも動作します。

唯一の問題は、いつ注文を出すか、シグナルが出た瞬間か、次のバーの最初のティックかです。
1つのバーにつき1つのオーダーを開けるようにお願いします
 
законопослушный гражданин Sleep() で解決しようかと思いましたが、Makarは処理を止めない方がいいと言いました。


これで、コードは次のようになります。

開く前に、このキャンドルにオープンポジションがあるかどうか確認してください。ない場合は、開封してください。

 
законопослушный гражданин #:

原則として、新規注文は、すでに開いているバーのティックで閉じるのが普通です。MakarFXとArtemの指摘は正しい。ですから、こうするのが正しいのでしょう。

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

原則として、新規注文は、すでに開いているバーのティックで閉じるのが普通です。MakarFXとArtemの指摘は正しい。したがって、正しいことはこうです。

Artemの言う通り、こうあるべきでしょう。

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

アルテムさんの言う通り、こうでなくっちゃね。

こちらも結果は同じでしょう。ただ、コードはより複雑になっています。同じコードを2つの関数で書くことになり、可読性も 悪くなります。 もっとも、誰でも好きなように、気持ちよく書いているのですが......。

 

いろいろあるんですよ。

オープンポジションには、オープンタイムがあります。オープン時間をローソク足の時間と比較することで、ポジションをオープン した時間がローソク足の内側かどうか(そしてこれが現在のローソク足であるかどうか)を調べることができます。

また、すべての例で必ず注文数を調べているのはなぜですか?そして、注文がゼロであれば、開封する。これでは、可能性が大きく狭まってしまいます。

一般的には、非常に狭い戦略の方向性に対してのみ、注文数/ポジション数を重視すべきです。

 
Mihail Matkovskij #:

ここでの結果は同じになります。コードだけがより分かりやすくなっています。同じコードを2つの関数で書くことになり、可読性も 悪くなります。 もっとも、誰でも好きなように、気持ちよく書いているのですが...。

あなたのコード

  if (time != cTime && nOrders == 0)
    time = cTime;

(バーが開いていて、注文が入っていない状態)

信号の確認 - 信号なし

...次のバーを待ちます。

前回と同じ失敗を繰り返した

追伸

これは

 time = cTime;
は、注文の開封後に実施される必要があります。
 
MakarFX #:

アルテムさんの言う通り、こんな感じでいいと思います。

あなたのコードでは、1つのポジションが開いている場合、別のポジションは逆の信号で開くことはありません。すなわち、まず、シグナルが入ったら、反対側のポジションがあるかどうかをチェックして、それを決済する必要があります。

しかし、やはりこれだけでは、戦略を改善する可能性が大きく狭まってしまいます。

注文の有無(特に4つ-保留中の注文(これは正しい)およびポジション(これは間違っている))に拘束されることは避けるべきです。

いや、種類別の注文数、ポジション数が手元にあるのは正しいし、必要だ。しかし、シグナルのみで注文がないことを当てにするのは間違っています。

一般的には、注文やポジションを数える機能(注文やポジションの数が変わると構造体を埋める機能が一つ)、ポジションを開く/閉じる機能、注文を設定する機能、アラーム機能などを持つのが正しい方法です。各種トロールの機能、指標からのデータ取得。プラス - ポジション(オープンまたはクローズ)のデータをいくつかの値で比較する機能。

このセットから、どんな戦略も構築できるのです。