avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

میں تخلیق کیا: 2021-05-28 09:50:12, تازہ کاری: 2023-09-21 21:06:08
comments   14
hits   2531

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

پچھلے مضمون میں، ہم نے ایک سادہ گرڈ حکمت عملی کے تجارتی منطق کے تجزیہ کی وضاحت کی تھی، اس مضمون میں، ہم اس تدریسی حکمت عملی کے ڈیزائن کو مکمل کرتے رہیں گے۔

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

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

حکمت عملی کے مرکزی فنکشن کو لکھنا شروع کریں، جو کوڈ ہے جو حکمت عملی پر عمل درآمد شروع کرتا ہے۔

  var diff = 50                                 // 全局变量,网格间距,可以设计成参数,方便讲解,我们把这个参数写死在代码里。
  function main() {
      // 实盘开始运行后,从这里开始执行策略代码
      var ticker = _C(exchange.GetTicker)       // 获取市场最新的行情数据ticker,ticker这个数据的结构参看FMZ API文档:https://www.fmz.com/api#ticker
      var net = createNet(ticker.Last, diff)    // 我们上篇设计的初始构造网格数据结构的函数,这里构造一个网格数据结构net

      while (true) {                            // 然后程序逻辑就进入了这个while死循环,策略执行到此将不停的循环执行这里{}符号之内的代码
          ticker = _C(exchange.GetTicker)       // 死循环代码部分的第一行,获取最新的行情数据,更新给ticker变量
          // 检查网格范围
          while (ticker.Last >= net[net.length - 1].price) {
              net.push({
                  buy : false,
                  sell : false,
                  price : net[net.length - 1].price + diff,
              })
          }
          while (ticker.Last <= net[0].price) {
              var price = net[0].price - diff
              if (price <= 0) {
                  break
              }
              net.unshift({
                  buy : false,
                  sell : false,
                  price : price,
              })
          }

          // 还有其它代码...
      }
  }

کوڈ جو گرڈ ڈیٹا ڈھانچے کو قابل توسیع بناتا ہے وہ یہ ہے (مذکورہ بالا کوڈ سے اقتباس):

        // 检查网格范围
        while (ticker.Last >= net[net.length - 1].price) {   // 如果价格超过网格最高价格的网格线
            net.push({                                       // 就在网格最高价格的网格线之后加入一个新的网格线
                buy : false,                                 // 初始化卖出标记
                sell : false,                                // 初始化买入标记
                price : net[net.length - 1].price + diff,    // 在之前最高价格的基础上再加一个网格间距
            })
        }
        while (ticker.Last <= net[0].price) {                // 如果价格低于网格最低价格的网格线
            var price = net[0].price - diff                  // 区别于向上添加,要注意向下添加新网格线的价格不能小于等于0,所以这里要判断
            if (price <= 0) {                                // 小于等于0就不添加了,跳出这层循环
                break
            }
            net.unshift({                                    // 就在网格最低价格的网格线之前添加一个新的网格线
                buy : false,
                sell : false,
                price : price,
            })
        }

اگلا مرحلہ اس بات پر غور کرنا ہے کہ ٹرانزیکشن ٹرگرنگ کو تفصیل سے کیسے نافذ کیا جائے۔

  var diff = 50
  var amount = 0.002       // 增加一个全局变量,也可以设计成参数,当然为了简便讲解,我们也写死在策略代码,
                           // 这个参数控制每次网格线上触发交易时的交易量
  function main() {
      var ticker = _C(exchange.GetTicker)
      var net = createNet(ticker.Last, diff)
      var preTicker = ticker       // 在主循环(死循环)开始前,设置一个变量,记录上一次的行情数据
      while (true) {
          ticker = _C(exchange.GetTicker)
          // 检查网格范围
          while (ticker.Last >= net[net.length - 1].price) {
              net.push({
                  buy : false,
                  sell : false,
                  price : net[net.length - 1].price + diff,
              })
          }
          while (ticker.Last <= net[0].price) {
              var price = net[0].price - diff
              if (price <= 0) {
                  break
              }
              net.unshift({
                  buy : false,
                  sell : false,
                  price : price,
              })
          }  

          // 检索网格
          for (var i = 0 ; i < net.length ; i++) {     // 遍历网格数据结构中的所有网格线
              var p = net[i]
              if (preTicker.Last < p.price && ticker.Last > p.price) {         // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
                  if (i != 0) {
                      var downP = net[i - 1]
                      if (downP.buy) {
                          exchange.Sell(-1, amount, ticker)
                          downP.buy = false 
                          p.sell = false 
                          continue
                      }
                  }
                  if (!p.sell && !p.buy) {
                      exchange.Sell(-1, amount, ticker)
                      p.sell = true
                  }
              } else if (preTicker.Last > p.price && ticker.Last < p.price) {  // 下穿,买入
                  if (i != net.length - 1) {
                      var upP = net[i + 1]
                      if (upP.sell) {
                          exchange.Buy(-1, amount * ticker.Last, ticker)
                          upP.sell = false 
                          p.buy = false 
                          continue
                      }
                  }
                  if (!p.buy && !p.sell) {
                      exchange.Buy(-1, amount * ticker.Last, ticker)
                      p.buy = true 
                  } 
              }
          }
          preTicker = ticker    // 把当前的行情数据记录在preTicker中,在下一次循环中,作为“上一次”行情数据和最新的对比,判断上穿下穿
          Sleep(500)
      }
  }  

آپ دیکھ سکتے ہیں:

  • گرڈ لائن کی حالت کو عبور کرنا:preTicker.Last < p.price && ticker.Last > p.price
  • گرڈ لائن کی حالت کو عبور کرنا:preTicker.Last > p.price && ticker.Last < p.price

یہ وہی ہے جس کے بارے میں ہم نے پچھلے مضمون میں بات کی تھی:

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

اوپر یا نیچے کراس کرنا اس بات کا تعین کرنے کا صرف پہلا قدم ہے کہ آیا کوئی تجارت رکھی جا سکتی ہے، جس کے لیے گرڈ لائن ڈیٹا میں نشانات کا تعین کرنے کی بھی ضرورت ہوتی ہے۔

اگر یہ اوپر کی طرف کراسنگ ہے، تو قیمت کو موجودہ گرڈ لائن سے کم سمجھا جاتا ہے اور قریب ترین گرڈ لائن پر خرید کے نشان کی قیمت درست ہے، اس کا مطلب ہے کہ پچھلی گرڈ لائن خرید لی گئی ہے۔ اور پچھلی گرڈ لائن ری سیٹ ہو گئی ہے روٹ کا خرید مارک غلط ہے، اور موجودہ گرڈ لائن کا سیل مارک غلط پر سیٹ کر دیا گیا ہے۔

پچھلی شرط کو جانچنے کے بعد، اگر یہ موجودہ گرڈ لائن پر خرید/فروخت کے نشانات دونوں غلط ہیں، تو اس کا مطلب یہ ہے کہ موجودہ گرڈ لائن کی تجارت کی جا سکتی ہے کیونکہ یہ اوپر کی طرف ہے۔ یہاں فروخت کے عمل کو انجام دیں، عمل درآمد کے بعد موجودہ گرڈ لائن سیل فلیگ کو سچ کے طور پر نشان زد کریں۔

انڈر پاسز کو ہینڈل کرنے کی منطق ایک ہی ہے (یہ نئے لوگوں کے لیے سوچنا چھوڑ دیا گیا ہے)۔

مکمل حکمت عملی بیک ٹیسٹنگ

کچھ بیک ٹیسٹنگ ڈیٹا دیکھنے کے لیے، ایک فنکشن لکھا جاتا ہے۔showTblڈیٹا ڈسپلے کریں۔

function showTbl(arr) {
    var tbl = {
        type : "table", 
        title : "网格",
        cols : ["网格信息"],
        rows : []
    }
    var arrReverse = arr.slice(0).reverse()
    _.each(arrReverse, function(ele) {
        var color = ""
        if (ele.buy) {
            color = "#FF0000"
        } else if (ele.sell) {
            color = "#00FF00"
        }
        tbl.rows.push([JSON.stringify(ele) + color])
    })
    LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}

مکمل حکمت عملی کوڈ:

/*backtest
start: 2021-04-01 22:00:00
end: 2021-05-22 00:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"OKEX","currency":"ETH_USDT","balance":100000}]
*/

var diff = 50
var amount = 0.002
function createNet(begin, diff) {
    var oneSideNums = 10
    var up = []
    var down = []
    for (var i = 0 ; i < oneSideNums ; i++) {
        var upObj = {
            buy : false,
            sell : false, 
            price : begin + diff / 2 + i * diff,
        }
        up.push(upObj)

        var j = (oneSideNums - 1) - i
        var downObj = {
            buy : false,
            sell : false,
            price : begin - diff / 2 - j * diff,
        }
        if (downObj.price <= 0) {  // 价格不能小于等于0 
            continue
        }
        down.push(downObj)
    }

    return down.concat(up)
}

function showTbl(arr) {
    var tbl = {
        type : "table", 
        title : "网格",
        cols : ["网格信息"],
        rows : []
    }
    var arrReverse = arr.slice(0).reverse()
    _.each(arrReverse, function(ele) {
        var color = ""
        if (ele.buy) {
            color = "#FF0000"
        } else if (ele.sell) {
            color = "#00FF00"
        }
        tbl.rows.push([JSON.stringify(ele) + color])
    })
    LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}

function main() {
    var ticker = _C(exchange.GetTicker)
    var net = createNet(ticker.Last, diff)
    var preTicker = ticker 
    while (true) {
        ticker = _C(exchange.GetTicker)
        // 检查网格范围
        while (ticker.Last >= net[net.length - 1].price) {
            net.push({
                buy : false,
                sell : false,
                price : net[net.length - 1].price + diff,
            })
        }
        while (ticker.Last <= net[0].price) {
            var price = net[0].price - diff
            if (price <= 0) {
                break
            }
            net.unshift({
                buy : false,
                sell : false,
                price : price,
            })
        }

        // 检索网格
        for (var i = 0 ; i < net.length ; i++) {
            var p = net[i]
            if (preTicker.Last < p.price && ticker.Last > p.price) {         // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
                if (i != 0) {
                    var downP = net[i - 1]
                    if (downP.buy) {
                        exchange.Sell(-1, amount, ticker)
                        downP.buy = false 
                        p.sell = false 
                        continue
                    }
                }
                if (!p.sell && !p.buy) {
                    exchange.Sell(-1, amount, ticker)
                    p.sell = true
                }
            } else if (preTicker.Last > p.price && ticker.Last < p.price) {  // 下穿,买入
                if (i != net.length - 1) {
                    var upP = net[i + 1]
                    if (upP.sell) {
                        exchange.Buy(-1, amount * ticker.Last, ticker)
                        upP.sell = false 
                        p.buy = false 
                        continue
                    }
                }
                if (!p.buy && !p.sell) {
                    exchange.Buy(-1, amount * ticker.Last, ticker)
                    p.buy = true 
                } 
            }
        }

        showTbl(net)
        preTicker = ticker 
        Sleep(500)
    }
}

حکمت عملی بیک ٹیسٹنگ:

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (V)

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