Ja. Es gibt keinen Grund, die Zeit in eine Zeichenkette zu übersetzen, da die Zeit eine Anzahl von Sekunden ist. Diese Zahl ist viel einfacher und schneller zu verarbeiten als Zeichenketten.
Sie haben eine Sache korrigiert und eine andere verdorben.)
Im zweiten Teil anstelle von:
Rückkehr:
In Ihrem letzten Versuch hatten Sie diese Zeile richtig geschrieben.
Vielen Dank für die Antworten! Ich habe beide Möglichkeiten ausprobiert.
Ich verstehe nicht, wo der Haken ist - er geht immer noch rein, wenn man auf einen Anschlag zugeht:
lil_lil:
Sprechen Sie Ihren Zustand laut aus und Sie werden sehen, was los ist)
if ( TimeSeconds(TimeCurrent()) - TimeSeconds(OrderCloseTime()) > TimeSeconds(30*60) )
if ( TimeCurrent() -OrderCloseTime() > 30*60 )
In der Tat gibt es überall != Bedingung, das heißt, das Gegenteil > sollte dort sein, wenn ich richtig verstanden habe, was Sie meinen. Aber alle Varianten liefen - funktionieren noch.
Helfen, die Logik zu verstehen, den Fehler zu finden
Der Code wurde detailliert auskommentiert.
Ich brauche es, um Fraktale mit einem Punkt zu zeichnen, mit einem "Zickzack"-Typ, so dass die untere obere obere untere Fraktale in Folge gehen und so weiter.
Das Ergebnis ist, dass die wiederholten Fraktale trotzdem auf dem Diagramm erscheinen.
Die Basis ist dem Standard-Fraktal-Indikator entnommen. Screenshot unten mit wiederholtem Fraktal in Periode 5
//+------------------------------------------------------------------+//| Fractals.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_type2DRAW_ARROW#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_label1"Fractal Up"#property indicator_label2"Fractal Down"bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input datainputint period = 5;
int per = period;
//---- indicator buffersdouble ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high priceint ExtArrowShift=-10;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
if(per % 2 == 0) per++; //период фракталов только нечетный//---- indicator buffers mappingSetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_ARROW,217);
PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawingPlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
}
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
//---if(rates_total < per)
return(0);
//---if(prev_calculated < per + (per - 1) / 2)
{
limit = (per - 1) / 2;
//--- clean up arraysArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
}
else limit = rates_total - per;
for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
{
high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свечеfor(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)//---- Upper Fractalif(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
ExtUpperBuffer[i] = EMPTY_VALUE;
high_f = false;
}
//---- Lower Fractalif(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет
ExtLowerBuffer[i] = EMPTY_VALUE;
low_f = false;
}
}
//устанавливаем верхнийif(high_f){//если фрактал все таки есть (из цикла-проверки выше)if(lastIsLower){//еси последний фрактал был нижний
ExtUpperBuffer[i] = high[i];//устанавливаем сверху
lastUpperIndex = i;//записываем индекс в буффере установленного
lastIsLower = false;//говорим что последний - не нижний
lastIsUpper = true;//а верхний
}else{
if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
ExtUpperBuffer[i] = high[i];//устанавливаем новый
lastUpperIndex = i;//записываем индекс нового
}
}
}
}
//аналогично для фрактала снизуif(low_f){
if(lastIsUpper){
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
lastIsLower = true;
lastIsUpper = false;
}else{
if(lastIsLower){
if(low[i] < ExtLowerBuffer[lastLowerIndex]){
ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
}
}
}
}
}
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
Können Sie mir sagen, wie ich das Volumen der offenen Positionen in MQL4 ermitteln kann, wenn SYMBOL_SESSION_INTEREST nicht unterstützt wird? Ich danke Ihnen!
kotaries: Können Sie uns bitte mitteilen, wie man das Volumen der offenen Positionen in MQL4 erhält, wenn SYMBOL_SESSION_INTEREST nicht unterstützt wird? Ich danke Ihnen!
Alle Positionen durchlaufen und ihr Gesamtvolumen berechnen:OrderLots()
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает сумму лотов открытых позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - торговая операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
l+=OrderLots();
}
}
}
}
}
}
return(l);
}
Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?
Wie wird sie überhaupt berechnet?
Dies ist der von OnCalculate() bei der letzten Iteration zurückgegebene Wert. Dies wird in der Dokumentation ausdrücklich erwähnt:
Die Beziehung zwischen dem von OnCalculate() zurückgegebenen Wert und dem zweiten Eingabeparameter prev_calculated sollte beachtet werden. Der Parameter prev_calculated enthält beim Aufruf der Funktion den von OnCalculate() beim vorherigen Aufrufzurückgegebenen Wert. Dies ermöglicht sparsame Algorithmen für die Berechnung des benutzerdefinierten Indikators, um wiederholte Berechnungen für die Balken zu vermeiden, die sich seit dem letzten Aufruf dieser Funktion nicht verändert haben.
Hallo!
Ja. Es gibt keinen Grund, die Zeit in eine Zeichenkette zu übersetzen, da die Zeit eine Anzahl von Sekunden ist. Diese Zahl ist viel einfacher und schneller zu verarbeiten als Zeichenketten.
Sie haben eine Sache korrigiert und eine andere verdorben.)
Im zweiten Teil anstelle von:
Rückkehr:
In Ihrem letzten Versuch hatten Sie diese Zeile richtig geschrieben.
Vielen Dank für die Antworten! Ich habe beide Möglichkeiten ausprobiert.
Ich verstehe nicht, wo der Haken ist - er geht immer noch rein, wenn man auf einen Anschlag zugeht:
Sprechen Sie Ihren Zustand laut aus und Sie werden sehen, was los ist)
In der Tat gibt es überall != Bedingung, das heißt, das Gegenteil > sollte dort sein, wenn ich richtig verstanden habe, was Sie meinen. Aber alle Varianten liefen - funktionieren noch.
Helfen, die Logik zu verstehen, den Fehler zu finden
Der Code wurde detailliert auskommentiert.
Ich brauche es, um Fraktale mit einem Punkt zu zeichnen, mit einem "Zickzack"-Typ, so dass die untere obere obere untere Fraktale in Folge gehen und so weiter.
Das Ergebnis ist, dass die wiederholten Fraktale trotzdem auf dem Diagramm erscheinen.
Die Basis ist dem Standard-Fraktal-Indikator entnommen. Screenshot unten mit wiederholtem Fraktal in Periode 5
Können Sie uns bitte mitteilen, wie man das Volumen der offenen Positionen in MQL4 erhält, wenn SYMBOL_SESSION_INTEREST nicht unterstützt wird? Ich danke Ihnen!
Alle Positionen durchlaufen und ihr Gesamtvolumen berechnen:OrderLots()
Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?
Wie wird sie überhaupt berechnet?
Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?
Wie wird sie überhaupt berechnet?
Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?
Wie wird sie überhaupt berechnet?
Dies ist der von OnCalculate() bei der letzten Iteration zurückgegebene Wert. Dies wird in der Dokumentation ausdrücklich erwähnt:
Die Beziehung zwischen dem von OnCalculate() zurückgegebenen Wert und dem zweiten Eingabeparameter prev_calculated sollte beachtet werden. Der Parameter prev_calculated enthält beim Aufruf der Funktion den von OnCalculate() beim vorherigen Aufrufzurückgegebenen Wert. Dies ermöglicht sparsame Algorithmen für die Berechnung des benutzerdefinierten Indikators, um wiederholte Berechnungen für die Balken zu vermeiden, die sich seit dem letzten Aufruf dieser Funktion nicht verändert haben.
Die Aufgabe besteht darin, den Balken mit der geringsten Schließung zu finden
for(int x=0; x<=xBars -1; x++)
{
Gegen++;
// Print(Close[x],",",counter);
int h = ArrayMinimum(Close[x]);
if(Zähler > 20) break;
}
Compiler schwört auf Close