Kerzenwechsel
Hallo,
1. wie kann ich einen Kerzenwechsel d.h. long Kerze nach short Kerze u. umgekehrt abfragen. 2. nach Eröffnen eines Trades soll nach z.B. 4 Kerzen die Position wieder geschlossen werden. Bitte um Hilfe. Gruß Dieter |
zu1.)
Long- zu Short-Kerze: if (Close[2] > Open[2] && Close[1] < Open[1]) Short- zu Long-Kerze: if (Close[2] < Open[2] && Close[1] > Open[1]) zu 2.) if (Time[0] > OrderOpenTime() + 4*Period()*60) traderdoc |
Danke für die schnelle Antwort
LG Dieter |
Hab mal versucht das Schließen der Order in den Ea einzubauen. Klappt leider nicht.Wo ist der Fehler?
extern int StopLoss=50; extern int TakeProfit=50; //+------------------------------------------------------------------+ void start() { double SL,TP; int i,Total; int Dig=MarketInfo(Symbol(),MODE_DIGITS); int order_ticket; //+------------------------------------------------------------------+ Total=OrdersTotal(); if(Total>0) { for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) { if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderStopLoss()==0 && OrderTakeProfit()==0) { if(StopLoss>0)SL=OrderOpenPrice()+StopLoss*Point;e lse SL=0; if(TakeProfit>0)TP=OrderOpenPrice()-TakeProfit*Point;else TP=0; OrderModify(OrderTicket(),OrderOpenPrice(),Normali zeDouble(SL,Dig),NormalizeDouble(TP,Dig),0,CLR_NON E); if (Time[0] > OrderOpenTime() + 2*Period()*60) OrderClose(OrderTicket(),0.1,Bid,3,0); return(0); } if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderStopLoss()==0 && OrderTakeProfit()==0) { if(StopLoss>0)SL=OrderOpenPrice()-StopLoss*Point;else SL=0; if(TakeProfit>0)TP=OrderOpenPrice()+TakeProfit*Poi nt;else TP=0; OrderModify(OrderTicket(),OrderOpenPrice(),Normali zeDouble(SL,Dig),NormalizeDouble(TP,Dig),0,CLR_NON E); if (Time[0] > OrderOpenTime() + 2*Period()*60) OrderClose(OrderTicket(),0.1,Ask,3,0); return(0); } } } } } |
"Klappt leider nicht" ist zwar das Endergebnis Deiner Beobachtung, mit der man aber manchmal sehr wenig anfangen kann. In diesem Falle ist der Fehler offensichtlich, dass bei OrderClose() die BuyOrder mit dem Bid und die SellOrder mit dem Ask geschlossen werden muß! Vorausgesetzt die Lotgröße beträgt tatsächlich 0.1.
Also, wenn irgendwas nicht klappt, dann gibt es in der Regel auch eine Fehlermeldung des MT4 im Terminal unter Reiter "Expert". Und in diesem Falle bin ich mir sicher, dass da stand: INVALID_PRICE. traderdoc |
habe Bid und Ask getauscht, Order wird nicht beendet, läuft einfach weiter .
Beim Kompilieren erscheint keine Fehlermeldung nur Warnings. Gruß Dieter |
Nein, ich meine nicht beim Compilieren, sondern wenn der EA im Chart läuft, werden alle Fehlermeldungen im Terminal unter dem Reiter "Expert" aufgelistet. Wenn der EA also zum erwarteten Zeitpunkt nicht schließt könnte da eine Meldung stehen.
Und dann nimm bitte zum Schreiben des Codes den Button # über dem Textfeld. Den Code kann man dann viel besser lesen. Desweiteren wird der EA dann die Orders nicht schließen, weil über if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderStopLoss()==0 && OrderTakeProfit()==0) in diesen Teil nur eingesprungen wird, wenn auch tatsächlich SL und TP 0 sind. Das aber darunter der SL und TP in der Order gesetzt werden, würde beim nächsten Tick nicht mehr die Bedingung erfüllt sein und damit würde die Zeile OrderClose(OrderTicket(),0.1,Bid,3,0); nicht durchlaufen werden - also auch kein Close. Es macht sich gut, immer an bestimmten Stellen ein Print("Irgendetwas"); einzufügen. Dann sieht man im Reiter Expert des Terminals nämlich, wo der EA langgelaufen ist und wo eben nicht. traderdoc |
ok, hat geklappt. Jetzt noch Punkt 1. Umkehrkerze einbauen. Wo kann man die Abfrage am besten einbauen?
Danke im vorraus Dieter |
Am Anfang mittels:
Code:
//global datetime OldBar; deklarieren traderdoc |
verstehe ich jetzt nicht. Wird mit dieser Abfrage festgestellt ob ein Kerzenwechsel vorliegt?
|
Ja klar. Da nur nach einem Kerzenwechsel die letzte und vorletzte Kerze abgefragt werden muß, braucht diese Abfrage auch nur einmalig pro Kerze sein.
traderdoc |
hab mal die Long Routine soweit hingebracht, daß das Opening bei Kerzenwechsel funktioniert, nur das Schließen geht nicht, d. h. die Position wird sofort geschlossen. Im Terminal wird angezeigt: invalid ticket for OrderClose function.
Code: extern double Lot=0.01; extern int StopLoss=6; extern int TakeProfit=10; int Multiplier; int i=0; int zaehler; int MagicNumber=1234; double TPValue,SLValue; //+------------------------------------------------------------------+ void OnInit() { Multiplier = 1; if(Digits == 3 || Digits == 5) Multiplier = 10; if(Digits == 6) Multiplier = 100; if(Digits == 7) Multiplier = 1000; TakeProfit *= Multiplier; StopLoss *= Multiplier; TPValue = NormalizeDouble(TakeProfit * Point, Digits); SLValue = NormalizeDouble(StopLoss * Point, Digits); } void start() { int ticket; string comment="Expiration v2 (Long)"; //+------------------------------------------------------------------+ int offeneorders=0; int anzahlorders=OrdersTotal(); if (Close[2] < Open[2] && Close[1] > Open[1]) { for(zaehler=0; zaehler<anzahlorders; zaehler++) { OrderSelect(zaehler, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol()) { offeneorders++; } } if(offeneorders==0) { ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-SLValue,Ask+TPValue,comment,0,0,Blue); } if (Time[0] > OrderOpenTime() + 4*Period()*60) { OrderClose(ticket,Lot,Bid,3,0); } } return(0); } |
Ich habe mir mal erlaubt, den Code per #-Button so darzustellen, dass man ihn auch lesen kann. So sollte das in Zukunft immer geschrieben werden, sonst kann ihn keiner helfen!
Code:
extern double Lot=0.01; Ich habe Einiges umgestellt und v.a. über Funktionsaufrufe den Code strukturiert und die SellOpen-Funktion eingebaut. Code:
extern double Lot=0.01; traderdoc |
DANKE ! !
werde es gleich ausprobieren. LG Dieter |
Hallo traderdoc,
klappt prima, jetzt wollte ich noch, daß wenn die Position geschlossen wird, er nicht sofort in die laufende Kerze wieder eröffnet. Gruß Dieter23 |
Code:
datetime OldBar; traderdoc |
vielleicht erinnern Sie sich noch an mich, Sie haben mir vor ca. 2 Jahre einen Bot programmiert. Name devisen-scalper, der martingalmäßig nachkauft über RSI Signal. Lief eine Weile sehr gut, dann hat er mir mein Konto geplättet.
Gruß Dieter23 |
Ja natürlich. Das ist natürlich sehr schade, lag jedoch nicht an meinem Teil der Programmierung. Der Hauptteil des EAs war fremdgecodet, was auch nicht bedeutet, dass da die Ursache zu suchen sei. Ein Handelssystem auf Martingale-Basis ist immer ein heißes Eisen, mit viel Potential nach oben, aber eben auch nach unten.
Wenn es wieder mal was zu programmieren gibt, dann sagen Sie einfach Bescheid. traderdoc |
Ja klar, Ihre Programmierung war spitze. War halt sehr riskant mit Martingale.
Wenn ich wieder Hilfe brauche melde ich mich.Ok. LG Dieter23 |
Alle Zeitangaben in WEZ +2. Es ist jetzt 01:14 Uhr. |
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum