//+------------------------------------------------------------------+
//|                                                       sample.mq4 |
//|                                             sakymns test program |
//|                                            http://fxde.tou3.com/ |
//|                                              最終更新日2011/07/27|
//|                                         モンテカルロ式testprogram|
//+------------------------------------------------------------------+
#property copyright "sakymns test program"
#property link      "http://twitter.com/sakymns"
#define MAGIC 20101020           //MAGICナンバー


double Lots;
int monte[100];
int monteX = 4;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   for(int i = 0;i < 100; i++)
   {
      monte[i] = -1;
   }
   monte[0] = 1;
   monte[1] = 2;
   monte[2] = 3;
      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();

//----
   //勝ちトレードだったら、オーダークローズ時に下のようにしてロット変更
   Lots = LOT(false) * MarketInfo(Symbol(),MODE_LOTSTEP);

   //負けトレードだったら、オーダークローズ時に下のようにしてロット変更
   Lots = LOT(true)  * MarketInfo(Symbol(),MODE_LOTSTEP);

   //MarketInfo(Symbol(),MODE_LOTSTEP);の部分は適当に変えてください。
   //これは最低ロットをint型で帰ってくるLOTの戻り値にかけてるだけです。
   //何枚も同時にポジをクローズしたりするとわけわからなくなりそうですね。
   //とりあえず1ポジしか持たない前提ですすめます。   

//----
   return(0);
  }
//+------------------------------------------------------------------+


double LOT(bool SON)
{
   int i;
   int mtmp;
   bool flg1 = true;
   int Ltmp;
   int Rtmp;
   //montecarlo
   if (SON == true)
   {     //損失が出た場合
      for (i = 0; i < 100 ; i++)
      {
         //左の値の所得
         if(monte[i] != 0 && flg1 == true)
         {
            mtmp = monte[i];
            flg1 = false;
         }
         if(monte[i] < 0)
         {
            monte[i] = monteX;
            break;
         }
      }
      if(i == 100) Alert("負けすぎワロタｗｗｗ");
      monteX += mtmp;
   }     
   else
   {     //利益が出た場合
      for (i = 0; i < 100 ; i++)
      {
         //左の値消し
         if(monte[i] != 0)
         {
            monte[i] = 0;
            monte[i + 1] = 0;
            Ltmp = i;
            break;
         }
      }
      for (i = 2; i < 100 ; i++)
      {
         //右の値消し
         if(monte[i] < 0)
         {
            monte[i - 1] = -1;
            monte[i - 2] = -1;
            Rtmp = i - 2;
            break;
         }
      }   

      if (Rtmp - Ltmp <= 3)
      {     //配列が少なくなった
         for(i = 0;i < 100; i++)
         {
            monte[i] = -1;
         }
         monte[0] = 1;
         monte[1] = 2;
         monte[2] = 3;
         monteX = 4;
      }
      else
      {
         monteX = monte[Ltmp + 2] + monte[Rtmp - 1];
      }
   }

   return(monteX);
}



