投資金投入率チェック

by Hakuhin
「白いマーク」が現在のフレームで行った計算結果です。
「赤いマーク」が今までの累計の平均値です。
「勝率補正」をお好みで増減してください。0.0 で上昇率と下落率が 50% となります。
グラフのスケールが安定するとブラーが動作します。
マシンスペックに余裕がある場合は「1Fの計算回数」を増やしてみてください。
放置すればするほど平均の精度が上がります。

この情報によって生じたいかなる損害についても一切責任を負いません。
♥3 | Line 545 | Modified 2011-12-19 03:04:41 | MIT License
play

ActionScript3 source code

/**
 * Copyright Hakuhin ( http://wonderfl.net/user/Hakuhin )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/vmjn
 */

<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();"><mx:Script><![CDATA[public function init():void{
// -------------------------------------------------
//
//
// -------------------------------------------------



// -------------------------------------------------
// インポート
// -------------------------------------------------
import mx.core.*;
import mx.containers.*;
import mx.controls.*;
import mx.events.*;



// -------------------------------------------------
// Flash 設定
// -------------------------------------------------

// キャプチャタイミング
Wonderfl.capture_delay( 30 );

// フレームレート
stage.frameRate = 60;

// 100% 表示
stage.scaleMode = StageScaleMode.NO_SCALE;

// 左上
stage.align = StageAlign.TOP_LEFT;
stage.align = "TL";



// -------------------------------------------------
// Flex 設定
// -------------------------------------------------

// パディングなし
setStyle("paddingTop",0);
setStyle("paddingBottom",0);
setStyle("paddingLeft",0);
setStyle("paddingRight",0);

// 背景透過
setStyle("backgroundAlpha",0);

// 左上
setStyle("horizontalAlign","left");
setStyle("verticalAlign","top");

// キャンバス作成
var canvas:Canvas = new Canvas();
addChild(canvas);



// -------------------------------------------------
// Flash オブジェクト作成
// -------------------------------------------------
var chart:Object = {
    width  :0,                        // 幅
    height :0,                        // 高さ
    scale        :{x:1.0,y:1.5},    // スケール
    scale_target :{x:1.0,y:1.5},    // スケールターゲット
    scale_speed  :{x:0.0,y:0.0}        // スケール速度
};

// 黒壁紙
var shape_bg:Shape = new Shape();
stage.addChild(shape_bg);
(function():void{
    var g : Graphics = shape_bg.graphics;
    g.beginFill (0x000022, 1.0);
    g.drawRect  ( 0, 0 , 100 , 100);
    g.endFill();
})();

// テキストレイヤー
var sprite_text:Sprite = new Sprite();
stage.addChild(sprite_text);

// グリッドレイヤー
var shape_grid:Shape = new Shape();
stage.addChild(shape_grid);

// ブラーレイヤー
var bitmap_blur: Bitmap = new Bitmap();
stage.addChild(bitmap_blur);

// 算出レイヤー
var shape_now:Shape = new Shape();
stage.addChild(shape_now);

// グリッドレイヤー
var shape_average:Shape = new Shape();
stage.addChild(shape_average);

// ビットマップデータ
var bitmap_data:Array = new Array();
var bitmap_data_slot:int = 0;

// -------------------------------------------------
// Flex コンポーネント作成
// -------------------------------------------------
var text : Text;

// 下側メニュー左側
var result_l:Canvas = new Canvas();
result_l.x = 0;
canvas.addChild(result_l);

// 条件1
text = new Text();
text.text = "条件1:";
text.x = 10;
text.y = 5;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);

var stepper_profit : NumericStepper = new NumericStepper();
stepper_profit.x = 70;
stepper_profit.y = 5;
stepper_profit.value = 1.5;
stepper_profit.stepSize = 0.0001;
stepper_profit.minimum = 1.0;
stepper_profit.maximum = 0xFFFFFFFFFFFFFFFF;
stepper_profit.width = 80;
stepper_profit.height = 22;
stepper_profit.setStyle("textAlign","center");
result_l.addChild(stepper_profit);

text = new Text();
text.text = "倍以上で利確";
text.x = 155;
text.y = 5;
text.width = 150;
text.height = 22;
text.selectable = false;
result_l.addChild(text);


// 条件2
text = new Text();
text.text = "条件2:";
text.x = 10;
text.y = 35;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);

var stepper_loss_cut : NumericStepper = new NumericStepper();
stepper_loss_cut.x = 70;
stepper_loss_cut.y = 35;
stepper_loss_cut.value = 0.5;
stepper_loss_cut.stepSize = 0.0001;
stepper_loss_cut.minimum = 0.0;
stepper_loss_cut.maximum = 1.0;
stepper_loss_cut.width = 80;
stepper_loss_cut.height = 22;
stepper_loss_cut.setStyle("textAlign","center");
result_l.addChild(stepper_loss_cut);

text = new Text();
text.text = "倍以下で損切り";
text.x = 155;
text.y = 35;
text.width = 150;
text.height = 22;
text.selectable = false;
result_l.addChild(text);


// 勝率補正
text = new Text();
text.text = "勝率補正:";
text.x = 10;
text.y = 65;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);

var stepper_win_percent_add : NumericStepper = new NumericStepper();
stepper_win_percent_add.x = 70;
stepper_win_percent_add.y = 65;
stepper_win_percent_add.value = 0.01;
stepper_win_percent_add.stepSize = 0.0001;
stepper_win_percent_add.minimum = -1.0;
stepper_win_percent_add.maximum = 1.0;
stepper_win_percent_add.width = 80;
stepper_win_percent_add.height = 22;
stepper_win_percent_add.setStyle("textAlign","center");
result_l.addChild(stepper_win_percent_add);

text = new Text();
text.text = "(人間補正)";
text.x = 155;
text.y = 65;
text.width = 100;
text.height = 22;
text.selectable = false;
result_l.addChild(text);


// 試行回数
text = new Text();
text.text = "施行回数:";
text.x = 10;
text.y = 95;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);

var stepper_try_max : NumericStepper = new NumericStepper();
stepper_try_max.x = 70;
stepper_try_max.y = 95;
stepper_try_max.value = 200;
stepper_try_max.minimum = 0;
stepper_try_max.maximum = 0xFFFFFFFFFFFFFFFF;
stepper_try_max.width = 80;
stepper_try_max.height = 22;
stepper_try_max.setStyle("textAlign","center");
result_l.addChild(stepper_try_max);

text = new Text();
text.text = "回繰り返す";
text.x = 155;
text.y = 95;
text.width = 100;
text.height = 22;
text.selectable = false;
result_l.addChild(text);


// 下側メニュー左側
var result_r:Canvas = new Canvas();
canvas.addChild(result_r);

// 勝率
text = new Text();
text.text = "勝率:";
text.x = 855;
text.y = 5;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_r.addChild(text);

var textinput_win_percent : TextInput = new TextInput();
textinput_win_percent.x = 915;
textinput_win_percent.y = 5;
textinput_win_percent.text = "";
textinput_win_percent.width = 80;
textinput_win_percent.height = 22;
textinput_win_percent.editable = false;
textinput_win_percent.setStyle("textAlign","center");
result_r.addChild(textinput_win_percent);

// 1Fの計算回数
text = new Text();
text.text = "1Fの計算回数:";
text.x = 815;
text.y = 35;
text.width = 100;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_r.addChild(text);

var stepper_count : NumericStepper = new NumericStepper();
stepper_count.x = 915;
stepper_count.y = 35;
stepper_count.value = 1;
stepper_count.minimum = 0;
stepper_count.maximum = 0xFFFFFFFFFFFFFFFF;
stepper_count.width = 80;
stepper_count.height = 22;
stepper_count.setStyle("textAlign","center");
result_r.addChild(stepper_count);

// 総計算回数
text = new Text();
text.text = "総計算回数:";
text.x = 815;
text.y = 65;
text.width = 100;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_r.addChild(text);

var textinput_total : TextInput = new TextInput();
textinput_total.x = 915;
textinput_total.y = 65;
textinput_total.text = "";
textinput_total.width = 80;
textinput_total.height = 22;
textinput_total.editable = false;
textinput_total.setStyle("textAlign","center");
result_r.addChild(textinput_total);



// -------------------------------------------------
// 図形用データ
// -------------------------------------------------
var chart_param:Object = new Object();
function ChartParamGetObject():Object{

    var profit:Number = (stepper_profit.value - 1.0);
    var loss_cut:Number = (1.0 - stepper_loss_cut.value);
    var win_percent:Number = loss_cut / (profit + loss_cut);
    win_percent += stepper_win_percent_add.value;
    if(win_percent > 1)    win_percent = 1;
    if(win_percent < 0)    win_percent = 0;
    var key:String =
        "{" + 
            "win_percent:" + win_percent + "," +
            "profit:" + profit + "," +
            "win_percent:" + win_percent + "," +
            "stepper_try_max:" + stepper_try_max.value +
        "}";
    var obj:Object = chart_param[key];
    if(!obj){
        obj = new Object();
        obj.count = 0;
        obj.try_max = stepper_try_max.value;
        obj.profit = profit;
        obj.loss_cut = loss_cut;
        obj.win_percent = win_percent;
        var probability:Array = new Array();
        obj.probability = probability;
        var i:int;
        for(i=0;i<101;i++){
            probability.push({
                now:0,
                average:0
            });
        }
        chart_param[key] = obj;
    }
    
    return obj;
}
ChartParamGetObject();


// -------------------------------------------------
// リサイズ時にフィット
// -------------------------------------------------
stage.addEventListener(Event.RESIZE,ResizeFunc);
function ResizeFunc(e:Event):void{
    var w:uint = stage.stageWidth;
    var h:uint = stage.stageHeight;

    // 下側メニュー左側
    result_l.y = h - 130;

    // 下側メニュー右側
    result_r.x = w - 1000;
    result_r.y = h - 130;

    chart.width = w - 10;
    chart.height = h - 130 - 5;
    
    // ビットマップを更新
    bitmap_data[0] = new BitmapData(chart.width,chart.height,true,0x00FFFFFF);
    bitmap_data[1] = new BitmapData(chart.width,chart.height,true,0x00FFFFFF);
    bitmap_data_slot = 0;

    // チャートのサイズを変更
    ChartResize();

}
ResizeFunc(null);



// -------------------------------------------------
// チャートをリサイズ
// -------------------------------------------------
function ChartResize():void {
    var w:Number = chart.width;
    var h:Number = chart.height;
    var s:Number = chart.scale.y;

    // 背景
    shape_bg.x = 5;
    shape_bg.y = 5;
    shape_bg.width = w;
    shape_bg.height = h;

    // テキストをクリア
    sprite_text.x = 5;
    sprite_text.y = 5;
    while(sprite_text.numChildren){
        var obj:DisplayObject = sprite_text.getChildAt(0);
        sprite_text.removeChild(obj);
    }
    
    var s_add:Number = 1;
    (function():void{
        var d:Number = s;
        
        while(true){
            if(d < 20)    break;
            d /= 2;
            s_add *= 2;
        }
    })();

    function TextFieldCreateCommentH():TextField{
        var tf:TextField;
        tf = new TextField();
        tf.width = 200;
        tf.height = 20;
        tf.textColor = 0xFFFFFF;
        tf.selectable = false;

        var format:TextFormat = new TextFormat();
//        format.align = TextFormatAlign.LEFT;
        tf.defaultTextFormat = format;

        return tf;
    }
    function TextFieldCreateCommentV():TextField{
        var tf:TextField;
        tf = new TextField();
        tf.width = 200;
        tf.height = 20;
        tf.textColor = 0xFFFFFF;
        tf.selectable = false;

        var format:TextFormat = new TextFormat();
        format.align = TextFormatAlign.RIGHT;
        tf.defaultTextFormat = format;

        return tf;
    }
    function TextFieldCreateValueH():TextField{
        var tf:TextField;
        tf = new TextField();
        tf.width = 40;
        tf.height = 20;
        tf.textColor = 0xFFFFFF;
        tf.selectable = false;

        var format:TextFormat = new TextFormat();
        format.align = TextFormatAlign.CENTER;
        tf.defaultTextFormat = format;

        return tf;
    }
    function TextFieldCreateValueV():TextField{
        var tf:TextField;
        tf = new TextField();
        tf.width = 60;
        tf.height = 20;
        tf.border = true;
        tf.textColor = 0xFFFFFF;
        tf.selectable = false;

        var format:TextFormat = new TextFormat();
        format.align = TextFormatAlign.RIGHT;
        tf.defaultTextFormat = format;

        return tf;
    }
    
    var tf:TextField;
    tf = TextFieldCreateCommentH();
    tf.text = "試行後の資金 (倍率)";
    tf.x = 5;
    tf.y = 0;
    sprite_text.addChild(tf);

    tf = TextFieldCreateCommentV();
    tf.text = "1回分の資金投入率 (%)";
    tf.x = w - 205;
    tf.y = h - 20;
    sprite_text.addChild(tf);

    var i:int;
    for(i=0;i<11;i++){
        tf = TextFieldCreateValueH();
        tf.text = "" + (i * 10) + "%";
        tf.x = 60 + (i / 10) * (w - 60 - 20) - 20;
        tf.y = h - 40 + 2;
        sprite_text.addChild(tf);
    }
    var d:Number;
    for(d=1;d<=s;d+=s_add){
        tf = TextFieldCreateValueV();
        tf.text = "" + Math.floor(d + 0.5) + ".0 ×";
        tf.x = 0;
        tf.y = (h - 40) - (d / s * (h - 40 - 30)) - 10;
        sprite_text.addChild(tf);
    }

    shape_grid.x = 5;
    shape_grid.y = 5;
    (function():void{
        var g:Graphics = shape_grid.graphics;
        g.clear();

        g.lineStyle (1.0,0x888888, 1.0);
        var i:int;
        for(i=1;i<11;i++){
            var x:Number = 60 + (i / 10) * (w - 60 - 20);
            g.moveTo(x,20);
            g.lineTo(x,h - 40);
        }
        var d:Number;
        for(d=1;d<=s;d+=s_add){
            if(d == 1){
                g.lineStyle (2.0,0xFF0000, 1.0);
            }else{
                g.lineStyle (1.0,0x888888, 1.0);
            }
            var y:Number = (h - 40) - (d / s * (h - 40 - 30));
            g.moveTo(60,y);
            g.lineTo(w - 10,y);
        }
        g.endFill();

        g.lineStyle (3.0,0xFFFFFF, 1.0);
        g.moveTo(60,20);
        g.lineTo(60,h - 40);
        g.moveTo(60,h - 40);
        g.lineTo(w - 10,h - 40);
        g.endFill();
    })();

    // クリア
    bitmap_data[bitmap_data_slot].fillRect(new Rectangle(0,0,w,h),0x00FFFFFF);

    ChartRender();
}


// -------------------------------------------------
// チャートをレンダリング
// -------------------------------------------------
function ChartRender():void {
    var w:Number = chart.width;
    var h:Number = chart.height;
    var s:Number = chart.scale.y;

    var param:Object = ChartParamGetObject();
    var probability:Array = param.probability;

    shape_now.x = 5;
    shape_now.y = 5;
    (function():void{
        var g:Graphics = shape_now.graphics;
        g.clear();
        var i:int;
        for(i=0;i<101;i++){
            var obj:Object = probability[i];
            var x:Number = 60 + (i / 100) * (w - 60 - 20);
            var y:Number = (h - 40) - (obj.now / s * (h - 40 - 30));
            g.beginGradientFill (
                GradientType.RADIAL,
                [0xFFFFFF , 0xFFFFFF],
                [1.0,0.0],
                [0,255],
                new Matrix(
                    5/1638.4 , 0 ,
                    0 , 5/1638.4 ,
                    x , y
                ),
                SpreadMethod.PAD,
                InterpolationMethod.LINEAR_RGB,
                0.0
            );
            g.drawCircle(x,y,5.0);
            g.endFill();
        }
    })();

    shape_average.x = 5;
    shape_average.y = 5;
    (function():void{
        var g:Graphics = shape_average.graphics;
        g.clear();
        var i:int;
        for(i=0;i<101;i++){
            var obj:Object = probability[i];
            var x:Number = 60 + (i / 100) * (w -60 - 20);
            var y:Number = (h - 40) - (obj.average / s * (h - 40 - 30));
            g.beginFill (0xFF0000,0.8);
            g.drawCircle(x,y,3.0);
            g.endFill();
        }
    })();
    
    bitmap_blur.x = 5;
    bitmap_blur.y = 5;
    bitmap_blur.bitmapData = bitmap_data[1-bitmap_data_slot];
    // クリア
    bitmap_data[1-bitmap_data_slot].fillRect(new Rectangle(0,0,w,h),0x00FFFFFF);
    // キャプチャ
    bitmap_data[bitmap_data_slot].draw(shape_now,new Matrix(1,0,0,1,0,0),new ColorTransform(0.8,0.8,1,1.0,0,0,0,0));
    bitmap_data[1-bitmap_data_slot].draw(bitmap_data[bitmap_data_slot],new Matrix(1,0,0,1,0,0),new ColorTransform(1,1,1,0.995,0,0,0,0));

    bitmap_data_slot ++;
    if(bitmap_data_slot > 1)    bitmap_data_slot = 0;

    textinput_total.text = "" + param.count;
    textinput_win_percent.text = "" + Math.floor(param.win_percent * 10000) / 10000;
}


// -------------------------------------------------
// 実行
// -------------------------------------------------
addEventListener(Event.ENTER_FRAME,function(e:Event):void{

    var param:Object = ChartParamGetObject();
    var average_total:Number = 0;

    var i:int;
    var j:int;
    var k:int;
    var try_max:int = param.try_max;
    var win_percent:Number = param.win_percent;
    var profit:Number = param.profit;
    var loss_cut:Number = param.loss_cut;

    var num:Number = stepper_count.value;
    for(k=0;k<num;k++){
        // 回数
        param.count += 1;
        var average:Number = 0;
        for(i=0;i<101;i++){
            var prob:Object = param.probability[i];
            var money:Number = 0x10000;
            var d:Number = (i / 100);
            for(j=0;j<try_max;j++){
                if(win_percent >= Math.random()){
                    money += profit * money * d;
                }else{
                    money -= loss_cut * money * d;
                }
            }

            var now:Number = money / 0x10000;
            prob.now = now;
            if(param.count > 1){
                prob.average = (prob.average * (param.count - 1) + now) / param.count;
            }else{
                prob.average = now;
            }
            average += prob.average;
        }
        average_total += average / 101;
    }

    if(num){
        average_total = average_total / num;
        average_total *= 2;
    }
    if(average_total < 1.5)    average_total = 1.5;
    if(Math.abs(chart.scale_target.y - average_total) > 0.1){
        chart.scale_target.y = average_total;
    }

    // スケール
    var SCALE_SPEED_ADD:Number = 0.001;
    var SCALE_SPEED_MAX:Number = 5;
    var SCALE_SPEED_FRE:Number = 0.05;
    
    var sub:Number = chart.scale_target.y - chart.scale.y;
    sub *= SCALE_SPEED_FRE;
    var spd:Object = chart.scale_speed;
    if(sub > 0){
        spd.y += SCALE_SPEED_ADD;
        if(sub > 10){
            if(spd.y < 0)    spd.y = 0;
            spd.y *= 10.0;
        }else{
            if(spd.y > SCALE_SPEED_MAX)    spd.y = SCALE_SPEED_MAX;
        }
        if(spd.y > sub)    spd.y = sub;
    }else if(sub < 0){
        spd.y -= SCALE_SPEED_ADD;
        if(sub <-10){
            if(spd.y > 0)    spd.y = 0;
            spd.y *= 10.0;
        }else{
            if(spd.y <-SCALE_SPEED_MAX)    spd.y =-SCALE_SPEED_MAX;
        }
        if(spd.y < sub)    spd.y = sub;
    }else{
        spd.y = 0.0;
    }

    if(Math.abs(spd.y) > 0.001){
        chart.scale.y += spd.y;
        if(chart.scale.y == Number.POSITIVE_INFINITY)    chart.scale.y = Number.MAX_VALUE;
        if(chart.scale.y == Number.NEGATIVE_INFINITY)    chart.scale.y =-Number.MAX_VALUE;
        if(chart.scale_speed.y == Number.POSITIVE_INFINITY)    chart.scale_speed.y = Number.MAX_VALUE;
        if(chart.scale_speed.y == Number.NEGATIVE_INFINITY)    chart.scale_speed.y =-Number.MAX_VALUE;
        ChartResize();
    }else{
        ChartRender();
    }
});







}]]></mx:Script></mx:Application>