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

 
Activict:

こんにちは。そんな疑問があります。

このインジケータは、他のExpert AdvisorやInductorのコードの断片を、私自身のニーズに合わせて苦労して再設計しました。大きなコードではないので、思い通りに動作します。

問題は、内部で何らかの計算を行い、チャート上に上下の矢印を表示することです。

チャート上に矢印が表示されたときに、正しい方向に注文を出すExpert Advisorの作り方を教えてください。

正確には、どの矢印が現在アクティブかを知るだけで、あとは自分でできると思います。

以下は、分かりやすくするためのコードの一部で、インジケータでの初期化です。

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

皆さん、よろしくお願いします。

Expert Advisorに必要なカスタムインジケータの 値を受け取るには、内蔵のiCustom機能を使用します。



double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

例えば、最後に完全に形成されたバー上に上向きや下向きの矢印があるかどうかを知る必要があります。


double Up=iCustom(NULL, 0, name/* название индикатора */, /* настраиваемые параметры индикатора через запятую */, 1, 1); // стрелка вверх
double Dw=iCustom(NULL, 0, name/* название индикатора */, /* настраиваемые параметры индикатора через запятую */, 2, 1); // стрелка вниз
 

返信ありがとうございましたそうですね、矢印が消えてしまうことがありますね。このメソッドは、矢印が消えたら "0 "を読むのでしょうか?

そして、矢印は、新興のバー上にのみ描画され、前のバーは、それが再描画されません、発生の瞬間にそれは取引を開く必要があり、それぞれ矢印が消えた場合は、閉じます。

 
プログラムコードを用いて、EAが通常よりも頻繁にサーバーにリクエストを送るようにする方法はありますか?だから、1つではなく2つの要求があるように、またはそのためにちょうどプログラムシェルを繰り返すことができます...。1回のリクエストではなく3回のリクエストなら、2回繰り返す・・・??
 
Activict:

そうですね、矢印が消えてしまうことがありますね。この方法をカスタマイズして、矢印が消えたら'0'と読むのでしょうか?

はい、そうなります。

アクティヴィクト

そして、矢印は、形成バー上にのみ描画され、前のバーは、それが再描画されません、発生の瞬間にそれは矢印が消えた場合は、位置を開き、それぞれする必要がありますその後閉じます

その結果、矢印が完全に形成されたバーのいずれかにある場合、矢印はもはや消えることはありません。矢印は、現在のバー上に何度も現れたり消えたりすることができます。
 
アクティヴィクト

спасибо за ответ! Да стрелки иногда пропадают. Этот способ через кастом будет считывать "0" если стрелка пропадет?

インジケーターのコードで "empty "と指定されている値は、iCustomで考慮されます。原則として、0 または EMPTY_VALUE とする。

インジケータではEMPTY_VALUEがデフォルトですが、init()にSetIndexEmptyValueを 入れると、また違った意味になります。

 
yellownight:
プログラムコードを用いて、EAが通常よりも頻繁にサーバーにリクエストを送るようにする方法はありますか?1つの要求の代わりに2つの要求があるように、またはそのためにちょうどプログラムシェルを繰り返すことができます ...1回のリクエストではなく3回のリクエストなら、2回繰り返す・・・??
これでは何の意味もありません。サーバーに大量のリクエストを送ると、あなたのアカウントが無効になることがあります。これは、「リクエストをやりすぎて」サーバーを「爆撃」してしまう人に起こることですね。
 

簡単なインジケータを書きました。以下はそのコードです。

//+------------------------------------------------------------------+
//|                                            AngleByLineFromMA.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string  h1 = "основные параметры машки";
extern int     maTF = 0;
extern int     maPeriod = 50;
extern int     maShiftByPrice = 0;
extern int     maMethod = 0;
extern int     maPrice = 0;
extern int     shiftBarsBack1 = 2;                       // Первое значение shift
extern int     shiftBarsBack2 = 7;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Другие переменные";
double         pointOfMaFirst,                           // Первая тока (начало отрисовки отрезка)
               pointOfMaLast,                            // Вторая тока отрезка (конец отрисовки отрезка)
               varsAngle[1000];                              // Буфер для хранения значение возвращаемых машкой

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//#property indicator_minimum -45
//#property indicator_maximum 45
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {
    ObjectsDeleteAll();                                  // Очистим график от всего
    
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
    int i, countedBars = IndicatorCounted();
    int limit = Bars - countedBars;
    if (limit > 400) limit = 400;
        
    for(i = limit;i > 1;i--)
    {
      pointOfMaFirst = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1+i);   // Начальная точка прямой
      pointOfMaLast = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2+i);     // Крайняя точка прямой
    
      varsAngle[i] = pointOfMaFirst - pointOfMaLast;
      Print("varsAngle[i] = ", varsAngle[i]);
    }

    return(0);
  }
バッファは1つしか入っていない。指標となる値はdouble 型である。

Expert Advisorでは、インジケータの値を取得して、フィルタとしてトレードに適用することにしました。

ここでは、最後に形成されたバーで、このインジケータのバッファの簡単な関数コールを書きました。

//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   
   return(slope);
}
テスターのスロープ 値が正しくない。
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647

なぜ?タイプは正しいです。通話も正しい。インジケーターは全く正常に動作しています。これはテスターからのログですが、実際の現在のマーケットからのログです。

2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001

なぜ、2147483647という 数字が常に返されるのですか?

 
hoz:

簡単なインジケータを書きました。以下はそのコードです。

バッファは1つだけです。指標となる数値はダブル タイプである。

Expert Advisorでは、インジケーターの値を取得し、フィルターとしてトレードに適用することにしました。

ここでは、最後に形成されたバーで、このインジケータのバッファの簡単な関数コールを書きました。

テスターで返されるスロープの 値が正しくない。

なぜ?タイプは正しいです。通話も正しい。インジケーターは全く正常に動作しています。テスターでのログ記録と、実際の現在の市場からのログをご紹介します。

なぜ、2147483647という 数字が常に返されるのですか?

作業開始時のテスターでは、インジケータを 正しく計算 するための十分なバーが履歴に残っていません。

//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   if(iBars(NULL, i_TF)<maPeriod) { Print("Недостаточно баров в истории для корректного расчёта значений индикатора!"); return(-1.0); }
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   
   return(slope);
}
 
//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   if(iBars(NULL, i_TF) < maPeriod)
   {
      Print("Недостаточно баров в истории для корректного расчёта значений индикатора!");
      return(0);
   }
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   Print ("iBars(NULL, i_TF) = ", iBars(NULL, i_TF));
   
   return(slope);
}

2007年からデューカスコピーからストーリーをダウンロードしたのですが・・・。バーが少ないわけがない。MA期は50のみ。

あなたの行を貼り付けましたが、return(0) ...を修正し、チャートのバーの 数の出力を追加しました。

このログで

2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647


 
hoz:

2007年からデューカスコピーからストーリーをダウンロードしたのですが・・・。バーが少ないわけがない。MA期は50のみ。

以下は、あなたの行ですが、return(0)を修正しました.

これがログに残っています。


インジケーターに問題があるようです

 if (limit > 400) limit = 400;