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

 
Youri Lazurenko:

一見、簡単そうに見える問題が解けない。チャートのどこかにMAが交差していた。横断歩道を渡った先でバーを見つける。そのバーから現在のバーまでの本数は どのように計算するのですか?

その特定のバーの番号。ダメ?
 
Youri Lazurenko:

一見、簡単そうに見える問題が解けない。チャートのどこかにMAが交差していた。横断歩道を渡った先でバーを見つける。このバーから現在のバーまでの本数を 計算するにはどうすればよいですか?


されるようです(少なくとも画面上のコメントは正しい)。バーの数」のおかげで、解決策が見つかったような気がします。iTime関数を使って、必要なバーのdatetimeを決定しています。スケッチはこのような感じです。

void OnTick()

{

int nBarsUp, nBarsDn;

datetime date_dn = iTime(NULL, 0, IntersectionDN())。

datetime date_up = iTime(NULL, 0, IntersectionUp());

datetime date_1 = iTime(NULL, 0, 1);

nBarsUp = Bars(Symbol(), 0, date_up, date_1)とする。

nBarsDn = Bars(Symbol(), 0, date_dn, date_1);

Comment("長い棒の本数:" + nBarsUp + "\n" + "短い棒の本数:" + nBarsUp + "\n")

"短いバーの数:" + nBarsDn);

}

//+------------------------------------------------------------------+

int IntersectionDN()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i))

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

return(i-1)です。

}

return(-1)です。

}

int IntersectionUp()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol()、0、5、0、MODE_EMA、PRICE_CLOSE、i) < iMA(Symbol()、0、21、0、MODE_EMA、PRICE_CLOSE、i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

return(i-1)です。

}

return(-1)です。

}

 
Youri Lazurenko:

うまくいったようだ(少なくとも画面のコメントは正しい)。バーの数」のおかげで、解決策が見つかったような気がします。iTime関数を使って、目的のバーのdatetimeを決定しました。スケッチはこのような感じです。

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

//+------------------------------------------------------------------+

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

ループの中でクロスオーバーを探しているのですね。そして、歴史に深く刻まれたゼロバーから。つまり、関数IntersectionXX()は棒グラフの番号を返すということですね。

これは何のため?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

ループの中でクロスオーバーを探しているのですね。そして、バーゼロからストーリーの底辺まで。そこで、IntersectionXX()は小節番号を返します。

これは何のため?


バー・ナンバーは、そうですね。しかし、私はバーの数を 知る必要があります - 履歴の深いこのバーからゼロバーまで。要するに、MAからのバーの傾きの角度が必要なんです。しかし、私の考えでは計算できないので(縦線に価格、横線にバーがある程度離れて配置されている-両者は相容れない値である)。昔々、フォーラムで、価格差をバーの本数で割った係数を導入してはどうかという意見がありました。その考え方は合理的だと思います。実践したいのですが、私自身はダミーなので、自分で何かを見つけて試行錯誤しています。

P.S. MQL4でコードを挿入する方法(あなたのような、私のようなものではない)?
 

この問題の対処法をご存知の方はいらっしゃいますか?


TF交換後、パネルがゆがむ

 
Youri Lazurenko:

バーの数、ですね。しかし、私はバーの数を 知る必要があります - この物語の後ろのいくつかのバーから第0のバーまで。要するに、MAから見たバーの角度が知りたいのです。しかし、計算できないので、(縦線に価格、横線にバーがある程度離れて配置され、相容れない値である)と思われます。昔々、フォーラムで、価格差をバーの本数で割った係数を導入してはどうかという意見がありました。その考え方は合理的だと思います。実践してみたいのですが、私自身はダミーなので、自分で何かを見つけて試行錯誤しています。

追伸:MQL4でコードを挿入する方法(私が持っている方法ではなく、あなたが持っている方法)?
これが10本目のバーだとすると、10本目と0本目のバーの違いはどうすればわかるのでしょうか?10-0=10
また、引き算は何のためにするのでしょうか?

 

こんにちは!2つのマイナス数qとwが等しいときにif演算子が一方が他方より大きいと思って しまう、間違った比較をして います。q=-0.0002でwも-0.0002のとき、res12=falseとなりますが、なぜでしょうか?

 

こんにちは!2つのマイナス数qとwが等しいときにif演算子が一方が他方より大きいと思って しまう、間違った比較をして います。q=-0.0002でwも-0.0002のとき、res12=falseとなりますが、なぜでしょうか?

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

こんにちは!2つのマイナス数qとwが等しいときにif演算子が一方が他方より大きいと思って しまう、間違った比較をして います。q=-0.0002でwも-0.0002のとき、res12=falseとなりますが、なぜでしょうか?


ノーマライゼーションが必要だと思うし、それこそノーマライゼーションがないとダブルス同士を比較することはできない。

if NormalizeDouble (q<=w)
 
Vyacheslav Kornev:

正規化しないと、両者のダブルの比較はできないので、正規化して終わりと思います。


ありがとうございます!うまくいったのですが、qとwを別々に正規化しました

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))