MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1042

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin:
プログラミングが実質ゼロだと言うのなら、なぜそんな規格外の仕事を引き受けるのか、簡単なものから始めたらいいのでは?あるいは基礎知識を向上させる?やってもらうと楽なんですよ、ええ。

私は「インジケータを作ってくれ」とは書いていない。とお願いしました。mql4を完全にマスターしようとは思っていません。アイデアの確認をしているところです。もうエクセルで十分なんです)。

 
Oleg Bondarev:

私は「ハッカー」であると警告した)

その方法はこうだ。

これでティックチャートが描画されましたが、一部改行があります。

4でやってます。

折れ線はLabel1Buffer[ХХ]に値がないことを意味します。

そして2つ目は、上に書いたように、もう1度、インジケータ・バッファ(Label1Buffer) をターミナルで制御し、新しいバーを見れば、値はすべて自動的にシフトします - M1 でコードを実行し、観察してください。

ZS: ハッカーではなく、自分で学ぼうとしている人!))))

 
Igor Makanu:

折れ線はLabel1Buffer[XXX]に値がないことを意味します。

そして2つ目は、上に書いたように、もう1度、インジケータ・バッファLabel1Buffer)をターミナルで制御し、新しいバーが現れたら、値をすべて自動的にシフトさせるというものです - このコードをM1で実行し、観察してください

ZS: ハッカーではなく、自分で学ぼうとしている人!))))

Label1Buffer[XXX] - 3つの合成数という意味でしょうか?


 
Oleg Bondarev:

Label1Buffer[XXX] - これは3成分の数値でしょうか?


いや、最初に覚えていた文字を書いたんです。

がその項目の番号です。

あなたのコードを見ると、私のループと同じように、インジケーターバッファLabel1Bufferを 1要素ずつシフトしていますね。

で、 Label1Bufferの 内容をシフトした後、Label1Buffer[0]に新しい 値を代入します。

そして、他の要素にはどのような値が入るのでしょうか。最初は「空の値」(EMPTY_VALUE)が入っていますが、一度シフトして新しい値を割り当てる......。で、新しいバーが 表示されると、端末自身がLabel1Bufferの 全ての値をシフトさせます。


一般的に、あなたの知識のわずかなシフトがありますが、単にインジケータとバーの終値を描画しようとすると、ここでコードは次のとおりです。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  int i,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
 
聞いていますよ。考えないといけないですね。ありがとうございました。
 

Excelでデータを記録するには?- MQL5です。

Excel のファイル形式は xlsx ですが、FileOpen 機能は txt と csv ファイルを作成し、動作させます。


OnTesterでテストした後、各ティックのオープニングの瞬間に異なるデータの履歴を含むバッファからデータをアンロードし、1つのチャートにすべてのディールのデータを出力する必要があります。
そのため、「手動で転送する」というオプションは適切ではありません。


おすすめは?

 
Alexandr Sokolov:

Excelにデータを取り込むには?- MQL5です。

Excel のファイル形式は xlsx で、FileOpen 機能は txt と csv ファイルを作成し動作させます。


OnTesterでテストした後、各ティックでポジションがオープンされた瞬間の異なるデータの履歴を含むバッファからデータをアンロードし、1つのチャートにすべてのトレードデータを表示する必要があります。
そのため、「手動で転送する」というオプションは適切ではありません。


おすすめは?

さて、結論から言うと、MQL5を使ってExcelに直接書き込むことはできませんが、Excelの「データ」>>「テキストから」タブでテキストファイルからデータを取り込むことは可能です。

 
こんにちは、エクスプローラーテストを完了した後、失敗したオブジェクトに関するエラーが発生します。私が理解する限り、スタック内のすべてのオブジェクトを完全に作成しました、つまり、新規作成せずに。この問題について説明してください。
 
Alexandr Sokolov:

おすすめは?

.csvで書き出し、Excelで開く