[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 524

 
sss2019:

Il mio Expert Advisor apre tre ordini nel mio terminale, ad un certo punto dovrebbe chiudere tutti e tre gli ordini, ma per qualche motivo ne chiude solo due, non dà errori.

Ecco questo pezzo che dovrebbe chiudere gli scambi

Non capisco cosa c'è che non va e perché solo due affari sono chiusi. Per favore, ditemi chi sa cosa.

if(OrderSelect(i, SELECT_BY_POS) == false) continue;
 
Vinin:


Fare il ciclo in modo diverso


Anche questo non ha aiutato. Non riorganizzando il ciclo o sostituendo continue non ha aiutato, come se l'EA non vedesse i suoi tre ordini e ne cancellasse solo due.

 
Invertire la direzione del ricalcolo del ciclo
 
Prendilo e usalo.
File:
 
A volte le cose sono così incomprensibili, per niente logiche, che penso ci siano errori nell'ambiente terminale stesso.
 
sss2019:
A volte le cose sono così incomprensibili, per niente logiche, che penso ci siano errori nell'ambiente terminale stesso.
Per farlo sembrare meno è necessario iniziare a studiare un libro di testo e un manuale. Poi cercate di trovare spiegazioni di problemi simili sul forum.
 
sss2019:

Come si potrebbe organizzare meglio il drawdown massimo dell'EA, al quale smette di funzionare, si può impostare una variabile statica che accumula la quantità di perdite?

L'Expert Advisor dovrebbe smettere di funzionare, ma ricomincerà a funzionare dopo aver riavviato o cambiato i parametri.


Quando si inizializza un EA, è possibile salvare il saldo corrente in una variabile statica. E nella funzione Start, si può controllare quanta percentuale del saldo corrente è diminuito da quello iniziale e se la percentuale è più del consentito - vietare il commercio. Brevemente, senza alcun codice. Dopo il riavvio, l'Expert Advisor ricorderà il nuovo equilibrio iniziale...
 
MrSoros:

Quando si inizializza l'Expert Advisor, il bilancio corrente può essere salvato in una variabile statica. E nella funzione Start, controlla quanto il saldo corrente è scivolato dal saldo iniziale, e se la percentuale è superiore al consentito - il commercio è vietato. Brevemente, senza alcun codice. Dopo il riavvio, l'Expert Advisor ricorderà il nuovo equilibrio iniziale.

Avete capito la domanda?
 
MrSoros:

1. Quando si inizializza l'Expert Advisor, è possibile salvare il bilancio corrente in una variabile statica. Poi la funzione Start controlla di quanti punti percentuali il saldo corrente è diminuito da quello iniziale e se la percentuale è più alta, il commercio sarà proibito. In breve, senza alcun codice.

2. Dopo il riavvio, il valutatore ricorderà il nuovo saldo originale...

1. È possibile. Ho questa opzione (con codice) - inizializzate voi stessi le variabili:

extern int MaxLoss = 90;          // Максимально допустимая просадка в процентах от баланса
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия
int start()
{  
   if (IsExpertStopped)
   {
      Comment("Не удалось инициализировать советник!");
      return (0);
   }
   
   if (IsExpertFailed)
   {
      Comment("Критическая ошибка! Советник остановлен.");
      return (0);
   }
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Учет ордеров только ЭТОГО ЭКСПА---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
     {  
      if (!OrderSelect(orderIndex, SELECT_BY_POS))    continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
          // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(magic);
         IsExpertFailed = true;
         return (0);
      }        
         
      orderCount++;                     // считаем ордера (не больше i)                   
     
    }   

2. No. Non ricorderà il livello di equilibrio che era prima dell'inizio di questo EXPERT la prima volta. Ricorderà solo il livello corrente nella variabile

AccountBalance()

. per questo conto.

 

Buon pomeriggio, ho avuto una domanda prima sulla corretta rappresentazione delle citazioni in Excel. Questa domanda ha trovato risposta grazie aCosty .Ora ho una domanda, è possibile fare (senza MQL5 e dll) i dati per più valute da caricare? Lo schema è mostrato qui sotto, al posto di "..." i valori di data corrispondenti, i valori del prezzo di chiusura e il periodo corrente.

Presumo che la risposta alla domanda comporti possibili correzioni al mio codice. Sto allegando il codice di Expert Advisor che scrive i valori dei prezzi di chiusura per uno strumento finanziario corrente nel file.

#property copyright "S.I.Shlikov"
#property link      ""
int init()  
  {
   string Name=Symbol();
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,"Date",Name,"Period",Period());
   FileClose(h);        
  }
int start()
  {
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   string Wtime=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,Wtime,NormalizeDouble(Close[0], Digits));
   FileClose(h);   
   return(0);
  }
Motivazione: