グラフィカルなオブジェクトを作成するにはどうしたらよいですか?MQL4です。 - ページ 2

 
barabashkakvn:
ポイントの日時がわかっている場合は、bool TrendCreate()を呼び出すだけでよい。

アドバイスありがとうございました。それよりも、もっと簡単なことがわかった。

私はこのようにしました。

#property strict
#property script_show_inputs

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  long   chart_ID=0;        // ID графика
  string name="TrendLine";  // имя линии
  int    sub_window=0;      // номер подокна
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим трендовую линию по заданным координатам
   if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,Time[41],1.0656,Time[65],1.0494))
     {
      Print(__FUNCTION__,
            ": не удалось создать линию тренда! Код ошибки = ",GetLastError());
      return;
     }
   
  }
//+------------------------------------------------------------------+

追伸:ひとつ理解できないのは、例の数字がなぜあのように選ばれているのかということです。

InpDate1=35;        
InpPrice1=60;        
InpDate2=65;        
InpPrice2=40; 

そこからトレンドラインはレンジの真ん中あたりを通る。

 
さて、次に解決すべき問題は、線を右に続けて、EAで線の値を得るにはどうしたらいいかということです。
 
forexman77:

...

それらから、トレンドラインをレンジの真ん中あたりに置く。

つまり、OBJ_TREND オブジェクトの 作成方法と操作方法を説明するための単なるスクリプトなのです。数値は説明のために撮影したものです。
 
forexman77:
さて、次に解決すべき問題は、線を右に続けて、EAで線の値を得るにはどうしたらいいかということです。

スクリプトコードには、そのすべてが詰まっています。

//+------------------------------------------------------------------+
//| Создает линию тренда по заданным координатам                     |
//+------------------------------------------------------------------+
bool TrendCreate(const long            chart_ID=0,        // ID графика
.
.
.
//--- включим (true) или отключим (false) режим продолжения отображения линии влево
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
.
.
.
 
barabashkakvn:

スクリプトコードには、そのすべてが詰まっています。

1.テスターから呼び出されると、トレードが開始されます。最適化を実行すると、いたるところにゼロがある。最適化の実行を開始すると、そこに案件が発生するのです。どうすればいいのか?

2.取引が発生した場合(各取引で)、行を保存し、発生しなかった場合は削除するようにするにはどうすればよいですか?

  long   chart_ID=0;        // ID графика
  string name="TrendLine";  // имя линии
  int    sub_window=0;      // номер подокна
  ObjectDelete(chart_ID,name);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим трендовую линию по заданным координатам
   if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,Time[minbar],Low[minbar],Time[IPMIN],Low[IPMIN]))
     {
      Print(__FUNCTION__,
            ": не удалось создать линию тренда! Код ошибки = ",GetLastError());
      return(0);
     }
    ObjectSet("TrendLine",OBJPROP_TIME1,Time[minbar]);
    ObjectSet("TrendLine",OBJPROP_PRICE1,Low[minbar]);
    ObjectSet("TrendLine",OBJPROP_TIME2,Time[IPMIN]);
    ObjectSet("TrendLine",OBJPROP_PRICE2,Low[IPMIN]);

   if (IPMIN!=0){ double uroven= ObjectGetValueByTime(chart_ID,name,Time[1],sub_window);}
   
}
Print("uroven=",uroven);
if (Time[0] > b && Close[1] < uroven){Opn_B=true;}
 
自分でトレードをコントロールする必要がある。しかし、各取引に独自の行を持たせるためには、行を作成する際にそれぞれの行に固有の名前を付ける必要があります。
 
barabashkakvn:
トレードは自分自身でコントロールする必要があります。しかし、各取引に独自の行を持たせるためには、行を作成する際にそれぞれの行に固有の名前を付ける必要があります。
どうやって?例を挙げていただけますか?
 
forexman77:
どうやって?例を挙げてみましょうか。
例を持っている人、助けてください。
 

テスト中のグラフィックオブジェクト

可視化テストでは、Expert Advisorは実際のチャートと対話します。通常のテストでは、視覚化せずに、Expert Advisor はレンダリングされない「仮想」チャートで動作します。この場合、いくつかの微妙な違いが生じる可能性があります。 テスターが最適化モードの場合、グラフィカルオブジェクトは サポートされません。

2日間の勉強で、最適化を実行するのは不可能だと判明。

インジケータを作るとどうだろう。Expert Advisorのライン値をこれを通して取得することはできますか?

誰が何を言わなければならないのか?もしかしたら、この問いをすでに研究している人がいるかもしれない。

 
forexman77:

...

インジケータを作れないかなぁ?それを通してEA内のラインの値を取得することができるでしょうか?

...

インジケータがグラフィカルオブジェクトを作成 し、そのパラメータを取得する場合、いいえ。

しかし、やはりインジケーターを使うことで全てを解決するのは簡単です。演算はインジケーター内で行われ、その結果はインジケーターバッファーを介して表示されます。

もうひとつの選択肢がある。行の代わりに行のパラメータでグローバル変数を作成しますが、その後、関数GetValueByShift()が動作しません、あなたはそのアナログを記述する必要があります。