特定の時間帯のローソク足の始値を取得します。

 

こんにちは、皆さん。

新しい質問があります。

例えば15:00になったとき、9:00のローソクの建値を 知りたいのです。

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
そこで、あらかじめ設定した時間帯のローソクの建値を取得するコードをどのように書けばよいのでしょうか?
 

時間をdatetime変数として計算し、それをiBarshift()で使ってバー番号を取得し、バー番号がわかったらそれをOpen[]またはiOpen()で使用します。

 
RaptorUK:

時間をdatetime変数として計算し、それをiBarshift()で使用してバー番号を取得します。バー番号がわかったら、それをOpen[]またはiOpen()で使用します。


うん、悪くないアイデアだね:)

ありがとうございます、使ってみます

 

とが可能です。

   int Bar;
   double OpenPrice;
   
   int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);


HeureSHは4時間分の配列サイズです。

それは特定の時間であればバーが異なっていなければならないので、4つの異なる行ではなく、1行だけを持っているスイッチを作成するものの。

ああ、それは正しいですか?コードが正しく書かれている?

 
Kane59:

とが可能です。


HeureSHは4時間分の配列サイズです。

それは特定の時間であればバーが異なっていなければならないので、4つの異なる行ではなく、1行だけを持っているスイッチを作成するものの。

ああ、それは正しいですか?コードが正しく書かれている?

私はあなたが2回ケース1を持って いるとして、コピー/貼り付けエラーがあると仮定します... ...ので、私は2番目のケース1がケース2でなければならないと仮定します

HeureSH[]配列に格納される値は、1, 2, 3, 4 のいずれかですが、これは正しいですか? int 型の値のみです。. .

iOpen()の呼び出しでは、Bは Bar であるべきだと思いますが、それともB(int)であることを意味しますか? その呼び出しで関数を 使用したい場合は、関数が正しい値を返すようにしなければなりません。


もしあなたが意味のある変数名や関数名を使えば、あなた自身にとっても、他の人にとっても、大きな利点になるでしょう。

 

あ、これは私のミスです。自分のコードをコピーしたのですが、何を書いたのかわかりません.........。で、解決しました。

iopenでは、Bと書いていますが、これはBarのことです。


そうそう、文字列の値が問題になるんですよね、それが問題だと思うので、変えてみます。

 
  int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);
これはうまくいきません。1) iBarShiftはBarに 割り当てられるが、iOpenはBを 使う。 2) StrToTime("23:00") は今日の23時の日付を返すが、これは常に未来(または現在のH1バー)である。
#define HR2400      86400           // 24 * 3600
datetime TimeOfDay(datetime when){  return( when % HR2400          );       }
datetime DateOfDay(datetime when){  return( when - TimeOfDay(when) );       }
  int B(k);
   {
    #define HR0900 23400    // 9*3600
    #define HR1500 54000
    #define HR1900 68400
    #define HR2300 59800
    int times[]={ HR2300, HR0900, HR1500, HR1900 };
    datetime    now = TimeCurrent(),
                Bod = DateOfDay(now),
                want= Bod + times[HeureSH[k]];
    if (want > now){    // Yesterdays?
        datetime prevTradingDate = iTime(Symbol(), PERIOD_D1, 1);
        want = prevTradingDate + times[HeureSH[k]];
    }
   int iBar= iBarShift(Symbol(), PERIOD_H1, want);
   OpenPrice= iOpen(Symbol(), PERIOD_H1, iBar);
   }
 

こんにちは、WHRoederです。

あなたのコードは、私のコードよりも効率的で、時間値が昨日か今日かを取得することができると思います。私のコードでは、23:00は常に未来か現在で、遅すぎるということになりますね。


ありがとうございました。まさに私が探していたものです。

 

こんにちは、WHRoeaderです。

参考までに。

ibarshiftはBarに、iOpenはBに割り当てられたと言いましたね。

しかし、関数 B(k)は、この関数は何ですか?

私のコードでは、私は文字列の時間(HeuresSH)の配列サイズと異なるStrToTimeの間の関係を望んでいたので、それを配置した。それはそう偽だった。


あなたは再びそれを使用して、なぜですか?

よろしくお願いします。)

 

そうそう、言い忘れましたが、HeureSH[]は4つの異なる時間を文字列で表した配列サイズです。

 

OK、あなたのコードを私のEAに挿入し、それは完璧に動作します。私が望んでいたようにEAが実行されるのを見たとき、私は微笑んだ!

本当にありがとうございます。

市場が閉じているため、バックテスト 中です。

しかし、問題があります。

EAが正しくポジションを開くが、買いは決して閉じられず、開いたときに即座に閉じて販売する。

私のストラテジーは

同時に、EAは、パラメータが真であれば、売りまたは買いを開かなければならない。SLやTPはありません。

そして同時に、次の関数が真であれば、ループしてすべてのトレードをクローズしなければなりません。

if(OrdersTotal()>0)
            { 
               for(int i=OrdersTotal()-1; i>=0; i--)
               {
                  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  {
                     if(OrderMagicNumber() == MagicSH && OrderOpenTime() > iTime(Symbol(), PERIOD_H1, 1))
                     {
                        if(OrderType() == OP_BUY)
                        {
                           OrderClose(OrderTicket(),LotsSH, bid, 300, CLR_NONE);
                        }
                        if(OrderType() == OP_SELL)
                        {
                           OrderClose(OrderTicket(),LotsSH, ask, 300, CLR_NONE);
私は利益フィルタを追加する必要がありますが、私はこれについて作業します。それがなければ、買いをクローズしなければなりませんが、クローズされることはなく、売りを実行させなければなりませんが、売りはすぐにクローズされます。最後のコードに間違いがあるのでしょうか?
理由: