[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 299

 
palomnik:

//-----------------------------------------------------------------------------+
//Kim Respekt und Achtung !!! |
//+----------------------------------------------------------------------------+

Dies war zweifellos der stressigste Teil des Codes))))

Ja. Ich verstehe gar nichts. Ich habe die zweite TF zum Laufen gebracht. Alles sollte wie am Schnürchen laufen. Aber das ist nicht der Fall. Nein, es funktioniert zwar, aber nicht wie erwartet. Ich habe es tausendmal überprüft. Ich selbst kann keine syntaktischen oder algorithmischen Fehler erkennen. Ich versuche es zu erklären und füge den vollständigen Code bei. Also:

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

Am Anfang von start() habe ich einen Handler für die Anzahl der Sekunden, die seit dem letzten start() vergangen sind, eingefügt. Wiederholte Abschnitte wurden in benutzerdefinierte Funktionen verschoben. Der neue Wert time=TimeCurrent() wird dort in Benutzerfunktionen zugewiesen.

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

Die Funktion arbeitet in zwei Modi: im ersten Zweig, AtFirst=true, fängt sie nur einen Tick ab und setzt den Array-Speicher auf Null, während sie im zweiten Zweig, AtFirst=false, genau wie ein Tick-Speicher arbeitet. Das bedeutet, dass wir entweder den Drive auf Null setzen und abschneiden und den Geld-Brief in einer Nullzelle einfangen, oder den Drive verlängern und den Geld-Brief einfangen. Alert wurde nur zur Fehlersuche verwendet. Ich werde den Zustand der Nullstellung des Akkumulators weiter unten beschreiben.

void WriteBar(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        }else{
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  ArraySize(ask), DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                if(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
                if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
                /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

Die Funktion des "Zeichnens" der Kerze (Hinzufügen einer Kerze zur .hst, die im autonomen Chart geöffnet ist). Ähnlich verhält es sich mit den Warnungen zur Fehlersuche. Der erste Alarm signalisiert bei zwei gefangenen Ticks in einer Sekunde (Array-Größe ist gleich zwei, und in der Idee sollte das Volumen gleich zwei sein), während der zweite bei Bit gleich ack im gefangenen Tick signalisiert (ähnlicher Alarm in Laufwerk: aber sie arbeiten nicht synchron aus irgendeinem Grund), und das Volumen der Kerze. Theoretisch ist das alles richtig, aber wenn man zum Beispiel zwei (oder 0x00 00 00 00 00 00 00 00 40, double 2.0) in die Datei eingibt, wird daraus trotzdem eins (0x00 00 00 00 00 00 00 F0 3F, double 1.0 im BigEndian-Format). Normalerweise setze ich diesen Alarm im Laufwerk außer Kraft, es piept oft, ich arbeite mit diesen beiden.

void WriteDash(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //аналогично убрал, т.к. к вопросу не относится.
        }else{//ставим прочерк на Close[0]
                Δtime--; time++;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
        }
}

Die Funktion "zeichnet" einen Strich für den Fall, dass in welcher Sekunde kein Tick erfolgt. Es funktioniert nach dem folgenden Algorithmus:

Δtime=0: Zecken fangen (kopieren).

Δtime=1: Zeichnen Sie einen Candlestick auf dem Tick, der zuvor gefangen wurde, und fangen Sie dann den Tick ein (mit einem vorläufig auf Null gesetzten Akkumulator).

Δtime>1: Zeichnen Sie eine Kerze auf dem zuvor gefangenen Tick, zeichnen Sie Striche auf der Close[0]-Linie in Höhe vonΔtime-1, fangen Sie einen Tick (mit zuvor auf Null gesetztem Akkumulator). In allen Fällen sollte der Akkumulator auf Null gesetzt werden, wenn bereits eine Kerze darauf gezogen wurde und dies bedeutet, dass der Akkumulator nicht mehr benötigt wird. Dies geschieht, wennΔtime>0.

Gehen wir es mal durch:

Der Pfeil hat die Momente gezeichnet, in denen das Gebot gleich dem asc sein soll und das Volumen gleich eins sein soll. Den Boden habe ich nicht mit Volumen erfasst, da man dort sowieso nichts sehen kann, er ist flach. Aber sie sind alle gleich, d. h. entweder null oder eins, keine geht bis zwei (obwohl der Alarm ein Signal ist). Zwei Ticks pro Sekunde - noch bei einem Maus-Hover zeigt ironischerweise Volumen = 1, und das Gebot ist gleich asku auch ironisch zeigt Volumen = 0. Warum? Mir ist klar, dass irgendwo ein Fehler vorliegt, aber höchstwahrscheinlich bemerke ich den Fehler nicht, oder ich suche an der falschen Stelle. Ich hänge den Code an, ich habe meinen Teil des Codes gut auskommentiert, überall Einrückungen überprüft, Einfügungen entfernt, nur die zu verwendenden Funktionen ausgewählt, damit er schneller kompiliert werden kann. Die einzige Bemerkung - es funktioniert nicht offline, d.h. mit TimeLocal, im Gegensatz zum ursprünglichen Tick-Collector, weil ich if(tickTimeLocal==true) dort von Anfang an reingeschrieben habe (da ich es nicht oft brauchte). Ich habe versucht, es in Expert Advisor nach Taras' Rat zu übersetzen - Candlesticks werden im autonomen Chart nicht angezeigt (aber die Linie des aktuellen Kurses bewegt sich gut).

Dateien:
fif.ta.mq4  18 kb
 
artmedia70:

Ihre Pantoffeln.

Sie sollten von der Verwaltung einen Spoiler erhalten. Mir ist aufgefallen, dass unkommentiertes Schuhwerk aus irgendeinem Grund nicht weniger Schuhwerk wird))
 

Hallo

Ich habe eine Frage. Nehmen wir an, heute ist Montag. Ich muss den Schlusskurs vom Freitag wissen. Ich muss den Schlusskurs vom Freitag wissen.

iClose(NULL, Period_D1, 1)
Ich habe diese Frage gestellt, weil ich die Balken für Samstag und Sonntag im Strategy Tester sehe. Ich habe an diesen Tagen nicht gehandelt. Über der geschriebenen Linie ist der Schlusskurs am Freitag oder Sonntag?
 
gince:

Hallo

Ich habe eine Frage. Nehmen wir an, heute ist Montag. Ich muss den Schlusskurs vom Freitag wissen. Kann ich schreiben

Ich habe diese Frage, weil ich im Strategy Tester am Samstag und Sonntag Balken sehe. An diesen Tagen handle ich nicht. Die oben geschriebene Zeile gibt den Schlusskurs am Freitag oder Sonntag an?

Geben Sie mir den Preis vom Freitag! Wenn der Server am Freitag spätestens um 24.00 Uhr schließt und am Sonntag frühestens um 0.00 Uhr wieder öffnet!

Verwenden Sie den DailyPivotPoints-Indikator!

 

Nein, ich verstehe das überhaupt nicht. Offensichtlich schon schreiben

                switch(ArraySize(ask)){
                 case 0: FileWriteDouble(hand1e,  0.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 0")); break;
                 case 1: FileWriteDouble(hand1e,  1.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 1")); break;
                 case 2: FileWriteDouble(hand1e,  2.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 2")); break;
                 default: Alert("!!!!! - ", ArraySize(ask));
                }

Bei den Alarmen gleich 2, nehme ich den Indikator von den Minuten, ziehe ich die Maus über die Kerze... Volumen=1.

Looked RateInfo in hst durch FileInsight (wie Debugger), ich denke, vielleicht dort int, aber nicht double in Volume - nein, same-double...

 

Guten Abend.

Vielen Dank für die Beantwortung meiner Frage))

Bitte sagen Sie mir, wenn ich einen Kaufauftrag wie folgt erteile OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Wenn es sich um einen Verkaufsauftrag handeltOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red);


ist die Differenz blau oder muss auch die rote Farbe geändert werden? d.h. wenn OP_BUY der Angebotspreis ist

wobei OP_SELL den Briefkurs enthält

Ich wollte auch überprüfen, ob sich meine Order nicht geändert hat, und ich wollte sie nicht ändern. Warum ging im Strategy Tester und in der Demo alles gut, aber ich bekam einen Fehler von 129, als ich versuchte, sie im REAL Market zu öffnen?

 
ed3sss:

Guten Abend.

Vielen Dank für die Beantwortung meiner Frage))

Bitte sagen Sie mir, wenn ich einen Kaufauftrag wie folgt erteile OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Wenn es sich um einen Verkaufsauftrag handeltOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red);

ist die Differenz blau oder muss auch die rote Farbe geändert werden? d.h. wenn OP_BUY der Angebotspreis ist

wobei OP_SELL den Briefkurs enthält

Ich wollte auch überprüfen, ob sich meine Order nicht geändert hat, und ich wollte sie nicht ändern. Warum ging im Strategy Tester und in der Demo alles gut, aber ich bekam einen Fehler von 129, als ich versuchte, sie im REAL Market zu öffnen?

Wenn Sie Buy öffnen, auf Asc, wenn Sell auf Bid! Und andersherum!
 
ed3sss:

Guten Abend.

Vielen Dank für die Beantwortung meiner Frage))

Können Sie mir sagen, ob ich einen Kaufauftrag wie folgt eröffne OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Wenn es sich um einen Verkaufsauftrag handeltOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red);

...
Auf Kaufen:
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,"Покупка",0,0,Green);

Verkaufen:

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,0,0,"Продажа",0,0,Red);

Ich empfehle, die Angebote vor dem Absenden einer Bestellung zu aktualisieren:

RefreshRates();
OrderSend (...);
Und beachten Sie, dass Ihr Schlupf =3, für 4-stellige Kurse wird =3 Pips und für 5-stellige Kurse wird es als 0,3 Pips berechnen. Wenn Ihr EA also mit 5-stelligen Kursen arbeiten soll, dann setzen Sie Slipage = 30.
 
gyfto:

Nein, ich verstehe das überhaupt nicht. Offensichtlich schreibe ich bereits

Bei den Alarmen gleich 2, nehme ich den Indikator von den Minuten, ziehe ich die Maus über die Kerze... Volumen=1.

Looked RateInfo in hst durch FileInsight (wie Debugger), ich denke, vielleicht dort int, aber nicht double in Volume - nein, same-double...

Ich habe mir Ihren Code angesehen.... Sie haben alles zu sehr durcheinander gebracht))))

Ich verstehe nicht ganz, warum wir Ticks akkumulieren müssen, denn es reicht aus, die Parameter des aktuellen Balkens - sechs Zahlen TOHLCV - im Speicher zu speichern (oder auch nicht zu speichern, da der aktuelle Balken in HST geschrieben werden muss - sonst wird das Diagramm nicht aktualisiert) und sie bei Bedarf beim Tick-Empfang zu aktualisieren und den Balken bei einer bestimmten Bedingung(TimeCurrent()-O>1) abzuschneiden.

Versuchen Sie, den Code auf diese Weise zu überarbeiten, er wird sich um das 8-fache verringern, das garantiere ich Ihnen (ich habe es überprüft:)

 
Ich habe versucht, einen Indikator zu überprüfen, ich habe die Zahlen auf dem Diagramm, aber sie ändern sich nicht, ich werde versuchen, es auf eine andere Art und Weise, ich brauche den beigefügten Indikator, um den Preis als ein Kreuz, das auf einem Zickzack oder Alarm oder Druck steht fixieren, aber es friert auf die Verbindung.
Dateien: