[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 524

 
sss2019:

Mi Asesor Experto abre tres órdenes en mi terminal, en algún momento debería cerrar las tres órdenes, pero por alguna razón sólo cierra dos, no da errores.

Aquí está esta pieza que debería cerrar las operaciones

No entiendo qué pasa y por qué sólo se cierran dos operaciones. Por favor, dígame quién sabe qué.

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


Hacer el ciclo de forma diferente


Sin embargo, esto tampoco ayudó. El hecho de no reordenar el bucle o sustituirlo por continue no ayudó, como si el EA no viera sus propias tres órdenes, y sólo borrara dos.

 
Invertir el sentido del recálculo del ciclo
 
Tómalo y úsalo.
Archivos adjuntos:
 
A veces las cosas son tan incomprensibles, nada lógicas, que creo que hay errores en el propio entorno del terminal.
 
sss2019:
A veces las cosas son tan incomprensibles, nada lógicas, que creo que hay errores en el propio entorno del terminal.
Para que parezca menos hay que empezar por estudiar un libro de texto y un manual. A continuación, trata de encontrar explicaciones sobre cuestiones similares en el foro.
 
sss2019:

¿Cómo se podría organizar mejor el drawdown máximo del EA, a partir del cual deja de funcionar, se puede establecer una variable estática que acumule la cantidad de pérdidas?

El Asesor Experto debería dejar de funcionar, pero volverá a hacerlo después de reiniciar o cambiar los parámetros.


Al inicializar un EA, puede guardar el saldo actual en una variable estática. Y en la función Inicio, puede comprobar cuántos porcentajes del saldo actual han disminuido respecto al inicial y si el porcentaje es superior al permitido - prohibir operar. Brevemente, sin ningún código. Después de reiniciar, el Asesor Experto recordará el nuevo saldo inicial...
 
MrSoros:

Al inicializar el Asesor Experto, el saldo actual puede guardarse en una variable estática. Y en la función Inicio, comprueba cuánto se ha desviado el saldo actual del inicial, y si el porcentaje es superior al permitido, se prohíbe el comercio. Brevemente, sin ningún código. Después de reiniciar, el Asesor Experto recordará el nuevo saldo inicial.

¿Ha entendido la pregunta?
 
MrSoros:

1. Al inicializar el Asesor Experto, puede guardar el saldo actual en una variable estática. A continuación, la función Inicio comprueba en cuántos puntos porcentuales se ha alejado el saldo actual del inicial y, si el porcentaje es mayor, se prohibirá la operación. En resumen, sin ningún código.

2. Después de reiniciar, el evaluador recordará el nuevo saldo original...

1. Puedes hacerlo. Tengo esta opción (con código) - usted mismo inicializa las variables:

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. No recordará el nivel de equilibrio que había antes del inicio de este EXPERTO la primera vez. Sólo recordará el nivel actual de la variable

AccountBalance()

. para esta cuenta.

 

Buenas tardes, ya tenía una pregunta sobre la representación correcta de las comillas en Excel. Esta pregunta ha sido respondida gracias aCosty .Ahora tengo una pregunta, ¿es posible hacer (sin MQL5 y dll) los datos para más monedas a cargar? El esquema se muestra a continuación, en lugar de "..." los valores de la fecha correspondiente, los valores del precio de cierre y el período actual.

Supongo que la respuesta a la pregunta implicará posibles correcciones de mi código. Adjunto el código del Asesor Experto que escribe los valores de los precios de cierre para un instrumento financiero actual en el archivo.

#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);
  }