Da der Spread im Strategietester jedoch konstant ist, benötige ich einen Emulator für zufällige Spreads. Ich möchte die Veränderungen der Spanne im Tester im Bereich von 2 bis 3 Punkten (4 Ziffern) in 80 % der Fälle und mehr als 3 Punkte in 20 % der Fälle emulieren. Irgendwelche Ideen, wie man dies umsetzen kann, oder Links, wo eine solche Idee gelöst wurde.
Der Fehler mit dem Magier führt dazu, dass Ihr EA nicht sieht, dass seine Position auf einem Stop geschlossen ist, wenn er auf einem Stop schließt. Warum? Die Antwort ist, dass Sie eine Position mit magic 123 eröffnen und die Variable Magic an die Funktion senden, die prüft, ob die Position am Stop geschlossen wird. Was meinen Sie, was es bedeutet, wenn es implizit initialisiert wird? Null. Die Funktion sucht natürlich nach Positionen mit der magischen Zahl 0 und diese ist gleich 123 in Ihren Positionen. Und wir streiten uns nicht, nur... ...Argumentation... Überprüfen Sie die Reaktion auf das Schließen der Haltestelle:
Ich habe mir den Rest Ihrer "toten" EA-Logik nicht angesehen - ich habe Ihnen geholfen, die Stop-Close-Check-Funktion zu verstehen...
Artem! Guten Tag und nochmals vielen Dank für die Hilfe.
Ich habe alle unnötigen "toten" Logiken entfernt und die verbleibenden "wiederbelebt".... soweit ich es verstanden habe.
Es blieb nur eine Funktion übrig, bei deren Behebung Sie mir geholfen haben.
Aber es geschahen Wunder, die ich nicht begreifen konnte.
1. Mein Expert Advisor eröffnet Trades zu Beginn jeder Kerze (ich habe eine 5-Minuten-Kerze)
und ignorieren alle Bedingungen.
D.h. die Kontrolle geht in die erste Zeile
double Price=iOpen(Symbol (),0,0);
Und dann springt er durch 11 Zeilen und kommt zu folgenden Zeilen
2. wenn wir die Zeile, die das Mindestlos berechnet, entfernen Lot=MarketInfo(Symbol(), MODE_MINLOT);
Der Expert Advisor funktioniert gut, aber die Funktion isCloseLastPosByStop funktioniert nicht.
Ich habe mir lange den Kopf zerbrochen....., aber vergeblich. Ich wäre Ihnen dankbar, wenn Sie mir sagen könnten, wo der Fehler versteckt ist.
double Lot = 0.1; //я проинициализировал переменнуюint Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point)) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
t=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула ??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
Alle meine "tote Logik" unnötig entfernt und "wiederbelebt" den Rest.... soweit ich es verstanden habe.
Ich habe praktisch nur die Funktion übrig gelassen, bei deren Korrektur Sie mir geholfen haben.
Aber die Wunder, die über mein Verständnis hinausgehen, haben begonnen zu geschehen.
Nach
if ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
Tat, wie Sie sagte..... leider Berater arbeitet .... die isCloseLastPosByStop-Funktion nicht funktioniert
double Lot=0.1;
int Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если ПРИ ЭТОМ цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
{ Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
Lot=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
} return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
Dies ist ein Teil des Codes der Funktion bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Was aber, wenn es einen Ausrutscher von 3 Pips gibt? Es ist nicht sehr gut durchdacht ))
if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
Du verstehst, dass mich das nicht wirklich stört, aber....
Ich versuche schon seit einer Woche herauszufinden, warum diese Funktion bei mir nicht funktioniert.
D.h. ich möchte, dass der nächste Auftrag mit dem doppelten Volumen des am Stop geschlossenen Auftrags eröffnet wird und der nächste Auftrag nach dem Non-Stop mit einem regulären Volumen eröffnet wird.
Korrigieren Sie die Logik der Arbeit, sonst wird es lange dauern, bis Sie nachdenken.
Dies ist ein Teil des Codes der Funktion bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Was aber, wenn es einen Ausrutscher von 3 Pips gibt? Es ist nicht sehr gut durchdacht ))
Sie verstehen, dass ich mich noch nicht damit befasst habe....
Ich habe seit einer Woche nicht verstanden, warum diese Funktion nicht so funktioniert, wie ich es möchte.
D.h. ich muss die nächste Order nach dem Stop mit dem doppelten Volumen der Order öffnen, die am Stop geschlossen wurde, und nach dem Non-Stop wird die nächste Order mit einem regulären Volumen geöffnet.
Guten Tag.
Meine Strategie berücksichtigt den Spread, der durch eine Funktion definiert ist:
Da der Spread im Strategietester jedoch konstant ist, benötige ich einen Emulator für zufällige Spreads. Ich möchte die Veränderungen der Spanne im Tester im Bereich von 2 bis 3 Punkten (4 Ziffern) in 80 % der Fälle und mehr als 3 Punkte in 20 % der Fälle emulieren. Irgendwelche Ideen, wie man dies umsetzen kann, oder Links, wo eine solche Idee gelöst wurde.
Der Fehler mit dem Magier führt dazu, dass Ihr EA nicht sieht, dass seine Position auf einem Stop geschlossen ist, wenn er auf einem Stop schließt. Warum? Die Antwort ist, dass Sie eine Position mit magic 123 eröffnen und die Variable Magic an die Funktion senden, die prüft, ob die Position am Stop geschlossen wird. Was meinen Sie, was es bedeutet, wenn es implizit initialisiert wird? Null. Die Funktion sucht natürlich nach Positionen mit der magischen Zahl 0 und diese ist gleich 123 in Ihren Positionen. Und wir streiten uns nicht, nur... ...Argumentation... Überprüfen Sie die Reaktion auf das Schließen der Haltestelle:
Ich habe mir den Rest Ihrer "toten" EA-Logik nicht angesehen - ich habe Ihnen geholfen, die Stop-Close-Check-Funktion zu verstehen...
Artem! Guten Tag und nochmals vielen Dank für die Hilfe.
Ich habe alle unnötigen "toten" Logiken entfernt und die verbleibenden "wiederbelebt".... soweit ich es verstanden habe.
Es blieb nur eine Funktion übrig, bei deren Behebung Sie mir geholfen haben.
Aber es geschahen Wunder, die ich nicht begreifen konnte.
1. Mein Expert Advisor eröffnet Trades zu Beginn jeder Kerze (ich habe eine 5-Minuten-Kerze)
und ignorieren alle Bedingungen.
D.h. die Kontrolle geht in die erste Zeile
double Price=iOpen(Symbol (),0,0);
Und dann springt er durch 11 Zeilen und kommt zu folgenden Zeilen
Lot=0.1;
OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 );
2. wenn wir die Zeile, die das Mindestlos berechnet, entfernen Lot=MarketInfo(Symbol(), MODE_MINLOT);
Der Expert Advisor funktioniert gut, aber die Funktion isCloseLastPosByStop funktioniert nicht.
Ich habe mir lange den Kopf zerbrochen....., aber vergeblich. Ich wäre Ihnen dankbar, wenn Sie mir sagen könnten, wo der Fehler versteckt ist.
solnce600:
Артем ! Добрый день! Еще раз спасибо за помощь.
Alle meine "tote Logik" unnötig entfernt und "wiederbelebt" den Rest.... soweit ich es verstanden habe.
Ich habe praktisch nur die Funktion übrig gelassen, bei deren Korrektur Sie mir geholfen haben.
Aber die Wunder, die über mein Verständnis hinausgehen, haben begonnen zu geschehen.
Nach
alles zum Körper hinzufügen { }
Ich bin leider nicht Artem.
solnce600:
Nach
alles zum Körper hinzufügen { }
Es tut mir leid, dass ich nicht Artem bin.
t oder Lot
solnce600:
Nach
alles zum Körper hinzufügen { }
Ich bin leider nicht Artem.
Tat, wie Sie sagte..... leider Berater arbeitet .... die isCloseLastPosByStop-Funktion nicht funktioniert
Dies ist ein Teil des Codes der Funktion bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Was aber, wenn es einen Ausrutscher von 3 Pips gibt? Es ist nicht sehr gut durchdacht ))
Du verstehst, dass mich das nicht wirklich stört, aber....
Ich versuche schon seit einer Woche herauszufinden, warum diese Funktion bei mir nicht funktioniert.
D.h. ich möchte, dass der nächste Auftrag mit dem doppelten Volumen des am Stop geschlossenen Auftrags eröffnet wird und der nächste Auftrag nach dem Non-Stop mit einem regulären Volumen eröffnet wird.
Korrigieren Sie die Logik der Arbeit, sonst wird es lange dauern, bis Sie nachdenken.
Dies ist ein Teil des Codes der Funktion bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
Was aber, wenn es einen Ausrutscher von 3 Pips gibt? Es ist nicht sehr gut durchdacht ))
Sie verstehen, dass ich mich noch nicht damit befasst habe....
Ich habe seit einer Woche nicht verstanden, warum diese Funktion nicht so funktioniert, wie ich es möchte.
D.h. ich muss die nächste Order nach dem Stop mit dem doppelten Volumen der Order öffnen, die am Stop geschlossen wurde, und nach dem Non-Stop wird die nächste Order mit einem regulären Volumen geöffnet.Und warum die Auftragshistorie anfassen? Schauen Sie sich den Saldo an - wo es in diese Richtung ging und ändern Sie das Los.
Wenn es nur ein Roboter ist, der auf Ihrem Konto handelt.