Ccxt: CEX - يبدو أن أوامر السوق تخلط المبلغ مع السعر

تم إنشاؤها على ١٤ نوفمبر ٢٠١٧  ·  43تعليقات  ·  مصدر: ccxt/ccxt

عندما أقوم بطلب سوق CEX بواسطة ccxt ، لنفترض أن 15 ETH لسعر السوق ، فسوف تشتري ETH بسعر إجمالي 15 دولارًا أمريكيًا.

bug

التعليق الأكثر فائدة

شكرا على الرد المفصل!

سأحاول تنفيذ هذه الفحوصات قبل إرسال الطلب وآمل أن ينجح.

lib عظيم ومجتمع مفيد جدا!

ال 43 كومينتر

janeCMD thx للإبلاغ عن هذا ،

janeCMD هل يمكنك من فضلك نشر التعليمات البرمجية الخاصة بك مع إخراج مطول منه؟

لست متأكدًا مما تقصده بالإخراج المطول ، ولكن هذا ما أفعله:

if($my_order["co_type"]=="buy"){
    $res=$exchange->createMarketBuyOrder ($my_order["co_pair"], $my_order["co_amount"]);
}else if($my_order["co_type"]=="sell"){
    $res=$exchange->createMarketSellOrder ($my_order["co_pair"], $my_order["co_amount"]);
}

janeCMD قبل القيام بذلك أضف:

$exchange->verbose = true;

ثم أعد تشغيل الكود الخاص بك وقم بنسخ ولصق الإخراج هنا ، بلز. شكرا!

سأفعل هذا لاحقًا اليوم أو غدًا. لدي مشكلة أخرى مع CEX ، هل يجب عليّ نشر مشكلة منفصلة (يعطي fetch_ohlcv خطأ: unjson غير موجود)؟

تضمين التغريدة

يجب أن أنشر قضية منفصلة

كلا ، شكرًا ، لقد رأيت بالفعل السبب هناك ، وسأصلح ذلك أيضًا!

janeCMD تم إصلاح fetchOHLCV لـ CEX في 1.10.102. سنكون شاكرين إذا أبلغت عما إذا كان يعمل من أجلك أم لا (كان ينبغي ، لقد جربناه محليًا).

kroitor الإصدار الذي تم تجربته 1.10.110 ، الآن لا يظهر خطأ ، لكن مجموعة OHLC التي تم إرجاعها فارغة (تعمل مع الآخرين الذين أستخدمهم). كود PHP المستخدم:

    $exchange = '\\ccxt\\cex';
    $exchange = new $exchange ();
    if ($exchange->hasFetchOHLCV){
        $ohlc = $exchange->fetch_ohlcv ($_GET["pair"], '1h');
    }
    print_r($ohlc);

janeCMD يمكنك الرجاء نشر إخراج مطول منه؟

        $exchange = '\\ccxt\\cex';
    $exchange = new $exchange (array ('vebose' => true));
    if ($exchange->hasFetchOHLCV){
        $ohlc = $exchange->fetch_ohlcv ($_GET["pair"], '1m');
    }
    print_r($ohlc);

لقد قمت للتو بتشغيل هذا البرنامج النصي وقد نجح معي:

<?php

include_once ('./ccxt.php');

$exchange = '\\ccxt\\cex';

$exchange = new $exchange ();
if ($exchange->hasFetchOHLCV){
    print_r ($exchange->timeframes);
    // cex supports 1m timeframes only
    $ohlc = $exchange->fetch_ohlcv ('BTC/USD', '1m');
    print_r($ohlc);
}

?>

هل تعمل من أجلك أيضًا؟ إذا كان الأمر كذلك ، يجب أن تظهر مخرجاتك المطولة أو تخبر ما بداخل $ _GET ['pair'] ...

mbp:ccxt igorkroitor$ node examples/js/symbols cex
Instantiating cex exchange (printSymbols @ symbols.js:24)
cex has 21 symbols: BCH/BTC, BCH/EUR, BCH/GBP, BCH/USD, BTC/EUR, BTC/GBP, BTC/RUB, BTC/USD, DASH/BTC, DASH/EUR, DASH/GBP, DASH/USD, ETH/BTC, ETH/EUR, ETH/GBP, ETH/USD, GHS/BTC, ZEC/BTC, ZEC/EUR, ZEC/GBP, ZEC/USD (printSymbols @ symbols.js:37)

