[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 632

 
alsu:

Sie müssen zum Beispiel einen einfachen gleitenden Durchschnitt mit PeriodSMA berechnen. Um den SMA zu berechnen, addieren Sie die Werte der letzten PeriodSMA-Balken und teilen sie durch den PeriodSMA. Es ist offensichtlich, dass es für die Balken mit den Nummern Bars-1, Bars-2, ..., Bars-PeriodSMA+1 nicht funktionieren wird, weil wir einfach nicht die notwendige Anzahl von Balken für die Berechnung haben (der ganz linke Balken hat den Index Bars-1). Daher müssen wir die Berechnung des Indikators nicht mit dem letzten Balken im Diagramm beginnen, sondern mit dem Balken mit dem Index Bars-PeriodSMA.

Warum wird dieser Wert angegeben und nicht ein beliebiger? Diese Verschiebung des Berechnungsbeginns ermöglicht es uns, die maximale Anzahl von Balken zu berechnen, ohne die Korrektheit der Berechnung zu beeinträchtigen.

Aber bedenken Sie, dass dies der einfachste Fall ist. Manchmal ist aus dem Code nicht sofort ersichtlich, wie viele vergangene Takte das Programm für die Berechnung benötigt und woher genau diese Verschiebung kommt. Nun, Sie sollten den Entwickler fragen, der den Code geschrieben hat. Aber im Allgemeinen gibt es einen universellen Weg - schauen Sie sich einfach den Code an, was im Prinzip der maximale Index des Balkens unter Verwendung von Preisdaten und Indexpufferdaten während des Programmablaufs erhalten werden kann, normalerweise wird es bereits in diesem Stadium klar...

Jetzt fügt sich alles zusammen. Vielen Dank, Alexej, dass Sie so schnell reagiert haben!
 
skyjet:


Danke für die Klarstellung!

Und nur um zu klären, wenn ich mechanisch 0 hinzufügen, wird TP und SL in dieser Art von Terminal arbeiten?


Das werden sie, natürlich werden sie das.
Dafür sind sie ja da, die externen Variablen, um beliebige Werte zu setzen.

Es ist jedoch einfacher, das, was Ihnen empfohlen wurde, in das Initialisierungsmodul aufzunehmen.
Oder in dieser Form:
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
Die Variablen werden automatisch angepasst, und für andere Bedürfnisse verwenden Sie den Multiplikator "decimal".
 
skyjet:


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?

prorab:

Natürlich werden sie das.
Dafür sind sie ja da, die externen Variablen, um beliebige Werte zu setzen.

Aber es ist noch einfacher, das, was man Ihnen geraten hat, in das Initialisierungsmodul zu packen.
Oder in dieser Form:
Die Variablen werden automatisch angepasst, und für andere Bedürfnisse verwenden Sie den Multiplikator "decimal".

Diese Aufgabe bedarf der Klärung:

  • Ihre Eingabeparameter (STPOLOSS, TAKEPROFIT, usw.) müssen mit 4\2 Stellen eingegeben werden!!!
 

Guten Tag...

SOS!!! GUTE LEUTE, HILFE!!! Ich bin ein Anfänger in der Programmierung im Allgemeinen (ich bin Autodidakt), und in MQL im Besonderen. Ich habe einen einfachen Indikator geschrieben: RSI + Bollinger Bands in einer Person. Aber hier ist das Problem: wenn ich nicht ausdrücklich die Anzahl der Elemente im Array Buf_std_dev angeben (d.h. die Array-Deklarationszeile sieht so aus: double Buf_std_dev[]), dann erhalte ich beim Anzeigen dieses Indikators im Client-Terminal-Fenster(CT) das folgende Bild:

Erläuterung des Bildes:

a) Oben befindet sich der RSI, der im Indikatorensatz von CT enthalten ist, und die Bollinger-Bänder wurden per Drag& Drop ( und ) in das Fenster dieses RSI gezogen;

b) unten ist der RSI, der von mir programmiert wird;

Der Compiler stellt keine Fehler oder Warnungen fest.

 

Wenn ich hingegen bei der Deklaration des Arrays Buf_std_dev die Anzahl der Elemente explizit angebe (d.h. die Zeile der Array-Deklaration sieht wie folgt aus: double Buf_std_dev[5502], wobei 5502 die Anzahl der Balken ist, die über die Variable Bars ermittelt wird ), dann ist alles wieder normal (denn wie Sie aus dem Vergleich der beiden Indikatoren sehen: alle Werte sind gleich):

Können Sie mir sagen, was zu tun ist, um das Bild zu speichern, wie auf dem zweiten Bild, aber ausdrücklich NICHT die Anzahl der Elemente im Array Buf_std_dev zu setzen.

P.S. Ich danke Ihnen im Voraus für Ihre Antwort.

 
Den gesamten Code anzeigen
 

Code im Anhang (ohne einige Teile - kann nicht in 4 MB passen!!!):

....
double Buf_rsi[];                                                       //открываем индикаторный массив для значений RSI+
double Buf_ma[];                                                        //открываем индикаторный массив для значений скользящей средней по RSI+
double Buf_up_line[];                                                   //открываем индикаторный массив для значений ВЛБ по RSI+
double Buf_down_line[];                                                 //открываем индикаторный массив для значений НЛБ по RSI+
double Buf_std_dev[5498];                                               //открываем массив для хранения данных по стандартному отклонению  

string timeframe[9];                                                    //объявляем массив для значений таймфреймов
extern int Период_RSI=14;                                               //внешняя переменная: период RSI+
extern int Применить_к=PRICE_CLOSE;                                     //внешняя переменная: цена, для к-й рассчитывается RSI+
extern int Сдвиг=0;                                                     //внешняя переменная: сдвиг относительно текущего графика RSI+
extern double Сигма=2.0;                                                //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+
extern int МА=21;                                                       //внешняя переменная: период скользящей средней для расчета лент Боллинджера по RSI+
....
   if(Bars<=Период_RSI) return(0);                                      //если баров на графике меньше, чем период RSI+, то выходим
//+-------------------------------------------------------------------------------------- 9 --
   int counted_bars=IndicatorCounted();                                 //количество посчитанных баров
   int i;                                                               //техническая переменные: счетчики

   int limit=Bars-counted_bars;                                         //индекс первого непосчитанного по массиву Buf_ma (т.к. этот массив НЕ является массивом таймсерией)
   if(counted_bars<0)limit--;                                           //если значение переменной counted_bars больше 0, то увеличиваем на 1 значение переменной limit
//+-------------------------------- Рассчет линий индикатора ---------------------------- 10 --
   for(i=0;i<=limit;i++)Buf_rsi[i]=iRSI(NULL,0,Период_RSI,Применить_к,i);//рассчет значения RSI+ на i-ом баре      
   for(i=0;i<=limit;i++)                                                //цикл по рассчету линий на основе RSI+     
       {                                                                //начало for
        Buf_std_dev[i]=iStdDevOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);//рассчитываем стандатное отклонение по массиву RSI+
        Buf_ma[i]=iMAOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);         //рассчет значения MA по RSI+ на i-ом баре
        Buf_up_line[i]=Buf_ma[i]+Сигма*Buf_std_dev[i];                  //рассчет значения ВЛБ по RSI+
        Buf_down_line[i]=Buf_ma[i]-Сигма*Buf_std_dev[i];                //рассчет значения НЛБ по RSI+
       }                                                                //конец for
   for(i=0;i<=Bars;i++)                                                 //цикл по подсчету количества данных внутри ЛБ
      {                                                                 //начало for
       int sum;                                                         //техническая переменные: сумма данных, к-е находятся внутри ЛБ 
       if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
      }                                                                 //конец for
//+------------------------------------------------------------------------------------- 11 --
 
FAQ:
Alle Codes anzeigen

Bitte beraten Sie, wenn es Möglichkeiten, um Code über 4Mb hier dump (oder dump es hier in Teilen?) ?
 

Wenn Ihr Buf_std_dev kein Indikatorpuffer (einer der acht) ist, müssen Sie seine Größe oder eine beliebige Größe (wenn Sie beabsichtigen, sie (Größe) in der Zukunft zu ändern) angeben, wenn Sie ihn deklarieren.

 

Richtig, es ist nicht... Wenn ich darf, dann gleich noch zwei Fragen:

1. Wenn ich ihm einen Puffer zuweise (das Array Buf_std_dev) , bedeutet dies, dass er auch im Anzeigefenster angezeigt wird?

Wenn ich ihm keinen Puffer zuweise, tritt (wenn ich es richtig verstehe) folgende Situation ein: Angenommen, ich habe die Größe von 100 Takten festgelegt. Wenn dann neue Balken erscheinen (d.h. wenn z.B. Balken=101), werden die Berechnungen nur für die letzten 100 Balken durchgeführt, die wir angegeben haben (d.h. der älteste Balken - 101 - wird verworfen). Also, beim Laden der Geschichte, die Array-Größe wird immer gleich 100 Bars nur (oder einen anderen Wert, die ich angeben, wenn deklarieren)?