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

 
Андрей #:

おやすみなさい!

フォーラムユーザーの皆様、助けてください。MQL4で、チャート上の与えられた3つのポイントを元に、数式で線を引くスクリプトを書きました。インデントやスペースを含めて130行かかる。最近、MQL5に移植することにしたのですが、プログラミングの拙い知識では、もう一度勉強する必要があり、役に立たないことに気づきました。

ゼロ除算の コードにエラーがあるので、まずそれを修正すること

a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);

ここで、x1とx2が "1 "になるので、"0 "で除算すると、"0 "になる。

マトリクス操作の前にチェックを行う

 
Manter84 #:

ジョーカーなんですね。しかし、問題は現実で、PrintコマンドがExpertsタブに2回印刷され、Allertも2回出るという話題があるが、どうすれば解決できるのか、残念ながら回答はない。また、今後のために、わからなければ黙って通り過ぎればいいのですが、専門外の回答で自ら評価を得るのは愚かなことです。はい、それにしても、皆さんの回答は本当に弱いですね。

どんな質問でも、どんな答えでも。
 
Андрей #:

おやすみなさい!

フォーラムユーザーの皆様、助けてください。MQL4で、チャート上の与えられた3つのポイントを元に、数式で線を引くスクリプトを書きました。インデントやスペースを含めて130行かかる。最近、MQL5に移植することにしたのですが、私のプログラミングの乏しい知識ではどうにもならないことに気づき、もう一度勉強し直さなければなりません。

どなたか、このスクリプトをMQL5に移植してくださる方がいらっしゃれば、ありがたいのですが。どなたか、このスクリプトをMQL5に変換していただけるとありがたいのですが。

スクリプトを書いたのなら、なぜコードにそれが必要なのですか?

 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   {SetIndexBuffer(0,Buffer1);
   SetIndexStyle(0,DRAW_LINE);
 //---- indicators
 //----
    return(0);
   }
 
#property indicator_chart_window
int            FR_handle;
int OnInit()
  {

    FR_handle = iFractals(NULL,PERIOD_CURRENT);
   return(INIT_SUCCEEDED);

  }

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[])
  {
    Print("Проверка 111 "); 
    return(rates_total);
  }
Alexey Viktorov #
:
問いがそうであるように、答えもそうです。

まあ、もっと詳細が必要だと書けばよかったんですけどね。一番シンプルなインジケータのコードを書いたのですが(これ以上シンプルにはできない)、Printコマンドのところでも2つのメッセージを生成してしまいます。また、Handleの取得を省略した場合は、1つのメッセージを表示します。

***

ファイル:
111.png  15 kb
 
Alexey Viktorov #:

スクリプトを書いたのであれば、なぜコードの中に

私は小学生レベルのプログラミングスキルしかないので、実際に動いているコードからルールを作ってみました。干渉しなかったもの、触れなかったもの)
 
Manter84 #:

まあ、もっと詳細が必要だと書けばよかったんですけどね。一番シンプルなインジケータのコードを書いたのですが(これ以上シンプルにはできない)、Printコマンドのところでも2つのメッセージを生成してしまいます。そして、Handleを取得しない場合は、1つを取得します。

やれやれ・・・汚い言葉しか出てきませんね。だから、黙っていたほうがいいんです。

 
Андрей #:
私のプログラミングスキルは小学生レベルなので、いくつかの動くコードやルールを参考にしました。干渉しなかったもの、触れなかったもの)

了解です。

アンドリュー#:
誰か助けてくれたら、とりあえずウィスキーをお借りします!)

のウイスキーは30ドルより安くはないと思います。だから、フリーランスのサイトでアプリケーションを作成する方が簡単だし、20人くらいは喜んでくれるだろう...そして、これはあなたのメッセージであり、あなたはルールを破るために人々を挑発する。誰が必要としているのか?じゃあ、タダでやれよ、それでどうする?結局のところ、あなたが合格していないボトルなので、それはお金のための仕事です迂回フリーランス。

 
Андрей #:

#property strict
//+------------------------------------------------------------------+
#property indicator_chart_window
 #property indicator_buffers 1
 #property  indicator_color1 clrBlue
 #property  indicator_width1 2
 #property  indicator_style1 0
 
#property indicator_label1  "3T" 
#property indicator_type1   DRAW_LINE 

#property indicator_style1  STYLE_SOLID 


#define Point _Point
#define Period()  _Period
#define Symbol  _Symbol
#define  TimeToStr TimeToStruct



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.


