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

 


Hallo, könnten Sie mir bitte helfen - ich habe ein Problem: Der Roboter geht eine Position ein und beim nächsten Tick ändert er seinen Stop-Loss auf das vorherige Tief, und ich brauche, dass der Stop-Loss nur geändert wird, wenn die Kerze schließt, bei der die Position eröffnet wurde

void TrailingStop()
{  
  for(int i=0;i<OrdersTotal();i++)
  {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true);
    {
    if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
      {  
      if (OrderType()==OP_BUY)             
        {              
            double LOW_1 = iLow(NULL,0,1);       
            bool res=OrderModify(OrderTicket(),OrderOpenPrice(),LOW_1,OrderTakeProfit(),0,White);                
            if(!res)  Print("Ошибка модификации ордера. Код ошибки=",GetLastError());         
        }               
       if (OrderType()==OP_SELL)              
        {                  
            double HIGH_1 = iHigh(NULL,0,1);                    
            res=OrderModify(OrderTicket(),OrderOpenPrice(),HIGH_1,OrderTakeProfit(),0,White);                
            if(!res)  Print("Ошибка модификации ордера. Код ошибки=",GetLastError());          
        }                      
      }
    } 
  }     
 return;                   
}
 

oder wie man diesen Fehler loswerden kann


 
remjte:
Meine Herren! Können Sie mir den Code sagen, der das Testen eines EAs stoppt, wenn nicht genug Marge vorhanden ist, um eine Position zu eröffnen?
Ich danke Ihnen!
Wenn AccountFreeMarginCheck() kleiner als ein bestimmter Wert ist (z.B. kleiner als 50% der AccountFreeMargin) - beenden Sie die Handelsfunktion, der Test endet schnell, weil leere Schleifen fast nicht belastbar sind.
 
evillive:
Wenn AccountFreeMarginCheck() kleiner als ein bestimmter Wert ist (z.B. weniger als 50% der AccountFreeMargin) - beenden Sie die Handelsfunktion, der Test ist schnell beendet, denn leere Schleifen werden fast nicht geladen.

Ehrlich gesagt, noch sehr grün, fand dieses Stück Code können Sie mir sagen, wie zu korrigieren

if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
if(GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
return (l_lots_4);

 
In einfacheren Worten: Wie schreibe ich diese Bedingung - Ändere eine offene Order nicht, bis eine neue Kerze erscheint?
 
zhezheria:
Lassen Sie mich einfacher schreiben: wie man diese Bedingung schreibt - Eine offene Order nicht ändern, bis eine neue Kerze erscheint
Arbeiten Sie an der Eröffnung einer neuen Bar in einem entsprechenden Zeitrahmen. Eine Menge Code-Beispiele
 
remjte:

Ehrlich gesagt, noch sehr grün, fand dieses Stück Code können Sie mir sagen, wie zu korrigieren

if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
if (GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
return (l_lots_4);

Sie brauchen ihn nicht zu bearbeiten, er reicht völlig aus. Es sei denn, Sie ersetzen die Variablen einfach durch Ihre eigenen Namen.

Wenn wir aber weniger Risiko brauchen, dann, wenn (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= AccountFreeMargin()*0.5) return (-1); - in diesem Fall, wenn 50% oder weniger freies Geld übrig bleibt, nachdem die Position mit dem angegebenen Lot eröffnet wurde, dann return (-1)

 
Können Sie mir bitte einen Tipp geben? Ich muss einen Teil des Codes schreiben, in dem die zweite Bestellung in der Liste ausgewählt und dann gelöscht wird (ausstehend). Gibt 4051 zurück, wenn OrderSelect(1, SELECT_BY_POS, MODE_TRADES)
 
remjte:
Meine Herren! Können Sie mir den Code sagen, der das Testen eines EAs stoppt, wenn nicht genug Marge vorhanden ist, um eine Position zu eröffnen?
Ich danke Ihnen!
      // проверяем доступность свободных средств
      if(AccountFreeMarginCheck(Symbol(),OP_BUY,OpenLot)<=0 || GetLastError()==134)
            {
               Print("It is impossible to open the order Buy, not enough money.");
               return(0);
            }
      // проверяем доступность свободных средств
      if(AccountFreeMarginCheck(Symbol(),OP_SELL,OpenLot)<=0 || GetLastError()==134)
            {
               Print("It is impossible to open the order Sell, not enough money.");
               return(0);
            }
doube OpenLot; // Лот который вы хотите открыть.
Geben Sie dies ein, bevor Sie einen Marktauftrag eröffnen.
 
Pomid:
Können Sie mir bitte einen Tipp geben? Ich muss einen Teil des Codes schreiben, in dem die zweite Bestellung in der Liste ausgewählt und dann gelöscht wird (ausstehend). Gibt 4051 zurück, wenn OrderSelect(1, SELECT_BY_POS, MODE_TRADES)
Die Zählung der Aufträge beginnt bei 0. Try, OrderSelect(0, SELECT_BY_POS, MODE_TRADES)