Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Das war's. Verstehe. Ich "versuche" zu helfen. Ich denke, es ist an der Zeit, weitere Ideen mitzuteilen.
Das war's. Verstehe. Ich "versuche" zu helfen. Ich denke, es ist an der Zeit, weitere Ideen mitzuteilen.
Wer würde sich für das "alte Fahrrad" interessieren? Sie haben immer noch nicht verstanden, dass das, was Sie zu erforschen versuchen, schon lange im Forum zu finden ist und dass es freie Implementierungen in der Codebasis gibt - schauen Sie nach und spielen Sie herum. Haben Sie Ihre eigenen Ideen? Ansonsten gibt es nichts zu diskutieren.
Bitte helfen Sie mir, die maximale Anzahl offener Bestellungen zum Berater hinzuzufügen!
//+---------------------------------------------- --------------------+
//| v128-2.mq4 |
//| Copyright © 2011, Andrej N. Bolkonsky |
//| 21.03.2011 |
//| E-Mail: abolk@yandex.ru | Skype: abolk1 |
//+---------------------------------------------- --------------------+
#property copyright "Copyright © 2011, Andrey N. Bolkonsky"
#property link "abolk@yandex.ru"
//
extern string rem2 = "=== Anzahl der Lose ===";
extern double _Lots0_1 = 0,1; // Basisebene (für die 1. Ordnung)
extern double _Lots0_2 = 0,1; // Basisebene (für die 2. Ordnung)
//
extern string rem3 = "=== Zusätzliche Parameter ===";
extern int _TakeProfit1_Proc = 50; // Prozentuales Risiko für Take-Profit der 1. Order
extern int _SpaseFromMaxMin = 1; // Versatz von oben/unten
//
extern string rem4 = "=== Breakeven-Parameter ===";
extern bool _IsStopLoss_0 = falsch; // Aktivieren der Verwendung des Breakeven-Levels
extern int _StopLoss_0_From = 0; // Offset vom Break-Even-Level (in Punkten)
extern int _StopLoss_0_Level = 15; // Breakeven-Niveau
//
extern string rem5 = "=== Trailing-Stop-Parameter ===";
extern bool _IsTrailingStop = falsch; // Trailing-Stop aktivieren
bool _IsTrailingStopProfit = wahr; // Aktivieren eines Trailing Stops von einer Breakeven-Position
//extern int _TrailingStopProfit_From = 0; // Offset vom Break-Even-Level (in Punkten)
extern int _TrailingStopLevel = 15; // Trailing-Stop-Level
extern int _TrailingStopStep = 5; // Trailing-Stop-Bewegungsschritt
//
extern string rem6 = "=== Werkzeugeinstellungen ===";
extern string _Symboll = ""; // Symbolischer Name des Instruments: "" - aktuelles Symbol
extern int _Timeframe = 0; // Periode: 0 - Periode des aktuellen Charts
int_Digitss; // Anzahl der Nachkommastellen im Preis
doppelte _Punkte; // Punktgröße in Kurswährung
extern int _Slippage = 2; // Schlupf
extern int _Magic1 = 1281; // Eindeutige Anzahl von EA-Bestellungen (1. Bestellung)
extern int _Magic2 = 1282; // Eindeutige Anzahl von EA-Bestellungen (2. Bestellung)
//
extern string rem7 = "=== Parameter des MA1-Indikators ===";
extern int _MA1_Zeitrahmen = PERIODE_D1; // Periode: 0 - Periode des aktuellen Charts
extern int _MA1_Periode = 20; // Mittelungszeitraum für die Berechnung des gleitenden Durchschnitts
extern int _MA1_Shift = 0; // Verschiebung des Indikators relativ zum Kursdiagramm
extern int _MA1_Methode = 0; // Mittelungsmethode: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int _MA1_Applied_Price = 0; // Verwendeter Preis: 0 - schließen, 1 - öffnen, 2 - hoch, 3 - niedrig
//
extern string rem8 = "=== Parameter des MA2-Indikators ===";
extern int _MA2_Zeitrahmen = PERIODE_H4; // Periode: 0 - Periode des aktuellen Charts
extern int _MA2_Period = 20; // Mittelungszeitraum für die Berechnung des gleitenden Durchschnitts
extern int _MA2_Shift = 0; // Verschiebung des Indikators relativ zum Kursdiagramm
extern int _MA2_Methode = 0; // Mittelungsmethode: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int _MA2_Applied_Price = 0; // Verwendeter Preis: 0 - schließen, 1 - öffnen, 2 - hoch, 3 - niedrig
//
extern string rem9 = "=== Parameter des Bollinger-Bänder-Indikators ===";
//extern int _BB_Timeframe = 0; // Periode: 0 - Periode des aktuellen Charts
extern int _BB_Period = 20; // Mittelungszeitraum der Hauptindikatorlinie
extern int _BB_Abweichung = 2; // Abweichung von der Hauptlinie
extern int _BB_Bands_Shift = 0; // Verschiebung des Indikators relativ zum Kurschart
extern int _BB_Applied_Price = 0; // Gebrauchtpreis: 0 - schließen
//
extern string rem10 = "=== Parameter des ZigZag-Indikators ===";
//extern int _ZZ_Timeframe = 0; // Periode: 0 - Periode des aktuellen Charts
extern int _ZZ_ExtDepth = 12;
extern int _ZZ_ExtDeviation = 5;
extern int _ZZ_ExtBackstep = 3;
//
datetime_TimePrevious;
datetime _TimeCurrent;
//
string_fstr;
int_tp;
//
void MaxOrders(int max_orders=5);
//=++========================================= = ================++=
int init()
{
if(_Symbol == "") _Symboll = Symbol();
//
_Digitss = MarketInfo(_Symbol, MODE_DIGITS);
_Punkte = MarketInfo(_Symbol, MODE_POINT);
//
if(_Timeframe == 0) _Timeframe = Periode();
Print("v128-2 > init() >> _Timeframe=", _Timeframe,
"rem4=",_IsStopLoss_0,
"rem5=",_IsTrailingStop,_IsTrailingStopProfit);
//
_fstr = "v128_";
_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // Stellen Sie sicher, dass die Datei existiert, wenn sie nicht existiert, erstellen Sie sie
Print("v128-2 > init() >> _Timeframe=", _Timeframe, " _tp=",_tp);
//
_TimePrevious=iTime(_Symbol, _Timeframe, 0);
//
Print("v128-2 > Done: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");
Rückgabe (0);
}
//=++========================================= = ================++=
int start()
{
doppelt P_Close1, P_Close2;
doppelt BB_1_oben, BB_1_unten;
doppelt MA1_0, MA2_0;
doppeltes P_ask, P_bid;
bool is_signal_2_buy, is_signal_2_sell;
doppelt P1_kaufen, P2_kaufen, P3_kaufen;
doppelt P1_verkaufen, P2_verkaufen, P3_verkaufen;
bool is_b1 = falsch, is_s1 = falsch;
bool is_b2 = falsch, is_s2 = falsch;
int-Ticket;
//
_TimeCurrent = iTime(_Symbol, _Timeframe, 0);
if(_TimeCurrent != _TimePrevious)
{
MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);
MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Periode, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);
BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);
BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);
P_Close1 = iClose(_Symbol, _Timeframe, 1);
P_Close2 = iClose(_Symbol, _Timeframe, 2);
P_ask = MarketInfo(_Symbol, MODE_ASK);
P_bid = MarketInfo(_Symbol, MODE_BID);
Print("v120-4 > ", _Symbol, " | ", _Zeitrahmen,
" -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,
" -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,
" -> P_Close1=", P_Close1, " | P_Close2=", P_Close2,
" -> ask=", P_ask, " | bid=", P_bid);
//
is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower;
is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper;
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);
// ========== nach Märkten
// ========== Eröffnen einer KAUF-Order
if( is_signal_2_buy )
{
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> Signal zum Eröffnen einer KAUF-Order");
BestellungenDeleteAll(OP_SELL);
//
if(!is_b1 || !is_b2)
{
P1_kaufen = P_fragen;
P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point;
_tp = (P1_buy - P3_buy) / _Point * (_TakeProfit1_Proc / 100,0);
P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> KAUFEN -> P1_kaufen=", P1_kaufen, " | P2_kaufen=", P2_kaufen, " | P3_kaufen=", P3_kaufen, "_tp=", _tp);
//
Ticket = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),
NULL, _Magic1, 0, CLR_NONE);
if(Ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> KAUFEN (1) > Fehler (Eröffnung) #", GetLastError());
Sonst ist_b1 = wahr;
//
Ticket = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,
NULL, _Magic2, 0, CLR_NONE);
if(Ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> KAUFEN (2) > Fehler (Eröffnung) #", GetLastError());
Sonst ist_b2 = wahr;
//
}
Sonst { is_b1 = wahr; is_b2 = wahr; }
}
Sonst { is_b1 = wahr; is_b2 = wahr; }
//Print("= kaufen +++",is_b1,is_b2,"==",is_s1,is_s2);
// ========== Eröffnen einer VERKAUFS-Order
if( is_signal_2_sell )
{
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> Signal zum Öffnen einer VERKAUFS-Order");
BestellungenDeleteAll(OP_BUY);
//
if(!is_s1 || !is_s2)
{
P1_verkauf = P_gebot;
P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point;
_tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0);
P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);
//
_FileWriteDouble(_fstr+"_tp.dat", _tp);
//
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> KAUFEN -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);
//
Ticket = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),
NULL, _Magic1, 0, CLR_NONE);
if(Ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> VERKAUFEN (1) > Fehler (Eröffnung) #", GetLastError());
Sonst ist_s1 = wahr;
//
Ticket = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,
NULL, _Magic2, 0, CLR_NONE);
if(Ticket == -1)
Print("v128-2 > ", _Symbol, " | ", _Zeitrahmen,
" -> VERKAUFEN (2) > Fehler (Eröffnung) #", GetLastError());
Sonst ist_s2 = wahr;
//
}
Sonst { is_s1 = wahr; is_s2 = wahr; }
}
Sonst { is_s1 = wahr; is_s2 = wahr; }
//Print("= verkaufen +++",is_b1,is_b2,"==",is_s1,is_s2);
// ==========
if(ist_b1 && ist_s1 && ist_b2 && ist_s2)
_TimePrevious=_TimeCurrent;
}
//
if(_IsTrailingStop)
{
if( !FindOrders(_Magic1) ) TrailingStop(_tp);
}
//
if(_IsStopLoss_0)
StopLoss_0(_StopLoss_0_From);
//
Rückgabe (0);
}
//=++========================================= = ================++=
double DoubleTestZero(double value, double new_value)
{
if(value==0) return(wert);
sonst return(new_value);
}
//=++========================================= = ================++=
doppelt ND (doppelter Wert)
{
return( NormalizeDouble(value, _Digits) );
}
//=++========================================= = ================++=
// Orders schließen. Ende mit Alle schließen
ungültige BestellungenDeleteAll(int cmd)
{
while(CountOrders(cmd) > 0)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
&& (OrderType() == cmd) )
{
if(OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > KAUFEN -> ticket=", OrderTicket(),
" -> Fehler (Schließen) #", GetLastError());
if(OrderType() == OP_SELL)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))
Print("v128-2 > ", _Symbol, " > SELL -> ticket=", OrderTicket(),
" -> Fehler (Schließen) #", GetLastError());
}
}
}
}
// Anzahl der Bestellungen
}
//=++========================================= = ================++=
// Zählen der Anzahl der Bestellungen in der Richtung
int CountOrders(int cmd)
{
Ganzzahl n = 0;
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol)
&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
&& (OrderType() == cmd) ) n++;
}
}
Rückkehr (n);
}
//=++========================================= = ================++=
// magisch nach einer Bestellung suchen
bool FindOrders(int magisch)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == Magie) )
zurück (wahr);
}
}
falsch zurückgeben);
}
//=++========================================= = ================++=
// Berechnung der Gewinnschwelle durch Magie
void StopLoss_0(int von)
{
doppelter Gewinnpunkt, bieten, fragen;
bool ist;
doppelt P3_Kauf, P3_Verkauf;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) Continue;
//
if(OrderType() == OP_BUY)
{
Gebot = MarketInfo(_Symbol, MODE_BID);
Gewinnpunkt = (Gebot - OrderOpenPrice()) / _Point;
ist = Gewinnpunkt >= _StopLoss_0_Level + von;
P3_buy = ND( OrderOpenPrice() + from * _Point );
//
if( ist && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )
{
Print("v128-2 b4 >", _Symbol, " | ", _Zeitrahmen,
" -> Bid=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,
" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 b4 > ", _Symbol, " | ", _Zeitrahmen,
" -> KAUFEN > ticket=", OrderTicket(), " > Fehler (Breakeven) #", GetLastError());
}
}
//
sonst if(OrderType() == OP_SELL)
{
fragen = MarketInfo(_Symbol, MODE_ASK);
profitpoint = (OrderOpenPrice() - fragen) / _Point;
ist = Gewinnpunkt >= _StopLoss_0_Level + von;
P3_sell = ND( OrderOpenPrice() - from * _Point );
//
if( ist && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )
{
Print("v128-2 b4 >", _Symbol, " | ", _Zeitrahmen,
" -> Ask =", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,
" | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))
Print("v128-2 b4 > ", _Symbol, " | ", _Zeitrahmen,
" -> VERKAUFEN -> ticket=", OrderTicket(), " > Fehler (Breakeven) #", GetLastError());
}
}
}
}
}
//=++========================================= = ================++=
// Herausarbeiten des Trailing-Stops durch Magie
void TrailingStop(int von)
{
doppelter Gewinnpunkt, bieten, fragen;
doppelter Preis;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) Continue;
//
if(OrderType() == OP_BUY)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point;
sonst fromprice = OrderStopLoss();
//
Gebot = MarketInfo(_Symbol, MODE_BID);
profitpoint = (bid - ND(fromprice)) / _Point;
//
if( profitpoint >= _TrailingStopLevel &&
Gebot > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v128-2 v4 >", _Symbol, " | ", _Zeitrahmen,
" -> Bid=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v128-2 v4 >", _Symbol, " | ", _Zeitrahmen,
" -> BUY > ticket=", OrderTicket(), " > Error (trailing stop) #", GetLastError());
}
}
}
//
sonst if(OrderType() == OP_SELL)
{
if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - from * _Point;
sonst fromprice = OrderStopLoss();
//
fragen = MarketInfo(_Symbol, MODE_ASK);
profitpoint = (ND(fromprice) - ask) / _Point;
//
if( profitpoint >= _TrailingStopLevel &&
ask < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v128-2 v4 >", _Symbol, " | ", _Zeitrahmen,
" -> Ask=", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v128-2 v4 >", _Symbol, " | ", _Zeitrahmen,
" -> SELL > ticket=", OrderTicket(), " > Error (trailing stop) #", GetLastError());
}
}
}
}
}
}
//=++========================================= = ================++=
// Finden des lokalen Bodens. Gibt den Preis zurück
double FindPriceMinMax(bool isUp)
{
Int-Verschiebung = 1;
doppelter Preis = 0, p0,p1,p2;
solange (Preis == 0)
{
p0 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);
p1 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);
p2 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);
//Print("v128-2 >", _Symbol, " | ", _Zeitrahmen,
// " > sichten=", verschieben, " | p0=", p0, " | p1=", p1, " | p2=", p2);
wenn (istOben)
{
if(p0 !=0 && p0 == p1) // Vertex gefunden
Preis = p0;
}
anders
{
if(p0 != 0 && p0 == p2) // Boden gefunden
Preis = p0;
}
Umschalt++;
}
//Print("v128-2 >", _Symbol, " | ", _Zeitrahmen,
// " -> return(price)=", price);
Rückgabe (Preis);
}
//============================================ = ====================
// Variable aus Datei lesen.
// Wenn die Datei nicht existiert, erstelle eine Datei und schreibe die Variable in die Datei
double _FileReadWriteDouble(String Dateiname, Double-Wert)
{
int h1 = FileOpen(Dateiname, FILE_BIN);
wenn (h1 > 0)
{
Wert = FileReadDouble(h1, DOUBLE_VALUE);
DateiSchließen(h1);
}
anders
{
h1 = FileOpen(Dateiname, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, Wert, DOUBLE_VALUE);
DateiSchließen(h1);
}
Rückgabewert);
}
//============================================ = ====================
// Variable in Datei schreiben
void _FileWriteDouble(String Dateiname, doppelter Wert)
{
int h1 = FileOpen(Dateiname, FILE_BIN|FILE_WRITE);
FileWriteDouble(h1, Wert, DOUBLE_VALUE);
DateiSchließen(h1);
}