Индикаторы: FF_FP

 

FF_FP:

Индикатор в помощь управлению капиталом

Author: HgCl2

 

Хм ! ... Интересно ...

      if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )
      {
      xc++;                                                // считает все изменения в балансе счета
      if( ( cmd == 6 ) && ( orderprofit > 0 ) )
      {
      b1 = b1 + orderprofit;                               // депозит / Deposit
      }
      else
      {
      if( ( cmd == 6 ) && ( orderprofit < 0 ) )
      {
      w = xc + 1;
      b2 = b2 + orderprofit;                               // снятие / Withdrawal
      }
      }

 разве не проще 

 if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )  ЗАМЕНИТЬ НА 
if ( cmd <= 1 )

 и верно ли данное ??? Разве ордертип ()  может бвть больше 5 ???

if ( cmd == 6 )
 
VOLDEMAR:

Хм ! ... Интересно ...

      if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )
      {
      xc++;                                                // считает все изменения в балансе счета
      if( ( cmd == 6 ) && ( orderprofit > 0 ) )
      {
      b1 = b1 + orderprofit;                               // депозит / Deposit
      }
      else
      {
      if( ( cmd == 6 ) && ( orderprofit < 0 ) )
      {
      w = xc + 1;
      b2 = b2 + orderprofit;                               // снятие / Withdrawal
      }
      }

 разве не проще 

 if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )  ЗАМЕНИТЬ НА 
if ( cmd <= 1 )

 и верно ли данное ??? Разве ордертип ()  может бвть больше 5 ???

if ( cmd == 6 )

 ордертип() при пополнении и снятии имеет значение 6 ..если поставить простое условие

( cmd <= 1 )

как вы предлагаете то не будут вычисления   депозит/снятие  которые нужны для некоторых преобразований..Согласен что код написан слишком сложно и много лишнего и можно было бы и проще написать его но я не смог добиться максимальной простоты ..так сказать изящества..все мои знания о программировании ограничены теми знаниями которые можно почерпнуть   из учебника по MQL4..Я до сих пор толком не понимаю как работает оператор  continue..Так что не судите строго..

 

 
Boeing747:
VOLDEMAR:

Хм ! ... Интересно ...

      if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )
      {
      xc++;                                                // считает все изменения в балансе счета
      if( ( cmd == 6 ) && ( orderprofit > 0 ) )
      {
      b1 = b1 + orderprofit;                               // депозит / Deposit
      }
      else
      {
      if( ( cmd == 6 ) && ( orderprofit < 0 ) )
      {
      w = xc + 1;
      b2 = b2 + orderprofit;                               // снятие / Withdrawal
      }
      }

 разве не проще 

 if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )  ЗАМЕНИТЬ НА 
if ( cmd <= 1 )

 и верно ли данное ??? Разве ордертип ()  может бвть больше 5 ???

if ( cmd == 6 )

 ордертип() при пополнении и снятии имеет значение 6 ..если поставить простое условие

( cmd <= 1 )

как вы предлагаете то не будут вычисления   депозит/снятие  которые нужны для некоторых преобразований..Согласен что код написан слишком сложно и много лишнего и можно было бы и проще написать его но я не смог добиться максимальной простоты ..так сказать изящества..все мои знания о программировании ограничены теми знаниями которые можно почерпнуть   из учебника по MQL4..Я до сих пор толком не понимаю как работает оператор  continue..Так что не судите строго..

 Пардон..Вы правы. Та запись  где вычисляются переменные b1 и b2 ..совсем лишняя..Дело в том что я хотел вычислить еще какой то параметр не помню какой где требуются данные депозит/снятие  , а потом передумал  или забыл и  те вычисления b1 и b2 забыл удалить.. Вы сбили меня с толку с этим оредеромтайпом ..Надо было написать что переменные b1 и b2 далее нигде  в коде не используются..и я бы сразу понял вас )))



 

Все равно хороший код ...

Можно было б  его переписать и уместить в 15-30 строк ...

Но это если у Вас будет желание , 

 
VOLDEMAR:

Все равно хороший код ...

Можно было б  его переписать и уместить в 15-30 строк ...

Но это если у Вас будет желание , 

Да, надо бы.Будет время еще посижу над этим индикатором..
 
Boeing747:
Boeing747:
VOLDEMAR:

Все равно хороший код ...

Можно было б  его переписать и уместить в 15-30 строк ...

Но это если у Вас будет желание , 

Да, надо бы.Будет время еще посижу над этим индикатором..


Здесь код несколько упрощен в пределах разумного по моим меркам и добавлены еще несколько интересных параметров :  Total Net Profit_Ticks  - профит в тиках за всю торговлю..Average Risk trade  - средний риск за всю торговлю и Maximal Risk trade - максимальный риск от одной из сделок за весь период..Если интересны эти параметры можете списывать код отсюда

//------------------------------------------------------------------------------------------------------------------ 
#property indicator_separate_window           // индикатор в отдельном окне
#property indicator_buffers 2                 // количество отображаемых линий 
#property indicator_minimum 0                 // минимальные показания индикатора
#property indicator_color1 LightSteelBlue     // цвет гистограммы баланса счета 
#property indicator_color2 LightSlateGray     // цвет скользящей средней баланса счета
#property indicator_levelcolor SlateGray      // цвет уровня 
#property indicator_style1 0                  // стиль отрисовки столбиков гистограммы баланса счета 
#property indicator_width1 1                  // толщина столбиков гистограммы баланса счета ( вбирается при стеле = 0 )
#property indicator_style2 2                  // стиль отрисовки скользящей средней баланса счета 
#property indicator_width2 1                  // толщина скользящей средней баланса счета ( вбирается при стеле = 0 )
#property indicator_levelstyle 0              // стиль отрисовки уровня 
#property indicator_levelwidth 1              // толщина уровня ( вбирается при стеле = 0 )
#property indicator_level1 0                  // значение уровня 
//---- вводные параметры
    extern double Delta_Growth = 18;          // Значение Delta для ставки роста 
    extern double Delta_Decrease = 20;        // Значение Delta для ставки снижения
    extern bool Get_report = false;           // Показать отчет по торговле => true / Не показывать => false
    extern int MA_period = 8;                 // Период скользящей средней баланса
    extern bool EMA_true_SMA_false = false;   // Метод вычисления скользящей средней баланса  EMA => true / SMA => false
//---------------------------------------------------------------------------------
      double T[2000];
      double B[2000];
      double Buffer[];
      double Buffer1[];
//------------
      int init( )
      {
      IndicatorBuffers( 2 );
      IndicatorDigits( 2 ); 
      SetIndexStyle( 0, DRAW_HISTOGRAM );
      SetIndexStyle( 1, DRAW_LINE );
      SetIndexBuffer( 0, Buffer );
      SetIndexBuffer( 1, Buffer1 );
      string name = "Balance";
      string Method = "SMA";
      if( EMA_true_SMA_false == true )
      {
      Method = "EMA";
      }
      string name1 = "Average Balance  "+Method+" ("+MA_period+")";
      IndicatorShortName( name );
      SetIndexLabel( 0, name );
      SetIndexLabel( 1, name1 );
      return(0);
      }
//----
      int deinit( )
      {
      Comment( " " );
      return(0);
      }
//----
      int start( )
      {
      
      int oht = OrdersHistoryTotal( );
      double balance = AccountBalance( );
   	if( Get_report == true )
      {
      int i;
      double MaxRisk = 0;
      double TotalRisk = 0;
      double loss;
      double profit;
      double nles;
      double nprofi;
      double Dd = 0;
      double sum = 0;
      double sum1 = 0;
      int sum_ticks = 0;
      double fs = 0;
      double Lp;
      double Ll;
      double u;
      int x4;
      int o1 = 0;
      int j = 0;
      double mk = 0;
      double en = 0;
      //double b1 = 0;
      //double b2 = 0;
      int y5;
      double SU = 0;
      double EJ = 0;
      int ii;
      int yy = 0;
      int xx = 0;
      int re;
      int es;
      double gb;
      double cn;
      double de3;
      int z = 0;
      double short;
      double long;
      int Total_short;
      int Total_long;
      double SOC;
      double NT1;
      double NW2;
      double NM3;
      int NT1_ticks;
      int NW2_ticks;
      int NM3_ticks;
      int xc;
      int w;
      int l;
      while( i <= oht )
      {
      if( OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) == true )
      {
      double tick = MarketInfo( OrderSymbol( ), MODE_TICKSIZE );
      double orderopenprice = OrderOpenPrice( );
      double ordercloseprice = OrderClosePrice( );
      double swap = OrderSwap( );
      datetime closetime = OrderCloseTime( );
      int cmd = OrderType( );
      double commission = OrderCommission( );
      double orderprofit = OrderProfit( );
      //----
      if( ( cmd != 2 ) && ( cmd != 3 ) && ( cmd != 4 ) && ( cmd != 5 ) )
      {
      xc++;
      if( cmd == 6 )
      {
      if( orderprofit > 0 )
      {
     // b1 = b1 + orderprofit;
      }
      else
      {
      if( orderprofit < 0 )
      {
      w = xc + 1;
     // b2 = b2 + orderprofit;
      }
      }
      }
      //----
      de3 = de3 + swap + orderprofit + commission;
      B[xc] = de3;
      //------------------------------------------
      if( cmd <= 1 )
      {
      if( orderprofit >= 0 )
      {
      l = 1;
      }
      else
      {
      if( orderprofit < 0 )
      {
      l = -1;
      }
      }
      if( tick != 0 )
      {
      x4 = l * MathAbs( orderopenprice - ordercloseprice ) / tick;
      sum_ticks = sum_ticks + x4; 
      }
      SOC = swap + orderprofit + commission;
      if( closetime >= iTime( NULL, PERIOD_D1, 0 ) )
      {
      if( tick != 0 )
      {      
      NT1_ticks = NT1_ticks + x4;
      }
      NT1 = NT1 + SOC;
      } 
      if( closetime >= iTime( NULL, PERIOD_W1, 0 ) )
      {
      if( tick != 0 )
      {      
      NW2_ticks = NW2_ticks + x4;
      }
      NW2 = NW2 + SOC;
      }
      if( closetime >= iTime( NULL, PERIOD_MN1, 0 ) )
      {
      if( tick != 0 )
      {      
      NM3_ticks = NM3_ticks + x4;
      }
      NM3 = NM3 + SOC;
      }
      //----
      z++; 
      T[z] = SOC; 
      if( SOC < 0 )
      {
      sum = sum + SOC;
      if( B[xc - 1] != 0 )
      {
      TotalRisk = TotalRisk + 100 * SOC / B[xc - 1];
      }
      o1++;
      y5++;
      if( mk > sum  )
      {
      mk = sum;
      re = y5;
      }
      if( xx <= y5 )
      {
      xx = y5;
      }
      if( Ll > SOC )
      {
      Ll = SOC;
      if( B[xc - 1] != 0 )
      {
      MaxRisk = 100 * Ll / B[xc - 1];
      }
      }
      nles++;
      loss = loss - SOC;
      }
      else
      {
      if( SOC >= 0 )
      {
      if( cmd == 0 )
      {
      long++;
      }
      else
      {
      if( cmd == 1 )
      {
      short++;
      }
      }
      sum = 0;
      if( o1 != 0 )
      {
      gb++;
      }
      o1 = 0;
      y5 = 0;
      sum1 = sum1 + SOC;
      j++;
      ii++;
      if( en < sum1 )
      {
      en = sum1;
      es = ii;
      }
      if( yy <= ii )
      {
      yy = ii;
      }
      if( Lp < SOC )
      {
      Lp = SOC;
      } 
      nprofi++;
      profit = profit + SOC;
      }
      }
      //---
      if( SOC < 0 )
      { 
      sum1 = 0;
      if( j != 0 )
      {
      cn++;
      }  
      j = 0;
      ii = 0;
      }
      }
      //----
      if( cmd == 0 )
      {
      Total_long++;
      }
      else
      {
      if( cmd == 1 )
      {
      Total_short++;
      } 
      }
      }
      }
      i++;
      }
      //----
      int oi = 0;
      int maxindex = ArrayMaximum( B, xc, 0 ); 
      double max = B[maxindex];
      while( oi <= xc - maxindex )
      {
      static double min = 1000000;
      if( ( min > B[xc - oi] ) && ( xc - oi > w ) ) 
      {
      min = B[xc - oi];
      }
      oi++;
      }
      Dd = max - min;
      if( max != 0 )
      {
      u = 100 * Dd / max;
      } 
      //----
      int ie = 0;
      int t = 0;
      int k2 = 0;
      double fgh = 0;
      double css = 0;
      while( ie < xc )
      {
      if( T[ie] < 0 )
      {
      t++;
      SU = SU + T[ie];
      if( t == xx )
      {
      css = SU;
      t = 0;
      SU = 0;
      }
      }
      else
      {
      if( T[ie] >= 0 )
      {
      t = 0;
      SU = 0;
      }
      }
      //----
      if( T[ie] >= 0 )
      {
      k2++;
      EJ = EJ + T[ie];
      if( k2 == yy )
      {
      fgh = EJ;
      k2 = 0;
      EJ = 0;
      }
      }
      else
      {
      if( T[ie] < 0 )
      {
      k2 = 0;
      EJ = 0;
      }
      }
      Buffer[ie] = B[xc - ie];
      ie++;
      }
      //---
      int nb = xc - MA_period - 1;
      int iz;
      while( nb >= 0 )
      {
      if( EMA_true_SMA_false == false )
      {
      double vol = 0;
      for( iz = nb; iz <= nb + MA_period - 1; iz++ )
      {
      vol = vol + Buffer[iz];
      }
      if( MA_period != 0 )
      {
      Buffer1[nb] = vol / MA_period;
      }
      }
      else
      {
      if( EMA_true_SMA_false == true )
      {
      if( nb == xc - MA_period - 1 )
      { 
      Buffer1[nb + 1] = Buffer[nb + 1];
      }
      Buffer1[nb]=( ( MA_period - 1 ) * Buffer1[nb + 1] + 2 * Buffer[nb] ) / ( MA_period + 1 );
      }
      }
      //---
      if( Bars - nb - 1 < MA_period )
      {
      Buffer1[nb] = 0;
      SetIndexEmptyValue( 1, 0.0 );
      }
      nb--;
      }
      //----
      int h = 0;
      double TWR = 1;
      double g;
      double f;
      while( h < 99 )
      {
      f = f + 0.01;
      int o = 1;
      int i9 = z;
      while( o <= i9 )
      {
      if( Ll != 0 )
      { 
      double HPR = 1 - f * T[o] / Ll;
      }
      TWR  = TWR * HPR;
      o++;
      }
      double G = MathPow( TWR, MathPow( z, -1 ) );
      if( G <= g )
      {
      double F = 100 * f - 1;
      break;
      }
      g = G;
      h++;
      TWR = 1;
      }
      //---
      if( ( Total_long != 0 ) && ( Total_short != 0 ) )
      {
      double pctLong = 100 * long / Total_long;
      double pctShort = 100 * short / Total_short;
      }
      double Gp = profit;
      double Gl = loss;
      double TN = profit - loss;
      if( ( nles != 0 ) && ( nprofi != 0 ) )
      {
      double AverageRisk = TotalRisk / nles;
      double alt = loss / nles;
      double apt = profit / nprofi;
      }
      double total = z;
      if( ( total != 0 ) && ( cn != 0 ) && ( gb != 0 ) )
      {
      double EP = TN / total;
      double acw = nprofi / cn;
      double acl = nles / gb;
      double won = 100 * nprofi / total;
      double lS = 100 - won;
      }
      if( ( alt != 0 ) && ( loss != 0 ) )
      {
      double ME = 0.01 * ( 1 + apt / alt ) * won - 1;
      double pf = profit / loss;
      }
      //---
      double nt1pct = 100 * NT1 / ( balance - NT1 );
      double nw2pct = 100 * NW2 / ( balance - NW2 );
      double nm3pct = 100 * NM3 / ( balance - NM3 );
      SetIndexDrawBegin( 0, Bars - xc );
      SetIndexDrawBegin( 1, Bars - xc + MA_period );
      //---
      Comment( " Profit factor   "+DoubleToStr( pf, 2 )+" ", // информ табло
      "\n ", "Profit trades ( % of total )   "+DoubleToStr( nprofi, 0 )+" ("+DoubleToStr( won, 2 )+" %) ",
      "\n ", "Loss trades ( % of total )   "+DoubleToStr( nles, 0 )+" ("+DoubleToStr( lS, 2 )+" %) ",
      "\n ", "Total trades   "+z+" ",
      "\n ", "Short Positions (won %)   "+Total_short+" ("+DoubleToStr( pctShort, 2 )+" %) ",
      "\n ", "Long Positions (won %)   "+Total_long+" ("+DoubleToStr( pctLong, 2 )+" %) ",
      "\n ", "Gross Profit    "+DoubleToStr( Gp, 2 )+" ",
      "\n ", "Gross Loss    "+DoubleToStr( Gl, 2 )+" ",
      "\n ", "Total Net Profit    "+DoubleToStr( TN, 2 )+" ",
      "\n ", "Total Net Profit_Ticks   "+sum_ticks+" ",
      "\n ", "Expected Payoff   "+DoubleToStr( EP, 2 )+" ",
      "\n ", "Mathematical еxpectation   "+DoubleToStr( ME, 2 )+"",
      "\n ", "Optimum fraction  F   "+DoubleToStr( F, 0 )+" % ",
      "\n ", "Current Drowdown   "+DoubleToStr( Dd, 2 )+"  ("+DoubleToStr( u, 2 )+" %)",
      "\n ", "Net Profit today (%) ( ticks )   "+DoubleToStr( NT1, 2 )+"  ("+DoubleToStr( nt1pct, 2 )+" %)  ("+NT1_ticks+")", 
      "\n ", "Net Profit this week (%) ( ticks )   "+DoubleToStr( NW2, 2 )+"  ("+DoubleToStr( nw2pct, 2 )+" %)  ("+NW2_ticks+")",
      "\n ", "Net Profit this month (%) ( ticks )   "+DoubleToStr( NM3, 2 )+"  ("+DoubleToStr( nm3pct, 2 )+" %)  ("+NM3_ticks+")",
      "\n ", "Largest profit trade   "+DoubleToStr( Lp, 2 )+" ",
      "\n ", "Largest loss trade   "+DoubleToStr( Ll, 2 )+" ",
      "\n ", "Average profit trade   "+DoubleToStr( apt, 2 )+" ",
      "\n ", "Average loss trade   "+DoubleToStr( -alt, 2 )+" ",
      "\n ", "Average Risk trade   "+DoubleToStr( -AverageRisk, 4 )+" %",
      "\n ", "Maximal Risk trade   "+DoubleToStr( -MaxRisk, 4 )+" %",
     // "\n ", "Average loss trade   "+DoubleToStr( -alt, 2 )+" ",
     // "\n ", "Average loss trade   "+DoubleToStr( -alt, 2 )+" ",
     // "\n ", "Average loss trade   "+DoubleToStr( -alt, 2 )+" ",
      "\n ", "Average consecutive wins   "+DoubleToStr( acw, 0 )+" ",
      "\n ", "Average consecutive losses   "+DoubleToStr( acl, 0 )+" ",
      "\n ", "Maximum consecutive wins($)    "+yy+" ("+DoubleToStr( fgh, 2 )+") ",
      "\n ", "Maximum consecutive losses($)   "+xx+" ("+DoubleToStr( css, 2 )+") ",
      "\n ", "Maximal consecutive profit (count)   "+DoubleToStr( en, 2 )+"  ("+es+")",
      "\n ", "Maximal consecutive loss  (count)   "+DoubleToStr( mk, 2 )+"  ("+re+")" );
      }
      else
      {
   	if( Get_report == false )
   	{
      if( OrderSelect( oht - 1, SELECT_BY_POS, MODE_HISTORY ) == true )
      {
      if( OrderType( ) <= 1 )
      {
      double last_trade = OrderSwap( ) + OrderProfit( ) + OrderCommission( );
      }
      }
      double minlot = MarketInfo( Symbol( ), MODE_MINLOT );
		double Delta;
		if( last_trade >= 0 )
		{
	   Delta = Delta_Growth;
		}
		else
		{
		if( last_trade < 0 )
		{
		Delta = Delta_Decrease;
		}
		}
		double fp = MathSqrt( 0.25 + 2 * ( balance - Delta ) / Delta ) + 0.5;
	   double lot = NormalizeDouble( minlot * MathRound( fp - 0.5 ), 2 );
		string dD = "Delta_Decrease   "+DoubleToStr( Delta_Decrease, 2 )+"";
		string dG = "Delta_Growth     "+DoubleToStr( Delta_Growth, 2 )+"";
		string v = "Lot   "+DoubleToStr( lot, 2 )+" ";
      Comment( " "+v+"" );//, "\n ", dG, "\n ", dD );
		}
      }
      return(0);
      }


 

Здравствуйте. Очень интересный индикатор, во первых в плане того, что за основу взят ММ Райана Джонсона (давно ищу что нибудь на его основе для МТ4, ничего толкового нет), во вторых в плане статистики, более чем подробная статистика, открываемая по требованию, что так же очень хорошо. Спасибо за такой индикатор.

Так как я не программер, нельзя ли для таких как я выложить готовый оптимизированный код с добавленными параметрами уже сразу в виде индикатора?

С уважением Ярослав. 

 
yarikbes:

Здравствуйте. Очень интересный индикатор, во первых в плане того, что за основу взят ММ Райана Джонсона (давно ищу что нибудь на его основе для МТ4, ничего толкового нет), во вторых в плане статистики, более чем подробная статистика, открываемая по требованию, что так же очень хорошо. Спасибо за такой индикатор.

Так как я не программер, нельзя ли для таких как я выложить готовый оптимизированный код с добавленными параметрами уже сразу в виде индикатора?

С уважением Ярослав. 

Здравствуйте.С днем победы вас!
Да конечно можно выложить оптимизированный вариант с добавленными параметрами, но на прошлой неделе я заметил расхождения по параметрам "Average consecutive wins", "Average consecutive losses",  "Maximum consecutive wins($)", "Maximum consecutive losses($)", "Maximal consecutive profit (count)" и "Maximal consecutive loss  (count)" которые выдает  индикатор и теми же параметрами что есть в отчете предоставляемым брокером. Оказалось, что в коде счет серий ведется на последовательности увеличения числа отображающего номер ордера, а не по времени закрытия сделки, как должно быть. И когда писал этот индикатор у меня под рукой  была история сделок, где в любой момент времени была открыта только одна сделка и поэтому получилось совпадение этих параметров что выдает индикатор с теми, что можно запросить у брокера.Попробую сперва исправить ошибку в вычислении этих параметров.
 
Вас так же с Днём победы! Спасибо большое за оперативный ответ и разъяснения. Буду ждать!