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

 
Top2n:

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

最も直接的かつ効率的な方法で、重要なスキルを徐々に身につけることができたら、かっこいいですよね。

そして、他の人が同じように恩恵を受けることができれば。

 

思いつきません)行があります そして、行が変わったかどうかを確認する方法は

 
ClanVi:

行があります。この行が変更されたかどうかを確認する方法は?



チャートイベント_オブジェクトの変更

プロパティダイアログでグラフィカルオブジェクトのプロパティを変更する

パラメータ "sparam "は変更されたオブジェクトの名称を返す。オブジェクトが自分のものであれば、そのオブジェクトにとって重要なプロパティを確認します。
 
barabashkakvn:


チャートイベント_オブジェクトの変更

プロパティダイアログによるグラフィカルオブジェクトのプロパティ変更

パラメータ "sparam "は、変更されたオブジェクトの名前を返す。もし、そのオブジェクトが自分のものであれば、自分のオブジェクトにとって重要なプロパティを確認します。

どのようにオブジェクトなしで、我々は価格がラインであることを知っている場合、我々はそれが変更されているかどうかを確認する必要があり、我々は価格を比較する必要があることは明らかである)。

如何いう

if(NormalizeDouble(Price,Digits)-NormalizeDouble(Price2,Digits)!=0)
Price2 = Price;

価格の指標を得るには2))

 
ClanVi:

どのようにオブジェクトなしで、我々は価格を知っていて、これはラインであり、それが変更されているかどうかを確認する必要がある、それはこの価格を比較する必要があることは明らかである私は方法がわからない)

如何いう

価格の指標を得るには2))


最後のバーの価格をPrice2とし、BidをOpen、Close、High、Lowの中から選択した価格と比較します。

中間値が欲しい場合は、ティック履歴を保存し、そこから前の価格を取得し、Bidは前のティックの価格と比較する必要があります。

また、価格の正規化とはどういう意味かというと、後で取引注文に 使う計算値を正規化する必要があるのですが、価格はすでに正規化されているのです。

 
evillive:

最後のバーの価格はPrice2です。

中間値が欲しい場合は、ティック履歴を保存して、そこから前の値を取る必要があります。

すべて把握しました :)

いいえ、私のバーでは使えません。

 
シグナルでは、著者が使用する最大リスクしか設定できないのですか?
 
simpleton:

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

#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))|| !FilTrenLin(subname+IntegerToString(i))) { \\ Вот куда вставил
      return false; // Ошибка, массив, если и заполнен, то недостоверно
    }
  }

  return true; // Нет ошибки, массив заполнен достоверно
}
/***************************************************************************/
 bool FilTrenLin(string name) {

const  string   dt_123 = TimeToStr(TimeCurrent(),TIME_SECONDS); //
const  datetime   vremnin= StrToTime(dt_123); // Присваиваем время в секундах 
  
    
const  datetime     vrem2kor= ObjectGet(name,OBJPROP_TIME2);// время второй координаты
    MqlDateTime str1;
    TimeToStruct(vrem2kor,str2);
const  int     PjatPon=str1.sec;

    if(PjatPon+3600>=vremnin){ \\ если время 2-ой координаты + час > времени нынешнего то блокируем запись в массив
   Print("  PjatPon  ", PjatPon,"  vremnin ",vremnin,"  vrem2kor ",vrem2kor);
        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("Чёрт!");   } }

生意気だと思わないでください、もうどう対処していいかわからないけど、どうしようも ないんです。アレイを作り上げれば、何もしないのと同じように信号をフィルタリングして、条件が打ち出されると思ったのです。

 
Top2n:

気にしないでください、もうどう対処していいかわからないくらいです、でも どうしようもないんです。配列を作れば、信号のフィルタリングをするのに条件がめんどくさいと思ったんです。

TimeCurrent()関数は オーバーロードされています。datetime型の 説明を読むと、最初の関数の最初のバリアントで済むことがわかります。

#property strict

/******************************************************************************/
long DiffInSecs(const datetime dt1, const datetime dt2) {
  return dt1 - dt2;
}

/******************************************************************************/
void OnStart() {
  const datetime dt = TimeCurrent();

  Sleep(5555);
  Print("Diff in secs = ", DiffInSecs(TimeCurrent(), dt));
}

そうなんです。

01:10:43 Script 2 EURUSDm,H1: loaded successfully
01:10:43 2 EURUSDm,H1: initialized
01:10:49 2 EURUSDm,H1: Diff in secs = 6
01:10:49 2 EURUSDm,H1: uninit reason 0
01:10:49 Script 2 EURUSDm,H1: removed

時間的な瞬間の差を得るためではなく、これらの瞬間を比較するために、反対側に行くことができます(同時に、再び条件式を使うことができます)。

#property strict

/******************************************************************************/
void test(const datetime dt) {
  Sleep(2000);
  Print("Момент времени dt ", TimeCurrent() < dt ? "НЕ " : "", "достигнут");
}

/******************************************************************************/
void OnStart() {
  const datetime dt1 = TimeCurrent();
  const datetime dt2 = dt1 + 5;

  test(dt2);
  test(dt2);
  test(dt2);
  test(dt2);
}

スタートアップは与える。

01:30:29 Script 2 EURUSDm,H1: loaded successfully
01:30:29 2 EURUSDm,H1: initialized
01:30:31 2 EURUSDm,H1: Момент времени dt НЕ достигнут
01:30:33 2 EURUSDm,H1: Момент времени dt НЕ достигнут
01:30:35 2 EURUSDm,H1: Момент времени dt достигнут
01:30:38 2 EURUSDm,H1: Момент времени dt достигнут
01:30:38 2 EURUSDm,H1: uninit reason 0
01:30:38 Script 2 EURUSDm,H1: removed

応用的な考え方の本質を理解し、日時型とは何かを覚えておけば、必要な精度が秒単位を超えない限り、時間の瞬間を扱うことは困難ではないでしょう。

 
simpleton:

TimeCurrent()関数は オーバーロードされています。datetime型とは 何かという説明を読めば、最初のバージョンの関数で問題ないことがわかると思います。

そうなんです。

時間モーメントの差を求めるのではなく、これらのモーメントを比較するために、他の方向にも行くことができます(同時に、再び条件式を使うことができます)。

ランニングは与える。

これまでの考え方を理解し、datetime型を意識すれば、必要な精度が秒単位を超えなければ、時間の中のポイントを扱うことは問題なくなるはずです。


正直なところ、どう塗ればいいのかがわからないんです。あと1ミリ、あと少しで完成というところでやめてしまうのはもったいない。

タスク、オブジェクト時間(第2パラメータ+3600秒>現在)||(第1パラメータ時間-第2パラメータ時間)<3600秒)の場合、配列に価格を書き込まない。

/******************************************************************************/
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+2; i++) {
    if (!AddValueIfFound(array, subname + IntegerToString(i))||!FilTrenLin(subname + IntegerToString(i)) {// Условие вставил вот сюда
      return false; // Ошибка, массив, если и заполнен, то недостоверно
    }
  }
 
  return true; // Нет ошибки, массив заполнен достоверно
}
/***************************************************************************/
 bool FilTrenLin(string name) {

 const  datetime    dt = TimeCurrent();
 const  datetime   dt1 = ObjectGet(name,OBJPROP_TIME1);
 const  datetime   dt2 = ObjectGet(name,OBJPROP_TIME2);
  Print("  DiffInSecs(dt,dt2)  ", DiffInSecs(dt,dt2),"  DiffInSecs(dt2,dt1))  ",DiffInSecs(dt2,dt1),"  dt1  ",dt1);
  
     if(DiffInSecs(dt,dt2)<3600||DiffInSecs(dt2,dt1)<3600)// Если время объекта второго параметра + 3600 сек > текущего времени,
 или если разница первого и второго   параметра времени объекта < 3600 сек, то запускаем ошибку, чтоб цена не записалась в массив.
     {   return false;
     }  
   return true;
} 
/******************************************************************************/
long DiffInSecs(const datetime dt1, const datetime dt2) {
  return dt1 - dt2;
}