[アーカイブ!】どんなルーキーの質問でも、フォーラムを散らかさないように。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 2. - ページ 521

 
Roger:

どのように確認すればいいのでしょうか?

ありがとうございます。

MaxEquityの設定を、EAを再起動することなく、例えば500回動作させることは可能でしょうか?

例えば、カウンターに500と書いた場合、次のようにします。最初の資本が10 000だとします。

初期の自己資本10,000に加算(設定で指定)した後、大きな赤字は閉じます。

500倍(例)されます(いずれにせよ初期資本を500倍にすることは不可能です)。

それはあなたのバージョンで判明する違いです - 最初の株式= 10 000に10 000の増分の後ということ - 。

EAを再起動する必要はなく、2万回に1万回、3万回に1万回と500回(例)繰り返されます。あの

そして、各増分 = 10 000 の後、最大のマイナスを持つ負け注文(または複数の注文 - 設定で指定される)が閉じられるのでしょうか?

 
alex12:

ありがとうございます。

MaxEquityの設定を、EAを再起動することなく、例えば500回分動作させることは可能でしょうか?

例えば、カウンターに500と書いた場合、次のように動作させる。最初の資本が10 000だとする。

最初の自己資本10,000に追加した後(設定で指定)、大きな欠点は閉じます。

同じように、(例えば)500倍としましょう(何しろ、最初の資本を500倍にすることは不可能ですから)。

つまり、あなたのバージョンでは、最初の自己資本=10 000に10 000を加えた後に、その差が現れるのです。

Expert Advisor を再起動する必要はなく、20 000 に 10 000、30 000 に 10 000 といった具合に 500 回繰り返されます。例えば、こんな感じです。

そして、10,000の増分ごとに、最も損失の大きい負け注文が決済されます(設定により複数の負け注文も可能)?


再起動の必要はありません。ポジションを決済 した後、初期持分データを更新し、新しい初期持分から持分が増加するのを待つ必要があります。
 
artmedia70:
再起動の必要はありません。ポジションを決済した後、初期持分データを更新し、新しい初期持分から持分が増加するのを待つ必要があります。
しかし、私の理解では、それはすべてプログラミング・コードの中で行われるものです。 プログラミングのスキルがない)
 
alex12:
しかし、私の理解では、それはすべてプログラミング・コードで行われるものです。 プログラミングの力がないんです(笑)
もちろん、そうでしょう。必要なのは、継続的に株式を監視し、指定した値を超えたら採算の合わないポジションを決済するコマンドを送信する機能だけです。そして、すべてのポジションが無事に決済された後、新しい株式価値を記録し、さらにそれをトレースする必要があります。
 
artmedia70:
当然です。継続的に株式を監視し、指定された値を超えたら不採算ポジションを決済するコマンドを送信する機能が1つだけあります。そして、すべてのポジションが正常に決済された後、新しいエクイティの状態を記録し、それを監視し続ける必要があります。
ありがとうございます。
 
tol64:

どのような問題があるのか、教えてください。


私の質問には十分な情報が含まれていないと思われます)質問を完結させます。以下に、私のExpert Advisorの主な機能の構成を示します。もしかしたら、これで私が概説した問題が明らかになるかもしれません。

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

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

現在、EAパラメータで資金管理機能を有効/無効にした後、レポートを正しく生成するために、毎回EAを再コンパイルする必要があります。

追伸:もしかしたら、ターミナルのグローバル変数 fxprop_lotと 関係があるのでしょうか?

 
tol64:


私の質問には十分な情報がないものと思われます)。質問の補足をします。以下、私のEAの基本的な機能を構造的に説明します。そうすれば、私が指摘したような問題を特定できるかもしれません。

現在、レポートを正しく生成するために、EAパラメータで資金管理機能を有効/無効にした後、毎回EAを再コンパイルする必要があります。

追伸:もしかしたら、ターミナルのグローバル変数fxprop_lotと 関係があるのでしょうか?


それで十分だと思うなら、そうなんでしょうね。答えを待つしかない。持っていないんです。
 
Vinin:

それで十分だと思うのであれば、そうですね。答えを待っているところです。持っていない。


私のこれまでの経験では、残念ながら、提供された情報が特定の問題に対処するのに十分であるかどうかを判断することはできません。わざとやらないし、やるとしたら謝る)私が思うに、私が取り上げた問題のキーポイントは、Expert Advisorを再コンパイルするとすべてが正しく動作することです。しかし、これも私の未熟な経験によるものです。この問題を解決するためには、どのような情報を提供する必要があるのか、アドバイスをお願いします。資金管理 機能やレポート作成機能が明らかに問題で出てくる。そのために、資金管理機能を持たせるのです。

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);
}
そして次の記事では、レポート作成機能について...。
 
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
}
問題解決のためにご協力お願いします。
 

初期化中に資本管理機能を呼び出して みた。

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);
  }
でも、それでは問題が解決しない...。