[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 334

 
hoz:


Boris, wenn Sie eine der Bedingungen in int GetGeneralSignal() auskommentieren, ist die Öffnung klar.

Ich habe sie aufgespürt. Das Kennzeichen ändert seinen Wert nicht, wenn die Rentabilität der derzeit offenen Aufträge im Minus ist. Hier ist die umgeschriebene Funktion, die die Short- und Long-Flags auf false setzen soll, d.h. die Eröffnung einer Position verbietet, wenn es Minus-Orders gibt:

Die aufrufende Funktion ist diese:

Vielleicht sind die Bedingungen für den Bey besser geeignet? Zwar habe ich heute nur Verkäufe offen, weil der Euro sehr schwach gefallen ist, aber immerhin, etwas ist besser als nichts!
 
borilunad:
Vielleicht sind die Bedingungen für die Bai besser geeignet? Ehrlich gesagt, werden heute nur Verkäufe eröffnet, weil der Euro sehr schwach fällt, aber trotzdem ist etwas besser als nichts!


Nein. Das Signal wird in int GetGeneralSignal() geschrieben und funktioniert eindeutig. Das Signal ist primitiv, ich habe es nur für den Test genommen. Wenn PCI die obere Grenze überschritten hat - kaufen, und wenn die untere Grenze - verkaufen. Ich selbst verwende keine Indizes, aber ich habe beschlossen, dies nur als Experiment zu überprüfen.

So, das war's. Ohne Flaggen funktioniert alles perfekt. Bei Flaggen ist das nicht der Fall. Wenn die Funktionint FindOrders(bool&long,bool&short) einen Auftrag des angegebenen Typs enthält und sein Gewinn unter Null liegt, muss meine Funktion gemäß dem Verweis auf die Funktion GetGeneralSignal() einem bestimmten Flag den Wert false übergeben, aber in Wirklichkeit zeigen die Flags immer true:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         long = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}  

Ich kann es im Drucker sehen, aber es ist nicht klar, warum sich die Flagge nicht ändert.

Übrigens, ich habe die Rentabilität der Aufträge im Druck dargestellt:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     pr("profitS =" + profitS);
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Und beim Drucken der Werte der Flaggen wird dies angezeigt:

D.h. es ist klar, dass, wenn die Rentabilität unter Null liegt, das entsprechende Flag auf false gesetzt werden sollte, aber das passiert nicht... Alles scheint elementar zu sein, aber irgendetwas ist nicht in Ordnung.

 
hoz:


Nein. Es gibt ein Signal in der Funktion int GetGeneralSignal(), das gut funktioniert. Das Signal ist primitiv, ich habe es nur für den Test genommen. Wenn PCI die obere Grenze überschritten hat - kaufen, und wenn die untere Grenze - verkaufen. Ich selbst verwende keine Indizes, aber ich habe beschlossen, dies nur als Experiment zu überprüfen.

So, das war's. Ohne Flaggen funktioniert alles perfekt. Bei Flaggen ist das nicht der Fall. Wenn die Funktionint FindOrders(bool&long,bool&short) einen Auftrag des angegebenen Typs enthält und sein Gewinn unter Null liegt, muss meine Funktion gemäß dem Verweis auf die Funktion GetGeneralSignal() einem bestimmten Flag den Wert false übergeben, aber die Flags enthalten immer true:

Ich sehe es im Druck, aber ich verstehe nicht, warum die Flagge nicht wechselt.
Sieh mal, du hast in beiden Fällen long=false geschrieben, wie soll sich das also öffnen?
 
hoz:



Ich kann es im Druck sehen, aber warum sich die Flagge nicht ändert, ist nicht klar.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false; /// ?????????????????????? 
                 }
                 t++;
              }
   }
   
   return (t);
}  
 

Der Tippfehler wurde korrigiert.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         short = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}

Hier ist ein Bildschirmfoto:

Sie können auf dem Diagramm sehen, dass die Bai im Minus ist und die Flagge = TRU sowieso.

 
Guten Abend, könnten Sie mir bitte sagen, wie ich das Formular " Warnung" nur einmal erscheinen lassen kann, wenn die Bedingung eintritt, und nicht jedes Mal, wenn die Bedingung erfüllt ist?
 

Ich habe Mitleid mit Ihnen! Ich schreibe Ihnen, wie es ohne Schleifen funktioniert, die durch Funktionen verlangsamt werden! Hier ist Ihr Code, aber was soll ich daraus machen?

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
Dieses Schema ist krampflos und wirkt sofort! Verzichten Sie auf unnötige Funktionen! Die Funktion ExistPositions() finden Sie unter Nützliche Funktionen der lieben Kim!
 
borilunad:

Ich habe Mitleid mit Ihnen! Ich schreibe Ihnen, wie es ohne Schleifen funktioniert, die durch Funktionen verlangsamt werden! Hier ist Ihr Code, aber was soll ich daraus machen?

Dieses System ist einfach und funktioniert sofort! Verzichten Sie auf unnötige Funktionen! Die Funktion ExistPositions() finden Sie unter Nützliche Funktionen von Kim!


Boris, die FunktionExistPositions hatdie gleiche Schleife, nur hat sie mehr unnötige Prüfungen, so dass es nicht träge auf dem Weg sein wird. Ihre Logik ist mir klar, aber der Grund für die Inoperabilität der vorherigen Version wurde nicht genannt, was seltsam ist :)

Sie verwenden auch diese Flaggen:

 if(profitL > 0 && long == true && short == false)

Und ich habe gezeigt, dass sie nicht richtig zurückkommen.

Auch hier gilt: Wenn die Variablen profitL und profitS in dieser Funktion vorhanden sind, werden die Flags nicht benötigt.

So war es dann auch:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)              // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

Auch hier öffnet es sich nicht auf Signal, sondern auf was auch immer.

 
Hallo zusammen!
Ich mache eine virtuelle Spur und stieß auf ein Problem mit closelevel=profitpips-TrailingStop, die Schleppnetz und GlobalVariableSet("tral",0) eingeschaltet ist, wie es sein sollte, aber Variable
der Variablencloselevel wird der Wert profitpips zugewiesen (es handelt sich um den aktuellen Gewinn in Pips) anstelle von profitpips-TrailingStop mit allen sich daraus ergebenden Konsequenzen o_o



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

Ich habe es herausgefunden, die Zeile
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


änderte es in...
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



Jetztwird derAbschlusslevelnicht geändert, wenn der Gewinn steigt...

Ich habe es bereits herausgefunden.



 
hoz:


Boris, die FunktionExistPositions hat die gleicheSchleife, aber es gibt mehr unnötige Prüfungen, so dass es nicht träge auf dem Weg sein. Ihre Logik ist mir klar, aber der Grund für die Inoperabilität der vorherigen Version wurde nicht genannt, was seltsam ist :)

Sie verwenden auch diese Flaggen:

Und ich habe nachgewiesen, dass sie nicht korrekt zurückgegeben werden.

Auch hier gilt: Wenn die Variablen profitL und profitS in dieser Funktion vorhanden sind, werden die Flags nicht benötigt.

So hat es sich ergeben:

Auch hier öffnet es sich nicht durch ein Signal, sondern durch was auch immer.

Dann graben Sie in Ihrer eigenen Wohnung! Sie haben für jedes Wort Ihres Codes eine Funktion, und Sie müssen mit Variablen auskommen. Das macht den Code schwerfällig. Ich habe in Kims Code alles auskommentiert, was ich nicht brauche, und es funktioniert alles sehr schnell! Erinnern Sie sich daran, dass ich jeden gefragt habe, wie man das Programm unter vielen Bedingungen schneller laufen lassen kann. Jetzt läuft die Prüfung für ein Jahr auf alle Zecken in 5 Minuten! Ich bin alle Bedingungen und Funktionen durchgegangen und habe alles Unnötige entfernt.
Grund der Beschwerde: