Fehler, Irrtümer, Fragen - Seite 33

 
Urain:

Diesist ein bemerkenswerter Vorschlag,

Aus der Sicht der gewöhnlichen Logik ist es allerdings so, als würde man sich mit der rechten Hand am linken Ohr kratzen (aber das liegt nicht an Ihnen, sondern an den Entwicklern),

warum die Möglichkeit, die Daten eines nicht einheimischen Instruments abzurufen?

wenn Sie noch benutzerdefinierte Indikatoren zu erstellen und rufen Sie sie von einem erforderlichen Symbol, in der Regel ist die Schlussfolgerung denken Kopf ich kaufen.

Die Möglichkeit eines solchen Aufrufs ist notwendig, die Entwickler konnten beim Schreiben der Indizes sicher nicht von einem solchen Ansatz ausgehen.

Ich meine die Werkzeuganzeige in den Parametern des Indikators des Benutzers (und nicht in den iCustom()-Parametern, wie es ihrer Meinung nach sein sollte).


PS

Die Priorität bei der Arbeit mit iCustom() scheint zunächst dem mechanischen Handel gegeben worden zu sein, der in der Tat davon ausgeht, dass einige Momente berücksichtigt und einige Aktionen im Expert Advisor durchgeführt werden und erst dann iCustom() für den benutzerdefinierten Indikator aufgerufen wird.

Andernfalls fällt die gesamte Arbeit und Verantwortung auf den Programmierer, der den Code des Indyke implementiert (was zu fatalen Fehlern und Konsequenzen führen kann, da ein zu ausgefallener Indyke zu einem Abbremsen oder Absturz des gesamten Systems führen kann).

 
Urain:

EinVorschlag, der Aufmerksamkeit verdient,

Aber auch hier kann ich den fertigen Indikator für EUR mit Daten über JPY aufrufen (zum Beispiel gibt es nicht genug Daten über Yen)

Ich habe keine Daten für diese Länge, und was soll mir das sagen, das gleiche Lied.

Die Behandlung von Fehlern und Engpässen ist im nativen Tool viel einfacher, und die Vorprüfung und die Endprüfung erfolgen vor und nach dem Aufruf im Expert Advisor oder dem Daten anfordernden Indikator.

Ich gehe davon aus, dass es einen zweiten Weg gibt, der aus meiner Sicht grundlegend falsch ist. Nach seiner Logik müssen Sie eine oder mehrere Funktionen im Indikator erstellen (die vom Taschenrechner aufgerufen werden), alles, was Sie brauchen, darin berechnen und das Ergebnis an den Taschenrechner zurückgeben.

PS

Aber die Sache ist die: Sie können die Anzahl der Balken eines beliebigen Symbols berechnen. Aber was ist mit anderen Dingen?

 
Prival:

Fehler. Beschreibung. ATS immer im Markt (Rollover um doppeltes Los 0,2).

Testmodus alle Zecken. Alles ist normal.

Testmodus, durch Öffnen der Preise. das gleiche Stück.

Aus irgendeinem Grund teilt es sich in 2 Gewerke auf. Vielleicht ist es nur die Art der Anzeige, aber es ist nicht richtig.

Ordnen Sie die öffnenden Befehle den schließenden Befehlen zu. Sie sollte in dieser Reihenfolge erfolgen

- Positionen schließen

- Positionen ändern

- offene Stellen

Dann liegen Ihre geschlossenen und offenen Positionen auf demselben Balken.

 
gpwr:

Ordnen Sie die öffnenden Befehle den schließenden Befehlen zu. Die Reihenfolge sollte wie folgt sein

- Positionen schließen

- Positionen ändern

- offene Stellen

Dann liegen Ihr Close und Open auf demselben Balken.

Wenn der Markt 0,1 kauft, eröffne ich einen Verkauf zu 0,2. Das Ergebnis dieser Operation sollte 0,1,1 in einer Transaktion sein, nicht in zwei.

Ich glaube, die Entwickler haben verstanden, was ich sagen wollte.

 

Ich habe folgenden Code geschrieben

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

Es scheint gut zu funktionieren, aber ob es alles berücksichtigt, weiß ich nicht.
Wenn ja, haben wir hier eine Variante für Sie.
Falls nicht korrekt, korrigieren Sie es bitte.

 

Jetzt habe ich eine Frage.

Warum wird der Indikator vom Expert Advisor aufgerufen, der Wert stimmt nicht mit dem Indikator überein.

D.h. Indikator hat 1.5123 und EA bekommt 1.5117

Ich habe versucht, sie zu benutzen, weil ich nicht weiß, wie man sie liest, und ich möchte sie nicht verpassen.

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

und Bild

Und der erste Puffer, das Instrument, auf dem es läuft, stimmt überein.

Dateien:
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

Jetzt habe ich eine Frage.

Warum wird der Indikator vom Expert Advisor aufgerufen, der Wert stimmt nicht mit dem Indikator überein.

D.h. Indikator hat 1.5123 und EA bekommt 1.5117

Hier ist der Code von EA, außerdem ist er im Anhang dupliziert.

Und Sie schauen sich den vorherigen Wert des Indikators an. Ich vermute, dass es genau 1,5117 ist. Nimm den aktuellen (letzten) Wert mit Index 1. Oder Arrays zuweisen SetAsSeries(bufX,true)
 
stringo:
Und Sie schauen sich den vorherigen Indikatorwert an.
1,512380 - aktuell 1,512310 - früher
 
ddd06:

Ich habe folgenden Code geschrieben

Es scheint gut zu funktionieren, aber ob es alles berücksichtigt, weiß ich nicht.
Wenn ja, haben wir hier eine Variante für Sie.
Falls nicht korrekt, korrigieren Sie es bitte.

Ja, meine überarbeitete Version hat auch eine Überprüfung der Array-Länge, aber ich habe mich, wie üblich, in den Richtungen der Serie verirrt,

und es stellte sich heraus, dass die Zeichnung weiterging, aber da die Länge des Feldes geringer ist als die Länge des Diagramms, ging die Zeichnung vom Ende bis zur Mitte (oder so ähnlich),

Deshalb hatte ich den Eindruck, dass es kein Rendering gab.

Im Allgemeinen vermute ich, dass es hier noch lange Zeit Verwirrung geben wird,

denn das gleiche Problem hatten die Besucher von mql4.com, und jetzt laden sie hier herunter.

 
Urain:

Das ist richtig.

Das ist großartig. Ich denke, der Code ist einfach und lokal, so dass Sie ihn als Grundlage verwenden können.

Frage zu EA - soll ich an den Service Desk schreiben?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.