limits          | precision       | maker | taker | id       | symbol   | base | quote | info           
--------------------------------------------------------------------------------------------------------
[object Object] | [object Object] | 0     | 0.002 | BCH/BTC  | BCH/BTC  | BCH  | BTC   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BCH/EUR  | BCH/EUR  | BCH  | EUR   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BCH/GBP  | BCH/GBP  | BCH  | GBP   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BCH/USD  | BCH/USD  | BCH  | USD   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BTC/EUR  | BTC/EUR  | BTC  | EUR   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BTC/GBP  | BTC/GBP  | BTC  | GBP   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BTC/RUB  | BTC/RUB  | BTC  | RUB   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | BTC/USD  | BTC/USD  | BTC  | USD   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | DASH/BTC | DASH/BTC | DASH | BTC   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | DASH/EUR | DASH/EUR | DASH | EUR   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | DASH/GBP | DASH/GBP | DASH | GBP   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | DASH/USD | DASH/USD | DASH | USD   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ETH/BTC  | ETH/BTC  | ETH  | BTC   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ETH/EUR  | ETH/EUR  | ETH  | EUR   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ETH/GBP  | ETH/GBP  | ETH  | GBP   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ETH/USD  | ETH/USD  | ETH  | USD   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | GHS/BTC  | GHS/BTC  | GHS  | BTC   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ZEC/BTC  | ZEC/BTC  | ZEC  | BTC   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ZEC/EUR  | ZEC/EUR  | ZEC  | EUR   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ZEC/GBP  | ZEC/GBP  | ZEC  | GBP   | [object Object]
[object Object] | [object Object] | 0     | 0.002 | ZEC/USD  | ZEC/USD  | ZEC  | USD   | [object Object] 

يجب عليك تمرير الرمز لجلب OHLCV ...

شكرًا لك على المساعدة Igor ، 1m تعمل ، الآن اكتشفت ذلك. كنت أختبر مع جميع الأجهزة الأخرى تقريبًا ليس فقط 1 مليون ، وكان الزوج ETH / USD ... ليس كبيرًا جدًا من واجهة برمجة تطبيقات OHLC ، ولكن سيتعين علي التعايش معها ...

janeCMD يمكنك بناء (حساب / دمج) أطر زمنية أعلى من 1m إطار زمني ، راجع للشغل. لكن هذا يتجاوز ccxt (في الوقت الحالي) ، سيتعين عليك تجميعها في كود userland ، حتى يكون لدينا هذه الطرق داخل المكتبة. بدلاً من ذلك ، يمكنك استخدام مكتبة إحصائية للقيام بذلك نيابةً عنك ، وهناك الكثير منها على GitHub. دعنا نعرف ما إذا كنت قد نجحت في تقديم طلب وإذا لم يعمل من أجلك ، من فضلك ، لا تنسى لصق إخراج مطول كامل. شكرا لملاحظاتك!

janeCMD هل لديك أي متابعة لأوامر CEX؟ إذا كان يعمل من أجلك ، فأنا أغلق هذه المشكلة. أخبرنا إذا كنت لا تزال تواجه صعوبات في ذلك. شكرا!

لم أذهب إليها أمس ، فقط أختبر الآن. يبدو أن المشكلة لا تزال موجودة ، وتتصرف كما كانت من قبل. يعطيني الإخراج المطول هذا (تم التحقق من الإصدار الأول مرتين ، لكن الإصدار الجديد الذي قمت بتنزيله لا يزال يعرض الإصدار القديم).

الطلب: Array ([0] => GET [1] => https://cex.io/api/currency_limits/ [2] => Array ([User-Agent] => ccxt / 1.9.282 (+ https: //github.com/ccxt-dev/ccxt) PHP / 5.5.38-1 ~ dotdeb + 7.1) [3] =>) الطلب: صفيف ([0] => POST [1] => https: // cex .io / api / place_order / ETH / USD / [2] => Array ([0] => نوع المحتوى: application / x-www-form-urlencoded [User-Agent] => ccxt / 1.9.282 (+ https://github.com/ccxt-dev/ccxt) PHP / 5.5.38-1 ~ dotdeb + 7.1) [3] => key = mzUsoSIXldBo1tZ4lHTp0BOyAHY & signature = F0C2EB3EE2C06B33B3D8F0A12B193AE74AAC40982019) نوع النظام = mzUsoSIXldBo1tZ4lHTp0BOyAHY & signature = F0C2EB3EE2C06B33B3D8F0A12B193AE74AAC40982019 : "Last RUN 23 seconds AGO"، "debug": "Arrayn (n [info] => Arrayn (n [error] => حدث خطأ أثناء تقديم طلبك: مبلغ غير صالح [آمن] => 1n) nn [ id] => n) n ---- "،" orders ": [{" 459 ": {" type ":" buy "،" price ":" 0 "،" pair ":" ETH / USD "، "المبلغ": "0.1"، "القاعدة": "immo market"، "exchange_id": ""، "msg": "ERROR on ADDING ORDER"}}]}

بالإضافة إلى ذلك ، كما ترى من معلومات تصحيح الأخطاء المطولة ، هناك استدعاء إضافي لـ currency_limits (load_markets). لقد تسبب لي هذا السلوك في الكثير من المشاكل وما زلت غير واضح كيفية حلها. يتم استدعاء load_markets داخليًا في جميع الأوقات تقريبًا ويسبب لي الحصول على أخطاء حماية DDOs. لدي ذاكرة تخزين مؤقت لهذا النوع من المكالمات ، ولكن هذه مكالمات داخلية بواسطة ccxt. هل سيكون من الممكن إضافة طريقة لتجاوز هذه الوظيفة دون الحاجة إلى إنشاء فئات فرعية منفصلة لكل تبادل؟ ما يمكنني فعله الآن هو إعادة كتابته في /php/base/Exchange.php للعمل مع نظام ذاكرة التخزين المؤقت ، ولكن من الواضح أن هذا ليس أفضل نهج.

تضمين التغريدة

بالإضافة إلى ذلك ، كما ترى من معلومات تصحيح الأخطاء المطولة ، هناك استدعاء إضافي لـ currency_limits (load_markets). لقد تسبب لي هذا السلوك في الكثير من المشاكل وما زلت غير واضح كيفية حلها. يتم استدعاء load_markets داخليًا في جميع الأوقات تقريبًا ويسبب لي الحصول على أخطاء حماية DDOs. لدي ذاكرة تخزين مؤقت لهذا النوع من المكالمات ، ولكن هذه مكالمات داخلية بواسطة ccxt. هل سيكون من الممكن إضافة طريقة لتجاوز هذه الوظيفة دون الحاجة إلى إنشاء فئات فرعية منفصلة لكل تبادل؟ ما يمكنني فعله الآن هو إعادة كتابته في /php/base/Exchange.php للعمل مع نظام ذاكرة التخزين المؤقت ، ولكن من الواضح أن هذا ليس أفضل نهج.

يتم إجراء المكالمة load_markets مرة واحدة فقط لكل عملية تبادل ، إذا لم يكن الأمر كذلك ، فيجب أن يكون هناك خطأ في مكان ما ، ولكن يتم تخزين الأسواق مؤقتًا بواسطة ccxt داخليًا عند استدعائك الأول لأي طريقة موحدة ، مثل create_order . لن يتم استدعاء load_markets في المكالمات اللاحقة إلى create_order ، فقط عند الاتصال الأول. هذه المعلومات مطلوبة من أجل القيام بالتحويلات. بدلاً من ذلك ، يمكنك تحميلها مسبقًا يدويًا عن طريق الاتصال بـ load_markets قبل الاتصال بـ create_order . تم شرح هذا الموضوع بالكامل في الدليل ، هنا: https://github.com/ccxt/ccxt/wiki/Manual#loading -markets ( أوصي بشدة بقراءة الدليل بالكامل ، فهناك الكثير من المعلومات المفيدة جدًا هناك) لذلك ، أعتقد أن CCXT تغطي بالفعل جميع أجزاء سؤالك (يمكنك أن تفعل ما تريد في الأسواق بالطريقة التي تريدها). أخبرنا إذا كان يعمل بشكل مختلف بالنسبة لك.

بالنسبة إلى الخطأ في الطلبات المفتوحة ، سأختبر على نطاق واسع ، شكرًا للإخراج! سوف نعود إليك في هذا الشأن.

أنت على حق ، "set_markets" هو بالضبط ما كنت أبحث عنه. شكرا لك على الدعم الرائع

لا تزال هناك ملاحظة واحدة بخصوص طلبات السوق. بعض البورصات لا تدعمها ، لكني بحاجة إلى إصدار أوامر السوق على أي حال. صنعت الوظيفة لذلك ، هل من المنطقي إضافة هذا النوع من المنطق إلى ccxt نفسها؟

function estimateMarketPrice($ob,$ordertype,$volume){
        $c_orders=$ob['bids'];
        if($ordertype=='buy'){
            $c_orders=$ob['asks'];
        }
        $totalvol=0;
        $est=0;
        foreach($c_orders as $order){
            $est=$order[0];
            $totalvol+=$order[1];
            if($totalvol > $volume * 1.5)
                break;
        }
        return $est;
    }
    function doMarketOrder($exchange,$my_order){
        $nomarket_orders=array('bittrex','cex');
        $res="";
        if(in_array($my_order["co_exchange"],$nomarket_orders)){
            $ob = $exchange->fetchOrderBook($my_order["co_pair"]);
            $est=estimateMarketPrice($ob,$my_order["co_type"],$my_order["co_amount"]);
            if($my_order["co_type"]=="buy"){
                $res=$exchange->createLimitBuyOrder ($my_order["co_pair"], $my_order["co_amount"],$est);
            }else if($my_order["co_type"]=="sell"){
                $res=$exchange->createLimitSellOrder ($my_order["co_pair"], $my_order["co_amount"],$est);
            }
            $res["exec_price"]=$est;
        }else{
            if($my_order["co_type"]=="buy"){
                $res=$exchange->createMarketBuyOrder ($my_order["co_pair"], $my_order["co_amount"]);
            }else if($my_order["co_type"]=="sell"){
                $res=$exchange->createMarketSellOrder ($my_order["co_pair"], $my_order["co_amount"]);
            }
        }
        return $res;
    }

janeCMD ليس حقًا ، لأنه خاص بالاستخدام ، على سبيل المثال التقدير * 1.5 ، ولا يأخذ الرسوم في الاعتبار ، يجب أن يكون أكثر تعقيدًا من ذلك ، ويعتمد في الواقع على العديد من العوامل التي لم يتم أخذها في الاعتبار في ما سبق رمز ، لذلك ، أود أن أقول ، سنحتفظ بذلك في userland في الوقت الحالي ، لأن العديد من المستخدمين يحتاجون إلى العمل بطرق مختلفة.

فقط أريد العودة إلى OHLC. المشكلة هي أن هذا الاستدعاء في ccxt يُرجع بيانات OHLC من اليوم السابق. أفضل بديل لـ OHLC الحالي على CEX هو واجهة برمجة التطبيقات هذه: https://cex.io/api/price_stats/BTC/USD. تسمح هذه المكالمة بالبدء / الإغلاق ، وربما تقترب أيضًا من ارتفاع / انخفاض القيم الحقيقية إذا تم استخدام دقة كافية. لذلك ... يجب عليك على الأرجح ضبط CEX على عدم تقديم OHLC ، أو الحصول على طريقة OHLC التي وصفتها ، أو الحصول عليها من جهة خارجية ، مثل https://www.cryptocompare.com/api/ ويجب أن يكون هناك طرق أخرى

janeCMD سأبحث في الأمر ، قد يكون التحويل الزمني البسيط مفقودًا في مكان ما. سوف أعلمك عن نتائجي.

kroitor لدي نفس المشكلة مع أوامر الشراء من السوق في CEX ، انظر هذا المثال:

const orderResponse = await cex.createMarketBuyOrder('ETH/BTC', 0.011111);

أفهم ، مثل البورصات الأخرى ، أنني أريد شراء 0.011111 ETH بأمر سوق ، صحيح ، ولكن هذا ما أحصل عليه:

> cex POST https://cex.io/api/place_order/ETH/BTC/
Request:
 { 'User-Agent': 'ccxt/1.9.192 (+https://github.com/ccxt-dev/ccxt) Node.js/8.9.0 (JavaScript)',
  'Content-Type': 'application/x-www-form-urlencoded' } key=x&signature=x&nonce=1511853166&type=buy&amount=0.011111&order_type=market
cex POST https://cex.io/api/place_order/ETH/BTC/
Response:
{"id":"5086305365","message":"Your order has been completed. Bought 0.22983200 ETH for 0.01111096 BTC","symbol1Amount":"229832","symbol2Amount":"1111096","time":1511853166339,"type":"buy"}

اشتريت ETH مقابل BTC بقيمة 0.011111 ....

يبدو أن التحقق من الكود يمثل مشكلة في خلط cex بين الحجم والمبلغ ، لأن أوامر البيع في السوق تعمل كما هو متوقع (تبيع بالفعل حجم ETH) ، على أي حال أعتقد أن ccxt يجب أن يكون الحل (إن أمكن) لتتمكن من استخدام أسواق cex الطلبات بطريقة موحدة.

شكر

شكرًا على التعليقات التفصيلية jgordor ! أنا أعمل على هذا ، وسوف أقوم بتحميل الإصلاح ، وآمل ، قريبًا جدًا. سنقوم بتحديثك هنا عندما يتم حل هذا ، بالطبع.

حسنًا ، تم إصلاح هذه المشكلة الآن.

لسوء الحظ ، يتطلب CEX.io مبلغ عملة التسعير لإنفاقه على أوامر الشراء في السوق. هذا صحيح بالنسبة للشراء من السوق فقط ، بالنسبة لبيع السوق ، يحدد المبلغ مقدار العملة الأساسية (التشفير) المراد بيعها.

لذلك ، لوضع أمر شراء من السوق على CEX.io ، سيتعين عليك الاتصال بـ createOrder (symbol, 'market', 'buy', amount, price) مع تقديم كل من المبلغ والسعر ، حتى تتمكن ccxt من حساب تكلفة الأمر المناسبة. وإلا فإنه سوف يطرح استثناء. نعتقد أن هذا الآن أفضل من شراء مبلغ خاطئ بصمت ، كما كان الحال من قبل.

أخبرنا إذا كنت لا تزال تواجه صعوبات في التعامل معها بعد التحديث إلى 1.10.239+. شكرا لك!

شكرًا لك @ kroitor ، سأختبر وأبلغك إذا واجهت أي مشاكل

مرحبًا ، لقد رأيت للتو هذا الموضوع وواجهت نفس المشكلة. إذا طلب مني CEX.IO تحديد السعر ، فكيف يكون هذا أمر السوق إذن؟

تضمين التغريدة

كيف يكون هذا أمر السوق إذن؟

بالمنطق الخالص. لا يتم إرسال هذا السعر إلى البورصة ويتم استخدامه لحساب تكلفة الأمر (المبلغ * السعر) ، وهو المبلغ الذي تريد إنفاقه مع أمر السوق. المبلغ المراد إنفاقه الناتج هو القيمة التي يتم إرسالها نحو التبادل. لذلك ، يمكنك اختيار أي سعر تريده لمطابقة التكلفة الإجمالية بالمبلغ الذي تريده. فكر في تكلفة الأمر (المبلغ المراد إنفاقه) على أنها شيء ثابت ، وفكر في المبلغ والسعر على أنهما قيم غير ثابتة يمكنك تعديلها.

مثال: تريد شراء أكبر قدر ممكن من BTC بتكلفة 100 دولار - يمكنك اختيار مبلغ 1 وسعر 100 دولار ، أو مبلغ 5 وسعر 20 دولارًا ... ستمنحك البورصة أكبر قدر من BTC بقدر الإمكان بتكلفة إجمالية قدرها 100 دولار على أي حال بأفضل سعر متاح في السوق.

بدلاً من ذلك ، يمكننا أن نجعل بعض البورصات تعامل amount أنها cost مع أنواع أوامر وجوانب معينة ، ولكن هذا من شأنه أن يؤدي إلى ارتباك أكثر بكثير من طلب مضاعف إضافي (السعر) لعمليات الشراء في السوق مع بعض التبادلات. سينتهي بك الأمر فجأة إلى شراء كميات غريبة من التوكنات إذا كنت لا تعرف تفاصيل كل تبادل معين.

شكرا kroitor ، نقدر الإجابة.
رغم أنني في حالتي أرغب في شراء مبلغ ثابت وأنا أكثر مرونة من حيث التكلفة. أعتقد أنه لا توجد طريقة بالنسبة لي للقيام بذلك؟

eranartzi مع هذا التبادل ، أخشى أن التبادل نفسه يفرض عليك الطبيعة الثابتة للتكلفة (المبلغ المطلوب إنفاقه).

تعذر استخدام وظيفة createMarketBuyOrder () لوضع أمر marketBuy. أتفهم أنه يمكن القيام بذلك عن طريق createOrder (symbol, 'market', 'buy', amount, price)
لكن يجب أن يوحد ccxt استخدام الوظيفة. لدى coinex و huobipro أيضًا هذه المشكلة ولكن يمكنني مضاعفة السعر بالمبلغ ووضع أمر شراء في السوق في تلك التبادلات.
يرجى الحصول على هذه الميزة لتعيين options['createMarketBuyOrderRequiresPrice'] = false

@ kroitor مسكتك ، شكرا!
بالمناسبة ، بيثون ليب العظيم!

azharuniverse ، نحن نعمل بجد لإضافة طريقة قاعدة موحدة لها في أسرع وقت ممكن ، ونتوقع رؤيتها في أحد الإصدارات القادمة.

مرحبا!
هل هناك شيء جديد مع هذه المشكلة؟

لقد قمت ببيع طلب سوق CEX بدون أي مشكلة ولكن عندما أحاول شراء السوق يقول: "مبلغ غير صالح"
لقد جربت بالسعر وبدون وعملت أيضًا .options ['createMarketBuyOrderRequiresPrice'] = خطأ

هذا هو الطلب الذي أرسلته:
order_1 = e.createOrder(symbol=['BTC/GBP'], type='market', side='buy', amount=0.002, price=2900.5)

الخطأ الذي حصل عليه Iv'e:

Traceback (most recent call last): File "<input>", line 5, in <module> File "C:\Users\LENOVO\AppData\Local\Programs\Python\Python36\lib\site-packages\ccxt\cex.py", line 336, in create_order response = self.privatePostPlaceOrderPair(self.extend(request, params)) File "C:\Users\LENOVO\AppData\Local\Programs\Python\Python36\lib\site-packages\ccxt\cex.py", line 499, in request raise ExchangeError(self.id + ' ' + self.json(response)) ccxt.base.errors.ExchangeError: cex {"error":"There was an error while placing your order: Invalid amount","safe":true}

هذا هو الطلب الذي أرسلته:
order_1 = e.createOrder (الرمز = ['BTC / GBP'] ، اكتب = 'market' ، الجانب = 'buy' ، المبلغ = 0.002 ، السعر = 2900.5)

هذه ليست طريقة صحيحة لإرسال الطلب ، فالرمز ليس قائمة ، في الواقع ...

نحتاج منك لصق بعض المقتطفات القصيرة من التعليمات البرمجية (5-20 سطرًا) لإعادة إنتاجها وكذلك لصق طلبك / الاستجابة المطولة بدون مفاتيحك ، فحاول اتباع هذه الأدلة بدقة قدر الإمكان:

# how you init the exchange...
e = ccxt.cex ({ ... })  # what's here (hide your keys)
print(ccxt.__version__)  # what's the number
e.load_markets()  # preload them just in case
e.verbose = True  # set verbose mode on
order_1 = e.create_order('BTC/GBP', 'market', 'buy', 0.002, 2900.5)
print(order_1)
# ...

اسف على الجواب المتاخر...
أنا أستخدم ccxt 1.18.11 في python 3.6 في بورصة CEX.

الكود الخاص ببدء كائن التبادل:

def initialize_exchange (exchange_id = 'cex'، enableRateLimit = True):
## intiate فئة api لإرسالها إلى الوظيفة
exchange_class = getattr (ccxt، exchange_id)
api_key = cexKey1 ['api_key']
api_secret = cexKey1 ['api_secret']
exchange = exchange_class ({
"apiKey": api_key،
"السر": api_secret،
"uid": "،
"المهلة": 30000 ،
'enableRateLimit': enableRateLimit ،
})
تبادل العودة

هذا هو الكود الذي نفذته:

e = initialize_exchange ()
e.verbose = صحيح
order_1 = e.createOrder (الرمز = "BTC / EUR" ،
type = 'market' ،
الجانب = 'شراء' ،
الكمية = 0.002 ،
السعر = 1)

الطلب والرد:

طلب:

انشر https://cex.io/api/place_order/BTC/EUR/ {'Content-Type': 'application / x-www-form-urlencoded'، 'User-Agent': 'python-applications / 2.18.4 '،' Accept-Encoding ':' gzip، deflate '} key = & signature = & nonce = 1544551761766 & type = buy & amount = 0.002 & order_type = market

الرد:

انشر https://cex.io/api/place_order/BTC/EUR/ 200 {'Date': 'Tue، 11 Dec 2018 18:09:21 GMT'، 'Content-Type': 'text / json'، ' ترميز التحويل ':' chunked '،' Connection ':' keep-live '،' Set-Cookie ':' __cfduid = db61998cb4fbd094c2fdf9ad98cf364ad1544551761 ؛ تنتهي الصلاحية = الأربعاء ، 11-ديسمبر -19 18:09:21 GMT ؛ المسار = / ؛ المجال = .cex.io ؛ HttpOnly '،' Content-Security-Policy-Report-Only ': "default-src' self" ؛ connect-src 'self' https://maps.googleapis.com https://cex.io wss: // ws .cex.io / ws؛ frame-src 'self' * ext.cex.io؛ font-src 'self' data: 'unsafe-inline' https://fonts.googleapis.com https: //fonts.gstatic. com؛ img-src 'self' data:؛ style-src 'self' 'unsafe-inline' https: //*.googleapis.com https: //code.jquery.com؛ script-src 'self' unsafe- مضمنة "غير آمنة-Eval '؛ report-uri https://cex.io/cspr؛ "،' X-Frame-Options ':' DENY '،' Vary ':' Accept-Encoding '،' Expect-CT ' : 'max-age = 604800، report-uri = " https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct "'، 'Server': 'cloudflare'، 'CF-RAY' : '4879e6de0f8364ed-FRA'} {"خطأ": "حدث خطأ أثناء تقديم طلبك: مبلغ غير صالح" ، "آمن": صحيح}
"

لا أفهم ما هو الخطأ ...

شكر!

ASAllon عليك حساب جميع الحدود الخاصة برمز التداول المعين هذا ، وهذا موضح هنا:

أولاً ، عليك أن تفهم المصطلحات بدقة شديدة:

  • base العملة التي تشتريها أو تبيعها ( BTC في حالتك)
  • quote هي العملة التي تشتريها أو تبيعها ( EUR في حالتك)
  • amount - المبلغ الذي تشتريه أو تبيعه ، والمبلغ دائمًا وفقًا للعملة الأساسية ( 0.002 BTC )
  • price - هو سعر وحدة واحدة (أو لوت ) من المبلغ ، يكون السعر دائمًا من حيث عملة التسعير ( 1 EUR )
  • cost - هو amount * price ، وهو دائمًا من حيث عملة التسعير (أيضًا بـ EUR )

بالنسبة لعمليات الشراء في السوق ، تتطلب CEX من المستخدم تحديد التكلفة الإجمالية للطلب ، بدلاً من المبلغ ، لذلك يُطلب من المستخدم price (أي ما يعادل 1 في حالتك) لحساب cost = amount * price . يتم إرسال هذه القيمة إلى CEX في طلبك كما ترون من الطلب / الاستجابة المطولة. ومع ذلك ، إذا نظرت بعناية إلى حدود سوق BTC/EUR لـ CEX ، ستلاحظ ما يلي:

mbp:python igorkroitor$ python3
Python 3.6.2 (v3.6.2:5fd33b5926, Jul 16 2017, 20:11:06)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import ccxt
>>> from pprint import pprint
>>> exchange = ccxt.cex({'enableRateLimit': True})
>>> markets = exchange.load_markets()
>>> pprint(markets['BTC/EUR'])
{'base': 'BTC',
 'fee_loaded': False,
 'id': 'BTC/EUR',
 'info': {'maxLotSize': 30,
          'maxPrice': '35000',
          'minLotSize': 0.002,
          'minLotSizeS2': 20,
          'minPrice': '1500',
          'symbol1': 'BTC',
          'symbol2': 'EUR'},
 'limits': {'amount': {'max': 30, 'min': 0.002},
            'cost': {'max': None, 'min': 20},  # ←------------------ min cost is 20
            'price': {'max': 35000.0, 'min': 1500.0}},
 'maker': 0.0016,
 'percentage': True,
 'precision': {'amount': 3, 'price': 0},
 'quote': 'EUR',
 'symbol': 'BTC/EUR',
 'taker': 0.0025}
>>>

في حالتك ، القيم هي:

  • القاعدة: BTC
  • اقتباس: EUR
  • المبلغ: 0.002 BTC
  • السعر: 1 يورو
  • التكلفة = 0.002 * 1 = 0.002 وهو أقل من الحد الأدنى للتكلفة المطلوبة من قبل CEX لعمليات الشراء في السوق. يجب أن يكون أكبر من 20 يورو.

بعبارة أخرى ، فإن مفتاح العمل بكفاءة مع البورصة هو الاهتمام الشديد بالكثير من التفاصيل. اسمحوا لي أن أعرف إذا كان هذا لا يجيب على سؤالك.

شكرا على الرد المفصل!

سأحاول تنفيذ هذه الفحوصات قبل إرسال الطلب وآمل أن ينجح.

lib عظيم ومجتمع مفيد جدا!

حاولت مرة أخرى بتكلفة أكبر من 20 يورو وما زلت أقول إن هناك مبلغًا غير صالح.

الشفرة:

order_1 = e.createOrder (الرمز = "BTC / EUR" ،
type = 'market' ،
الجانب = 'شراء' ،
المبلغ = 0.0066 ،
السعر = 3050)

الطلب: POST https://cex.io/api/place_order/BTC/EUR/ {'Content-Type': 'application / x-www-form-urlencoded'، 'User-Agent': 'python-applications / 2.18 .4 '،' Accept-Encoding ':' gzip، deflate '} key = & signature = & nonce = ** & type = buy & amount = 0.0066 & order_type = market

الرد: POST https://cex.io/api/place_order/BTC/EUR/ 200 {'Date': 'Tue، 11 Dec 2018 20:44:55 GMT'، 'Content-Type': 'text / json' ، 'ترميز النقل': 'chunked'، 'Connection': 'keep-live'، 'Set-Cookie': '__cfduid = المسار = / ؛ HttpOnly '،' Content-Security-Policy-Report-Only ': "default-src' self" ؛ connect-src 'self' https://maps.googleapis.com https://cex.io wss: // ws .cex.io / ws؛ frame-src 'self' * ext.cex.io؛ font-src 'self' data: 'unsafe-inline' https://fonts.googleapis.com https: //fonts.gstatic. com؛ img-src 'self' data style-src 'self' 'unsafe-inline' https: // .googleapis.com https: //code.jquery.com؛ script-src 'self' 'unsafe-inline "غير آمن"؛ report-uri https://cex.io/cspr؛ "،" X-Frame-Options ":" DENY "،" Vary ":" Accept-Encoding "،" Expect-CT ": 'max-age = 604800، report-uri = " https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct "'، 'Server': 'cloudflare'، 'CF-RAY': '487acab11be264e7-FRA'} {"خطأ": "حدث خطأ أثناء تقديم طلبك: مبلغ غير صالح" ، "آمن": صحيح}

ما هو الخطأ الآن؟

ما هو الخطأ الآن؟

لسبب ما ، لم يتم ضربه بالسعر وما زال في الطلب ...&amount=0.0066&... حيث كان يجب أن يكون ...&amount=20.13&... (0.0066 * 3050)

هل أنت متأكد من أنك تستخدم الإصدار 1.18.11؟ أقترح أن نتحقق من إصدار وقت التشغيل عن طريق تشغيل ما يلي في بيئتك:

import ccxt
print(ccxt.__version__)

لسوء الحظ ، لا تعرض النقطة دائمًا الإصدار الفعلي ، إذا كان لديك إصدارات متعددة من Python أو شيء من هذا القبيل ... إذا كانت تظهر 1.18+ في وقت التشغيل ، فسيتعين علي تصحيحها أكثر. ما هو رقمك؟

لقد أعدم وحصلت:

طباعة (ccxt .__ نسخة _)
1.18.11

ASAllon هل create_order ؟

هذا ما أراه في الإصدار الحالي:

mbp:ccxt igorkroitor$ python examples/py/cli.py cex create_order BTC/EUR market buy 0.0066 3050 --verbose
('\nRequest:', 'POST', 'https://cex.io/api/place_order/BTC/EUR/', {'Content-Type': 'application/x-www-form-urlencoded', 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'python-requests/2.18.4'}, 'nonce=1544562371252&amount=20.13&order_type=market&key=EK6TaiS68n4rhfu4hEhb1Enkws&signature=50A91D8F135C51F3F3BD2AF4ED77A4979CC39DDE5C6AC140D81933D39411D5CE&type=buy')

'nonce=1544562371252&amount=20.13&order_type=market

↑ المبلغ 20.13 مع هذا الكود:

import ccxt
from pprint import pprint
pprint('CCXT VERSION:', ccxt.__version__)
exchange = ccxt.cex({
    'enableRateLimit': True,  # required by the Manual
    'apiKey': 'YOUR_API_KEY',  # ←----------------------- put your credentials here
    'secret': 'YOUR_SECRET',
})
exchange.load_markets()
exchange.verbose = True
order = exchange.create_order('BTC/EUR', 'market', 'buy', 0.0066, 3050)
pprint(order)

هل ما زالت تحاول إرسال مبلغ 0.0066 بهذه الطريقة؟

لقد أجريت ترقيات للإصدار 1.18.21 وقمت بعمل الكود كما قلت وعملت!

شكرا جزيلا!!

مرة أخرى شكرا للجميع !!

حافظ على العمل الرائع!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات