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

 

初心者の方に質問です。

最近、ターミナルでMetaEditorが開かず、Expert Advisorやindicatorsで「変更」コマンドが効かないことがわかりました・・・・・・・。 よろしくお願いします。よろしくお願いします。

 
gnawingmarket:

初心者の方に質問です。

最近、ターミナルでMetaEditorが開かず、Expert Advisorやindicatorsで「変更」コマンドが効かないことがわかりました・・・・・・・。 よろしくお願いします。ありがとうございます。


それに答えてみる。

古いコードを修正することはできなくなった。

 
しかし、王子を戴くのですね。
 
tara:
少なくとも、あなたには王冠を戴く王子がいるのです。


何でも知っているんですね!?今日、誰が私をAdministratorにしたのかつかめず、パスワードも分からず、聞こうとも思わなかった!?明日、買ってきます!何してるんですか?

taraさん、ご参加ありがとうございました。ブロックの隣の人に全部復元してもらいました!コンピュータサイエンスの専門家!

 
Top2n:

はい、くだらない質問が多いのは理解しています。正直なところ、一日中試しているのですが、結果が出ません。

現在のバー上の複数のトレンドラインの価格値を配列に書き込んでいます。

オブジェクトが存在しない場合、配列から値を削除するにはどうすればよいですか?

artmedia70 です。

もし、毎ティックごとにトレンドラインの価格の値を調べ、配列を初期化し、次に必要なトレンドラインの価格を見つけるときにその次元を大きくすれば、削除したトレンドラインの値を配列から削除する必要がなくなります。この配列は動的なもので、tick毎に毎回、既存のオブジェクトの値のみを含むことになる。


?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
double MassTrendNumber(double &array[], string tip) // Поиск значения цены трендовой линии, текущего бара, запись в массив. Два массива: masS и masB
ArrayResize(array,ObjectsTotal(OBJ_TREND));

 for (int i = 0, limit = ArrayResize(array,ObjectsTotal(OBJ_TREND)); i < limit; i++) 

 {
 string DWnem=ObjectName(i); 
  string DW="downtrendline"+IntegerToString(i); // существует два названия трендовых линий, первое
  string DW2="uptrendline"+IntegerToString(i); // второе
if(tip="Sell")   //первый массив цен на селл
  if(DWnem=DW)//если имя равно "downtrendline"
   if(ObjectGet(DWnem,OBJPROP_COLOR)==Goldenrod || ObjectGet(DWnem,OBJPROP_COLOR)==Gainsboro || ObjectGet(DWnem,OBJPROP_COLOR)==White)
// Также существует три цвета
   array[i]=ObjectGetValueByShift(DWnem,1); //записываем
if(tip="Buy")   //второй массивцен на бай
 if(DWnem=DW2)
 if(ObjectGet(DWnem,OBJPROP_COLOR)==Goldenrod || ObjectGet(DWnem,OBJPROP_COLOR)==Gainsboro || ObjectGet(DWnem,OBJPROP_COLOR)==White)
  array[i]=ObjectGetValueByShift(DWnem,1);

  }   return;
   }

	          
 

終値から 0付近のオシレーターを別ウィンドウで作ろうとしているのですが、できません。どなたか既にやっておられるかもしれませんが、計算式を教えていただけませんか?

例えば、Close[i]の価格があり、この価格がMACD/CCIのようにゼロより上に行くか下に行くか、別のウィンドウで行う必要がありますが、できるだけ、MAのような追加の値なしでそれを行うことはできません。

または、0を回避する方法がない場合は、0.0...1.0の範囲で...

 
Top2n:

下のものは、検索方法が少し違います。

#property strict

/******************************************************************************/
bool AddValue(double &array[], const double value) {
  const int size = ArraySize(array);

  if (ArrayResize(array, size + 1) != size + 1) {
    return false; // Ошибка, значение не может быть добавлено к массиву
  }

  array[size] = value; //записываем
  return true; // Нет ошибки, значение добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValue(array, ObjectGetValueByShift(name, 1))) {
        return false; // Ошибка, значение найдено, но не может быть добавлено к массиву
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

/******************************************************************************/
bool MassTrendNumber(double &array[], const bool buy) { // Поиск значения цены трендовой линии, текущего бара, запись в массив. Два массива: masS и masB
  const string subname = (buy ? "uptrendline" : "downtrendline"); // существует два названия трендовых линий, первое и второе

  if (ArrayResize(array, 0) != 0) {
    return false; // Ошибка, массив не может быть заполнен достоверно
  }

  for (int i = 0, limit = ObjectsTotal(OBJ_TREND); i < limit; i++) {
    if (!AddValueIfFound(array, subname + IntegerToString(i))) {
      return false; // Ошибка, массив, если и заполнен, то недостоверно
    }
  }

  return true; // Нет ошибки, массив заполнен достоверно
}

/******************************************************************************/
void FillAndPrint(double &array[], const bool buy) {
  if (MassTrendNumber(array, buy)) {
    const int limit = ArraySize(array);

    Print("Найдено объектов: ", limit);

    for (int i = 0; i < limit; i++) {
      Print("Price[", i, "] = ", DoubleToStr(array[i], Digits));
    }
  } else {
    Print("Чёрт!");
  }
}

/******************************************************************************/
void OnStart() {
  double masS[];
  double masB[];

  Print("Sell:");
  FillAndPrint(masS, false);

  Print("Buy:");
  FillAndPrint(masB, true);
}

グラフに対応する名前をつけた2本の白いトレンドラインを追加すれば完成です。

04:14:34 Script 2 EURUSDm,H1: loaded successfully
04:14:34 2 EURUSDm,H1: initialized
04:14:34 2 EURUSDm,H1: Sell:
04:14:34 2 EURUSDm,H1: Найдено объектов: 1
04:14:34 2 EURUSDm,H1: Price[0] = 1.36268
04:14:34 2 EURUSDm,H1: Buy:
04:14:34 2 EURUSDm,H1: Найдено объектов: 1
04:14:34 2 EURUSDm,H1: Price[0] = 1.35668
04:14:34 2 EURUSDm,H1: uninit reason 0
04:14:34 Script 2 EURUSDm,H1: removed

何キロも続く関数を書くのではなく、プログラムを短い「フレーズ」、つまり「レンガ」に分割してください。小さな「レンガ」が大きな「レンガ」を作り、大きな「レンガ」がさらに大きな「レンガ」を作る。ほら、可能でしょう?

関数に渡すデータはすべてパラメータのみ。

呼び出される関数が失敗した場合のエラー処理を必ず行い、エラーを無視した場合の更なる処置は重大な結果をもたらします。プログラムクラッシュの大半は(一般的に)エラー処理がプログラム化されていないために発生します。

例えば、配列のサイズを 拡大するために呼び出したArrayResize()がエラーを返し、プログラマーがそれを確認せずに拡大したはずの配列を参照すると、後からMQL4プログラムが動かなくなるエラーが発生します。Expert Advisorは、例えば、オープンポジションを残して取引を停止します。すごいと思いませんか?

関数 MassTrendNumber()のループの前に「array[0] = 0;」を挿入し、配列オーバーランエラーの後にスクリプトが終了することを確認してみてください。

 
evillive:

終値から0付近のオシレーターを別ウィンドウで作ろうとしているのですが、できません。どなたか既にやっておられるかもしれませんが、計算式を教えていただけませんか?

例えば、Close[i]の価格があり、この価格がMACD/CCIのようにゼロより上に行くか下に行くか、別のウィンドウで行う必要がありますが、どんなに頑張っても、MAなどの追加値なしではできません:現在、iClose-iMAを引くと同様のものができますが、多分スムージングなしのバージョンがあるのでは?

または、0を回避する方法がない場合は、0.0...1.0の範囲で...


https://www.mql5.com/ru/code/9340
 

ああ、そんな感じですね。この世の中に新しいことは何もない )))
 
simpleton:

下の検索方法は少し違います。

2本の白いトレンドラインに対応する名前をつけて、チャートに追加すれば完成です。

何キロも続く関数を書くのではなく、プログラムを短い「フレーズ」-「レンガ」に分割してください。小さな「レンガ」が大きな「レンガ」を作り、大きな「レンガ」がさらに大きな「レンガ」を作る。ほら、可能でしょう?

関数には、すべてのデータをパラメータで渡すだけにしてください。

呼び出された関数が失敗した場合のエラー処理を必ず行ってください。エラーを無視した場合のその後の対応は、重大な結果を招きます。プログラムクラッシュの大半は(一般的に)エラー処理がプログラム化されていないために発生します。

例えば、配列のサイズを拡大するために呼び出したArrayResize()がエラーを返し、プログラマーがそれを確認せずに拡大したはずの配列を参照すると、後からMQL4プログラムが動かなくなるエラーが発生します。Expert Advisorは、例えば、オープンポジションを残して取引を停止します。素晴らしいことだと思いませんか?

MassTrendNumber()のループの前に「array[0] = 0;」を挿入し、配列オーバーランエラーの後にスクリプトが終了することを確認してみてください。


はい、本当にありがとうございます!なんて親切なんでしょう!とても分かりやすいです。Awesomeooo!!!