Ich schreibe kostenlos einen Ratgeber - Seite 18

 

Sie brauchen Hilfe.

http://forum.mql4.com/ru/67309#1011467

Помогите добавить к текущему советник пирамидинг. - MQL4 форум
  • www.mql5.com
Помогите добавить к текущему советник пирамидинг. - MQL4 форум
 

Bitte weisen Sie darauf hin, dass die Aufträge nicht jeden Tag geöffnet werden, dass das Trawling nicht funktioniert und dass die offenen Aufträge nicht nach TP geschlossen werden. Was mache ich falsch?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
   static bool IsFirstTick = false;
   static int ticket = 0;
  
   double lot=Lot_Normalize(Symbol(),Lots,1);
   double sl= Dist_Normalize(Symbol(),Trals);
   double step= Dist_Normalize(Symbol(),_Step);
  
   int h= TimeHour(TimeCurrent());
   if(h == StartHour)
   {
    Alert("TimeHor: ", h);
    if (IsFirstTick == true)
      IsFirstTick = false;
     
      bool res;
      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      {
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
           
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }  
      }
       if(Open[0] < Open[StartHour])
      {
         ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! BUY_LIMIT");
       }
       else
       {
         ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! SEL_LLIMIT");
    }  
}
 
}  

double Dist_Normalize(string Smv, int _Distancia)
{
 int Dig= int(MarketInfo(Smv,MODE_DIGITS));
 double Pip=MarketInfo(Smv,MODE_POINT);
 if(Dig==3 || Dig==5)
   return NormalizeDouble(_Distancia*10*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
 } 


double Lot_Normalize(string Smv, double _lot, double _mult)
{
 double minlot=MarketInfo(Smv,MODE_MINLOT);
 double maxlot=MarketInfo(Smv,MODE_MAXLOT);
 double steplot=MarketInfo(Smv,MODE_LOTSTEP);
 double lot= _lot*_mult;
 if(lot<=minlot) lot+minlot;
 else if(lot>=maxlot) lot=minlot;
 else if(lot>minlot && lot<maxlot)
  {
    int k=int((lot-minlot)/steplot);
    lot=NormalizeDouble(minlot+k*steplot,2);
  }
  return(lot);




void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
  int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
  for(int pos=OrdersTotal()-1; pos>=0;pos--)
    {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
      OrderMagicNumber()==_Magic && OrderType()<2)
        {
          double SLPrice;
          if(OrderType()==OP_BUY)
            {
              if(_Step_Use)
              {
                RefreshRates();
                if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
                {
                  SLPrice=NormalizeDouble(Ask-_Tral,Dig);
                  if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                   Alert("Error modifi Order!: ",GetLastError());
                  }
                 }
               else
                 {
                  RefreshRates();
                  if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
                    {
                     SLPrice=NormalizeDouble(Bid+_Tral,Dig);
                     if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                     Alert("Error modifi Order!: ",GetLastError());
                 }
             }
          }
       }
    }
 }            

 
MIR_KAZAN:

Bitte weisen Sie darauf hin, dass die Aufträge nicht jeden Tag geöffnet werden, dass das Trawling nicht funktioniert und dass die offenen Aufträge nicht nach TP geschlossen werden. Was mache ich falsch?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
 ......
 

if (IsFirstTick == true)

IsFirstTick = false;

Ich würde dieses Stück ersetzen durch

if (TM!=Time[0])
{
   TM = Time[0];
......
}

Die TM-Variable wird außerhalb der Funktion OnTick() als DateTime deklariert, d. h. sie ist für dieses Modul global.

Ich verstehe diesen Code nicht: if(Open[0] < Open[StartHour])

Die StartHour ist gleich 23 und legt nahe, dass der Eröffnungskurs des Null-Balkens mit dem Eröffnungskurs des 23. vorherigen Balkens verglichen wird. Nun, ok, vielleicht ist es ein Trick des Expert Advisors.

Aber dieses Design ist überhaupt nicht angemessen.

      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      { 
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
            
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }   
      }

Was ist, wenn die Ticket-Variable gleich Null ist, oder wenn der EA neu initialisiert wurde und diese Variable standardmäßig zurückgesetzt wurde?

 
StartHour ist die Zeit, zu der der EA laufen soll. Es sollte ein Uhr nachts sein. Warum funktioniert die Schleppnetzfischerei nicht?
 
MIR_KAZAN:
Die StartHour ist die Zeit, zu der der EA arbeiten soll. Es sollte 1:00 Uhr nachts sein. Warum funktioniert die Schleppnetzfischerei nicht?

Sie müssen den Code analysieren, um zu verstehen, warum er nicht funktioniert.

Versuchen Sie,die Funktion Print("Tralling_Stop") in die FunktionTralling_Stop() einzufügen, und prüfen Sie, ob diese Meldung (Tralling_Stop) im Protokoll erscheint, wenn nicht, dann wird diese Funktion nicht aufgerufen. Wenn Sie sie haben, analysieren Sie die Funktion Tralling_Stop() selbst, vielleicht enthält sie einige logische Fehler.

Generell gilt: Wo immer es logische Wenn-Bedingungen gibt, fügen Sie Print(" Bedingung 1" ), Print(" Bedingung 2" ), usw. ein. Führen Sie den Expert Advisor im Strategietester aus und im Journal können Sie die Logik Ihres EAs nachvollziehen.

 
vitales:

Sie müssen den Code analysieren, um zu verstehen, warum er nicht funktioniert.

Versuchen Sie,die Funktion Print("Tralling_Stop") in die FunktionTralling_Stop() einzufügen, und prüfen Sie, ob diese Meldung (Tralling_Stop) im Protokoll erscheint, wenn nicht, dann wird diese Funktion nicht aufgerufen. Wenn ja, analysieren Sie die Funktion Tralling_Stop() selbst - vielleicht gibt es einige logische Fehler in ihr.

Generell gilt: Wo immer es logische Wenn-Bedingungen gibt, fügen Sie Print(" Bedingung 1" ), Print(" Bedingung 2" ), usw. ein. Führen Sie den Expert Advisor im Strategietester aus und im Journal können Sie die Logik Ihres EAs nachvollziehen.


Ich habe versucht, es umzuschreiben, aber es funktioniert immer noch nicht so, wie ich es brauche. Die Aufträge werden nicht geöffnet, wenn ich es will, und dann werden sie nicht ausgelöst. Der Expert Advisor sollte folgendermaßen funktionieren: Beim Abschluss der letzten Kerze eines Tages (um 00:00 Uhr) sollte er zwei ausstehende Orders öffnen: High (für Kauf) und Low (für Verkauf) und sie dann einfach auslösen.

input int     StartHour    = 1;     // Начало торговли
input int     TakeProfit   = 40;    // TakeProfit
input int     StopLoss     = 10;    // StopLoss
extern double Lots         = 0.1;   // Лот для торговли
input int     Magic        = 22;    // Магическое число
input int     Trals        = 5;     // Дистанция тралинга в пунктах
input int     _Step        = 1;     // Шаг
input bool    _StepUse     = false; // Использовать шаг или неT

void OnTick()
{
   static bool IsFirstTick = false;
  
   Trailing();
  
   if (StartHour != Hour()) { return;}
   if (OrdersTotal()>0)
   {
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);                    
   }
}           

//+------------------------------------------------------------------+ 
void Trailing()
{
  if (_StepUse)
{
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;      
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
}
//+------------------------------------------------------------------+

 
MIR_KAZAN:

Versuchen Sie

if (StartHour != Hour()) { return;} 

Ersetzen durch:

if (StartHour != TimeHour(Time[0])) { return;}//Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп. 
 if (OrdersTotal()>0)
{
....
}

Ersetzen durch:

if (OrdersTotal()==0) 
{
    bool rezult = false;
    rezult=OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера BUY LIMIT");
    rezult = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера SELL LIMIT"); 
//для работы в реале надо сделать более детальную проверку ошибок 

} else Trailing();

Darüber hinaus müssen die Preise mit NormalizeDouble() normalisiert werden. Das heißt, stattLow[1]-StopLoss*Point müssen Sie NormalizeDouble(Low[1]-StopLoss*Point,Digits()) schreiben.

Wenn die Variable _StepUse gleich false ist, funktioniert Ihr Trailing-Stop laut Ihrem Code nicht. Sehen Sie sich den Code der Funktion Trailing() genau an

void Trailing()
{
  if (_StepUse)//если false то код внутри скобок выполнятся не будет.
  {
   ......

  }
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
 
vitales:

Versuchen Sie

Ersetzen durch:

Ersetzen durch:

Darüber hinaus müssen die Preise mit NormalizeDouble() normalisiert werden. Das heißt, stattLow[1]-StopLoss*Point müssen Sie NormalizeDouble(Low[1]-StopLoss*Point,Digits()) schreiben.

Wenn die Variable _StepUse gleich false ist, funktioniert Ihr Trailing-Stop laut Ihrem Code nicht. Sehen Sie sich den Code der Funktion Trailing() genau an.

Sind Sie in Kontakt? Senden Sie mir eine Nachricht an http://vk.com/computerwizard116. Ich weiß nicht mehr, wie ich das EA-Problem lösen soll. Ich habe auf diese Strategie für eine Woche auf einem Demo-Konto arbeiten

Und es funktioniert. Und beim Testen schließt dieser Schlingel die Order nicht einmal bis zum Takeout-Punkt(((((( Auf dem Foto können Sie sehen, dass der Preis über den Takeout-Punkt hinausging und zurückging, aber er schloss mit einem Verlust, verdammt!(((

Warum tut er das?

Dateien:
 
MIR_KAZAN:

Sind Sie in Kontakt? Senden Sie mir eine E-Mail an http://vk.com/computerwizard116. Ich weiß nicht mehr, wie ich das EA-Problem lösen soll. Ich habe diese Strategie für eine Woche auf einem Demo-Konto verwendet

und es funktioniert. Aber beim Testen schließt dieser Schlingel nicht einmal den Auftrag zum Takeaway. (((((( Auf dem Foto können Sie sehen, dass der Preis über den Takeaway hinausging und zurückging, aber er schloss mit einem Verlust.

Warum tut sie das?

Ich bin nicht in Kontakt.

Take-Profit- undStop-Loss-Aufträge sind nicht vom Berater abhängig, sie werden auf dem Server des Brokers ausgeführt. Der EA setzt nur den Take-Profit und den Stop-Loss, führt sie aber nicht aus. Prüfen Sie, ob der Take Profit bereits gesetzt wurde, nachdem der Kurs diesen Wert erreicht hat. Mit anderen Worten: Zuerst wurde die Order eröffnet, dann bewegte sich der Preis hin und her, und dann wurde der Take Profit festgelegt.

 
vitales:

Ich bin nicht in Kontakt.

Die Ausführung von Take-Profit- undStop-Loss-Orders hängt nicht vom EA ab, sie werden auf dem Server des Brokers ausgeführt. Der EA setzt nur die Take- und Stop-Orders, führt sie aber nicht aus. Prüfen Sie, ob der Take Profit bereits gesetzt wurde, nachdem der Kurs diesen Wert erreicht hat. Mit anderen Worten: Zuerst wurde die Order eröffnet, dann ging der Kurs hin und her, und dann wurde der Take Profit festgelegt.

Wie kann man TP, Sl in OrderSend platzieren, so dass SL das Hoch der vorherigen Kerze und TP das Tief der vorherigen Kerze + TakeProfit ist?