[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 521

 
Roger:

Come potrei controllarlo?

Grazie.

È possibile far funzionare l'impostazione MaxEquity per esempio 500 volte senza riavviare l'EA?

Per esempio, se scrivo 500 nel contatore, facciamo così: supponiamo che il capitale iniziale sia 10 000,

Dopo aver aggiunto al capitale iniziale di 10.000 (specificando nelle impostazioni), i grandi inconvenienti si chiuderanno.

Sarà fatto 500 volte (per esempio) (è ancora impossibile moltiplicare il capitale iniziale 500 volte).

Questa è la differenza si rivelerà con la vostra versione - che dopo incrementi di 10 000 al capitale iniziale = 10 000 -

L'EA non ha bisogno di essere riavviato, e il ciclo continuerà - a 20 000 saranno aggiunti altri 10 000, a 30 000 + 10 000 e così via per 500 volte (per esempio). Bene

e dopo ogni incremento = 10 000, l'ordine perdente con il maggior minus (o più ordini - da specificare nelle impostazioni) sarà chiuso ?

 
alex12:

Grazie.

È possibile far funzionare l'impostazione MaxEquity per esempio 500 volte senza riavviare l'EA?

Per esempio, se scrivo 500 nel contatore, facciamo così: supponiamo che il capitale iniziale sia 10 000,

Dopo aver aggiunto al capitale iniziale di 10.000 (specificando nelle impostazioni), i grandi inconvenienti si chiuderanno.

Allo stesso modo, diciamo 500 volte (per esempio) (dopo tutto, è impossibile moltiplicare il capitale iniziale 500 volte).

In altre parole, la differenza apparirà nella vostra versione: dopo aver aggiunto 10 000 al capitale iniziale = 10 000.

L'Expert Advisor non ha bisogno di essere riavviato, e il ciclo continuerà - a 20 000 sarà aggiunto 10 000, a 30 000 + 10 000 e così via (per esempio) 500 volte. Per esempio:

E, dopo ogni incremento pari a 10 000, l'ordine perdente con la perdita maggiore sarà chiuso (o diversi ordini perdenti secondo le impostazioni) ?


Non c'è bisogno di fare alcun riavvio. È necessario aggiornare i dati del capitale iniziale dopo aver chiuso le posizioni e aspettare che il capitale aumenti dal nuovo capitale iniziale.
 
artmedia70:
Non c'è bisogno di fare alcun riavvio. È necessario aggiornare i dati del capitale iniziale dopo aver chiuso le posizioni e aspettare che il capitale aumenti dal nuovo capitale iniziale.
Ma da quanto ho capito è tutto fatto nel codice di programmazione. Non ho capacità di programmazione)
 
alex12:
Ma da quanto ho capito, è tutto fatto nel codice di programmazione. Non ho il potere di programmare).
Certo che sì. Tutto ciò di cui abbiamo bisogno è una funzione che monitorerà continuamente l'equity e invierà un comando per chiudere le posizioni non redditizie se il valore specificato viene superato. Poi, dopo che tutte le posizioni sono state chiuse con successo, dobbiamo registrare il nuovo valore del capitale e tracciarlo ulteriormente.
 
artmedia70:
Naturalmente. C'è solo una funzione che monitorerà continuamente l'equity e invierà un comando per chiudere le posizioni non redditizie se il valore specificato viene superato. Poi, dopo che tutte le posizioni sono state chiuse con successo, si deve registrare il nuovo stato patrimoniale e continuare a monitorarlo.
Grazie.
 
tol64:

Puoi dirmi quale potrebbe essere il problema?


Suppongo che la mia domanda non contenga abbastanza informazioni per aiutarmi). Completerò la mia domanda. Di seguito fornisco una struttura con le funzioni principali del mio Expert Advisor. Forse questo mi aiuterà a capire qual è il problema che ho evidenziato.

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

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

Al momento devo ricompilare l'EA ogni volta dopo aver abilitato/disabilitato la funzione di gestione del denaro nei parametri EA, affinché il report venga generato correttamente.

P.S. Forse ha qualcosa a che fare con la variabile globale terminale fxprop_lot?

 
tol64:


Presumo che non ci siano abbastanza informazioni nella mia domanda per aiutarmi). Integrerò la mia domanda. Di seguito sto fornendo la struttura con le funzioni di base del mio EA. Forse in questo modo sarà possibile identificare il problema che ho evidenziato.

Al momento devo ricompilare l'EA ogni volta dopo aver abilitato/disabilitato la funzione di gestione del denaro nei parametri EA perché il report venga generato correttamente.

P.S. Forse ha qualcosa a che fare con la variabile globale terminalefxprop_lot?


Se pensate che sia sufficiente, credo che lo sia. Devo solo aspettare una risposta. Non ne ho uno.
 
Vinin:

Se pensate che questo sia sufficiente, credo di sì. Sto aspettando una risposta. Non ne ho uno.


La mia esperienza finora purtroppo non mi permette di giudicare se le informazioni fornite sono sufficienti o meno per affrontare una particolare questione. Non lo faccio apposta e mi scuso se lo fai). Il fatto è che, secondo me, il punto chiave del problema che ho evidenziato è che tutto funziona correttamente quando si ricompila l'Expert Advisor. Ma anche questo è dovuto alla mia esperienza immatura. Si prega di indicare quali informazioni devono essere fornite per risolvere questo problema. La funzione di gestione del denaro o di generazione di rapporti appare ovviamente nel problema. Ecco perché vi darò la funzione di gestione del denaro:

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);
}
E nel prossimo post la funzione di generazione di rapporti...
 
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
}
Per favore, aiutatemi a risolvere il problema.
 

Ho provato a chiamare la funzione di gestione del capitale durante l'inizializzazione:

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);
  }
Ma questo non risolve il problema...
Motivazione: