[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 309

 
Zhunko ありがとうございます。 何事もブーメランで返ってくるので、良いこともあります。
 
artmedia70:
その通りです。グローバル変数Reasonは値を取得しますが、deinit()では取得せず、init()で取得することで、init()実行時に前回のdeinitializationの理由を確認し、値に基づいて特定のアクションを実行できるようにします。しかし、思うように動作しない。

その方法を教えていただきました。deinit()では、最後に非初期化を行った理由を調べ、グローバルに宣言された変数に渡します。 init()では、その変数の値をチェックし、最後に非初期化を行った理由を調べます。効果あり!!!

PS init()/deinit()は、関数内のステートメントで明示されていない限り、グローバルに宣言された変数の値を変更しないことを理解している人は、どうやら少ないようです。

実は、init()で注文をクローズしない方が良いのです。そこでは、MarketInfo()が期待通りに動作しないことが多い。

int    DeinitReason = 0; // определяем переменную на глобальном уровне
...
int init ()
{
...
      if ( DeinitReason == 3) // если смена таймфрейма
...
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
 
Mislaid:
その方法を教えていただきました。deinit()では、最後に非初期化を行った理由を調べ、グローバルに宣言された変数に渡します。 init()では、その変数の値をチェックし、最後に非初期化を行った理由を調べます。効果あり!!!
ArtyomがTF M5からの乗り換えで特に問題があることを認識。そこにエラーがあります。そうであるかどうかを確認する必要があります。MT4のバグかもしれませんね。
 
Zhunko:
この機能を使って何をするのかを提案しました。このような機能は、通常、歴史を通じて実行されます。

関数をループで動かすなんて、想像もつかない...。
 
hoz:

ループで実行されるような機能は考えられませんが...。

どういたしまして。
for(i=OrdersTotal()-1;i>=0;i--){
    Print(GetOrderInfo(i,OrderMagic,.....));// вызов пользовательской функции 
}

for(i=0;i<OrdersTotal();i++){/// вызов функции "ордерс тотал" на каждой итерации

}
 
Zhunko:
アルテムはM5 TFからの切り替えに問題があると実感しました。そこにエラーがあります。そうなのかどうか、確認したい。MT4のバグかもしれません。

いいえ、バグではありません。ここで、EAを紹介します。タイムフレームをM1からH1に変更しました。

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
19:20:02 111 CADJPY,M15:初期化されました。
19:20:09 111 CADJPY,M15: DeinitReason 3
19:20:09 111 CADJPY,M15: 初期化されました。
19:20:09 111 CADJPY,M15: uninit reason 3.
19:20:09 Supertrend[1] CADJPY,M15:初期化されました。
19:20:09 Supertrend[1] CADJPY,M15: uninit reason 3.
19:20:09 HLC CADJPY,M15: 初期化されました。
19:20:09 HLC CADJPY,M15: uninit reason 3.
19:20:09 AMA optimized1 CADJPY,M15: 初期化されました。
19:20:09 AMA optimized1 CADJPY,M15: uninit reason 3.
19:20:09 AMA optimized1 CADJPY,M15: 初期化されました。
19:20:09 AMA optimized1 CADJPY,M15: uninit reason 3.
19:20:09 Supertrend[1] CADJPY,H1:初期化されました。
19:20:09 HLC CADJPY,H1:初期化されました。
19:20:09 AMA optimized1 CADJPY,H1: 初期化されました。
19:20:09 AMA optimized1 CADJPY,H1: 初期化されました。
19:20:09 111 CADJPY,H1:初期化されました。
 
Mislaid:

いいえ、バグではありません。ここで、EAを紹介します。タイムフレームをM1からH1に変更しました。

それはいい!また、非初期化には いろいろと理由が あります。

ミスリード

実は、init()で注文をクローズしない方が良いのです。そこでは、MarketInfo()が期待通りに動作しないことがよくあります。

はい、できません。ヘルプに書いてあります。

hoz:

関数がループして実行されるなんて、想像もつかない...。
日常的なことです。
 
Zhunko:

それはいい!私も、非初期化の理由にはいろいろと縛りがありますから。

はい、できません。ヘルプに書いてあります。よくあることなんです。

ここで、最後のバリエーションを確認します。init()/deinit() がprint() と仲が悪いことがあるため、前のものはあまりうまくいきませんでした。

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
bool firststart = true;
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   firststart = true;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if ( firststart )
  {
      Print( "DeinitReason ", DeinitReason, " ", Period( ) );
      firststart = false;
  }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

関数をどう書けばいいんだろう、と。N本のローソク足 がある方向にロールバックしたときに、その本数を計算するというものです。BUT.そのためにはいくつかの条件があり、正確には時間をかけてリストアップしていくことになる。

例えばトレンドが下向きだとすると......プルバックは上昇する。5本のローソク足が上昇し、それぞれのローソク足が強気で、例えばそれぞれのローソク足のサイズがi_sizeOfCurrBarより 大きく、その他の条件があれば、継続して強気のバーの 数を出力して、関数から何らかの結果を返したい。

どのような書き方をすればいいのでしょうか?今のところ、書き始めて、棒グラフでループさせて、何とか履歴の深さで、固定された棒グラフの数ではなく、棒グラフで、条件によって興味のあるパラメータで表示を制限した方がいいということは理解しています。

これが、私が持っている、手に入れたものです。

int LastCandlesType()
{
   bool up,    // Свеча направлена вверх
        dn;    // Свеча направлена вниз
   int cnt;    // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-6; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром.
          continue;
      
      if (Close[i] > Open[i])                               // 
          up = true;

      cnt++;
   }
   if (cnt == 5)
       return (BULL_CANDLES);
}

現時点では、最後から2番目のバーからインデックス6のバーまで、つまり5本のバーを連続させているだけです。しかし、私はExpert Advisorに、強気なバーだけを検索させ、すべてのバーを連続させないようにしたいのです。どうすれば適切に実装できるのか?

サイズによるフィルタリングは、なんとなく正しくできていますね。

そして、すべてが書き込まれた後、カウンタはnht,etvsvbパラメータで連続したバーの数を計算し、そのようなバーが十分にあれば、関数の何らかの値が返されることになります。

 
Mislaid:

その方法を教えていただきました。deinit()では、最後に非初期化を行った理由を調べ、グローバルに宣言された変数に渡します。 init()では、その変数の値をチェックし、最後に非初期化を行った理由を調べます。効果あり!!!

PS init()/deinit()は、関数内のステートメントで明示されていない限り、グローバルに宣言された変数の値を変更しないことを理解している人は、どうやら少ないようです。

実は、init()で注文をクローズしない方が良いのです。そこでは、MarketInfo()が期待通りに動作しないことがよくあります。

また、init()のどこでポジションをクローズしているのでしょうか?削除依頼について1つ質問しましたが、どこで削除するのか......そんなことは言ってませんし、ましてや聞いてませんよ。なぜそう思うのですか?