وسائل لوڈ ہو رہے ہیں... لوڈنگ...

آپ کو مقدار کی دنیا میں لے جاتا ہے ---- MACD دو طرفہ آپریشن سلائڈ سٹاپ نقصان کوڈ تجزیہ

مصنف:ایجاد کاروں کی مقدار - خواب, تخلیق: 2016-04-22 13:53:14, تازہ کاری: 2023-06-14 10:38:59

آپ کو مقدار کی دنیا میں لے جاتا ہے ---- MACD دو طرفہ آپریشن سلائڈ سٹاپ نقصان کوڈ تجزیہ

پچھلے مضمون میں ہم نے 30 لائنوں کے کوڈ کے ساتھ کوالٹی مینجمنٹ کو آسان بنانے کی حکمت عملی کو سمجھا۔ اس مضمون میں ، مصنف کوالٹی مینجمنٹ کے ابتدائی افراد کو کوالٹی مینجمنٹ کی حکمت عملی کے ڈیزائن کے لطف کو دریافت کرنے کے لئے قدم بہ قدم رہنمائی کرے گا۔ یہ مضمون جاری ہے ، اس بار بھی بی ٹی سی کے ساتھ فوری طور پر تجارت کی جارہی ہے ، اور مصنف پہلے بھی مالی ، سرمایہ کاری ، سیکیورٹیز وغیرہ کے بارے میں مکمل طور پر بے وقوف ہے۔ اس کے علاوہ ، آنکھوں کی چمک ، ناموں اور اصطلاحات کو سن کر پریشان ہونے والے دماغ میں بے ہوش ہوجاتے ہیں ، (جس کا احساس تھوڑا سا سمجھ میں آتا ہے! تھوڑا سا سمجھ میں آتا ہے!) ؛ اپنے بائیوڈیٹ ، معلومات کی جانچ وغیرہ کے ذریعہ ایک ایک کرکے اپنا دماغ بھریں۔ میں نے اس کے بارے میں پڑھا ، میرے ذہن میں بنیادی تصورات ہیں ، اور میں نے اپنی تھوڑی سی سمجھ کے ساتھ جے ایس زبان کو جوڑ کر ایک آسان تحریر کی ہے۔ شروع میں مجھے نہیں معلوم تھا کہ کی لائن ، اوسط لائن ، میک ڈی اشارے کیا ہیں۔ یہاں ، K لائن ایک مخصوص دورانیے میں مارکیٹ کی رجحانات کو ریکارڈ کرتی ہے ، جو مارکیٹ کی حرکیات کو دیکھنے کے لئے آسان ہے۔ اوسط لائن ایک اشارے ہے جو پچھلے مضمون میں استعمال کیا گیا تھا ، اور MACD اشارے کی طرح ، مارکیٹ کی رجحانات کی عکاسی کرتی ہے۔ ان دونوں اشارے کے تصورات، الگورتھم، فارمولا انڈکشن وغیرہ کو ایک دوسرے سے الگ الگ بیان کیا گیا ہے۔ اگر آپ کو سمجھ نہیں آرہی ہے تو برائے مہربانی بائیوٹا کو دیکھیں.

کوڈ میں مندرجہ ذیل عالمی متغیرات ہیں ، پرانے قواعد ، پہلے ایک ایک کرکے وضاحت کریں ، پرانے پرندوں کو نظرانداز کریں۔

متغیر کا نام ابتدائی قدر وضاحت
وقفہ 2000 اس متغیر کا دورانیہ ہے، یا وقت کی مقدار جس میں پروگرام کو روکنے کے لئے انتظار کرنا ہے، یونٹ ملی سیکنڈ ہے، 1000 ملی سیکنڈ 1 سیکنڈ ہے، لہذا اس متغیر کی ابتدائی قیمت 2 سیکنڈ ہے.
STATE_FREE 0 یہ ایک حالت کا اشارہ کرنے والا متغیر ہے، جس میں خالی جگہیں ہیں۔
STATE_BUY 1 یہ ایک حالت کا اشارہ کرنے والا متغیر ہے، جس میں ایک سے زیادہ پوزیشنوں کا اشارہ ہوتا ہے۔
STATE_SELL 2 ریاست متغیر، خالی پوزیشن رکھنے کا اشارہ کرتا ہے۔
ORDER_INVALID 3 اسٹوریج کی حالت متغیر، غیر اسٹوریج کا اشارہ کرتا ہے۔
ORDER_VALID 4 اس کا مطلب یہ ہے کہ...
ریاست STATE_FREE ریاست متغیر، خالی حالت کے ساتھ initialized.
سگنل تاخیر 0 ابتدائی طور پر منصوبہ بندی کی گئی تھی سگنل میں تاخیر ہوئی تھی اور اس وقت اس کا کوئی فائدہ نہیں تھا۔
سٹاپپروفیٹ 0.002 یہ متغیر زیادہ اہم ہے، سٹاپ نقصان کی شرح، مثال کے طور پر سرمایہ * سٹاپ نقصان کی شرح ((0.002) زیادہ سے زیادہ نقصان کی شرح 0.002 بار، نقصان کی حد ہے.
قدم 0.5 سلائڈ سٹاپ نقصان کی لمبائی کی قدر۔
opمبلغ 1 آپریشن کی مقررہ مقدار۔
منافع 0 بہت اچھا۔

گلوبل آبجیکٹ، ذخیرہ اندوزی کی معلومات کو ریکارڈ کرنے کے لئے استعمال کیا جاتا ہے، جس میں کچھ طریقے شامل ہیں، بنیادی طور پر سلائڈ سٹاپ نقصان کو حاصل کرنے کے لئے.

    var holdOrder = {//持仓信息对象
	    orderState: ORDER_INVALID,// 持仓状态
	    price: 0, //持仓均价
	    amount: 0, //持仓量
	    time: null, // 操作时间
	    stopPrice: 0, // 止损价
	    level: 1,   //止损等级
	    updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
	        if(state === STATE_SELL){//当前 空头持仓
	        	return (lastPrice - this.price) * amount;
	        }
	        if(state === STATE_BUY){//当前 多头持仓
	        	return - (lastPrice - this.price) * amount;
	        }
	    },
	    SetStopPrice: function(ticker,stopState){//更新止损价
	    	if(stopState === STATE_FREE){ //更新止损时状态 为空闲
	    		return this.stopPrice;
	    	}
	    	if(stopState === STATE_BUY){ //更新止损时状态 为多仓
	            if(this.orderState === ORDER_INVALID){
	        	    return this.stopPrice;
	            }
	            if(this.stopPrice === 0){//初始 止损价为0 时 
	            	this.stopPrice = this.price * ( 1 - stopProfit );
	            }
	            if( ticker.Last <= this.price ){ //最后成交价 小于等于  持仓均价时
	                this.stopPrice = this.price * ( 1 - stopProfit );
	                this.level = 1;
	            }else{//其它情况
	        	    if( ticker.Last - this.price > this.level * step ){//超出当前等级   设置滑动止损
	                    this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
	                    //更新止损价为滑动后的止损价
	                    this.level++;//上调止损等级
	        	    }else{//其它
	        	    	this.stopPrice = this.stopPrice;//保持当前止损价不变
	        	    }
	            }
	    	}else if( stopState === STATE_SELL){//空头持仓类似
	    		if(this.orderState === ORDER_INVALID){
	        	    return this.stopPrice;
	            }
	            if(this.stopPrice === 0){
	            	this.stopPrice = this.price * ( 1 + stopProfit );
	            }
	            if( ticker.Last >= this.price ){
	                this.stopPrice = this.price * ( 1 + stopProfit );
	                this.level = 1; 
	            }else{
	        	    if( this.price - ticker.Last > this.level * step ){
	                    this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
	                    this.level++;
	        	    }else{
	        	    	this.stopPrice = this.stopPrice;
	        	    }
	            }
	    	}
	        return this.stopPrice;//返回止损价
	    },
	    initHoldOrder: function(){//平仓后  用于 初始化持仓信息的  函数
	        this.orderState = ORDER_INVALID;
	        this.price = 0;
	        this.amount = 0;
	        this.time = null;
	        this.stopPrice = 0;
	        this.level = 1;
	    }
	};
  • کوڈ اپ لوڈ کرنے کے لئے گٹ ہب ایڈریس: کلک کریںگٹ ہبداخلہ۔
  • اگر آپ کے پاس ابھی تک کوئی سرکاری QQ گروپ نہیں ہے تو ، براہ کرم شامل ہوں: 309368835

ذیل میں ہم ایک فوری پیش نظارہ کریں گے کہ ہم کس طرح استعمال کریں گے.

function MACD_Cross(){//检测MACD指标,交叉状态的函数
    var records = exchange.GetRecords();//获取K线数据
    while(!records || records.length < 45){ //K线数据不能为null,要大于45个柱,不符合标准 循环获取直到符合
    	records = exchange.GetRecords();
    	Sleep(Interval);
    }
    var macd = TA.MACD(records,12,26,9);//调用指标函数, 参数为MACD 默认的参数。
    var dif = macd[0];  //dif线
    var dea = macd[1];  //dea线
    var column = macd[2]; // MACD柱
    var len = records.length;  //K线周期长度
    if( (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2 ){ 
    //判断金叉条件:dif 与 dea 此刻均大于0 , 且dif由下上穿dea , 且 MACD量柱大于0.2
    	return 1; //返回1  代表 金叉信号。
    }
    if( (dif[len-1] < 0 && dea[len-1] < 0) && dif[len-1] < dea[len-1] && dif[len-2] > dea[len-2] && column[len-1] < -0.2 ){
    //判断死叉条件:
        return 2;//返回2  代表 死叉信号。
    }   
    return 0;  //金叉  、死叉  信号以外,为等待信号 0 。
}
function getTimeByNormal(time){// 获取时间的 函数 把毫秒时间 转换 标准时间
    var timeByNormal = new Date();
    timeByNormal.setTime(time);
    var strTime = timeByNormal.toString();
    var showTimeArr = strTime.split(" ");
    var showTime = showTimeArr[3]+"-"+showTimeArr[1]+"-"+showTimeArr[2]+"-"+showTimeArr[4];
    return showTime;
}

ذیل میں شروع کرنے کے لئے ، اس کی حکمت عملی کے مرکزی افعال میں داخل ہوں ، جو پچھلے 30 لائنوں کی طرح ہی ہے۔ اس کی حکمت عملی نے ٹرانزیکشن ٹیمپلیٹ کلاس لائبریری کا استعمال کیا ہے۔ اس میں ٹرانزیکشن کی تفصیلات شامل ہیں ، دلچسپی رکھنے والے دوست کوڈ کو موجد کی مقدار پر تلاش کرسکتے ہیں ، اور سرکاری QQ گروپ ، github پر شیئر کرنے کے لئے تشریح شدہ ورژن۔

function main(){
    var initAccount = $.GetAccount(exchange);//首先我们来记录初始时的账户信息,这里调用了模板类库的导出函数
    var nowAccount = initAccount;//再声明一个 变量 表示 现在账户信息
    var diffMoney = 0; //钱 差额
    var diffStocks = 0;//币 差额
    var repair = 0; //计算 盈亏时   用于修正的 量
    var ticker = exchange.GetTicker(); //获取此刻市场行情
    Log("初始账户:",initAccount); //输出显示  初始账户信息。
    while(true){//主函数循环
        scan(); //扫描函数,  稍后讲解,主要是判断  开仓、平仓 以及 操作 开仓 、 平仓。
        ticker = exchange.GetTicker();//在while循环内 获取 市场行情
        if(!ticker){//如果 没有获取到  (null) 跳过以下 重新循环
        	continue;
        }
        if(holdOrder.orderState == ORDER_VALID){//判断当前是否  持仓
        	Log("当前持仓:",holdOrder); //如果 当前持仓   输出  持仓 信息
        }
        if(holdOrder.orderState == ORDER_INVALID){//如果 未持仓(已平仓)
        	nowAccount = $.GetAccount(exchange); //获取当前账户信息
            diffMoney = nowAccount.Balance - initAccount.Balance; //计算  当前账户  与 初始账户之间的  钱 差额
            diffStocks = nowAccount.Stocks - initAccount.Stocks; // 计算  当前账户  与  初始账户之间的  币 差额
            repair = diffStocks * ticker.Last; //把 币的差额 * 最后成交价  ,转为等值的钱, 用于计算 盈亏
            LogProfit(diffMoney + repair ,"RMB","现在账户:",nowAccount,"本次盈亏:",profit);//输出 盈亏 信息
        }
    	Sleep(Interval);//轮询
    }
}

اس کے بعد حکمت عملی کا بنیادی حصہ ، کھلی پوزیشنوں کا پتہ لگانا ، اور کھلی پوزیشنوں کی کارروائی ہے۔

function scan(){
	var sellInfo = null; //声明  储存平仓信息的变量  , 初始化null
	var buyInfo = null;  //声明  开仓的 , 初始化null
	var opFun = null;//  开仓函数, 两种状态 ,  开多仓 ,  开空仓。
	var singal = 0; //信号
    while(true){//检测 及操作 循环
        var ticker = exchange.GetTicker(); //获取市场行情
        if(!ticker){ //判断 获取失败  跳过以下 ,继续循环获取
        	continue;
        }
        holdOrder.SetStopPrice(ticker,state); //设置 持仓 止损价
        if(state === STATE_FREE &&  (singal = MACD_Cross()) !== 0  ){
        	//判断策略运行状态是否空闲、此刻MACD指标信号是否空闲, 符合 策略运行状态空闲 且 有金叉或死叉执行以下
        	holdOrder.initHoldOrder();//初始化持仓信息
            opFun = singal === 1 ?  $.Buy : $.Sell ;//根据MACD_Cross函数返回结果,判断开多仓、开空仓。
            buyInfo = opFun(opAmount);//开仓操作
            holdOrder.orderState = ORDER_VALID;//设置持仓信息,状态为持仓
            holdOrder.price = buyInfo.price; //设置持仓均价  由 开仓操作函数 opFun返回。 
            holdOrder.amount = buyInfo.amount; //设置持仓量
            holdOrder.time = getTimeByNormal((new Date()).getTime());//设置持仓开始的时间
            state = singal === 1 ? STATE_BUY : STATE_SELL; //更新策略状态为多仓 或 空仓
            var account = $.GetAccount(exchange); //获取账户信息
            if(singal === 1){//输出开仓方向 和 当前账户信息
            	Log("开多仓。","账户:",account);
            }else{
                Log("开空仓。","账户:",account);
            }
            break;
        }else{
        	var lastPrice = holdOrder.price;// 把持仓均价 赋值 给 lastPrice
        	if( state === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ){
            //如果 多仓 且 持仓信息为持仓 且 最后成交价 小于止损价,执行以下
        	    Log("多头止损平仓","初始止损价:",holdOrder.price * (1 - stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//多头止损平仓信息
        	    sellInfo = $.Sell(holdOrder.amount);//平仓
                holdOrder.orderState = ORDER_INVALID;//平仓信息 更新进对象
                holdOrder.price = sellInfo.price;
                holdOrder.amount = sellInfo.amount;
                holdOrder.time = getTimeByNormal((new Date()).getTime());
                profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount);//更新浮动盈亏
        	    state = STATE_FREE;//更新状态
        	    break;//跳出
        	}
        	if( state === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice ){//同上 , 这个是空头止损平仓
        	    Log("空头止损平仓","初始止损价:",holdOrder.price * (1 + stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//测试
        	    sellInfo = $.Buy(holdOrder.amount);
                holdOrder.orderState = ORDER_INVALID;
                holdOrder.price = sellInfo.price;
                holdOrder.amount = sellInfo.amount;
                holdOrder.time = getTimeByNormal((new Date()).getTime());
                profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount);
        	    state = STATE_FREE;
        	    break;
        	}
            if(state === STATE_BUY && MACD_Cross() === 2 ){//做多时,MACD指标死叉 -- 死叉平仓
        	    sellInfo = $.Sell(holdOrder.amount);
        	    Log("死叉平仓","初始止损价:",holdOrder.price * (1 - stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//测试
                holdOrder.orderState = ORDER_INVALID;
                holdOrder.price = sellInfo.price;
                holdOrder.amount = sellInfo.amount;
                holdOrder.time = getTimeByNormal((new Date()).getTime());
                profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount);
        	    state = STATE_FREE;
        	    break;
            }
             if(state === STATE_SELL && MACD_Cross() === 1 ){//做空时,MACD指标金叉 ---金叉平仓
        	    sellInfo = $.Buy(holdOrder.amount);
        	    Log("金叉平仓","初始止损价:",holdOrder.price * (1 + stopProfit),"--滑动止损价:",holdOrder.stopPrice,"最后成交价:",ticker.Last,"止损等级:",holdOrder.level);//测试
                holdOrder.orderState = ORDER_INVALID;
                holdOrder.price = sellInfo.price;
                holdOrder.amount = sellInfo.amount;
                holdOrder.time = getTimeByNormal((new Date()).getTime());
                profit = holdOrder.updateCurrentProfit(lastPrice,sellInfo.amount);
        	    state = STATE_FREE;
        	    break;
            }
        }
        Sleep(Interval);//轮询间隔,就是让程序暂停一会儿。
    }
}

کوڈ تھکا ہوا ہے، پانی پینا چھوڑ دو

اس سے پہلے کہ ہم سلائڈ سٹاپ کے بارے میں بات کریں

اس کوڈ میں سلائڈنگ سٹاپ کے بارے میں کہا گیا ہے کہ:SetStopPriceفنکشن کے مطابق منتقلstopState(بند حالت) اورticker(مارکیٹ کے اعداد و شمار) سٹاپ نقصان کی قیمت کو اپ ڈیٹ کرنے کے لئے.stopState === STATE_BUY(ج) مختلف حالات کے مطابق فیصلہ اور سٹاپ نقصان کی قیمت کو اپ ڈیٹ؛ اگرorderStateغیر فعال حالت (یعنی کوئی پوزیشن نہیں ہے) کے لئے، موجودہ سٹاپ نقصان کی قیمت واپس آتی ہے۔ اگر سٹاپ نقصان کی قیمت 0 ہے، تو اسے خریدنے کی اوسط قیمت کے طور پر ضرب کریں(1 - stopProfit)اس کے بعد ، آخری قیمت کے مطابق۔ticker.Last) اور ہولڈنگ برابر قیمت ((this.price) کی فرق موجودہ سٹاپ نقصان کی درجہ بندی کے ساتھ ((this.level) کا موازنہ قدم کی لمبائی کے ضرب سے کیا جاتا ہے۔ اگر موجودہ درجہ سے زیادہ ہے تو ، اسٹاپ نقصان کی قیمت کو اسکیپ کے بعد کی قیمت کے طور پر اپ ڈیٹ کریں ، جبکہ اسٹاپ نقصان کی درجہ بندی میں اضافہ کریں۔ بصورت دیگر ، موجودہ اسٹاپ نقصان کی قیمت کو برقرار رکھیں۔stopState === STATE_SELLاس کے علاوہ ، آپ کو اس کی لاگت کو کم کرنے کی ضرورت ہوگی ، لیکن آپ کو اس کی لاگت کو کم کرنے کی ضرورت ہوگی۔ اس کے علاوہ ، آپ کو اس کی لاگت کو کم کرنے کی ضرورت ہوگی۔

سلائڈ سٹاپ نقصانات ایک خطرے کے انتظام کی حکمت عملی ہے

ہولڈنگ کے دوران، سٹاپ نقصان کی قیمت کو مارکیٹ کی قیمت میں اتار چڑھاؤ کے مطابق نقصانات کو کم کرنے یا منافع کو بچانے کے لئے ایڈجسٹ کیا جاتا ہے۔ کوڈ کی منطق کے مطابق، سلائڈ اسٹاپ نقصان کو حاصل کرنے کے لئے مندرجہ ذیل اہم نکات دیکھے جاسکتے ہیں:updateCurrentProfitطریقہ کار موجودہ منافع اور نقصان کو برقرار رکھنے کی حالت (state) اور تازہ ترین قیمت (lastPrice) کی بنیاد پر حساب کرنے کے لئے استعمال کیا جاتا ہے۔ اگر یہ حالت خالی فروخت (STATE_SELL) ہے تو ، منافع کو حالیہ قیمت اور اسٹاک کی برابر قیمت کے فرق سے ضرب کیا جاتا ہے۔ اگر یہ حالت ملٹی ہیڈ (STATE_BUY) ہے تو ، نقصان منفی ہے۔ سیٹ اسٹاپ قیمت کا طریقہ کار اسٹاپ نقصان کی قیمت کو اپ ڈیٹ کرنے کے لئے استعمال کیا جاتا ہے۔ اگر اسٹاپ نقصان خالی حالت (STATE_FREE) ہے تو ، موجودہ نقصان کی قیمت برقرار ہے۔ اگر نقصان کی حالت زیادہ اسٹاک نقصان (STATE_BUY) ہے تو ، مختلف حالات کے مطابق اسٹاپ نقصان کی قیمت کو ایڈجسٹ کیا جاتا ہے۔ اگر آخری ٹرانزیکشن کی قیمت چھوٹی ہے تو ، اسٹاپ نقصان کی قیمت کو اسٹاک کی برابر قیمت سے ضرب دیا جاتا ہے۔1 - stopProfit), اور سٹاپ نقصان کی درجہ بندی کو 1 پر دوبارہ ترتیب دیا جاتا ہے۔ اگر آخری تجارت کی قیمت موجودہ درجہ بندی سے آگے بڑھ جاتی ہے تو ، اسٹاپ نقصان کی قیمت کو سلائڈ کے بعد اسٹاپ نقصان کی قیمت پر ترتیب دیا جاتا ہے ، اور اسٹاپ نقصان کی درجہ بندی کو اپ گریڈ کیا جاتا ہے۔ دوسری صورت میں ، اسٹاپ نقصان کی قیمت کو برقرار رکھا جاتا ہے۔ اگر اسٹاپ نقصان کی حالت خالی ہے تو ، منطق اسی طرح کی ہے۔ init ہولڈ آرڈر کا طریقہ استعمال کرنے کے لئے استعمال کیا جاتا ہے اسٹاک کی معلومات کو ابتدائی طور پر برقرار رکھنے کے بعد ، اسٹاک کی حالت ، اوسط ، قیمت ، مقدار ، آپریٹنگ ٹائم اسٹاپ نقصان کی قیمت اور اسٹاپ نقصان کی سطح کو ابتدائی حالت میں دوبارہ ترتیب دیا جاتا ہے۔

آپ سب کو ایک بار پھر ٹیسٹ کرنے کی کوشش کر سکتے ہیں، اور یاد رکھیں کہ اس ٹیمپلیٹ کا حوالہ دیتے ہیں جو ڈیجیٹل کرنسی ٹریڈنگ لائبریری میں ہے!

حوالہ جات


متعلقہ

مزید

مڈسکیہیلو مالکان، میں www.banbiren.com منتقل کرنے والا ہوں، منتقلی کی مارکیٹنگ پلیٹ فارم کے مصنف، کوانٹیمیٹڈ ٹرانزیکشن سیکھ رہا ہوں، میرا QQ نمبر:39866099 ہے، کیا آپ مجھے گروپ میں شامل کرنے کی دعوت دے سکتے ہیں، پہلے تلاش میں شامل نہیں ہو سکتے ہیں۔

صفربہت تیزی سے ترقی ہو رہی ہے۔

مویامشکل ہے

ایجاد کاروں کی مقدار - خوابٹھیک ہے ^^ ، آپ براہ راست درخواست دیں ، MAC QQ نے دعوت نامہ نہیں پایا >_< ، 1 گروپ نمبر: 309368835۔ اب کئی مقامات ہیں۔

ایجاد کاروں کی مقدار - خوابعظیم خدا کی انگلیوں کے ساتھ اچھا ~~~

ایجاد کاروں کی مقدار - خوابایک ساتھ سیکھیں - ہہ -