Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1607

 
Андрей #:

Gute Nacht!

Liebe Forumsnutzer, ich brauche Hilfe. Ich habe ein Skript in MQL4 geschrieben, das eine Linie durch eine Formel auf der Grundlage von drei gegebenen Punkten in einem Diagramm zeichnet. Er umfasst 130 Zeilen, einschließlich Einzüge und Leerzeichen. Ich habe vor kurzem beschlossen, es auf MQL5 zu portieren, und habe festgestellt, dass meine geringen Programmierkenntnisse mir nicht helfen werden, da ich wieder lernen muss.

Es liegt ein Fehler im Code für die Nullteilung vor, der zuerst behoben werden muss.

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

Hier wird durch "0" geteilt, weil x1 und x2 gleich "1" sind, was "0" ergibt.

Führen Sie vor der Matrixoperation eine Prüfung durch

 
Manter84 #:

Du bist ein Witzbold. Aber das Problem ist real, und es gibt Themen darüber, dass der Befehl Print zweimal in der Registerkarte Experts gedruckt wird und Allert auch zweimal kommt, nur gibt es leider keine Antwort, wie man das beheben kann. Und für die Zukunft, wenn Sie nicht wissen, können Sie einfach schweigen und vorbei, aber zu gewinnen Bewertung selbst unprofessionelle Antworten ist dumm. Ja, übrigens, Ihre Antworten sind wirklich sehr schwach.

Egal welche Frage, egal welche Antwort.
 
Андрей #:

Gute Nacht!

Liebe Forumsnutzer, ich brauche Hilfe. Ich habe ein Skript in MQL4 geschrieben, das eine Linie durch eine Formel von drei gegebenen Punkten auf einem Diagramm zeichnet. Er benötigt 130 Zeilen, einschließlich Einzüge und Leerzeichen. Ich habe vor kurzem beschlossen, es auf MQL5 zu portieren, und habe festgestellt, dass meine geringen Programmierkenntnisse mir nicht helfen werden, ich muss wieder lernen.

Ich wäre dankbar, wenn jemand bereit ist, das Skript auf MQL5 zu portieren. Ich wäre sehr dankbar, wenn jemand das Skript in MQL5 umwandeln könnte.

Wenn Sie das Skript geschrieben haben, warum brauchen Sie es dann in Ihrem Code?

 //+------------------------------------------------------------------+
 //| 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 #
:
So wie die Frage ist, so ist auch die Antwort.

Nun, Sie hätten auch einfach schreiben können, dass mehr Details benötigt werden. Ich habe den Code für den einfachsten Indikator geschrieben (er könnte nicht einfacher sein), aber er erzeugt auch zwei Meldungen beim Druckbefehl. Und wenn Sie "Get Handle" weglassen, gibt es nur eine Meldung.

***

Dateien:
111.png  15 kb
 
Alexey Viktorov #:

Wenn Sie das Skript geschrieben haben, warum steht dann im Code

Da meine Programmierkenntnisse auf dem Niveau eines Schuljungen sind, habe ich ein funktionierendes Stück Code genommen und daraus Regeln erstellt. Was nicht stört, berührt nicht)
 
Manter84 #:

Nun, Sie hätten auch einfach schreiben können, dass mehr Details benötigt werden. Ich habe den Code für den einfachsten Indikator geschrieben (er könnte nicht einfacher sein), aber er erzeugt auch zwei Meldungen beim Druckbefehl. Und wenn du keine Handle bekommst, bekommst du eine.

Oh je... ich habe nur Schimpfwörter in meinem Wortschatz. Deshalb sollte ich besser schweigen.

 
Андрей #:
Da meine Programmierkenntnisse auf dem Niveau eines Schuljungen sind, habe ich ein funktionierendes Stück Code genommen und daraus Regeln abgeleitet. Was nicht stört, berührt nicht)

Ich hab's.

Andrew #:
Wenn Ihnen jemand hilft, schulde ich Ihnen sowieso einen Whisky)

Ich glaube, Whisky von ......... ist nicht billiger als 30 $. Daher ist es einfacher, eine Bewerbung auf einer Website für Freiberufler zu erstellen, und es werden sich etwa 20 Leute finden, die bereit sind... Und das ist Ihre Botschaft, Sie provozieren die Leute dazu, die Regeln zu brechen. Wer braucht sie? Nun, machen Sie es umsonst, und was dann? Immerhin, eine Flasche haben Sie nicht bestanden, so ist es ein Job für das Geld unter Umgehung der Freiberuflichkeit.

 
Андрей #:

#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();

  }


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

Es gibt keine Fehler, aber die Timing-Funktion ist nicht korrekt, es war nicht genug Zeit)

Und es ist besser, die Division durch Null in 5 zu überprüfen, bevor die Division durchgeführt wird. Wenn der Divisor Null ist, dann....

 
Manter84 #:

Ja, übrigens, Ihre Antworten sind wirklich sehr schwach.

Manter84 #:

Hier ist der Code des einfachsten Induktors (einfacher geht es nicht)

Es gibt fünf Fehler in einem Wort mit sechs Buchstaben...

und ich bin zu schwach, um dich zu korrigieren.

 
Alexey Viktorov #:

Schade... Die einzigen Worte, die ich noch in meinem Wortschatz habe, sind Schimpfwörter. Deshalb sage ich lieber gar nichts.

Was habe ich Ihnen angetan? Oder seid ihr alle so aggressiv?