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

 
PolarSeaman:

申し訳ないが、なぜできないのか理解できない。

できますが、タイマーにはなりません。

if (IsTesting()) OnTimer();
 
PolarSeaman:

然様ダニが来なかったらどうする? ダニがいない状態で「スタート」する必要があります。

最初のティックは同期のためで、もし開始ティックが来なかった場合、市場は閉じ られ、そこですることは何もありません。

 

こんばんは!(^o^)

またまた、お願いすることになりました。

ある時間帯に1つの注文を開く必要があり、過去30分間にこのマジックを使ってすでに注文が開かれている場合は、注文を開く必要はありません。このように書くと

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

最初の部分だけ残すと、その30分間にストップ/テイクのポジションが閉じると、別のポジションが開いてしまうという問題があるのです。そこで、注文履歴に 入り、このマグで過去30分以内にすでに注文があった場合は、それを開けないようにする、という2番目の部分を追加しました。しかし、2番目の部分が何かおかしい、まだ開いてしまう。

アドバイスお願いします

 

秒単位でカウントする必要があります。

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

秒単位で数えなければならない。

残念ながらうまくいかなかった。

もう一度やってみましたが、これもダメでした。

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

残念ながら、うまくいかなかった。

もう一度やってみたが、これもダメだった。

なぜ全部の回線を比較しているのですか?タラスは正しく言った - 秒で数えなさい。彼のバージョンは、まだアカウント履歴に到達していないため、機能しませんでした。

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

これは、ワーキング・オーダーのサイクルである。履歴を見ると、次のようなループになる。

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

その場合、ループの中で注文の開始時間ではなく、注文の終了時間を取る必要があります。

 
Ihor Herasko:

なぜ全部の回線を比較しているのですか?タラスが秒単位で数えろと言ったのは正しかった。彼のバージョンは、あなたがアカウントの履歴に到達しなかったので、フィットしませんでした。

これは、ワーキングオーダーのサイクルです。履歴を見ると、次のようなループになる。

そして、ループの中で、注文のオープンタイム ではなく、クローズタイムを取る必要があります。


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

私の理解が正しければ、TimeToStrのこと、つまりテキストに変換したのでしょうか?

修正しましたが、やはり

テスター

すみません、私が完全にバカだったら。

 
YanSay:

私が正しく理解していれば、TimeToStr - すなわちテキストに変換されることを意味するのでしょうか?

修正されましたが、それでも

まったくもってバカですいません。

自分の状態を声に出して言ってみれば、何が起こっているのかがわかるはずです)。

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

前のインジケータ・バッファの値のいずれかに空の値が割り当てられた場合、その値はチャートから削除されるのでしょうか?

それとも、バッファに空の値が入って、チャートに描画されたままになるのでしょうか?

 
YanSay:

私が正しく理解していれば、TimeToStr - すなわちテキストに変換されることを意味するのでしょうか?

そうです。時間は 秒数なので、文字列に 変換する意味はありません。この数値は、文字列よりもはるかに簡単で、素早く作業できます。

修正されましたが、それでも

完全にバカだったらごめんなさい。

あるものを修正し、別のものをスポイルしている)

の代わりに第2部では

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

復活させる

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

前回の試行では、この行が正しく書かれていましたね。