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

 

EAは取引後、33本のバーで終了します。

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (Time[33]>t) 
          {                                      
          Cls_B=true;              
          }

実機でもテスターでも43本で終了しました。5本目のバーで終了パラメータを設定してみましたが、すべて正常です。このような場合、どのような問題が考えられますか?

 
Forexman77:

EAは取引後、33本のバーで終了します。

実機でもテスターでも43本で終了しました。5本目のバーで終了パラメータを設定してみましたが、すべて正常です。このような場合、どのような問題が考えられますか?


もしかしたら、if (条件)が 何度も実行され(例えば10バーでもう一回)、この実行によってライフタイムが遅れたのでは?

 
ALXIMIKS:


多分、if (条件) が何度も実行され (例えば 10 bar でもう一回) 、その実行によってライフタイムが遅れたのでしょう。

1トレード:エントリー15:37、エグジット16:19。41小節目で終了、より正確に言うと。
 
Forexman77:
1トレード:エントリー15:37、エグジット16:19。41本のバーで終了、が正しい。


また、iBarShiftに 置き換えた場合、エラーは残らないのでしょうかね?ヒストリーのバーが欠けているのでは(確かに穴はない?

条件が満たされた後に入力し、オープンバーを数え、時間を参照することは非常に正しくないので、それらのいくつかは、実際に開かれた参照してください。

 
ALXIMIKS:


iBarShiftに 置き換えたら、エラーは残るのかな?ヒストリーにスキップバーがあるのかも(確かに穴はない)?

条件が満たされた後、時間を参照することは正しくないと思われるので、オープンバー数を入力し、実際に何本のバーが開いているかを確認します。

このようなコードにすべきでしょうか?

static datetime t;
datetime s=Time[33]>t;

if (условие)
    {
      Opn_B = true; 
      t=Time[0];
      int shif= iBarShift(Symbol(),PERIOD_M1,t,false);
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),PERIOD_M1,s,false)) 
    {                                      
     Cls_B=true;              
    }

このようなコードはExpert Advisorをロックします。

 

こんにちは、最初の行だけでなく、各行のバーごとに1回アラートを通過させるのを手伝ってくれませんか。

時間によるアラート数を制限していますが、1バー分のバッファの作り方がわかりません

 datetime LastAlertTime = 0;
int start()
  {

  string namesymb=Symbol();
  string tf=Period();

       for(int i = ObjectsTotal()-1; i >= 0; i--)
      {
         string name = ObjectName(i);
         
         if(ObjectType(name) == OBJ_TREND)
         {
            double value = ObjectGetValueByShift(name, 0);                    
             if(Bid <= value + Point && Bid >= value - Point)          
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(namesymb,"  M",tf,"   ",name);
             }
                Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",tf,"   ",name); 
            } 
         }      
}
 
Forexman77:

EAは取引後、33本のバーで終了します。

実機でもテスターでも43本で終了しました。5本目のバーで終了パラメータを設定してみましたが、すべて正常です。どのような問題があると思われますか?


まずは頭をスッキリさせることから始めましょう。

フラグOpn_B = trueの 時間は、注文が同じ秒に開くとは限らないので 何の意味も持ちません。

注文のOrderOpenTimeの 開始時刻を使うこともできますし、開始が成功した後の時刻の値を変数tに代入することも可能です。

次ページ:使用したことがあるのは

minimum = iLow(Symbol(),Period(),0);

1)iLowは 必要ですか、それとも同じ通貨とタイムフレームを使うならLowだけの 方が良いのでしょうか?

2)Symbol()、 Period() の値は、繰り返し使用する場合は、変数に入れた方が良い。すべては性能に影響する-慣れろ

分足チャート - 1分間、1ティックがなかった場合 - 新しいバーは描画されません(トリックかもしれません)。

また、iBarShiftについてはどうでしょうか。

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),1,t,false)>33) 
          {                                      
          Cls_B=true;              
          }

現時点で最も適切なのは、次のようなものだと思われます。

if ((TimeCurrent-t)/60)>33) Cls_B=true;
 
oleksaz:

こんにちは、最初の行だけでなく、各行のバーごとに1回アラートを通過させるのを手伝ってくれませんか。

時間によるアラート数を制限していますが、1バー分のバッファリングがわかりません

string namesymb=Symbol();
string tf=Period();

変数を刻々と評価し直すことに意味があるのでしょうか?

文字列 tf = Period() は1000000ループ実行時のパフォーマンスに影響しますか、それとも inttf = Period()の方がより正しいですか? 自分でもよくわからない。

 if(Bid <= value + Point && Bid >= value - Point)  

この条件でよいのでしょうか?また、ループに4つのピークがある場合はどうでしょうか?

if (LastAlertTime < Time[0])
LastAlertTime = Time[0];
          

ここで、もう一つ問題があります。つまり、1行目の条件が成立すれば、2行目の条件は明らかに偽となり、アラートはポップアップされないのです。

ローソクの開始時刻が新しいローソクの到着によってのみ変更されるため、次のティックではポップアップさえしません。

 
ALXIMIKS:


現時点での最も適切な選択肢は、次のように思われます。


申し訳ありませんが、時間でバーの 数を計算しようとするのは、非常に不十分な方法です。
 
ALXIMIKS:

tick毎に変数を再コード化する意味があるのでしょうか?

文字列 tf = Period() は 1000000 回のループ実行でパフォーマンスに影響しますか それとも inttf = Period() の方が正しいですか? 自分でもよくわからない。

この条件でよいのでしょうか?また、ループに4つのピークがある場合はどうでしょうか?

ここで、もう一つ問題があります。つまり、1行目の条件が成立すれば、2行目の条件は明らかに偽となり、アラートはポップアップされないのです。

ローソクの開始時刻が新しいローソクの到着で変わるだけなので、次のティックでポップアップすることもありません。


int start()
  {
string scrdate,nametf;

        if (Period()==PERIOD_M1)  nametf="9_M1";
        if (Period()==PERIOD_M5)  nametf="8_M5";
        if (Period()==PERIOD_M15) nametf="7_M15";
        if (Period()==PERIOD_M30) nametf="6_M30";
        if (Period()==PERIOD_H1)  nametf="5_H1";
        if (Period()==PERIOD_H4)  nametf="4_H4";
        if (Period()==PERIOD_D1)  nametf="3_D1";
        if (Period()==PERIOD_W1)  nametf="2_W1";
        if (Period()==PERIOD_MN1) nametf="1_Monthly";
/////////////////  
       for(int i = ObjectsTotal()-1; i >= 0; i--)//мониторим все объекты
      {
         string name = ObjectName(i);//имя объектов берем из i переменной
         
         scrdate=StringConcatenate(Symbol()," ",TimeToStr(TimeCurrent(), TIME_DATE),"_",Hour(),".",Minute()," ",nametf," ",".jpg");//,name

         if(ObjectType(name) == OBJ_TREND)//отбираем тип по имени 
         {
            double value = ObjectGetValueByShift(name, 0);//функция для объектов
            
            Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",Period(),"   ",name);           
            
             if(Bid <= value + Point && Bid >= value - Point)
             
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(Symbol(),"  M",Period(),"   ",name);
               /////////////////////////////////////////////////
               WindowScreenShot(scrdate,1920,1200,0,-1,-1);
               ////////////////////////////////////////////////////////
             }               
            }
         }
}
   return(0);
  }

1.削除された

2.ギャップがシグナルでない(はず)なら、シグナルなし→価格なし→トレードなし、に同意します。

3.これは上で言ったことですが、どうしたらいいのか

PS 返信ありがとうございました。