[Archiv!] Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Könnte nirgendwo ohne dich hingehen - 2. - Seite 82

 
nemo811:
Vielen Dank für die Hilfe. Ich habe die Logik des Setzens des Flags und die Funktion der Rückgabe der Anzahl der Aufträge verstanden. Mich interessiert aber auch der Zeitpunkt, an dem der Auftrag abgeschlossen wird. Es sieht so aus, als ob die Flaggenbedingung versucht, erneut einen Auftrag zu platzieren, aber die Funktion, die die Auftragsnummer zurückgibt, sagt, dass sie um 1 gesunken ist, und initialisiert auch die Eröffnung einer Position. Korrigieren Sie mich, wenn ich etwas übersehen habe.


In dem von Ihnen bereitgestellten Code befindet sich die Bedingung an einer Stelle (BUY=true) und bis sich die Flagge ändert, wird die Wiedereröffnung nicht stattfinden... denn der Funktionsaufruf zum Öffnen einer Position kommt aus diesem Bedingungsblock... Und die Flagge in diesem Code kann sich erst nach dem Neustart des EA ändern, wenn die Variable mit dem Wert true initialisiert wird.

Oder vielleicht verstehe ich die Frage nicht:)

 
NameLess:


Das Flag in diesem Code kann sich erst nach einem Neustart des Expert Advisors ändern, wenn die Variable mit dem Wert true initialisiert wird.

oder ich verstehe die Frage nicht:)


Danke, Sie haben es richtig verstanden. Ich werde sie jetzt umsetzen.
 
NameLess:


Dies ist die Version, die funktioniert hat. Vielen Dank an Sie und IgorM:

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3; 
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int ticket = -1;
while (ticket<0)
{
if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
Sleep(500);
}
return;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

Leute, nichts hilft! Ich kann keinen Wert mit 5 Dezimalstellen erhalten. Ich habe alle Optionen ausprobiert, die mir einfielen, ich habe eine Zeichenkette in eine Zahl umgewandelt, ich habe eine Teilzeichenkette in eine Zahl umgewandelt, ich habe Ziffern herausgenommen (Beispiel oben) und ich habe sie dummerweise eine nach der anderen addiert, jenseits von 4 Dezimalstellen addiert es einfach nicht und fängt an, auf 4 Dezimalstellen zu runden. ich habe sogar die 6.

Kann es sein, dass Alert keine doppelten Variablen jenseits des 4. Zeichens anzeigt? Ich weiß nicht, was ich denken soll... eine Art Mysterium(

 

Ich habe zwei EAs geschrieben, die miteinander verbunden sind (sie handeln nicht, sondern erstellen nur Gobals) und ich denke, ich kann sie verwenden, um einen Equi-Volumen-Chart-Indikator zu erstellen, der dem regulären Preis-Chart in mt4 ähnelt. Oder wenn jemand bereits etwas Ähnliches verwendet hat, teilen Sie bitte den Code:)

Dateien:
eqvol.rar  3 kb
 
NameLess:

Kann es sein, dass Alert keine doppelten Variablen jenseits der 4. Stelle anzeigt? (es wird die ganze Zeichenfolge angezeigt) Ich weiß nicht, was ich denken soll... eine Art Mysterium(

Ja, es werden (wie bei Print) die üblichen 4 Ziffern angezeigt, wenn nur eine Zahl ausgegeben wird.

Verwenden Sie DoubleToStr, um genauer zu sein.

 

Rrrrrrrrrrrrrrr. Richtig, das Terminal in Alert zeigt nicht mehr als 4 Zeichen an. Ich habe das Double zurück auf die Leitung geschaltet und es herausgenommen, um auf den Bildschirm zu schauen - alles ist korrekt.

einen halben Tag für diesen Unsinn geopfert. blechern, und alles funktionierte anfangs(

 
NameLess:

Leute, nichts hilft! Ich kann keinen Wert mit 5 Dezimalstellen erhalten. Ich habe alle Optionen ausprobiert, die mir einfielen, ich habe eine Zeichenkette in eine Zahl umgewandelt, ich habe eine Teilzeichenkette in eine Zahl umgewandelt, ich habe Ziffern herausgenommen (Beispiel oben) und ich habe sie dummerweise eine nach der anderen addiert, jenseits von 4 Dezimalstellen addiert es einfach nicht und fängt an, auf 4 Dezimalstellen zu runden. ich habe sogar die 6.

Kann es sein, dass Alert nicht mehr als die 4-stellige Variable double anzeigt? (Der String zeigt alles an) Ich weiß nicht, was ich denken soll.

Nun, wie immer bleibt alles dem Experiment überlassen. Wir schreiben das Drehbuch:

#property copyright ""
#property link      ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  string Stroka,Podstroka,SMB;
        int DGS,BezDrobi;
        double Rezult;
        SMB=Symbol();
        //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS=5;// дигитс задаём принудительно, чтоб можно было проверить на любой валюте
        // передаём левое значение в переменную
        Rezult=1.252546987;
        // возводим число в степень
        for(int i=1;i<=DGS;i++){
                Rezult=Rezult*10;
        }
        // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult);// функция отбрасывает дробную часть числа
        Alert("BezDrobi = ",BezDrobi);
        // теперь ставим на место запятую
        Rezult=BezDrobi*1.0;
        for(i=1;i<=DGS;i++){
                Rezult=Rezult/10;
                Alert("Rezult = ",Rezult);
        }
        Alert("----------- ",SMB," -----------");
        return(0);
}

Wie wir sehen können, ist eine dll-Karte mit dem Skript verbunden. Es hat nur eine Funktion, die den Bruchteil der Zahl entfernt. Die dll-Datei ist an diesen Beitrag angehängt. Nun sollten wir das Skript nacheinander auf 2 Währungspaare anwenden. Ich setze auf das Pfund und den Euro-Japaner. Beim Pfund habe ich 4 Dezimalstellen. Auf dem Euro-japanischen Währungspaar - zwei. Hier ist das Ergebnis der Skriptoperation:

Im Pfund können Sie sehen, wie sich das Komma konsequent bewegt. Sie können auch sehen, dass die letzte Division 4 Ziffern im Bruchteil übrig lässt. Wir können davon ausgehen, dass die fünfte Stelle nach dem Komma abgeschnitten wird, da meine Ziffern = 4 sind. Das Eurojapanische sollte also auch nur 2 Nachkommastellen ergeben, da die Nachkommastellen = 2 sind. Das Experiment zeigt jedoch, dass auch sie 4 Nachkommastellen ergibt. Unsere Annahme ist also nicht korrekt, und es kann zu Rundungen kommen. Versuchen wir, die letzten 4 durch 7 zu ersetzen. Das Ergebnis:

Was sehen wir? Die resultierende Fünf wird nun zu einer Sechs. Folglich erfolgt eine automatische Rundung.

Ich weiß nicht, wie sich das Skript bei den fünfstelligen Zeichen verhält, aber ich war mit der Arbeit bei den vier- und zweistelligen Zeichen nicht zufrieden - das Terminal mischte sich ein und rundete unaufgefordert ab. Ich muss also Fragen an die Entwickler stellen. Oder - Option 2 - nehmen Indikator Messwerte, setzen Sie sie in eine Zeichenfolge, senden Sie die Zeichenfolge zu einer DLL, verarbeiten die Daten dort, wie wir brauchen und geben Sie den Handel um von der DLL.

Dateien:
experts.rar  42 kb
 

Informationen aus der Hilfe (gemäß dem Alert):

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().

Finden Sie heraus, warum die Entwickler das getan haben...

 
drknn:


Danke, ich habe den Code studiert, sehr interessant. Alles, wie ich oben beschrieben habe, erwies sich als einfacher: das Terminal zeigt einfach nicht mehr als die 4. Stelle im Fenster an. und alle Ideen haben funktioniert, nur das Problem der Konvertierung wurde auf unterschiedliche Weise gelöst :)

zy. Wieder einmal bin ich davon überzeugt, dass alle Probleme logisch gelöst werden, und hier war die Situation ursprünglich unlogisch, so dass wir an der falschen Stelle nach einem Haken gesucht haben :)