コンパイルできるけどチャートに描画しない デバックもできない

 

主題の通りです。どすすれば解決できるでしょうか、教えていただけると幸いです。

以下にコードを張り付けておきます。よろしくお願いします。

//+------------------------------------------------------------------+

//|                                                   Snake_alfa.mq5 |

//|                                  Copyright 2022, MetaQuotes Ltd. |

//|                                              https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

#property indicator_chart_window


#property indicator_buffers 2

#property indicator_plots 1

#property indicator_type1 DRAW_LINE

#property indicator_color1 clrWhite


//パラメーター

input int Snake_HalfCycle = 7;    // Snake_HalfCycle

input int InpBars         = 1000; // Custom_Bars


//バッファ

double Snake_Buffer[];

double TempBuffer[];


//変数

double Snake_Sum, Snake_Weight, Snake_Sum_Minus, Snake_Sum_Plus;

int Snake_FullCycle;

int cnt = 0, cnt_lim = 8;


//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int draw_begin;


int OnInit()

{

   // バッファの設定

   SetIndexBuffer(0, Snake_Buffer, INDICATOR_DATA);

   SetIndexBuffer(1, TempBuffer, INDICATOR_CALCULATIONS);

   

   // バッファ初期化

   ArrayInitialize(Snake_Buffer, EMPTY_VALUE);

   ArrayInitialize(TempBuffer, EMPTY_VALUE);


   // その他の設定

   Snake_FullCycle = Snake_HalfCycle * 2 + 1;

   draw_begin = Snake_FullCycle + 1;


   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, draw_begin);

   PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);

   PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);


   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 FirstPos, ExtCountedBars = 0;


   if(rates_total <= Snake_HalfCycle) return(0);


   ExtCountedBars = prev_calculated;


   if (ExtCountedBars < 0) return(-1);

   if (ExtCountedBars > 0) ExtCountedBars--;

   FirstPos = rates_total - ExtCountedBars - 1;


   if(FirstPos > rates_total - Snake_HalfCycle - 1)

   {

      FirstPos = rates_total - Snake_HalfCycle - 1;

   }


   // Snake計算関数を呼び出し

   Snake(FirstPos, rates_total, close, high, low);


   // 表示削除処理の修正

   for(int i = 0; i < rates_total - InpBars; i++)

   {

      Snake_Buffer[i] = EMPTY_VALUE;

   }


   return(rates_total);

}


//+------------------------------------------------------------------+

//| Snake 計算ロジック                                              |

//+------------------------------------------------------------------+

void Snake(int Pos, int rates_total, const double &close_array[], const double &high_array[], const double &low_array[])

{

   // グローバル変数のリセット

   Snake_Sum = 0;

   Snake_Weight = 0;

   Snake_Sum_Minus = 0;

   Snake_Sum_Plus = 0;


   if(Pos <= Snake_HalfCycle + 1)

   {

      Pos = Snake_HalfCycle + 2;

   }


   for(int i = Pos; i >= 0; i--)

   {

      // リセット

      Snake_Sum = 0;

      Snake_Weight = 0;

      Snake_Sum_Minus = 0;

      Snake_Sum_Plus = 0;


      Snake_Buffer[i] = SnakeFirstCalc(i, close_array, high_array, low_array);

   }

}


//+------------------------------------------------------------------+

//| Snake価格取得                                                   |

//+------------------------------------------------------------------+

double SnakePrice(int Shift, const double &close_array[], const double &high_array[], const double &low_array[])

  {

   return ((2 * close_array[Shift] + high_array[Shift] + low_array[Shift]) / 4);

  }


//+------------------------------------------------------------------+

//| Snakeの最初の計算                                                |

//+------------------------------------------------------------------+

double SnakeFirstCalc(int Shift, const double &close_array[], const double &high_array[], const double &low_array[])

  {

   int i, j, w;


   if(Shift < Snake_HalfCycle)

     {

      i = 0;

      w = Shift + Snake_HalfCycle;


      while(w >= Shift)

        {

         i++;

         Snake_Sum += i * SnakePrice(w, close_array, high_array, low_array);

         Snake_Weight += i;

         w--;

        }

      while(w >= 0)

        {

         i--;

         Snake_Sum += i * SnakePrice(w, close_array, high_array, low_array);

         Snake_Weight += i;

         w--;

        }

     }

   else

     {

      for(j = Shift - Snake_HalfCycle, i = Shift + Snake_HalfCycle, w = 1; w <= Snake_HalfCycle; j++, i--, w++)

        {

         Snake_Sum += w * (SnakePrice(i, close_array, high_array, low_array) + SnakePrice(j, close_array, high_array, low_array));

         Snake_Weight += 2 * w;

         Snake_Sum_Minus += SnakePrice(i, close_array, high_array, low_array);

         Snake_Sum_Plus += SnakePrice(j, close_array, high_array, low_array);

        }

      Snake_Sum += (Snake_HalfCycle + 1) * SnakePrice(Shift, close_array, high_array, low_array);

      Snake_Weight += Snake_HalfCycle + 1;

      Snake_Sum_Minus += SnakePrice(Shift, close_array, high_array, low_array);

     }

   return Snake_Sum / Snake_Weight;

  }


//+------------------------------------------------------------------+

//| Snakeの次の計算                                                  |

//+------------------------------------------------------------------+

double SnakeNextCalc(int Shift, const double &close_array[], const double &high_array[], const double &low_array[])

  {

   Snake_Sum_Plus += SnakePrice(Shift - Snake_HalfCycle, close_array, high_array, low_array);

   Snake_Sum = Snake_Sum - Snake_Sum_Minus + Snake_Sum_Plus;

   Snake_Sum_Minus -= SnakePrice(Shift + Snake_HalfCycle + 1, close_array, high_array, low_array) - SnakePrice(Shift, close_array, high_array, low_array);

   Snake_Sum_Plus -= SnakePrice(Shift, close_array, high_array, low_array);

   return Snake_Sum / Snake_Weight; //修正、Weightで割る。

  }

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2025.03.23
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
【モデレーターの秘訣】フォーラムでコードについて討議される場合、コード(Alt+S)の機能をご活用ください。
【モデレーターの秘訣】フォーラムでコードについて討議される場合、コード(Alt+S)の機能をご活用ください。
  • 2025.03.18
  • Sky All
  • www.mql5.com
皆様 お世話になっております。 フォーラムでコードについて討議されたい場合、そのまま貼り付けると、ロボに勝手に削除される場合がございます。 できれる限り、コード(Alt+S)の機能をご活用いただければ幸甚です...
 
正しくはないけど表示もデバッグもできます。何か勘違いしていませんか?
 

ありがとうございます、

表示してます、、、

でも、挙動が怪しすぎる、、

すいません、どうすれば治りますか、、

AIまかせで修正してるので、なにがなんだかわからない、、

どなたかご教示お願いいたします、、

 

ALT+Sとはどうすればいいのでしょうか?直接貼り付けるのはよくないのは理解いたしました。申し訳ございません。

どうすればいいのでしょうか、、なにもわかってないので、、

 

本来の処理は、

SnakeFirstCalc

SnakeNextCalc

SnakeFirstCalc

LWMA

の順になるはずですが、最初のSnakeFirstCalcだけでその後の処理が脱落しています。

SnakeNextCalcは関数は追加されていますが一度も呼び出されていません。

変数のTempBufferも使われていません。

変換元はSnake.mq4だと思いますので、それと比較してください。

コードの投稿は編集画面でツールバーの をクリックするか、またはキーボードのALT+Sでコードの編集画面が開きます。

行間の無駄なスペースは削除してください。

この種の質問は、ここではなく「テクニカル指標」https://www.mql5.com/ja/forum/indicators に投稿してください。

MQL5フォーラム: テクニカル指標
MQL5フォーラム: テクニカル指標
  • www.mql5.com
MQL5言語でユーザーにより開発されたテクニカル指標はここでディスカッションされます
 

「SNAKER.mq5」で検索すればForex Factoryからほぼ完成品のファイルがDLできます。

最後のLWMAの部分がmq4のままなので正しく表示できません。

この部分をmq5の形式に修正すれば使えると思います。

 

ありがとうございます、

修正していますが、まだうまく表示しません、、一本垂直にラインインジがたっているという状態です、、テクニカル指標というところに引っ越ししてみます。引き続きよろしくお願いします、、