Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 318

 
muzzletop:
Nachmittags. Ich habe eine EA, es funktioniert gut in der Strategie-Tester (öffnet Aufträge und alles). Aber wenn ich sie einfach in ein Diagramm einfüge, passiert nichts. Der EA funktioniert nicht. Ich habe auch ein Kreuz neben dem Namen des EAs auf dem Diagramm bemerkt. Wie kann man das beheben?


Wenn Sie den EA auf dem Chart platzieren, öffnet sich ein Fenster mit Parametern. Es gibt verschiedene Registerkarten - in der ersten "General" müssen Sie ein Häkchen vor "Allow EA to trade" setzen.

Wenn sich der EA bereits im Chart befindet und mit einem Kreuz angezeigt wird, klicken Sie in der Symbolleiste auf die Schaltfläche "EAs" (gelber Würfel in einem Hut mit einem roten Kreis und einem weißen Quadrat innerhalb des Kreises).

 

Guten Tag. Helfen Sie mir, mit einem seltsamen Problem umzugehen.

Der Punkt ist: Ich schreibe einen Multitiming-Indikator, d.h. einen Indikator, der, wenn er zu einer beliebigen Zeit geöffnet ist, auch für alle anderen Zeiten Signale berechnet und gibt.

Die Grundlage des Indikators ist der RSI.

In init() wird beim Umschalten des Zeitrahmens ein separates Array entsprechend der Indikatorlinie angelegt. Für jeden von ihnen wird die Linie angezeigt, wenn man sich zu diesem oder jenem Zeitpunkt befindet, aber die Berechnungen für andere Zeitpunkte gehen nicht weiter (die Funktion iRSI jagt dummerweise Nullen in der Berechnung). D.h. die aktuelle Zeit wird berechnet, andere Zeiten jedoch nicht.

Ich füge den Code ein:

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80

#property indicator_level1 20          // уровень RSI
#property indicator_level2 42          // уровень RSI
#property indicator_level3 50          // уровень RSI
#property indicator_level4 58          // уровень RSI
#property indicator_level5 80          // уровень RSI

#property indicator_levelcolor White   // цвет уровней 

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2           // толщина RSI

//--- buffers
double   RSI_M1[];               // буферы под RSI
double   RSI_M5[];
double   RSI_M15[];
double   RSI_M30[];
double   RSI_H1[];
double   RSI_H4[];
double   RSI_D1[];
double   RSI_W1[];
double   RSI_MN[];

int         RSI_per           = 12;                // период RSI
int         RSIPriceType      =  PRICE_CLOSE;      // покакой цене считать RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   IndicatorShortName("test");
   
   switch(Period()) {
      case PERIOD_M1:
          SetIndexBuffer(0, RSI_M1);
          break;
      case PERIOD_M5:
          SetIndexBuffer(0, RSI_M5);
          break;
      case PERIOD_M15:
          SetIndexBuffer(0, RSI_M15);
          break;
      case PERIOD_M30:
          SetIndexBuffer(0, RSI_M30);
          break;
      case PERIOD_H1:
          SetIndexBuffer(0, RSI_H1);
          break;
      case PERIOD_H4:
          SetIndexBuffer(0, RSI_H4);
          break;
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          break;
      case PERIOD_W1:
          SetIndexBuffer(0, RSI_W1);
          break;
      case PERIOD_MN1:
          SetIndexBuffer(0, RSI_MN);
          break;
   }   
   
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0,"RSI(" + RSI_per + ")");
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   shift, _Bars;
   static int  _counted_bars_W1 = 0,
               _counted_bars_D1 = 0;
   //--------------------------------------------------------------------
   _Bars = iBars(NULL, PERIOD_W1);
   shift = _Bars - _counted_bars_W1 - 1;   // Индекс первого непосчитанного
   _counted_bars_W1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_W1[shift]       = iRSI(NULL, PERIOD_W1, RSI_per, RSIPriceType, shift);
      Print(RSI_W1[shift]);
      shift--;
   }
   //------------------------------------------
   _Bars = iBars(NULL, PERIOD_D1);
   shift = _Bars - _counted_bars_D1 - 1;   // Индекс первого непосчитанного
   _counted_bars_D1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_D1[shift]       = iRSI(NULL, PERIOD_D1, RSI_per, RSIPriceType, shift);
      shift--;
   }
   //------------------------------------------   
   return(0);
  }
//+------------------------------------------------------------------+

Interessant ist, dass, wenn wir nur ein Feld für die Indikatorlinie belassen und nur W1 zu jeder Zeit berechnen, alles zu jeder(!) Zeit korrekt berechnet und gezeichnet wird.
Was ist der Trick? Es ist unmöglich, verschiedene Arrays für die Indikatorzeile während der Initialisierung zu nehmen, abhängig von der Zeit?

 
satorifx:

Guten Tag. Helfen Sie mir, mit einem seltsamen Problem umzugehen.

Der Punkt ist: Ich schreibe einen Multitime-Indikator, d.h. einen Indikator, der, wenn er zu einem beliebigen Zeitpunkt geöffnet ist, auch für alle anderen Zeiten Berechnungen durchführt und Signale gibt.

Die Basis des Indikators ist der RSI.

In init() wird beim Umschalten des Zeitrahmens ein separates Array entsprechend der Indikatorlinie angelegt. Für jeden von ihnen wird die Linie angezeigt, wenn man sich zu diesem oder jenem Zeitpunkt befindet, aber die Berechnungen für andere Zeitpunkte gehen nicht weiter (die Funktion iRSI jagt dummerweise Nullen in der Berechnung). D.h. die aktuelle Zeit wird berechnet, andere Zeiten jedoch nicht.

Hier ist der Code:

Interessant ist, dass, wenn wir nur ein Feld für die Indikatorlinie belassen und nur W1 zu jeder Zeit berechnen, alles zu jeder(!) Zeit korrekt berechnet und gezeichnet wird.
Was ist der Trick? Es ist unmöglich, verschiedene Arrays für die Indikatorzeile während der Initialisierung zu nehmen, abhängig von der Zeit?

Nur W1 und D1 werden gelesen! Was wollen Sie? Bringen Sie es für die anderen zu Ende!
 
borilunad:
Nur W1 und D1 werden gelesen! Was wollen Sie? Bringen Sie es für die anderen zu Ende!

Das ist nicht der Punkt. Ich habe nur Berechnungen für D1 und W1 angegeben, damit der Code nicht zu lang ist. Hinweis: Bei jedem Tick in jedem Zeitrahmen werden die berechneten Werte von W1 gedruckt. Wenn also eine beliebige Zeit außer W1 geöffnet wird, werden Nullen gedruckt. Wenn es bei W1 funktioniert, wird es auch bei anderen funktionieren.
 
satorifx:

Das ist nicht der Punkt. Ich habe nur Berechnungen für D1 und W1 angegeben, um den Code nicht zu lang werden zu lassen. Bitte beachten Sie: Bei jedem Häkchen in einem beliebigen Zeitrahmen werden die berechneten Werte von W1 gedruckt. Wenn also eine beliebige Zeit außer W1 geöffnet wird, werden Nullen gedruckt. Wenn es bei W1 funktioniert, wird es auch bei allen anderen funktionieren.
Genau! Wir müssen den Wochenchart öffnen, um ihn in anderen Charts anzuzeigen!
 
borilunad:
Richtig! Um sie in anderen Charts anzuzeigen, müssen Sie auch den Wochenchart öffnen!


Um ehrlich zu sein, habe ich diese Aussage nicht verstanden.
Und es ist nicht nötig, etwas anderes zu zeigen. Wenn Sie den Code ausführen, werden Sie sehen, dass es bereits zeigt, was ich will: auf D1 zeigt es Chart RSI D1 und auf W1 - Chart RSI W1, aber zur gleichen Zeit, wenn D1 offen ist, dann RSI für W1 sind alle Null, und wenn W1 offen ist, dann die Berechnungen für D1 sind Null. Die Frage ist, warum dies der Fall ist und wie man das Problem lösen kann.

 

Das Problem besteht darin, dass sich das Index-Array selbst initialisiert und auf die richtige Größe bringt.
Wenn ich also D1 öffne, wird RSI_D1[] indiziert, und alles ist in Ordnung, aber andere Arrays bleiben im embryonalen Zustand.
Ich habe es auf diese Weise versucht: Ich habe alle Arrays auf diese Weise deklariert:

double   RSI_W1[]    =  {0};
Ich habe den Schalter in init() wie folgt geändert:
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

Bei ArrayResize gibt GetLastError jedoch einen Fehler aus:

EURUSD,Daily: Größe des Arrays kann nicht geändert werden

EURUSD,Daily: some array error

Wie auch immer, wer kann mir sagen, wie ich dieses Problem lösen kann?

 
satorifx:

Das Problem besteht darin, dass sich das Index-Array selbst initialisiert und auf die richtige Größe bringt.
Wenn ich also D1 öffne - RSI_D1[] wird indiziert, und alles ist in Ordnung, aber andere Arrays bleiben im embryonalen Zustand.
Ich habe es auf diese Weise versucht: Ich habe alle Arrays auf diese Weise deklariert:

Ich habe den Schalter in init() wie folgt geändert:

Bei ArrayResize gibt GetLastError jedoch einen Fehler aus:

EURUSD,Daily: Größe des Arrays kann nicht geändert werden

EURUSD,Daily: some array error

Wie auch immer, wer kann mir sagen, wie ich dieses Problem lösen kann?

Wenn das Array dynamisch ist, stellen Sie sicher, dass Sie die Größe des Ar rays erhöhen, wenn Sie Werte hineinschreiben, um die neuen Daten unterzubringen. ArrayResize()
 
artmedia70:
Wenn es sich um ein dynamisches Array handelt, müssen Sie die Größe des Arrays erhöhen, um die neuen Daten unterzubringen, wenn Sie Werte in das Array schreiben. ArrayResize()

Ich schrieb über sie oben:
Aber ArrayResize GetLastError gibt einen Fehler:

EURUSD,Daily: kann nicht die Größe des Arrays

EURUSD,Daily: einige Array-Fehler
 
satorifx:
Darüber habe ich oben geschrieben:
Allerdings gibt GetLastError bei ArrayResize einen Fehler:

EURUSD,Daily: Größe des Arrays kann nicht geändert werden

EURUSD,Daily: Array-Fehler
satorifx:


Um ehrlich zu sein, habe ich diese Aussage nicht verstanden.
Und es ist nicht nötig, etwas anderes zu zeigen. Wenn Sie meinen Code ausführen, werden Sie sehen, dass alles bereits angezeigt wird: RSI D1 wird auf D1 und RSI W1 auf W1 angezeigt, aber gleichzeitig, wenn D1 offen ist, dann sind alle RSI für W1 null, und wenn W1 offen ist, dann sind alle RSI für D1 null. Die Frage ist, warum dies der Fall ist und wie man das Problem lösen kann.

Denn der Zwischenspeicher ist allein und zeigt einen nach dem anderen bei Ihrem Anruf an!

#property indicator_buffers 1
Glauben Sie wirklich, ich hätte nichts Besseres zu tun, als Ihre "Codes" herunterzuladen und zu testen? Ich stehe Ihnen mit Ratschlägen zur Seite. Und wenn etwas nicht in Ordnung ist, ist alles für Sie da oben! Oder wurde die Faulheit schon vor Ihnen geboren?!