Vinceによるロット計算 - ページ 8

 
Roman.:

興味のある方のために - MAベースのMTの標準的な配信に含まれるEAで、R. Vinceによる幾何平均の方法によって、変数最適fの 作業(平均)値に達することが可能でした(スクリーンショットを参照)。本による 最適fの 算出条件と順序から、その値は0.36と なる。コードが完成したら、R.Vinceの本に従って、今後のトレードで開くロットの数量を計算するための関数の説明と使用順序をここに掲載します。

成功おめでとうございます。:))
 
MaxZ:
成功おめでとうございます。:))

ありがとうございます。アドバイス通り、念のためTWRアレイにする必要がありそうです。
 
MaxZ:
成功おめでとうございます。:))


変曲点f = 0.36、つまりfがさらに増加すると、TWR変数は-減少-R. Vinceは正しい! :-)))

 

えーと、これ全部、デポの%でロットサイズを定義する一番簡単な作業用EAに付けられるんですか?それとも利益が足りないのかなぁ)))

つまり、心理戦ばかりなのか、それともプラスの効果をもたらす実用性があるのか。

 
Dezil:

えーと、これってどうやってロットサイズをデポの%で単純に定義して動くEAにつけるんだろう?儲けが足りないのかもしれない))。

つまり、これはすべて心理ゲームなのか、それともポジティブな効果をもたらす実用的なアプリケーションなのか?


もちろん、R Vinceを読んでください。トレーラーで上の書き込みを見てください。私自身、まだデモでテストしていないのですが...。今に見てろ...:-)))

フィーヤは完成次第、説明文を添えてここに掲載する予定です。

 
Roman.:


もちろん、R.ビンスを読んでください。トレーラーで上の書き込みを見てください。私自身、まだデモでテストもしていませんし...。今に見てろ...:-)))

完成したらすぐに、ここに説明文と一緒に掲載します。


ヴィンスの作品から何を読み取るか、教えてください。作品のタイトルを教えてください。
 
Dezil:

ヴィンスから何を読み取るか教えてください。作品のタイトルを教えてください。

スレッドの2ページ 目にある私の投稿から、予告編をこちらからダウンロードしてください - 30〜32ページ。
 
Roman.:

間違いの原因がわかったような...。

すでに何度かひねった元のコードに戻ろう。

   for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально
     {  
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам
            {                                                // и считаем относительный конечный капитал (TWR)
             TWR = TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // TWR - это произведение всех HPR
             //if (TWR>TWR_Rez) {TWR_Rez = TWR; Print(" TWR = ",TWR_Rez, " при f = ", f);}  
             //   else break;       
            }
          if (TWR>TWR_Rez) {
              TWR_Rez = TWR;
              G=MathPow (TWR_Rez, 0.001988); // 1/503 сделки по данной торговой системе, как в книжке: в степени 1/N 
              Print(" TWR = ",TWR_Rez," G = ",G, " при f = ", f);} // если текущий TWR > результирующего, 
              else break;    // то результирующий делаем равным текущему, иначе переходим на след итерацию цикла по f                                  
      }    

もしかして、TWRという変数がfの繰り返しごとに "1 "にリセットされないのでしょうか?

 
MaxZ:

間違いの原因がわかったような...。

すでに何度かひねった元のコードに戻ろう。

もしかして、TWRという変数がfの繰り返しごとに "1 "にリセットされないことが原因なのか?


そう、ちなみに有能なのは...。可能性はある...かなりある。今日の午後、確認してここに投稿します。ありがとうございます。

それなら、TWR配列(今回のような-フレッシュバージョン-)も作る必要はないのでは...。

ここでは、最適なfを計算するときにオーバーフローしないように、製品中の値を比例的に小さくする(絶対値は 重要ではなく、多いか少ないかで比較することが重要だから)ために、いろいろなお祓いを試してみた。

for (f = 0.01; f<=1.0; f=f+0.01)//цикл перебора переменной f для поиска оптимального ее значения,при котором TWR-максимально
     {  
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++) //при заданной f проходим по всем закрытым ордерам
            {                                                // и считаем относительный конечный капитал (TWR)
             //TWR = MathPow(TWR*(1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))),0.33); // TWR - это произведение всех HPR                    
             Mas_TWR[orderIndex] = (1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D))); // заполняем массив значениями HPR                               
            }
          //Print ("Mas_TWR[Qnt]= ", Mas_TWR[Qnt]); 
          
          for ( orderIndex = 1;orderIndex<Qnt; orderIndex++)         
              {
               TWR = MathSqrt(TWR*Mas_TWR[orderIndex]);}
               
          if (TWR>TWR_Rez)
              {
                TWR_Rez = TWR;               
                //G = MathPow(TWR_Rez, 1/N);
                     // G1 = G1*MathPow(Mas_TWR[orderIndex], 1/N);
                     //G=MathPow (TWR_Rez, 0.0054054); // 1/185 сделки по данной торговой системе, как в книжке: в степени 1/N 
                Print(" TWR_Rez = ",DoubleToStr(TWR_Rez,8), " при f = ", f); 
                                                       // если текущий TWR > результирующего
              } 
          else 
              {
                TWR_Rez = TWR;
               // G=MathPow (TWR_Rez, 1/N);
                Print(" А это уже меньше: TWR_Rez = ",DoubleToStr(TWR_Rez,8), " при f = ", f);                                                     
              }       
      }      
             
   Print("Закрытых позиций = ", Qnt, " Нетто Профит/лосс = ", SUMM, " У последней ",Qnt, " закрытой позы профит/лосс = ", 
        Mas_Outcome_of_transactions[Qnt]);     
 

EAにコードを貼り付けて自分で確認するのが面倒くさかったのです:)))

まだちゃんとしたExpert Advisorがないんです。アイデアだけはあるんです。そのため、最適化せずに標準的なMoving Averageを 取り、利益の出る期間を選びました。

TWRが "1 "にリセットされないことを理解した上で、最後に試したコードは次の通りです。

//+------------------------------------------------------------------+
//---------переменные для расчета лота по оптимальному f Ральфа Винса
int Mas_Outcome_of_transactions [10000]; // Массив профитов/убытков закрытых позиций

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//--- Расчет оптимального f ---
   int Qnt = 0, Orders = OrdersHistoryTotal();        // Счётчик количества ордеров   
   ArrayInitialize(Mas_Outcome_of_transactions, 0);   // Обнуление массива
   double f, D, SUMM, TWR, G, G_Rez, Pow = 1/NormalizeDouble(Orders, 0);
   int orderIndex;
   
   for (orderIndex = 0; orderIndex < Orders; orderIndex++)
   {   
      if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY))
      {
         Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
         continue;
      }
   
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic || OrderCloseTime()==0)
         continue; 
         
      int lastType = OrderType();
      double lastLots = OrderLots();
      double lastProfit = OrderProfit() + OrderSwap();
      
      if (orderIndex == 0 || lastProfit < D)
         D = lastProfit;
      
      Mas_Outcome_of_transactions[Qnt] = lastProfit;  // Заполняем массив профитом/лоссом по всем закрытым позициям 
      SUMM=SUMM+lastProfit;
      Qnt++;                                          // увеличиваем счетчик закрытых ордеров    
   }
   
   Print("D = ", DoubleToStr(D, 2), " Pow = ", DoubleToStr(Pow, 8));
   
   for (f = 0.01; f<=1.0; f=f+0.01)                   // цикл перебора переменной f для поиска оптимального ее значения,
   {                                                  // при котором G - максимально
      G = 1;
      for ( orderIndex = 1; orderIndex < Qnt; orderIndex++) // при заданной f проходим по всем закрытым ордерам
      {                                                     // и считаем среднее геометрическое от TWR
         TWR = 1+f*(-Mas_Outcome_of_transactions[orderIndex]/(D));
         G *= MathPow(TWR, Pow);
      }
      if (G > G_Rez)
      {
         G_Rez = G;
         Print("G = ", G, " при f = ", f);
      }           // если текущий G > результирующего, то результирующий делаем равным текущему
      else break; // иначе переходим на следующую итерацию цикла по f
   }
   
   Print("Закрытых позиций = ",   Qnt,
         " Нетто Профит/лосс = ", SUMM,
         " У последней ",         Qnt,
         " закрытой позы профит/лосс = ", Mas_Outcome_of_transactions[Qnt-1]);
   
   return(0);
}

TWRアレイはありません。

オーバーフローで長い時間待たされることになりますよ。でも、もしかしたら、そんなことはなかったかもしれない......。

理由: