تجارت کی حکمت عملی تیار کرنے کے تجربات

مصنف:چھوٹا سا خواب, تخلیق: 2019-08-06 17:15:13, تازہ کاری: 2023-10-20 20:06:49

img

تجارت کی حکمت عملی تیار کرنے کے تجربات

اس مضمون کا مقصد حکمت عملی کی ترقی کے بارے میں کچھ تجربات اور چھوٹی چھوٹی ترکیبیں بتانا ہے جو قارئین کو فوری طور پر تجارتی حکمت عملی کی ترقی کے بارے میں سمجھنے میں مدد فراہم کرتی ہیں۔ جب آپ کو حکمت عملی کے ڈیزائن میں اسی طرح کے تفصیلی مسائل کا سامنا کرنا پڑتا ہے تو ، فوری طور پر ایک معقول حل تیار کیا جاسکتا ہے۔ یہ ایک ایسا پلیٹ فارم ہے جس میں ایجاد کنندہ کو مقداری تجارت کے لئے ایک پلیٹ فارم کے طور پر استعمال کیا جاتا ہے جس میں انکشاف ، جانچ اور مشق کی جاتی ہے۔ حکمت عملی پروگرامنگ زبان: جاوا اسکرپٹ تجارتی بازار: بلاکچین اثاثوں کی مارکیٹ (بی ٹی سی، ای ٹی ایچ وغیرہ)

  • اعداد و شمار تک رسائی اور پروسیسنگ

    عام طور پر حکمت عملی کی منطق کے مطابق ، مارکیٹ کے اعداد و شمار کو حاصل کرنے کے لئے مندرجہ ذیل مختلف انٹرفیس کا استعمال کرنا ممکن ہے ، کیونکہ عام طور پر حکمت عملی کی تجارتی منطق مارکیٹ کے اعداد و شمار سے چلتی ہے (یقینا some کچھ حکمت عملی بھی مارکیٹ سے قطع نظر ہوتی ہے ، جیسے پوزیشننگ کی حکمت عملی) ۔

    • GetTicker: حقیقی وقت میں ٹِک مارکیٹ حاصل کریں۔ عام طور پر موجودہ تازہ ترین قیمتوں کو فوری طور پر حاصل کرنے کے لئے استعمال کیا جاتا ہے، ایک قیمت خریدیں، ایک قیمت فروخت کریں.

    • GetDepth: آرڈر کی گہرائیوں کی گہرائیوں کو حاصل کریں۔ یہ عام طور پر ہر کٹ کی قیمت ، آرڈر کی مقدار اور مقدار کو حاصل کرنے کے لئے استعمال کیا جاتا ہے۔ اس کے علاوہ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے.

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

    • GetRecords: مارکیٹ کی K لائن ڈیٹا حاصل کریں۔ عام طور پر رجحانات پر نظر رکھنے کی حکمت عملی کے طور پر استعمال کیا جاتا ہے۔ اس کے علاوہ، اس کے بارے میں مزید معلومات حاصل کریں.

    • غلطی کرنا

      حکمت عملی کے ڈیزائن کے دوران ، عام طور پر نئے آنے والوں کو غلط صورتحال کو نظرانداز کرنا پڑتا ہے ، اور انٹروو کے مطابق حکمت عملی کے ہر لنک کے نتائج کا نتیجہ طے شدہ ہوتا ہے۔ لیکن حقیقت میں ایسا نہیں ہوتا ہے ، حکمت عملی کے پروگرام کے عمل میں ، جب مارکیٹ ڈیٹا کی درخواست کی جاتی ہے تو ، مختلف غیر متوقع حالات کا سامنا کرنا پڑتا ہے۔ مثال کے طور پر ، کچھ انٹرفیس غیر معمولی ڈیٹا واپس کرتے ہیں:

      var depth = exchange.GetDepth()
      
      // depth.Asks[0].Price < depth.Bids[0].Price      卖一价格低于了买一价格,这种情况不可能存在于盘面上,
      //                                                因为卖出的价格低于买入的价格,必定已经成交了。
      // depth.Bids[n].Amount = 0                       订单薄买入列表第n档,订单量为0
      // depth.Asks[m].Price = 0                        订单薄卖出列表第m档,订单价格为0
      

      یا براہ راست exchange.GetDepth() null کی قدر واپس کرتا ہے۔

      اس طرح کے بہت سے عجیب و غریب واقعات ہیں۔ لہذا ان مسائل کے لیے جو پہلے سے ہی ہو سکتے ہیں ان کے لیے مناسب اقدامات کرنے کی ضرورت ہے۔ اس طرح کے اقدامات کو غلطیوں کا علاج کہا جاتا ہے۔

      عام طور پر غلطیوں کو دور کرنے کا طریقہ یہ ہے کہ ڈیٹا کو ضائع کیا جائے اور دوبارہ حاصل کیا جائے۔

      مثال کے طور پر

      function main () {
          while (true) {
              onTick()
              Sleep(500)
          }
      }
      
      function GetTicker () {
          while (true) {
              var ticker = exchange.GetTicker()
              if (ticker.Sell > ticker.Buy) {       // 以 检测卖一价格是不是小于买一价这个错误的容错处理为例,
                                                    // 排除这个错误,当前函数返回 ticker 。
                  return ticker
              }
              Sleep(500)
          }
      }
      
      function onTick () {
          var ticker = GetTicker()                  // 确保获取到的 ticker 不会存在 卖一价格小于买一价格这种数据错误的情况。
          // ...  具体的策略逻辑
      }
      

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

    • K لائن ڈیٹا کا استعمال

      K لائن ڈیٹا حاصل کریں، کال کریں:

      var r = exchange.GetRecords()
      

      اس کے نتیجے میں K لائن ڈیٹا ایک صف ہے ، مثال کے طور پر اس طرح:

      [
          {"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
          {"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
          ...
          {"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
      ]
      

      آپ کو ہر ایک کے لئے قوس و قوس نظر آئے گا.{}درمیانی میں شامل ہیں: وقت، کھلی قیمت، سب سے زیادہ قیمت، سب سے کم قیمت، بند ہونے کی قیمت، حجم. یہ ایک K لائن کالم ہے۔ عام طور پر K لائن کے اعداد و شمار کو اشارے کے حساب سے استعمال کیا جاتا ہے ، جیسے: ایم اے اوسط ، ایم اے سی ڈی وغیرہ۔ K لائن ڈیٹا کو بطور پیرامیٹر ان پٹ کریں (خام ڈیٹا) ، پھر اشارے کے پیرامیٹرز مرتب کریں ، اور اشارے کے اعداد و شمار کا حساب لگائیں ، جسے ہم اشارے کے فنکشن کہتے ہیں۔ انوینٹرز کیوٹی ٹریڈنگ پلیٹ فارم پر بہت سے اشارے افعال موجود ہیں۔

      مثال کے طور پر، ہم ایک ہموار اشاریہ کا حساب لگاتے ہیں، اور ہم نے کٹر کے اعداد و شمار کو منتقل کیا ہے جس میں مختلف دوروں کے مطابق ہم آہنگ دوروں کی ہموار لائنوں کا حساب لگایا ہے. مثال کے طور پر ، دن کی K لائن کے اعداد و شمار (ایک K لائن کالم ایک دن کی نمائندگی کرتا ہے) کا حساب لگایا جاتا ہے ، اور اسی طرح ، اگر دن کی K لائن کے اعداد و شمار کو ایک گھنٹہ کے دورانیے کے لئے منتقل کیا جاتا ہے تو ، حساب لگایا جاتا ہے کہ یہ ایک گھنٹہ کی اوسط ہے۔

      عام طور پر جب ہم انڈیکیٹرز کا حساب لگاتے ہیں تو ایک مسئلہ نظرانداز کیا جاتا ہے۔ اگر میں 5 دن کی اوسط لائن کا حساب لگانا چاہتا ہوں تو ، ہم پہلے دن کی لائن کے اعداد و شمار کو تیار کرتے ہیں:

      var r = exchange.GetRecords(PERIOD_D1)  // 给GetRecords 函数传入参数 PERIOD_D1就是指定获取日K线,
                                              // 具体函数使用可以参看:https://www.fmz.com/api#GetRecords
      

      اگر ہم کینیڈین اعداد و شمار کے ساتھ، ہم اوسط لائن کے اشارے کا حساب لگاتے ہیں، اور ہم 5 دن کی اوسط لائن کا حساب لگاتے ہیں، تو ہم اس اشارے کے لئے 5 کا اشارہ کریں گے.

      var ma = TA.MA(r, 5)        // TA.MA() 就是指标函数,用来计算均线指标,第一个参数设置刚才获取的日K线数据r,
                                  // 第二个参数设置5,计算出来的就是5日均线,其它指标函数同理。
      

      ہم نے ایک ممکنہ مسئلہ کو نظر انداز کر دیا ہے، اگر R-Day K-Line ڈیٹا میں K-Line کالموں کی تعداد 5 سے کم ہے، تو کیا ہم مؤثر 5 روزہ اوسط کا حساب لگاسکتے ہیں؟ اس کا جواب یقینی طور پر نہیں ہے۔ چونکہ ہموار اشاریہ ایک مقررہ تعداد میں K لائن کالموں کی اختتامی قیمتوں کا اوسط ہے۔

      img

      لہذا، K لائن کے اعداد و شمار کا استعمال کرنے سے پہلے، یہ فیصلہ کرنا ضروری ہے کہ K لائن کے اعداد و شمار میں K لائن کے کالم کی تعداد کو پورا کرنے کے لئے معیار (پوائنٹر پیرامیٹر)

      لہذا ، 5 دن کی اوسط لائن کا حساب لگانے سے پہلے ، اس کا فیصلہ کرنے کے لئے ، مکمل کوڈ یہ ہے:

      function CalcMA () {
          var r = _C(exchange.GetRecords, PERIOD_D1)     // _C() 是容错函数,目的就是避免 r 为 null , 具体可以查询文档:https://www.fmz.com/api#_C
          if (r.length > 5) {
              return TA.MA(r, 5)                         // 用均线指标函数 TA.MA 计算出均线数据,做为函数返回值,返回。
          }
      
          return false 
      }
      
      function main () {
          var ma = CalcMA()
          Log(ma)
      }
      

      img

      اس کا جواب یہ ہے: [null،null،null،null،null،4228.7،4402.9400000000005،... ]

      جیسا کہ آپ دیکھ سکتے ہیں کہ حساب لگایا گیا 5 روزہ اوسط اشارے ، پہلے 4 صفر ہیں ، کیونکہ K لائن کالموں کی تعداد 5 سے کم ہے ، اس لئے اوسط کا حساب نہیں لگایا جاسکتا ہے۔ 5 ویں کالم تک ، یہ حساب لگایا جاسکتا ہے۔

    • K لائن کی تازہ کاری کا اندازہ لگانے کی چھوٹی سی چال

      اس طرح کے منظر نامے اکثر ہوتے ہیں جب ہم کچھ حکمت عملی لکھتے ہیں ، ہم ہر K لائن سائیکل کے اختتام پر کچھ کارروائیوں پر کام کرتے ہیں ، یا کچھ نوشتہ جات پرنٹ کرتے ہیں۔ ہم اس طرح کی کارکردگی کو کیسے حاصل کرسکتے ہیں؟ ابتدائی پروگرامنگ کے تجربے کے بغیر، آپ کو شاید یہ نہیں معلوم ہو گا کہ کس طرح کے طریقہ کار کے ساتھ کام کرنا ہے، یہاں ہم براہ راست ٹوٹکے دیتے ہیں.

      ہم یہ فیصلہ کرتے ہیں کہ ایک K کالم کا دورانیہ مکمل ہو گیا ہے، ہم K کالم کے اعداد و شمار میں وقت کی صفت سے شروع کر سکتے ہیں، ہم ہر بار جب K کالم کا ڈیٹا حاصل کرتے ہیں، ہم یہ فیصلہ کرتے ہیں کہ اس K کالم کے اعداد و شمار کے آخری K کالم کے اعداد و شمار میں Time کی صفت کی قیمت میں تبدیلی ہوئی ہے یا نہیں، اگر تبدیلی ہوئی ہے تو یہ ایک نیا K کالم پیدا کرتا ہے (یہ ثابت کرتا ہے کہ نئے K کالم کا پچھلا K کالم کا دورانیہ مکمل ہو گیا ہے) ، اگر کوئی تبدیلی نہیں ہوئی ہے تو یہ ایک نیا K کالم پیدا کرتا ہے جو موجودہ آخری (K کالم کا دورانیہ مکمل نہیں ہوا ہے) کا نمائندہ ہے۔

      لہذا ہم نے ایک متغیر ہے کہ K لائن کے اعداد و شمار کے آخری K لائن کالم کا وقت ریکارڈ کرنے کے لئے استعمال کیا جائے گا.

      var r = exchange.GetRecords()
      var lastTime = r[r.length - 1].Time       // lastTime 用来记录最后一根K线柱的时间。
      

      اس کے علاوہ، یہ بھی کہا جاتا ہے کہ اس کی تعمیر عام طور پر اس طرح کی ہے:

      function main () {
          var lastTime = 0
          while (true) {
              var r = _C(exchange.GetRecords)
              if (r[r.length - 1].Time != lastTime) {
                  Log("新K线柱产生")
                  lastTime = r[r.length - 1].Time      // 一定要更新 lastTime ,这个至关重要。
      
                  // ... 其它处理逻辑
                  // ...
              }
      
              Sleep(500)
          }
      }
      

      img

      جیسا کہ آپ دیکھ سکتے ہیں ، ریورس میں ، K لائن کا دورانیہ دن (exchange.GetRecords فنکشن کال کرتے وقت کوئی پیرامیٹر نہیں بتاتا ہے ، اس کے مطابق ریورس کی ترتیب کے مطابق K لائن کا دورانیہ ڈیفالٹ پیرامیٹر ہے) ہے ، جب بھی نیا K لائن کالم ظاہر ہوتا ہے تو ایک لاگ پرنٹ ہوتا ہے۔

  • عددی حساب کتاب

    • ایکسچینج انٹرفیس تک رسائی کے وقت کا حساب لگائیں

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

      function main () {
          while (true) {
              var beginTime = new Date().getTime()
              var ticker = exchange.GetTicker()
              var endTime = new Date().getTime()
      
              LogStatus(_D(), "GetTicker() 函数耗时:", endTime - beginTime, "毫秒")
              Sleep(1000)
          } 
      }
      

      آسان الفاظ میں ، GetTicker فنکشن کو کال کرنے کے بعد ریکارڈ کردہ ٹائم سیکنڈ کو کال سے پہلے کے ٹائم سیکنڈ سے کم کرکے تجربہ کردہ ملی سیکنڈ کا حساب لگایا جاتا ہے ، یعنی جب تک کہ GetTicker فنکشن کو انجام دینے سے نتائج واپس نہ آئے۔

    • عددی اقدار کے لئے Math.min / Math.max کے ساتھ اوپری اور نچلی حد کی حد

      اگر آپ چاہتے ہیں کہ ایک عددی قدر کی ایک حد ہو تو، عام طور پر Math.min پابندی کا استعمال کریں

      مثال کے طور پر ، فروخت کے احکامات کے دوران ، فروخت کی تعداد اکاؤنٹ میں موجود سکے کی تعداد سے زیادہ نہیں ہونی چاہئے۔ اگر آپ کے اکاؤنٹ میں دستیاب سکے کی تعداد سے زیادہ ہے تو ، آپ کو ایک غلطی کا سامنا کرنا پڑے گا۔

      عام طور پر اس طرح کنٹرول کیا جاتا ہے: مثال کے طور پر، 0.2 ٹن کی فروخت کا منصوبہ بنایا گیا ہے۔

      var planAmount = 0.2
      var account = _C(exchange.GetAccount)
      var amount = Math.min(account.Stocks, planAmount)
      

      اس طرح یہ یقینی بنایا جاتا ہے کہ رقم کے طور پر جمع ہونے والی رقم اکاؤنٹ میں دستیاب سکے کی تعداد سے زیادہ نہیں ہوگی۔

      اسی طرح، Math.max ایک عددی قدر کی کم سے کم حد کو یقینی بنانے کے لئے استعمال کیا جاتا ہے۔ یہ عام طور پر کس منظر نامے پر لاگو ہوتا ہے؟ عام طور پر ایکسچینجز میں کچھ تجارت کے لئے کم سے کم آرڈر کی مقدار کی حد ہوتی ہے، اور اگر یہ کم سے کم آرڈر کی مقدار سے کم ہے تو وہ آرڈر کو مسترد کردیں گے۔ اس طرح کا آرڈر بھی ناکام ہوجاتا ہے۔ فرض کریں کہ عام طور پر بی ٹی سی کی کم سے کم تعداد 0.01 ہے۔ ٹرانزیکشن کی حکمت عملی حساب کتاب کے ذریعے کبھی کبھی یہ ممکن ہوتا ہے کہ 0.01 سے کم تعداد میں تعداد پیدا کی جائے، لہذا ہم Math.max کا استعمال کر سکتے ہیں تاکہ کم سے کم تعداد میں تعداد کو یقینی بنایا جاسکے۔

    • کم مقدار، قیمت، درستگی کنٹرول

      _N() فنکشن یا SetPrecision فنکشن کا استعمال کرکے درستگی کو کنٹرول کیا جاسکتا ہے۔

      سیٹ پریسیشن () ایک بار سیٹ کرنے کے بعد ، سسٹم میں خود بخود ایک ہی مقدار اور قیمت کے عددی اعداد و شمار سے زیادہ چھوٹے ہندسوں کو کاٹ دیتا ہے۔

      _N() فنکشن کسی قدر کے لئے چھوٹے ہندسوں کو کاٹنے کے لئے درستگی کا کنٹرول ہے

      مثال کے طور پر

      var pi = _N(3.141592653, 2)
      Log(pi)
      

      pi کی قدر کو دو ہندسوں کے ساتھ دو ہندسوں کے ساتھ تقسیم کیا گیا ہے: 3.14

      مزید تفصیلات کے لیے اے پی آئی دستاویزات دیکھیں۔

  • کچھ منطقی ترتیبات

    • ٹائمنگ، ایک مخصوص وقت کے دورانیے پر کچھ کارروائیوں کو انجام دینے کے لئے

      اس طرح کے میکانزم کا استعمال کیا جا سکتا ہے، ٹائم ٹائم کا پتہ لگانے کے طریقہ کار کا استعمال کرتے ہوئے، موجودہ ٹائم ٹائم کو کم کرنے کے لئے موجودہ ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم ٹائم

      مثال کے طور پر سرمایہ کاری کی حکمت عملی میں استعمال کیا جاتا ہے۔

      var lastActTime = 0
      var waitTime = 1000 * 60 * 60 * 12   // 一天的毫秒数
      function main () {
          while (true) {
              var nowTime = new Date().getTime()
              if (nowTime - lastActTime > waitTime) {
                  Log("执行定投")
                  // ... 具体的定投操作,买入操作。
      
      
                  lastActTime = nowTime
              }
      
              Sleep(500)
          }
      }
      

      یہ ایک سادہ مثال ہے۔

    • حکمت عملی کے لئے خود کار طریقے سے بحالی کے طریقہ کار کو ڈیزائن کریں

      _G ((() فنکشن کا استعمال کرتے ہوئے ، اور بچانے کے فنکشن سے باہر نکلیں ، یہ آسان ہے کہ بچانے کے عمل سے باہر نکلنے اور خود بخود بحالی کی حیثیت کو دوبارہ شروع کرنے کی پالیسی تیار کی جائے۔

      var hold = {
          price : 0, 
          amount : 0,
      }
      
      function main () {
          if (_G("hold")) {
              var ret = _G("hold")
              hold.price = ret.price
              hold.amount = ret.amount
              Log("恢复 hold:", hold)
          }
      
          var count = 1
          while (true) {
              // ... 策略逻辑
              // ... 策略运行中,可能开仓,交易,把开仓的持仓价格赋值给 hold.price ,开仓的数量赋值给 hold.amount,用以记录持仓信息。
      
              hold.price = count++     // 模拟一些数值
              hold.amount = count/10   // 模拟一些数值
      
              Sleep(500)
          }
      }
      
      function onexit () {    // 点击机器人上的停止按钮,会触发执行这个函数,执行完毕机器人停止。
          _G("hold", hold)
          Log("保存 hold:", JSON.stringify(hold))
      }
      

      img

      جیسا کہ آپ دیکھ سکتے ہیں، جب بھی روبوٹ کو روک دیا جاتا ہے تو یہ ہولڈ آبجیکٹ میں موجود ڈیٹا کو محفوظ کرتا ہے، اور جب بھی اسے دوبارہ شروع کیا جاتا ہے تو یہ اعداد و شمار کو پڑھتا ہے، ہولڈ کی قدر کو اس حالت میں واپس لاتا ہے جب اسے روک دیا گیا تھا۔ یقینا یہ ایک سادہ مثال ہے، اگر یہ عملی حکمت عملی میں استعمال کیا جاتا ہے تو، اس حکمت عملی میں مطلوبہ اہم اعداد و شمار (عام طور پر اکاؤنٹ کی معلومات، ہولڈنگز، منافع کی تعداد، تجارت کی سمت وغیرہ وغیرہ) کے مطابق ڈیزائن کیا جانا چاہئے. اس کے علاوہ ، یہ بھی ممکن ہے کہ کچھ شرائط طے کی جائیں کہ آیا اسے بحال کیا جائے گا۔

یہاں کچھ چھوٹی چھوٹی حکمت عملی تیار کرنے کی ترکیبیں ہیں جو امید ہے کہ آپ کے لئے مفید ہوں گی ، خواہ آپ ابتدائی ہوں یا حکمت عملی تیار کرنے والے! آپ کو مبارک ہو کہ آپ نے اپنی زندگی میں بہت ساری کامیابیاں حاصل کی ہیں۔


متعلقہ

مزید

ویکسینآپ کا شکریہ کہ آپ نے یہ شیئر کیا ، یہ نئے آنے والوں کے لئے بہت اچھا ہے جو صرف ای پی آئی لکھنا شروع کرتے ہیں ، اور یہ بھی پوچھیں کہ کیا ہمارا پلیٹ فارم ای پی آئی کے اعلی ورژن کی حمایت کرتا ہے ، جیسے کہ کیا آپ اسے استعمال کرتے ہیں؟

مائیکوآپ کا شکریہ! آپ کے استاد ، واقعی ایک فن و فن کے ساتھ ہیں ، پروگرامنگ کی تکنیک بہت اچھی ہے ، مضمون بہت اچھا ہے ، آپ کی تعریف بہت اچھی ہے!!!

چھوٹا سا خوابہیلو، اس وقت ES8 معیار کی حمایت کی جاتی ہے۔

چھوٹا سا خواباوہ ، ایف ایم زیڈ کو کوٹیٹ کرنے کے لئے آپ کا شکریہ!