[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 521

 
Roger:

¿Cómo puedo comprobarlo?

Gracias.

¿Es posible hacer que el ajuste MaxEquity funcione por ejemplo 500 veces sin reiniciar el EA?

Por ejemplo, si escribo 500 en el contador, que sea como sigue: Supongamos que el capital inicial es de 10 000,

Después de añadir a la equidad inicial de 10.000 (especificando en la configuración), los grandes déficits se cerrarán.

Se hará 500 veces (por ejemplo) (sigue siendo imposible multiplicar el patrimonio inicial 500 veces).

Esa es la diferencia resultará con su versión - que después de incrementos de 10 000 a la equidad inicial = 10 000 -

El EA no necesita ser reiniciado, y el ciclo continuará - a 20 000 más se añadirán 10 000, a 30 000 + 10 000 y así 500 veces ( por ejemplo). Bueno

y después de cada incremento = 10 000, se cerrará la orden perdedora con el mayor inconveniente ( o varias órdenes - a especificar en los ajustes) ?

 
alex12:

Gracias.

¿Es posible hacer que el ajuste de MaxEquity funcione por ejemplo 500 veces sin reiniciar el EA?

Por ejemplo, si escribo 500 en el contador, que funcione así: Supongamos que el capital inicial es de 10 000,

Después de añadir a la equidad inicial de 10.000 (especificando en la configuración), los grandes déficits se cerrarán.

De la misma manera, digamos que 500 veces (por ejemplo) (después de todo, es imposible multiplicar el patrimonio inicial 500 veces).

En otras palabras, la diferencia aparecerá en su versión: después de añadir 10 000 al capital inicial = 10 000.

El Asesor Experto no necesita ser reiniciado, y el ciclo continuará - a 20 000 se añadirán 10 000, a 30 000 + 10 000 y así 500 veces ( por ejemplo). Por ejemplo:

Y, después de cada incremento igual a 10 000, se cerrará la orden perdedora con la mayor pérdida (o varias órdenes perdedoras, si así lo especifica en la configuración) ?


No es necesario hacer ningún reinicio. Es necesario actualizar los datos de la equidad inicial después de cerrar las posiciones y esperar a que la equidad aumente a partir de la nueva equidad inicial.
 
artmedia70:
No es necesario hacer ningún reinicio. Es necesario actualizar los datos de la equidad inicial después de cerrar las posiciones y esperar a que la equidad aumente a partir de la nueva equidad inicial.
Pero según tengo entendido todo se hace en el código de programación. No tengo conocimientos de programación)
 
alex12:
Pero según tengo entendido, todo se hace en código de programación. No tengo el poder de la programación).
Por supuesto que sí. Todo lo que necesitamos es una función que supervise continuamente la equidad y envíe una orden para cerrar las posiciones no rentables si se supera el valor especificado. A continuación, una vez cerradas con éxito todas las posiciones, hay que registrar el nuevo valor de la renta variable y seguirlo rastreando.
 
artmedia70:
Naturalmente. Sólo hay una función que controlará continuamente la equidad y enviará una orden para cerrar las posiciones no rentables si se supera el valor especificado. A continuación, una vez cerradas con éxito todas las posiciones, hay que registrar el nuevo estado patrimonial y seguir controlándolo.
Gracias.
 
tol64:

¿Puede decirme cuál puede ser el problema?


Supongo que mi pregunta no contiene suficiente información para ayudarme). Completaré mi pregunta. A continuación proporciono una estructura con las principales funciones de mi Asesor Experto. Tal vez esto revele el problema que he esbozado.

// ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ С ФУНКЦИЯМИ
// ВНЕШНИЕ ПАРАМЕТРЫ
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

Init()
{
  // ПРОВЕРКА: ПРАВИЛЬНО ЛИ ВВЕДЕНЫ ЗНАЧЕНИЯ ТАЙМФРЕЙМОВ ВО ВНЕШНИХ ПАРАМЕТРАХ.
}

Deinit()
{
  return(0);
}

Start()
{
  // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
  // ИНДИКАТОРЫ
  // УСЛОВИЯ
  // ФУНКЦИИ ВИЗУАЛИЗАЦИИ
  // ФУНКЦИЯ УДАЛЕНИЯ ОРДЕРОВ ПРИ ИСПОЛНЕНИИ ОПРЕДЕЛЁННОГО УСЛОВИЯ
  
//--- ВЫЗОВ ФУНКЦИИ УПРАВЛЕНИЯ КАПИТАЛОМ ------------------------------------------------------------------//  
   if (Money_Management_OnOff == TRUE)
      {  
         MM_FxProp(Delta,Start_Lot,Start_Deposit,Step_Lot,Stop_Trade,Symbol());
         Lots = NormalizeDouble(GlobalVariableGet("fxprop_lot"),2);

      //--- ПРОВЕРКА: ИЗМЕНИЛОСЬ ЛИ ЗНАЧЕНИЕ ЛОТА С ЦЕЛЬЮ ПЕРЕУСТАНОВКИ ОТЛОЖЕННЫХ ОРДЕРОВ ----------------//
         Re_Set_All_Orders_by_Lots(dgt, Lots);
      }
   else  Lots = 0.1;

  // ФУНКЦИЯ ИНФОРМАЦИОННОЙ ПАНЕЛИ
  // ПРОВЕРКА НА НОВЫЙ БАР
  // ПРОВЕРКА НА КОЛ-ВО БАРОВ НА ГРАФИКЕ
  // ПРОВЕРКА НА КОЛ-ВО ЗНАКОВ В СИМВОЛЕ
  // УСТАНОВКА ФЛАГОВ, ЕСЛИ ИСПОЛНЯЮТСЯ УСЛОВИЯ ДЛЯ ЗАКРЫТИЯ ОПРЕДЕЛЁННЫХ ПОЗИЦИЙ
  // ФУНКЦИИ ЗАКРЫТИЯ ПОЗИЦИЙ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ
  // ФУНКЦИЯ ТРЕЙЛИНГ СТОПА
  // ФУНКЦИЯ МОДИФИКАЦИИ ОТЛОЖЕННЫХ ОРДЕРОВ
  // ФУНКЦИЯ УСТАНОВКИ ОТЛОЖЕННЫХ ОРДЕРОВ
  // ФУНКЦИЯ ОТКРЫТИЯ ПОЗИЦИИ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ
  // УДАЛЕНИЕ ОТЛОЖЕННЫХ ОРДЕРОВ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ
  
//--- ЗАНОСИТЬ ДАННЫЕ В ОТЧЁТ ТОЛЬКО, ЕСЛИ КОЛ-ВО ЗАКРЫТЫХ ПОЗИЦИЙ ИЗМЕНИЛОСЬ
   Amount_Positions = 0;
   
   for(count = 0; count < OrdersHistoryTotal(); count++)
      {
         OrderSelect(count, SELECT_BY_POS, MODE_HISTORY);

         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               Amount_Positions++;
            }
      }

   if(Amount_Close_Deals != Amount_Positions)
      {  
         if(Short_Trade_Report == TRUE)
            {  
               // ФУНКЦИЯ ФОРМИРУЮЩАЯ ОТЧЁТ
            }
         Amount_Close_Deals = Amount_Positions;
      }
}

Por el momento tengo que recompilar el EA cada vez después de activar/desactivar la función de gestión de dinero en los parámetros del EA, para que el informe se genere correctamente.

P.D. ¿Tal vez tenga algo que ver con la variable global fxprop_lot del terminal?

 
tol64:


Supongo que no hay suficiente información en mi pregunta para ayudarme). Completaré mi pregunta. A continuación estoy proporcionando la estructura con las funciones básicas de mi EA. Tal vez de este modo sea posible identificar el problema, que he destacado.

Por el momento tengo que recompilar el EA cada vez después de activar/desactivar la función de gestión de dinero en los parámetros del EA para que el informe se genere correctamente.

P.D. ¿Tal vez tenga que ver con la variable globalfxprop_lot?


Si crees que eso es suficiente, supongo que lo es. Tendremos que esperar una respuesta. No tengo ninguno.
 
Vinin:

Si crees que es suficiente, supongo que sí. Estoy esperando una respuesta. No tengo ninguno.


Lamentablemente, mi experiencia hasta ahora no me permite juzgar si la información proporcionada es suficiente o no para abordar una cuestión concreta. No lo hago a propósito y me disculpo si lo haces). El caso es que, en mi opinión, el punto clave en el problema que destaqué es que todo funciona correctamente al recompilar el Asesor Experto. Pero esto también se debe a mi experiencia inmadura. Por favor, indíquenos qué información hay que proporcionar para resolver este problema. La función de gestión monetaria o de generación de informes aparece obviamente en el problema. Por eso te voy a dar la función de gestión del dinero:

double MM_FxProp(double Delta, double Start_Lot, double Start_Deposit, double Step_Lot, double Stop_Trade, string fSymbol) 
{
   if (Delta < Step_Lot || Start_Lot < Step_Lot                          ||    // если Delta <, чем 0.01 или Start_Lot <, чем 0.01 или
       Start_Deposit <= MarketInfo(fSymbol, MODE_MARGINREQUIRED) / 10.0  ||    // Start_Depo <=, чем размер свободных средств, ...
                                                                               // ...необходимых для открытия 1 лота на покупку (разделить на 10) или
       AccountFreeMarginCheck(fSymbol, OP_BUY, Start_Lot) <= Stop_Trade  ||    // размер свободных средств после BUY <= Stop_Trade или
       AccountFreeMarginCheck(fSymbol, OP_SELL, Start_Lot) <= Stop_Trade ||    // размер свободных средств после SELL <= Stop_Trade или
       Start_Lot < MarketInfo(fSymbol, MODE_MINLOT)                      ||    // Start_Lot <, чем минимальный возможный или
                
       (fSymbol != "GBPUSD" && fSymbol != "EURUSD" && fSymbol != "USDCHF" && fSymbol != "USDJPY" &&     // нет ни одного инструмента из ниже перечисленных, то
        fSymbol != "AUDUSD" && fSymbol != "USDCAD" && fSymbol != "EURCHF" && fSymbol != "EURGBP" && 
        fSymbol != "EURJPY" && fSymbol != "EURCAD" && fSymbol != "EURAUD" && fSymbol != "GBPCHF" &&
        fSymbol != "GBPJPY" && fSymbol != "CHFJPY" && fSymbol != "NZDUSD" && fSymbol != "USDSEK" && 
        fSymbol != "USDDKK" && fSymbol != "USDNOK" && fSymbol != "USDSGD" && fSymbol != "USDZAR" && 
        fSymbol != "EURNZD" && fSymbol != "AUDJPY" && fSymbol != "AUDNZD" && fSymbol != "AUDCAD" && 
        fSymbol != "AUDCHF" && fSymbol != "CADCHF" && fSymbol != "CADJPY" && fSymbol != "NZDJPY" && fSymbol != "XAUUSD")) 
       {
         Print("Расчет лота функцией MM_FxProp() невозможен из-за некорректности значений переданных ей аргументов.");
         return (0);
       }
   
   double S_D     = Start_Deposit;
   double S_L     = Start_Lot;
   double Stp_L   = Step_Lot;
   double stepUP  = 0;
   double stepDW  = 0;
   
   if (AccountBalance() >= Start_Deposit) //если текущий баланс >= значению Start_Depo, то
   {
      while (AccountBalance() > S_D + Delta * (10.0 * S_L)) //пока текущий баланс >, чем результат формулы
      {
         S_D += Delta * (10.0 * S_L);
         S_L += Stp_L;
      }
      stepUP = S_D + Delta * (10.0 * S_L);
      stepDW = S_D;
   }
   
   if (AccountBalance() < Start_Deposit) 
   {
      while (AccountBalance() < S_D) 
      {
         if (S_L > Stp_L) S_L -= Stp_L;
         else S_L = Stp_L;
         S_D -= Delta * (10.0 * S_L);
      }
      stepDW = S_D;
      stepUP = S_D + Delta * (10.0 * S_L);
   }
   
   if (AccountFreeMarginCheck(fSymbol, OP_BUY, S_L) <= Stop_Trade  ||   // если размер свободных средств после BUY <= Stop_Trade или
       AccountFreeMarginCheck(fSymbol, OP_SELL, S_L) <= Stop_Trade ||   // размер свободных средств после SELL <= Stop_Trade или
       GetLastError() == 134/* NOT_ENOUGH_MONEY */                 ||   // не хватает средств для операции или
       S_L < MarketInfo(fSymbol, MODE_MINLOT))                          // расчитанный объём лота <, чем минимальный возможный, то
       {
         while (AccountFreeMarginCheck(fSymbol, OP_BUY, S_L) <= Stop_Trade || // пока размер свободных средств после BUY <= Stop_Trade или
                AccountFreeMarginCheck(fSymbol, OP_SELL, S_L) <= Stop_Trade)  // размер свободных средств после SELL <= Stop_Trade, то
                {
                  S_L -= Stp_L;    // считаем так.
                  if (S_L < MarketInfo(fSymbol, MODE_MINLOT))  // если же расчитанный объём лота <, чем минимальный возможный, то
                     {
                        Print("Объём средств на счете не позволяет открыть позицию минимального объёма.");
                        return (GlobalVariableSet("fxprop_lot", 0));
                     }
                }
       } 
   else {
            GlobalVariableSet("fxprop_lot", S_L);
            Comment("Средств на счете: ", DoubleToStr(AccountBalance(),2), ", лот: ", S_L, ", лот + ", Stp_L, "при >=", stepUP, ", лот - ", Stp_L, "при <", stepDW); return;
        }
   return (0.0);
}
Y en el siguiente post la función de generación de informes...
 
void Short_Trade_Report(int Mgc_Src_LP_TS№1,int Mgc_LP01_TS№1,int Mgc_LP02_TS№1,int Mgc_LP03_TS№1,int Mgc_LP04_TS№1,int Mgc_LP05_TS№1,int Mgc_LP06_TS№1,
                        int Mgc_Src_SP_TS№1,int Mgc_SP01_TS№1,int Mgc_SP02_TS№1,int Mgc_SP03_TS№1,int Mgc_SP04_TS№1,int Mgc_SP05_TS№1,int Mgc_SP06_TS№1,
                        
                        int Mgc_Src_LP_TS№2,int Mgc_LP01_TS№2,int Mgc_LP02_TS№2,int Mgc_LP03_TS№2,int Mgc_LP04_TS№2,int Mgc_LP05_TS№2,int Mgc_LP06_TS№2,
                        int Mgc_Src_SP_TS№2,int Mgc_SP01_TS№2,int Mgc_SP02_TS№2,int Mgc_SP03_TS№2,int Mgc_SP04_TS№2,int Mgc_SP05_TS№2,int Mgc_SP06_TS№2,
                        
                        int Mgc_Src_LP_TS№3,int Mgc_LP01_TS№3,int Mgc_LP02_TS№3,int Mgc_LP03_TS№3,int Mgc_LP04_TS№3,int Mgc_LP05_TS№3,int Mgc_LP06_TS№3,
                        int Mgc_Src_SP_TS№3,int Mgc_SP01_TS№3,int Mgc_SP02_TS№3,int Mgc_SP03_TS№3,int Mgc_SP04_TS№3,int Mgc_SP05_TS№3,int Mgc_SP06_TS№3)
{
#define  RA 10000      // Range Array - Размер массива для отчёта
      
double   Acc_Bal_Close[RA];   // Массив для баланса на закрытии сделки(-ок)
double   Acc_Bal_Open[RA];    // Массив для баланса на открытии сделки(-ок)

double   Price_Open_Pos[RA];
double   Price_Stop_Loss[RA];

double   TS№1_DS[RA], TS№2_TA[RA], TS№3_SBH[RA];

int      pos, handle, dgt, Magic, sign, index;

double   Swap_P;
double   Profit_P;
double   Commission;
double   Open_Price;
double   Stop_Loss;
      
string   Type_Pos;
string   comment;
string   Str_Stop_Loss;
      
//--- ПРОВЕРКА НА КОЛ-ВО ЗНАКОВ В СИМВОЛЕ ДЛЯ РАСЧЁТА ОТСТУПА В СТРОКАХ КОММЕНТАРИЕВ --------------------------------//
int digit_string;
int digit = MarketInfo(Symbol(),MODE_DIGITS);
   
switch(digit)
      {  case 2 : digit_string = 4; dgt = 100;    break;
         case 3 : digit_string = 5; dgt = 100;    break;
         case 4 : digit_string = 6; dgt = 10000;  break;
         case 5 : digit_string = 7; dgt = 10000;  break;
         default: Print("Неизвестный символ! Количество знаков = ",digit); return(0);  }

handle = FileOpen("ShortReport.csv",FILE_CSV|FILE_WRITE);
      
if(handle > 0) //1
   {
      FileWrite(handle,"Time Close"+","+"Symbol"+","+"Type"+","+"Lots"+","+"Balance($)"+","+"Stop Loss(p)"+","+"Profit(p)"+","+"TS#1_DS(p)"+","+"TS#2_TA(p)"+","+"TS#3_SBH(p)");

      for(pos = 0; pos < OrdersHistoryTotal(); pos++) // 2
         {  
            OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY);
                  
            Commission =  OrderCommission();
            Swap_P     = (OrderSwap()/10)/OrderLots();
            Profit_P   = (OrderProfit()/10)/OrderLots()+(OrderSwap()/10)/OrderLots();
            Open_Price =  NormalizeDouble(OrderOpenPrice(),Digits);
            
            index = StringFind(OrderComment(),"[sl]",0);
            
            if(index != -1)   {  comment = StringSubstr(OrderComment(),0,StringLen(OrderComment())-4);   }
            else  {  comment = StringSubstr(OrderComment(),0,StringLen(OrderComment()));  }
            
            if(OrderType() < 2 && OrderCloseTime() == TimeCurrent() && 
                                 (OrderMagicNumber() == Mgc_Src_LP_TS№1 || OrderMagicNumber() == Mgc_Src_SP_TS№1 || 
                                  OrderMagicNumber() == Mgc_LP01_TS№1   || OrderMagicNumber() == Mgc_LP02_TS№1   || OrderMagicNumber() == Mgc_LP03_TS№1 || 
                                  OrderMagicNumber() == Mgc_LP04_TS№1   || OrderMagicNumber() == Mgc_LP05_TS№1   || OrderMagicNumber() == Mgc_LP06_TS№1 ||
                                  OrderMagicNumber() == Mgc_SP01_TS№1   || OrderMagicNumber() == Mgc_SP02_TS№1   || OrderMagicNumber() == Mgc_SP03_TS№1 ||
                                  OrderMagicNumber() == Mgc_SP04_TS№1   || OrderMagicNumber() == Mgc_SP05_TS№1   || OrderMagicNumber() == Mgc_SP06_TS№1))
               {     
                  TS№1_DS[pos]         = Profit_P + Swap_P + Commission;
                  Acc_Bal_Close[pos]   = AccountBalance();
                  Str_Stop_Loss        = StringSubstr(comment,StringLen(comment)-digit_string,digit_string);
                  Price_Stop_Loss[pos] = MathAbs((StrToDouble(Str_Stop_Loss)-Open_Price)*dgt);
               }

            if(OrderType() < 2 && OrderCloseTime() == TimeCurrent() && 
                                 (OrderMagicNumber() == Mgc_Src_LP_TS№2 || OrderMagicNumber() == Mgc_Src_SP_TS№2 || 
                                  OrderMagicNumber() == Mgc_LP01_TS№2   || OrderMagicNumber() == Mgc_LP02_TS№2   || OrderMagicNumber() == Mgc_LP03_TS№2 || 
                                  OrderMagicNumber() == Mgc_LP04_TS№2   || OrderMagicNumber() == Mgc_LP05_TS№2   || OrderMagicNumber() == Mgc_LP06_TS№2 ||
                                  OrderMagicNumber() == Mgc_SP01_TS№2   || OrderMagicNumber() == Mgc_SP02_TS№2   || OrderMagicNumber() == Mgc_SP03_TS№2 ||
                                  OrderMagicNumber() == Mgc_SP04_TS№2   || OrderMagicNumber() == Mgc_SP05_TS№2   || OrderMagicNumber() == Mgc_SP06_TS№2))
               {  
                  TS№2_TA[pos]         = Profit_P + Swap_P + Commission;
                  Acc_Bal_Close[pos]   = AccountBalance();
                  Str_Stop_Loss        = StringSubstr(comment,StringLen(comment)-digit_string,digit_string);
                  Price_Stop_Loss[pos] = MathAbs((StrToDouble(Str_Stop_Loss)-Open_Price)*dgt);
               }

            if(OrderType() < 2 && OrderCloseTime() == TimeCurrent() && 
                                 (OrderMagicNumber() == Mgc_Src_LP_TS№3 || OrderMagicNumber() == Mgc_Src_SP_TS№3 || 
                                  OrderMagicNumber() == Mgc_LP01_TS№3   || OrderMagicNumber() == Mgc_LP02_TS№3   || OrderMagicNumber() == Mgc_LP03_TS№3 || 
                                  OrderMagicNumber() == Mgc_LP04_TS№3   || OrderMagicNumber() == Mgc_LP05_TS№3   || OrderMagicNumber() == Mgc_LP06_TS№3 ||
                                  OrderMagicNumber() == Mgc_SP01_TS№3   || OrderMagicNumber() == Mgc_SP02_TS№3   || OrderMagicNumber() == Mgc_SP03_TS№3 ||
                                  OrderMagicNumber() == Mgc_SP04_TS№3   || OrderMagicNumber() == Mgc_SP05_TS№3   || OrderMagicNumber() == Mgc_SP06_TS№3))
               {  
                  TS№3_SBH[pos]        = Profit_P + Swap_P + Commission;
                  Acc_Bal_Close[pos]   = AccountBalance();
                  Str_Stop_Loss        = StringSubstr(comment,StringLen(comment)-digit_string,digit_string);
                  Price_Stop_Loss[pos] = MathAbs((StrToDouble(Str_Stop_Loss)-Open_Price)*dgt);
               }
                  
            if(OrderType() == OP_BUY)   {  Type_Pos = "buy";   }
            if(OrderType() == OP_SELL)  {  Type_Pos = "sell";  }
                  
            if(OrderType() < 2)
               {  
                  FileWrite(handle,TimeToStr(OrderCloseTime(),TIME_DATE|TIME_MINUTES)+","+Symbol()+","+Type_Pos+","
                                                                                           
                                  +DoubleToStr(OrderLots(),2)+","+DoubleToStr(Acc_Bal_Close[pos],2)+","+DoubleToStr(Price_Stop_Loss[pos],2)+","
                                       
                                  +DoubleToStr(Profit_P+Swap_P+Commission,2)+","+DoubleToStr(TS№1_DS[pos],2)+","+DoubleToStr(TS№2_TA[pos],2)+","+DoubleToStr(TS№3_SBH[pos],2));  }
      }  FileClose(handle); // 2\
   } //1
}
Por favor, ayude a resolver el problema.
 

He intentado llamar a la función de gestión del capital durante la inicialización:

int init()
  {

   ...
   
   if(!GlobalVariableCheck("fxprop_lot"))
      {
      //--- ВЫЗОВ ФУНКЦИИ УПРАВЛЕНИЯ КАПИТАЛОМ ----------------------------------------//
         if (Money_Management_OnOff == TRUE)
            {  
               MM_FxProp(Delta,Start_Lot,Start_Deposit,Step_Lot,Stop_Trade,Symbol());
               Lots = NormalizeDouble(GlobalVariableGet("fxprop_lot"),2);
            }
         else  Lots = 0.1;
      }

   return(0);
  }
Pero eso no resuelve el problema...