Igor, kannst du mir einen Tipp geben? Etwas vom Indikator(iMA) im EA kommen die Werte mit 4 Nachkommastellen, während ich 5 für die Arbeit brauche! Ich habe NormalizeDouble(iMA,Digits) ausprobiert - es sind immer noch 4 Dezimalstellen. Ist es notwendig, den gesamten Indikator in eine Unterprogrammfunktion des Expert Advisors umzuschreiben, um 5 Stellen zu erhalten?
Ich komme mit dem korrekten Schließen von Positionen nicht zurecht. Es gibt zwei Bedingungen für die Schließung: 1. wenn eine Position offen ist; 2. wenn zwei (oder mehr) Positionen offen sind. In beiden Fällen ist das Losvolumen = 0,03. Im ersten Fall wird das Los separat um 0,01 geschlossen (wie in den obigen Beiträgen berechnet). Im zweiten Fall sollten zwei Lose jeweils um 0,03 geschlossen werden:
if(OrderType()==OP_BUY&& BuyTotalOp==1)
dann die erste Variante von Schließen und wenn:
if(OrderType()==OP_BUY&& BuyTotalOp>1)
dann die andere (in meiner Variante (vorläufig), wenn die Summe der Gewinne beider Positionen > 0 ist, dann sollten beide Positionen geschlossen werden). Es sieht so aus:
externdouble Lots=0.03;// Жестко заданное колич. лотов.................................// Учёт количества имеющихся ордеров
Symb=Symbol();// Название фин.инстр.
BuyTotalOp=0;// Количество Buy ордеров
SellTotalOp=0;// Количество Sell ордеровfor(int i=1; i<=OrdersTotal(); i++)// Цикл перебора ордер{if(OrderSelect( i-1, SELECT_BY_POS)==true)// Если есть следующий{// Анализ ордеров:if(OrderSymbol()!= Symb)continue;// Не наш фин. инструмif(OrderType()>1)// Попался отложенный{Alert("Обнаружен отложенный ордер. Эксперт не работает.");return;// Выход из start()}if(OrderType()==OP_BUY){
BuyTotalOp++;// Счётчик ордеров Buy......................................//Проверка если открыто несколько БАЙ-позицийif(OrderType()==OP_BUY&& BuyTotalOp>1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия нескольких лотов БАЙif( BuyOrdProf>0){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);// Закрытие Buyif( Ans==true)// Получилось :){Alert("Закрыт ордер Buy ", TicketCl);break;// Выход из цикла закр}if( Fun_Error(GetLastError())==1)// Обработка ошибокcontinue;// Повторная попыткаreturn;// Выход из start()}}//.........................................//Проверка если открыта одна БАЙ-позицияif(OrderType()==OP_BUY&& BuyTotalOp==1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия одного лота БАЙif( BUYCLOSE_1PART && BuyClLot== Lots){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);// Закрытие Buyif( Ans==true)// Получилось :){Alert("Закрыт ордер Buy ", TicketCl);break;// Выход из цикла закр}if( Fun_Error(GetLastError())==1)// Обработка ошибокcontinue;// Повторная попыткаreturn;// Выход из start()}
Tatsächlich stellt sich heraus, dass, wenn die Bedingungen für das Schließen beider Lose auftreten, das erste Los vollständig geschlossen wird, während das zweite Los die Schließungsbedingungen BuyTotalOp==1 "übernimmt" und nach seinen eigenen Bedingungen schließt.
Bitte teilen Sie mir mit, was mit den Abschlussbedingungen nicht stimmt und wie man beide Lose auf einmal abschließen kann? Vielen Dank im Voraus.
Ich habe sowohl OrderTicket() als auch Lots counting und plusing in der Bestellschleife ausprobiert - ohne Erfolg... Vielleicht ist, wie immer, "die Wahrheit irgendwo in der Nähe", aber sie kommt nicht an...
...denn irgendwo fehlt eine }, und es wird unklar, was genau gemacht wird...vielleicht versuchen Sie, vorübergehend die Anzahl der Aufträge zu zählen und sie sofort zu löschen, oder was ? schwebende Aufträge sollten besser übersprungen und nicht unterbrochen werden, wenn sie existieren ?
Eine gute Option wäre eine Funktion, die nach gegebenen Bedingungen ein Array mit Parametern von offenen Aufträgen bilden würde, die Sie durchlaufen und schließen können ... im Allgemeinen, arbeiten Sie an der Struktur ...
Danke, keekkenen, ich habe in letzter Zeit über die Erstellung eines Arrays nachgedacht. Es ist nur so, dass ich noch nie damit gearbeitet habe und gehofft habe, dass es eine einfachere Lösung gibt, dass ich schon ein "geschlossenes" Auge habe, und dass jemand mit frischen Augen darauf schaut und sagt "Mensch, wo ist dein Zählen so-und-so...". Nun, alle Kaufaufträge in der Schleife sind berechnet worden:
// Учёт количества имеющихся ордеров от начала к концу
Symb=Symbol();// Название фин.инстр.
BuyTotalOp=0;// Количество Buy ордеров
SellTotalOp=0;// Количество Sell ордеровfor(int i=1; i<=OrdersTotal(); i++)// Цикл перебора ордер{if(OrderSelect( i-1, SELECT_BY_POS)==true)// Если есть следующий{// Анализ ордеров:if(OrderSymbol()!= Symb)continue;// Не наш фин. инструмif(OrderType()>1)// Попался отложенный{Alert("Обнаружен отложенный ордер. Эксперт не работает.");return;// Выход из start()}if(OrderType()==OP_BUY){
BuyTotalOp++;// Счётчик ордеров Buy....................................
//Проверка если открыто несколько БАЙ-позицийif(OrderType()==OP_BUY&& BuyTotalOp>1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия нескольких лотов БАЙif( BuyOrdProf>0){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);// Закрытие Buy...................................................................
Nun, ja, es ist offensichtlich ein "Overkill" .......
Ein Drittel des Lots wird geschlossen (gemäß einer der Bedingungen - nehmen wir an, der Preis hat +150 Pips erreicht). Das zweite Drittel wird geschlossen, sagen wir, wenn +300 Pips von der Eröffnung, usw...
hope>> Nicht dasselbe. Ein Drittel des Lots wird geschlossen (je nach einer der Bedingungen - nehmen wir an, der Kurs hat +150 Punkte erreicht). Das zweite Drittel wird geschlossen, sagen wir, wenn +300 Pips von der Eröffnung, usw..
Nein, das funktioniert nicht. Ein Auftrag - ein Lot, wenn Sie einen Auftrag mit 3 Lots eröffnet haben, können Sie das Lot nicht in irgendeiner Weise aufteilen - erst 1, dann 1 und dann 1 - der Auftrag schließt das gesamte Lot, d.h. der Auftrag schließt mit dem gleichen Lot wie er eröffnet wurde, Sie können Aufträge nicht in Teilen schließen...
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Igor, kannst du mir einen Tipp geben? Etwas vom Indikator(iMA) im EA kommen die Werte mit 4 Nachkommastellen, während ich 5 für die Arbeit brauche! Ich habe NormalizeDouble(iMA,Digits) ausprobiert - es sind immer noch 4 Dezimalstellen. Ist es notwendig, den gesamten Indikator in eine Unterprogrammfunktion des Expert Advisors umzuschreiben, um 5 Stellen zu erhalten?
Hilfe: Alert(), Comment(), Print()
Daten vom Typ Double werden mit 4 Dezimalstellen nach dem Punkt ausgegeben.
Verwenden Sie DoubleToStr(), um Zahlen mit größerer Genauigkeit auszugeben.
Guten Abend,
Ich komme mit dem korrekten Schließen von Positionen nicht zurecht. Es gibt zwei Bedingungen für die Schließung: 1. wenn eine Position offen ist; 2. wenn zwei (oder mehr) Positionen offen sind. In beiden Fällen ist das Losvolumen = 0,03. Im ersten Fall wird das Los separat um 0,01 geschlossen (wie in den obigen Beiträgen berechnet). Im zweiten Fall sollten zwei Lose jeweils um 0,03 geschlossen werden:
dann die erste Variante von Schließen und wenn:
dann die andere (in meiner Variante (vorläufig), wenn die Summe der Gewinne beider Positionen > 0 ist, dann sollten beide Positionen geschlossen werden). Es sieht so aus:
Tatsächlich stellt sich heraus, dass, wenn die Bedingungen für das Schließen beider Lose auftreten, das erste Los vollständig geschlossen wird, während das zweite Los die Schließungsbedingungen BuyTotalOp==1 "übernimmt" und nach seinen eigenen Bedingungen schließt.
Bitte teilen Sie mir mit, was mit den Abschlussbedingungen nicht stimmt und wie man beide Lose auf einmal abschließen kann? Vielen Dank im Voraus.
Trennen Sie die Fliegen von den Koteletts... schreiben Sie einige nützliche Funktionen...
Zählen Sie zum Beispiel die Anzahl der offenen Aufträge nach Auftragsart, die abgeschlossenen Aufträge nach Auftragsart usw..
dann wird alles einfacher sein...
...denn irgendwo fehlt eine }, und es wird unklar, was genau gemacht wird...vielleicht versuchen Sie, vorübergehend die Anzahl der Aufträge zu zählen und sie sofort zu löschen, oder was ? schwebende Aufträge sollten besser übersprungen und nicht unterbrochen werden, wenn sie existieren ?
Eine gute Option wäre eine Funktion, die nach gegebenen Bedingungen ein Array mit Parametern von offenen Aufträgen bilden würde, die Sie durchlaufen und schließen können ... im Allgemeinen, arbeiten Sie an der Struktur ...
Danke, keekkenen, ich habe in letzter Zeit über die Erstellung eines Arrays nachgedacht. Es ist nur so, dass ich noch nie damit gearbeitet habe und gehofft habe, dass es eine einfachere Lösung gibt, dass ich schon ein "geschlossenes" Auge habe, und dass jemand mit frischen Augen darauf schaut und sagt "Mensch, wo ist dein Zählen so-und-so...". Nun, alle Kaufaufträge in der Schleife sind berechnet worden:
und OrderClose zählt sie nicht...
Nun, ja, es ist offensichtlich ein "Overkill" .......und offen gesagt, verstehe ich das nicht.
und diese, insbesondere die Teilung des Loses durch 3 ? der Auftrag wird mit demselben Los geschlossen, mit dem er eröffnet wurde...
warum nicht in beiden Fällen?
warum nicht in beiden Fällen?
CloseTicketCl = OrderTicket () im Allgemeinen können Sie dies tun...
und das, vor allem wenn man das Lot durch 3 teilt ?? der Auftrag wird mit demselben Lot geschlossen, mit dem er eröffnet wurde...
nicht dass
elbe.Ein Drittel des Lots wird geschlossen (gemäß einer der Bedingungen - nehmen wir an, der Preis hat +150 Pips erreicht). Das zweite Drittel wird geschlossen, sagen wir, wenn +300 Pips von der Eröffnung, usw...
und ehrlich gesagt verstehe ich diese
hiernicht
Lots und OrderLots() ja, das gleiche.Nein, das funktioniert nicht. Ein Auftrag - ein Lot, wenn Sie einen Auftrag mit 3 Lots eröffnet haben, können Sie das Lot nicht in irgendeiner Weise aufteilen - erst 1, dann 1 und dann 1 - der Auftrag schließt das gesamte Lot, d.h. der Auftrag schließt mit dem gleichen Lot wie er eröffnet wurde, Sie können Aufträge nicht in Teilen schließen...