Hallo, liebe Programmierer! Können Sie einem Neuling raten, wie er ein Skript (keinen Expert Advisor) schreiben kann, das einen Handelsauftrag erteilt und gleichzeitig den Trailing Stop auf einem Mindestniveau aktiviert. Vielleicht gibt es eine fertige Version, wenn Sie mir einen Link geben können.
Meine Herren des Forums, helfen Sie zu verstehen....
Hier ist ein Teil des Codes (der Hauptcode stammt aus dem Expert Advisor Construction Manual)
// Orderfunktion // Globale Variablen: // Mas_Ord_New[31][9] // Array der zuletzt bekannten Orders // Mas_Ord_Old[31][9] // Array der vorherigen (alten) Orders // 1. Index = Ordernummer // [][0] ist nicht definiert // [][1] offener Orderpreis (abs. eines Auftrags (abc-Kurs) // [][2] StopLoss eines Auftrags (abc-Kurs) // [][3] TakeProfit eines Auftrags (abc-Kurs) // [][4] Auftragsnummer // [][5] Anzahl der Lots eines Auftrags. (Abc Rate) // [][6] Auftragsart 0=B,1=S,2=BL,3=SL,4=BS,5=SS // [][7] magische Zahl der Bestellung // [][8] 0/1
if (Mas_Ord_Old[old][6]==0 && Bid>Mas_Ord_Old[old][2] && Bid<Mas_Ord_Old[old][3]) Inform(1, Mas_Ord_Old[old][4]); // Der Kaufauftrag wurde also durch das Zählersignal geschlossen else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2]) Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // das bedeutet, dass SL ausgelöst hat else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3]) Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]) // TA ausgelöst
else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3]) Inform(2, Mas_Ord_Old[old][4]); // So wird die Verkaufsorder durch das Zählersignal geschlossen else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2]) Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // das bedeutet, dass SL ausgelöst hat else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3]) Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TA ausgelöst
Der Rest ist nicht von Interesse...
Das Problem: In 90% der Fälle wird der richtige Parameter angezeigt, d.h. wenn SL ausgelöst wird, ist der Parameter "19", wenn TP "20", wenn die Order manuell oder durch ein Zählersignal geschlossen wird, ist der Parameter "1" oder "2". Das war so geplant.
Aber manchmal (ziemlich oft) wird statt "20" "19" zurückgegeben (oder umgekehrt), oder sogar "1"("2"). Bitte helfen Sie mir, die "if"-Funktion korrekt zu beschreiben: als Bedingung für den Abschluss von Aufträgen.
Ich denke, der Grund könnte in der Rundung der Preise liegen?
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.
So weit, so gut:
//+------------------------------------------------------------------+
//| Fibo trading.mq4 |
//| Minodi |
//| minodi@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Minodi"
#property link "minodi@yandex.ru"
extern int Zeitraum_EMA = 233,
Zeitraum_SMA = 233,
Stoploss = 30,
extern double Lot = 0,01;
extern string SesEnd ="22:00"; //Grenzzeit für Hai oder Low
//+------------------------------------------------------------------+
//| Skriptprogramm-Startfunktion |
//+------------------------------------------------------------------+
int start()
{
//------- Tagespreise, Fibs und Hi-Low-Rendering-Zeit--------------+
int shift = iBarShift(NULL,1440,Time[0]) + 1;
double HiPrice = iHigh(NULL,1440,shift); //Höchster Preis
double LoPrice = iLow(NULL,1440,shift); // niedriger Preis
double OpPrice = iOpen (NULL,1440,shift); //offener Preis
double ClPreis = iClose (NULL,1440,shift); // Schlusskurs
datetime StTime = iTime(NULL,1440,shift); // ?
if(TimeDayOfWeek(StTime)==0/*Sunday*/)
{//Add fridays high and low
HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));
LoPreis = MathMin(LoPreis,iLow(NULL,1440,shift+1));
OpPreis = iOpen(NULL,1440,shift+1);
ClPreis = iClose (NULL,1440,shift+1);
}
double Pivot =(HiPrice+LoPrice+ClPrice)/3;
double Range =HiPrice-LoPrice;
double Fibo138 =1,382*Bereich+LoPreis;
double Fibo162 =1,618*Bereich+LoPreis;
double Fibo_138 =LoPrice-(1.382*Range-Range);
double Fibo_162 =LoPrice-(1.618*Range-Range);
//---------------- HiTime und Low-----------------------------------------+
int HiTime,LoTime;
int time; // beim nächsten Balken rollen die Werte
if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}
wenn (High[0]>HiPrice)HiTime=TimeCurrent();
if (Low[0]<LoPrice)LoTime=TimeCurrent();
Comment("Bei diesem Balken: "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime);
//-----------------Ценовой диапазон Демарка-------------------------------+
int currDay, i=0; //
if (aktuellerTag!=ZeitTag(Zeit[i]))
{
if (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;
wenn (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;
if (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;
i++;
}
double MaxDay = x - LoPrice; // Preisbereich markieren
double MinDay = x - HiPrice; // Preisspanne markieren
// -----------Скользящие средние---------------------------------------------+
double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);
double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);
double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
//----------------Удаление вчерашних ордеров---------------------------------+
//------------------Ордера----------------------------------------------------+
Liebe Forumsmitglieder, überprüfen Sie den Code, ich plane, schrittweise hinzuzufügen
Dies sind die Parameter, die ich Ihnen gegeben habe, setzen Sie sie ein, bevor Sie beginnen
int HiTime,LoTime;
int time; // на следующем баре обнкляем значения
Вот эти параметры ято я давал, поместите перд стартом
int HiTime,LoTime;
int time; // на следующем баре обнкляем значения
Liebe Forumsmitglieder, bitte passen Sie auf und sagen Sie uns, welche Fehler gemacht wurden:
//+------------------------------------------------------------------+
//| Fibo trading.mq4 |
//| Minodi |
//| minodi@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Minodi"
#property link "minodi@yandex.ru"
extern int Zeitraum_EMA = 233,
Zeitraum_SMA = 233,
Stoploss = 30,
Magie = 55;
extern double Lot = 0,01;
extern string SesEnd ="22:00"; //Grenzzeit für Hai oder Low
int HiTime,LoTime;
int time; // beim nächsten Balken werden die Werte hochgezählt
//+------------------------------------------------------------------+
//| Skriptprogramm-Startfunktion |
//+------------------------------------------------------------------+
int start()
{
//------- Tagespreise, Fibs und Hi-Low-Rendering-Zeit--------------+
int shift = iBarShift(NULL,1440,Time[0]) + 1;
double HiPrice = iHigh(NULL,1440,shift); //Höchster Preis
double LoPrice = iLow(NULL,1440,shift); // niedriger Preis
double OpPrice = iOpen (NULL,1440,shift); //offener Preis
double ClPreis = iClose (NULL,1440,shift); // Schlusskurs
datetime StTime = iTime(NULL,1440,shift); // ?
if(TimeDayOfWeek(StTime)==0/*Sunday*/)
{//Add fridays high and low
HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));
LoPreis = MathMin(LoPreis,iLow(NULL,1440,shift+1));
OpPreis = iOpen(NULL,1440,shift+1);
ClPreis = iClose (NULL,1440,shift+1);
}
double Pivot =(HiPrice+LoPrice+ClPrice)/3;
double Range =HiPrice-LoPrice;
double Fibo138 =1,382*Bereich;
double Fibo162 =1,618*Bereich;
double Fibo_138 =(LoPrice-1.382*Range)-Range;
double Fibo_162 =(LoPrice-1.618*Range)-Range;
//---------------- time hai and low-----------------------------------------+
if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}
wenn (High[0]>HiPrice)HiTime=TimeCurrent();
if (Low[0]<LoPrice)LoTime=TimeCurrent();
Comment("Bei diesem Balken: "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime);
//-----------------Ценовой диапазон Демарка-------------------------------+
int currDay, i=0; //
if (aktuellerTag!=ZeitTag(Zeit[i]))
{
if (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;
wenn (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;
if (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;
i++;
}
double MaxDay = x - LoPrice; // Preisbereich markieren
double MinDay = x - HiPrice; // Preisspanne markieren
// -----------Скользящие средние---------------------------------------------+
double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);
double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);
double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);
//------------------Ордера----------------------------------------------------+
wenn (HiTime>LoTime){
int ticket1 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,Pivot,NULL,Magic,58000,Red);
int ticket2 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket3 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket4 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket5 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket6 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,Pivot,NULL,Magic,58000,Red);
}
wenn (HiTime<LoTime){
int ticket7=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,Pivot,NULL,Magic,58000,Red);
int ticket8=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket9=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket10=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,Pivot,NULL,Magic,58000,Red);
int ticket11=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,LoPrice,NULL,Magic,58000,Red);
int ticket12=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,Pivot,NULL,Magic,58000,Red);
}
if (HiTime>LoTime && ClPrice>Pivot) {
int ticket13=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,HiPrice,NULL,Magic,58000,Red);
int ticket14=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,Fibo138,NULL,Magic,58000,Red);
}
if (HiTime<LoTime && ClPrice<Pivot)
int ticket15=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,LoPreis,NULL,Magic,58000,Red);
int ticket16=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,Fibo_138,NULL,Magic,58000,Red);
}
zurück(0);
//+------------------------------------------------------------------+
auf den ersten Blick die Parameter:
int currentDay;
für den Start
Meine Herren des Forums, helfen Sie zu verstehen....
Hier ist ein Teil des Codes (der Hauptcode stammt aus dem Expert Advisor Construction Manual)
// Orderfunktion
// Globale Variablen:
// Mas_Ord_New[31][9] // Array der zuletzt bekannten Orders
// Mas_Ord_Old[31][9] // Array der vorherigen (alten) Orders
// 1. Index = Ordernummer
// [][0] ist nicht definiert
// [][1] offener Orderpreis (abs. eines Auftrags (abc-Kurs)
// [][2] StopLoss eines Auftrags (abc-Kurs)
// [][3] TakeProfit eines Auftrags (abc-Kurs)
// [][4] Auftragsnummer
// [][5] Anzahl der Lots eines Auftrags. (Abc Rate)
// [][6] Auftragsart 0=B,1=S,2=BL,3=SL,4=BS,5=SS
// [][7] magische Zahl der Bestellung
// [][8] 0/1
if (Mas_Ord_Old[old][6]==0 && Bid>Mas_Ord_Old[old][2] && Bid<Mas_Ord_Old[old][3])
Inform(1, Mas_Ord_Old[old][4]); // Der Kaufauftrag wurde also durch das Zählersignal geschlossen
else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // das bedeutet, dass SL ausgelöst hat
else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]) // TA ausgelöst
else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3])
Inform(2, Mas_Ord_Old[old][4]); // So wird die Verkaufsorder durch das Zählersignal geschlossen
else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // das bedeutet, dass SL ausgelöst hat
else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TA ausgelöst
Der Rest ist nicht von Interesse...
Das Problem: In 90% der Fälle wird der richtige Parameter angezeigt, d.h. wenn SL ausgelöst wird, ist der Parameter "19", wenn TP "20", wenn die Order manuell oder durch ein Zählersignal geschlossen wird, ist der Parameter "1" oder "2". Das war so geplant.
Aber manchmal (ziemlich oft) wird statt "20" "19" zurückgegeben (oder umgekehrt), oder sogar "1"("2"). Bitte helfen Sie mir, die "if"-Funktion korrekt zu beschreiben: als Bedingung für den Abschluss von Aufträgen.
Ich denke, der Grund könnte in der Rundung der Preise liegen?