Vereinfacht gesagt, ist CopyOpen für OnCalculate unnötig, aber so sieht es nur die Geschichte aus dem Terminalfenster?
Array mas wird bei jedem Tick mit der Größe Null erstellt und ändert seine Größe auch sonst nicht. Jeder Zugriff darauf führt also zu einem Array Overrun.
Um das Problem zu lösen, müssen wir entweder die Größe des Indikators an die Größe anpassen, die die Messwerte aller Verlaufsbalken enthält, oder ihn an den Indikatorpuffer binden (der als globale Variable des Programms deklariert ist). Wenn ich es richtig verstehe, sollten diese Werte mit Hilfe des Indikators angezeigt werden.
Vereinfacht, CopyOpen ich verstehe ist überflüssig für OnCalculate, aber so sieht es nur die Geschichte aus dem Terminal-Fenster?
Beispiel:
//+------------------------------------------------------------------+//| Test.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property indicator_separate_window#property indicator_buffers1#property indicator_plots1//--- plot OC#property indicator_label1"Open/Close"#property indicator_type1DRAW_LINE#property indicator_color1clrRed#property indicator_style1STYLE_SOLID#property indicator_width11//--- indicator buffersdouble BufferOC[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Задаём массив BufferOC как буфер индикатораSetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерииArraySetAsSeries(BufferOC,true);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка на минимальное колиество баров для расчётаif(rates_total<1) return0;
//--- Установка массивов буферов как таймсерийArraySetAsSeries(open,true);
ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
{
limit=rates_total-1; // установим начало цикла на начало исторических данныхArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
if(close[i]==0) continue;
BufferOC[i]=open[i]/close[i];
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Das Array mas wird bei jedem Tick mit einer Größe von Null erstellt und ändert seine Größe auch sonst nicht. Daher führt jeder Verweis darauf zum Verlassen des Arrays.
Um das Problem zu lösen, sollten Sie entweder die Größe des Indikators so anpassen, dass er die Messwerte aller historischen Balken enthält, oder ihn an den Indikatorpuffer binden (der als globale Variable des Programms deklariert ist). Wenn ich es richtig verstanden habe, sind es diese Werte, die mit dem Indikator angezeigt werden müssen.
Mein Fehler, mas[] sollte wirklich ein globales Array sein, aber der Indikatorpuffer ist auch nicht geeignet, es wird eher ein mehrdimensionales Zwischenarray sein. Wie lässt sich die optimale Array-Größe für M5 am besten ermitteln, nicht über den Indikatorpuffer?
Meine Ungenauigkeit, mas[] ist wirklich ein globales Array, aber Indikatorpuffer ist auch nicht geeignet, eher wäre es ein dazwischen liegendes mehrdimensionales Array. Wie lässt sich die optimale Array-Größe für M5 am besten bestimmen, ohne dass ein Indikatorpuffer verwendet wird?
Ich verstehe nicht, was ich mit multidimensional meine. Wir sprechen hier von einem eindimensionalen Array. Darüber hinaus ist in MQL4 die maximale Dimension eines Arrays 4.
Um das Array auf die gleiche Größe wie die Zeitreihe zu bringen, sollten wir es entsprechend der Anzahl der verfügbaren Balken im Diagramm des gewünschten Symbols und der Periode anpassen:
double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
// Не удалось изменить размер массиваreturn;
}
ArraySetAsSeries(fArray, true);
Meine Ungenauigkeit, mas[] ist wirklich ein globales Array, aber Indikatorpuffer ist auch nicht geeignet, eher wäre es ein dazwischen liegendes mehrdimensionales Array. Wie lässt sich die optimale Array-Größe für M5 am besten bestimmen, wenn nicht durch einen Indikatorpuffer?
Warum wollen Sie keine Arrays als Indikatorpuffer verwenden? Sie werden vom Subsystem überwacht, was Ihnen die Arbeit erleichtert.
Und das Zwischenindikator-Pufferfeld ist einfach zu erstellen:
Bitte sagen Sie mir, was ich hinzufügen und wo ich eine schwebende Order löschen kann, wenn der Preis bereits den Stop Loss (dieser schwebenden Order) überschritten hat.
Entschuldigung für die dumme Frage, ich habe mich bei der Suche nach einer Antwort im Forum verirrt.
wie man es richtig macht?
Wie machen Sie das?
Vereinfacht so, CopyOpen ich verstehe ist überflüssig für OnCalculate, aber so sieht es nur die Geschichte aus dem Terminal-Fenster?
Vereinfacht gesagt, ist CopyOpen für OnCalculate unnötig, aber so sieht es nur die Geschichte aus dem Terminalfenster?
Array mas wird bei jedem Tick mit der Größe Null erstellt und ändert seine Größe auch sonst nicht. Jeder Zugriff darauf führt also zu einem Array Overrun.
Um das Problem zu lösen, müssen wir entweder die Größe des Indikators an die Größe anpassen, die die Messwerte aller Verlaufsbalken enthält, oder ihn an den Indikatorpuffer binden (der als globale Variable des Programms deklariert ist). Wenn ich es richtig verstehe, sollten diese Werte mit Hilfe des Indikators angezeigt werden.
Vereinfacht, CopyOpen ich verstehe ist überflüssig für OnCalculate, aber so sieht es nur die Geschichte aus dem Terminal-Fenster?
Beispiel:
Das Array mas wird bei jedem Tick mit einer Größe von Null erstellt und ändert seine Größe auch sonst nicht. Daher führt jeder Verweis darauf zum Verlassen des Arrays.
Um das Problem zu lösen, sollten Sie entweder die Größe des Indikators so anpassen, dass er die Messwerte aller historischen Balken enthält, oder ihn an den Indikatorpuffer binden (der als globale Variable des Programms deklariert ist). Wenn ich es richtig verstanden habe, sind es diese Werte, die mit dem Indikator angezeigt werden müssen.
Mein Fehler, mas[] sollte wirklich ein globales Array sein, aber der Indikatorpuffer ist auch nicht geeignet, es wird eher ein mehrdimensionales Zwischenarray sein. Wie lässt sich die optimale Array-Größe für M5 am besten ermitteln, nicht über den Indikatorpuffer?
Meine Ungenauigkeit, mas[] ist wirklich ein globales Array, aber Indikatorpuffer ist auch nicht geeignet, eher wäre es ein dazwischen liegendes mehrdimensionales Array. Wie lässt sich die optimale Array-Größe für M5 am besten bestimmen, ohne dass ein Indikatorpuffer verwendet wird?
Ich verstehe nicht, was ich mit multidimensional meine. Wir sprechen hier von einem eindimensionalen Array. Darüber hinaus ist in MQL4 die maximale Dimension eines Arrays 4.
Um das Array auf die gleiche Größe wie die Zeitreihe zu bringen, sollten wir es entsprechend der Anzahl der verfügbaren Balken im Diagramm des gewünschten Symbols und der Periode anpassen:
Meine Ungenauigkeit, mas[] ist wirklich ein globales Array, aber Indikatorpuffer ist auch nicht geeignet, eher wäre es ein dazwischen liegendes mehrdimensionales Array. Wie lässt sich die optimale Array-Größe für M5 am besten bestimmen, wenn nicht durch einen Indikatorpuffer?
Warum wollen Sie keine Arrays als Indikatorpuffer verwenden? Sie werden vom Subsystem überwacht, was Ihnen die Arbeit erleichtert.
Und das Zwischenindikator-Pufferfeld ist einfach zu erstellen:
Hallo.
Die Volumina auf der Plattform sind Tickvolumina, wird es auch echte Volumina geben?
Hallo.
Auf der Plattform ticken die Bänder, wird es auch echte Bänder geben?
Das wird es nicht. Verwenden Sie MT5, einige Broker bieten dort echte Volumina an.
Guten Tag!
Bitte helfen Sie mir bei dem folgenden Problem:
1) Nachdem einige Bedingungen erfüllt sind, wird ein schwebender Auftrag eröffnet:
{ price=High[1]+OrderPoint*Point; stoploss=Low[1]-Point; takeprofit=price+price-stoploss; OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit); }Bitte sagen Sie mir, was ich hinzufügen und wo ich eine schwebende Order löschen kann, wenn der Preis bereits den Stop Loss (dieser schwebenden Order) überschritten hat.
Entschuldigung für die dumme Frage, ich habe mich bei der Suche nach einer Antwort im Forum verirrt.
Vielen Dank im Voraus!