Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 210

 

Guten Tag.

Meine Strategie berücksichtigt den Spread, der durch eine Funktion definiert ist:

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

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.

 
artmedia70:


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.

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);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

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

 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))

alles zum Körper hinzufügen { }

Ich bin leider nicht Artem.

 
ALXIMIKS:

solnce600:

Nach

alles zum Körper hinzufügen { }

Es tut mir leid, dass ich nicht Artem bin.

Danke, verzeihen Sie mir für das erste Mal ....... (ich weiß nicht, wie man das scherzhafte Emoticon hinzufügt)
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

t oder Lot

 
ALXIMIKS:

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

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);                                // возвращаем истину
 
solnce600:

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.
 
ALXIMIKS:

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.