KimIVの便利な機能 - ページ 96

 
KimIV >> :

何も加えなくても...。すでにラインに入っています。


ありがとうございました。

あなたのスレッドはネット上の宝物です。 見つけたら、もうたまりません。

 
KimIV >> :

何も加えなくても...。すでにラインに入っています。


イゴールさんや、このスレッドに定期的に書き込んでいる皆さんにお聞きしたいのですが。ブランチを閲覧しましたが、トレンドの角度を判定する機能が見つかりませんでした。 15分足チャートで6本以上のローソク足でトレンドの角度を判定する機能はありますか?
 

を引けるような機能はないのでしょうか?

プロファイル

テンプレート

???

 
mazepa писал(а)>>

イゴールさんや、このスレッドに定期的に書き込んでいる皆さんにお聞きしたいのですが。ブランチに目を通しましたが、トレンドの角度を判定する機能が見つかりませんでした。 15分足のローソク足6本以上でトレンドの角度を判定する機能はないでしょうか?

角度ではなく、価格の変化率で語ることができる

 

ごあいさつお疲れ様でした。

インジケーターを作っているのですが、EquationDirect関数でクロスポイントが正しく計算されないことがあります :(

私のチャートで線のポイントを計算し、わかりやすいようにテスト用インジケータで添付しました。この関数はオフセットがあると正しく交点を計算しません。つまり、ある角度では関数の計算式は適切ではなく、何らかの方法で修正する必要があるため、そうなると計算が別の計算式で行われることになります IMHO

#define CPR "DECIDE"
#define mName "Signal"

#property indicator_chart_window

extern int SignalBars=30;              // кол-во баров для сигнала
extern int TrendBars=300;              // кол-во баров для т. линий
extern color CostMaxColor=FireBrick;   // цвет максимальной цены
extern color CostMinColor=SteelBlue;   // цвет минимальной цены
extern color VLineColor=DarkSlateGray; // цвет минимальной цены
extern color TrendColor=Gray;          // цвет трендовых линий
extern color OrderColor=Green;         // цвет сигнала ордера
extern color LabelColor=Navy;          // цвет меток

// Инициализация - функция начальных установок
int init(){
   if(!IsDemo())return(0);
   if( SignalBars<30) SignalBars=30;
}

// ДеИнициализация - функция завершения работы
int deinit(){
   ObjectDelete("UpTrend");
   ObjectDelete("DownTrend");
   ObjectDelete("MaxCost");
   ObjectDelete("MinCost");
   ObjectDelete("SignOrder");
   ObjectDelete("Trend");
   ObjectDelete("Volume");
}

// СТАРТ - основная функция обработки
int start(){
   int bar;
   double val, upb, t1, t2, h1, h2;
   val=173;
   bar=iHighest(NULL,0,MODE_HIGH,100,0);
   t1=Time[0]-273600;
   h1=High[ bar];
   t2= t1-518400;
   h2=High[ bar]- val*Point;
   SetTLine( TrendColor,"DownTrend", t2, h2, t1, h1, True,STYLE_SOLID,2);
   upb= EquationDirect( t1, h1, t2, h2,Time[0]);
   SetArrow(6,DarkViolet,"UpBorder",Time[0], upb,2);
   SetVLine( VLineColor,"VLine",Time[0],STYLE_SOLID);
}

// --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---

// вертикальная временная линия
void SetVLine(color cl,string nm="",datetime t1=0,int st=0,int wd=1){
// Параметры:
// cl - цвет линии
// nm - наименование               ("" - время открытия текущего бара)
// t1 - время                      (0  - время открытия текущего бара)
// st - стиль линии                (0  - простая линия)
// wd - ширина линии               (1  - по умолчанию)

  if( nm=="") nm=DoubleToStr(Time[0],0);
  if( t1<=0) t1=Time[0];
  if(ObjectFind( nm)<0)ObjectCreate( nm,OBJ_VLINE,0,0,0);
  ObjectSet( nm, OBJPROP_TIME1, t1);
  ObjectSet( nm, OBJPROP_COLOR, cl);
  ObjectSet( nm, OBJPROP_STYLE, st);
  ObjectSet( nm, OBJPROP_WIDTH, wd);
}
// установка трендовой линии
void SetTLine(color cl,string nm="",datetime t1=0,double p1=0,datetime t2=0,double p2=0,bool ry= False,int st=0,int wd=1){
// Параметры:
// cl - цвет линии
// nm - наименование               (  ""  - время открытия текущего бара)
// t1 - время открытия бара        (  0   - Time[10]
// p1 - ценовой уровень            (  0   - Low[10])
// t2 - время открытия бара        (  0   - текущий бар)
// p2 - ценовой уровень            (  0   - Bid)
// ry - луч                        (False - по умолчанию)
// st - стиль линии                (  0   - простая линия)
// wd - ширина линии               (  1   - по умолчанию)

  if( nm=="") nm=DoubleToStr(Time[0],0);
  if( t1<=0) t1=Time[10];if( t2<=0) t2=Time[0];
  if( p1<=0) p1=Low[10];if( p2<=0) p2=Bid;
  if(ObjectFind( nm)<0)ObjectCreate( nm,OBJ_TREND,0,0,0,0,0);
  ObjectSet( nm, OBJPROP_TIME1, t1);
  ObjectSet( nm, OBJPROP_PRICE1, p1);
  ObjectSet( nm, OBJPROP_TIME2, t2);
  ObjectSet( nm, OBJPROP_PRICE2, p2);
  ObjectSet( nm, OBJPROP_COLOR, cl);
  ObjectSet( nm, OBJPROP_RAY, ry);
  ObjectSet( nm, OBJPROP_STYLE, st);
  ObjectSet( nm, OBJPROP_WIDTH, wd);
}
// вычисление точки пересечения
double EquationDirect(double x1,double y1,double x2,double y2,double x){
// Параметры:
// x1,y1 - координаты первой точки,
// x2,y2 - координаты второй точки,
// x     - значение, для которого вычислить Y

  if( x2== x1)return( y1);
  else
  return(NormalizeDouble(( y2- y1)/( x2- x1)*( x- x1)+ y1,Digits));
}
// установка значька
void SetArrow(int cd,color cl,string nm="",datetime t1=0,double p1=0,int sz=0){
// Параметры:
// cd - код значка
// cl - цвет значка
// nm - наименование               ("" - время открытия текущего бара)
// t1 - время открытия бара        (0  - текущий бар)
// p1 - ценовой уровень            (0  - Bid)
// sz - размер значка              (0  - по умолчанию)

  if( nm=="") nm=DoubleToStr(Time[0],0);
  if( t1<=0) t1=Time[0];if( p1<=0) p1=Bid;
  if(ObjectFind( nm)<0)ObjectCreate( nm,OBJ_ARROW,0,0,0);
  ObjectSet( nm, OBJPROP_TIME1, t1);
  ObjectSet( nm, OBJPROP_PRICE1, p1);
  ObjectSet( nm, OBJPROP_ARROWCODE, cd);
  ObjectSet( nm, OBJPROP_COLOR, cl);
  ObjectSet( nm, OBJPROP_WIDTH, sz);
}
 

スクリーンショット

オペラで追加、エクスプローラでは未追加

 
グラフに表示されている終了時間(左から)は、どのように判断すればよいのでしょうか。
 
DECIDE писал(а)>>
グラフに表示されている終了時間(左から)を判断するにはどうしたらよいですか?

TimeCurrent()

 
KimIV писал(а)>>

TimeCurrent()

これは右のようです。

 

もうわかったんだ。

EquationDirect関数のせいではなく、端末のバグのせいで、線がオフセットして描かれてしまう。

そのため、まずTime[0]でクロスポイントを決定し、初期ポイントからTime[0]でクロスポイントまでトレンドラインを引く必要がありましたが、この場合、すべてがうまく機能しました。

チャート上の一番右の時間は、シグナルスイッチのアイコンの位置決めに必要です(チャートスケールが 変更された場合)、つまり、スイッチアイコンを一番右の時間を超えて、つまりまだ到達していない状態で動かすとアイコンが切り替わります(発注のシグナルがオンまたはオフに切り替わり、シグナルを切り替えることでEAに取引を禁止または許可できることを意味します)

左側の時間は次のように決定されます:チャート上に見える一番外側のバーを取得します。

WindowFirstVisibleBar()で時間を取得する Time[WindowFirstVisibleBar()].