#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
  CLASS##NAME  NAME;                                                                                           \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
//+------------------------------------------------------------------+





 double     Buffer1[];
 //+------------------------------------------------------------------+
 //| Объявляем внешние переменные                                     |
 //+------------------------------------------------------------------+
 datetime point_1;
 datetime point_2;
 datetime point_3;
 datetime LastBarTime;
 string line_name[10];
 int gg=1;
 int x1;
 int x2;
 int x3;
 int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.
 int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.
 int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.
 int max;
 int maxx;
 double y1;
 double y2;
 double y3;
 double y11;
 double y22;
 double y33;
 double x11;
 double x22;
 double x33;
 double y;
 double a1;
 double a2;
 double a3;

bool Deinit = true;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 

MqlDateTime str;
//--------------------------------------------------------------------
int OnInit()                             // Специальная функция init()
  {
   {SetIndexBuffer(0,Buffer1);
   
 //---- indicators
 //----
    return(0);
   }
  
   return(INIT_SUCCEEDED);                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
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[])

  {
   // Пересчитываем инликатор только при появлении нового бара
   if(LastBarTime == iTime(Symbol, 0, 0))
      return(0);
    LastBarTime = iTime(Symbol, 0, 0);
   
   
 // Присваиваем значения переменных времени


 int obj_total=ObjectsTotal(0,0,-1);

   for(int ii=0;ii<100;ii++)
     {string name = ObjectName(0,0,ii,OBJ_VLINE);
       if(ObjectGetInteger(0, name,OBJPROP_TYPE)!=OBJ_VLINE)
       continue;
       line_name[gg] = ObjectName(0,0,ii,OBJ_VLINE);
       gg=gg+1;
     
     }
    
   
    point_1=ObjectGetTimeByValue(0,line_name[1],0, OBJPROP_TIME);
    point_2=ObjectGetTimeByValue(0,line_name[2],0, OBJPROP_TIME);
    point_3=ObjectGetTimeByValue(0,line_name[3],0, OBJPROP_TIME);
   
 // Запоминаем текущий номер бара вершины

 xx1=x1; 
    
 //Определяем номера баров ключевых точек
   for (int j=0;j<500; j++)
   { if (Time[j]==point_1) x1=j;}
  
  
   // Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.
 if (x1==xx1) x1=x1+1;
  
  
 xx2=x2;
  
   for (int k=0;k<500; k++)
   {if (Time[k]==point_2) x2=k;  }
  
 if (x2==xx2) x2=x2+1;
  
 xx3=x3;

   for (int l=0;l<500; l++)
   {if (Time[l]==point_3) x3=l; }
  
 if (x3==xx3) x3=x3+1;

 // Comment ("n1=", j," n2=", k, " n3=", l);
 //Находим "высоту" вершин
   {
   y1=High[x1];
   y2=High[x2];
   y3=High[x3];
   //Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);
   //Принимаем первую из них за начало координат
  
 a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
 a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
 a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;

 max=MathMax(x1,x2);
 maxx=MathMax(max,x3);
  
  
   for (int i=maxx; i>=0; i--)
  
   { y=a1*i*i+a2*i+a3;
   Buffer1[i]=y;}
  

    return(0);
   }


//--------------------------------------------------------------------
   return(rates_total);                           // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
void OnDeinit(const int reason)
  {

   if( Deinit == true)                         // Стираем  с графика, если включена функция очистки графика
     {
      int obj_total=ObjectsTotal(0,0,-1);
      PrintFormat("Всего %d объектов",obj_total);
      for(int i=obj_total-1; i>=0; i--)
        {
         string name=ObjectName(0,i,-1,-1);
         //         PrintFormat("Объект %d: %s",i,name);
         ObjectDelete(0,name);
        }
     }
     Comment("");
//--- destroy timer
   EventKillTimer();

  }


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

エラーはないが、タイミング機能が正しく動作していない、時間が足りなかった)

また、5で0による除算は、除算演算の前に検証した方が良い 除算子が0であれば、・・・・。

 
Manter84 #:

はい、ところで、皆さんの回答は本当に弱いですね。

Manter84#:

以下は、最もシンプルなインダクタのコードです(これ以上ないほどシンプルです)。

6文字で5つの間違いがある...。

と訂正するのは弱すぎです。

 
Alexey Viktorov #:

ガッカリ・・・汚い言葉しか残っていない。だから、何も言わない方がいいんです。

私はあなたに何をしたのですか?それとも、皆さんそんなに積極的なんですか?