質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bitFlyer API

bitFlyer APIは、仮想通貨取引所bitFlyerが公開しているAIPツール。bitFlyer Lightning/API playground/chainFlyer/Echoの4種類あり、bitFlyerソフトをカスタマイズすることが可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Bitcoin

Bitcoinは、インターネット上で流通している電子マネーです。P2Pネットワークを通じた安価な決済コストが実現できる一方、取引時の危険性や闇市場・資金洗浄など不正取引の温床といった法的問題も抱えています。

Q&A

0回答

477閲覧

node.jsアプリがコマンドプロンプトから起動しない。

monolith_91

総合スコア18

bitFlyer API

bitFlyer APIは、仮想通貨取引所bitFlyerが公開しているAIPツール。bitFlyer Lightning/API playground/chainFlyer/Echoの4種類あり、bitFlyerソフトをカスタマイズすることが可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Bitcoin

Bitcoinは、インターネット上で流通している電子マネーです。P2Pネットワークを通じた安価な決済コストが実現できる一方、取引時の危険性や闇市場・資金洗浄など不正取引の温床といった法的問題も抱えています。

0グッド

1クリップ

投稿2022/09/11 11:44

編集2022/09/19 10:47

前提

ここ何年かBitcoin等の仮想通貨の取引が盛んになってきています。私は、「日給300万円のSS級トレーダーが明かす botterのリアル」という本を読んで、仮想通貨をBot(一定のタスクや処理を自動化するためのアプリケーション)により、仮想通貨を取引する取引所へAPIを通じて、過去の取引のデータを収集しSQLight等のDBに格納したり、売買注文をAPIを通じて発注するプログラム(Bot)を作ろうとしています。

ただし、私は日曜プログラマーで趣味でプログラムをかじっている程度なので設計のノウハウ等を持っておらず、0から作る能力がないので、既存のオープンソースでのフレームワークを探して、コードを分析して別言語に移植したりカスタマイズしたりしたいと考えておりました。

そこで、日本産でオープンソースで良いものが無かったので、海外産で評価の高い「Gekko」というnode.jsで書かれたフレームワークを使うことにしました。

■Gekkoの公式サイト
https://note.com/tonacoin/n/n2fbe86f96fa2
■日本語の紹介サイト
https://note.com/tonacoin/n/n2fbe86f96fa2

私の環境はWin10 Proなので、上記の日本語の紹介サイトを参考に(Githubのリンクが切れていたり等があったので適宜手順を修正し)下記を実施しました。

【Gekkoインストール・実行手順】
①node.js をインストール https://nodejs.org/ja/
② GekkoをGitHub https://github.com/askmike/gekko からダウンロードし適当なフォルダに配置(私はDownloadフォルダ)
③ターミナルから下記のコマンドを実行
$ cd C:\Users***\Downloads\gekko-develop(***はユーザ名)
$ npm install
④本来なら、ここで下記コマンドを実行すると、
$ node gekko --ui
Webブラウザから「 http://localhost:3000/#/home 」にてサービスにアクセス可能となる筈ですが、
「ERROR: Cannot find the specified config file.」とエラーが出ます。

ソースコードを追いかけると、解凍した「gekko-develop」フォルダ内の「gekko.js」スクリプトの47行目の「const config = util.getConfig();」でコケているようです。なお、「util」は「gekko.js」スクリプトの35行目の「const util = require(__dirname + '/core/util');」でモジュールの読み込みを実行しています。

対象の「gekko-develop/core/util.js」を読むと、更にここの行20~行26行目でコケているように見えることが分かりました。
「program.config」というオブジェクトが見つからず、「'Please specify a config file.'」というメッセージを発しているようです。
なお、programは本「util.js」の6行目の「var program = require('commander');」で読み込んだモジュールで、
「commander」はコマンドライン引数をハッシュとして格納する機能を持っているようなので、コンフィグファイルをコマンドラインで指定して実行してみましたが全く巧くいかないため途方に暮れています。「util.js」の173行の指定に従って実行したのですが…。

program
.version(util.logVersion())
.option('-c, --config <file>', 'Config file')

実際に実行したコマンドは「試したこと」に載せます。

実現したいこと

コンフィグファイルを指定して、gekkoをUI付きで起動したい。

発生している問題・エラーメッセージ

/ \ / |/ | / |/ | / | / \ /$$$$$$ |$$$$$$$$/ $$ | /$$/ $$ | /$$/ /$$$$$$ | $$ | _$$/ $$ |__ $$ |/$$/ $$ |/$$/ $$ | $$ | $$ |/ |$$ | $$ $$< $$ $$< $$ | $$ | $$ |$$$$ |$$$$$/ $$$$$ \ $$$$$ \ $$ | $$ | $$ \__$$ |$$ |_____ $$ |$$ \ $$ |$$ \ $$ \__$$ | $$ $$/ $$ |$$ | $$ |$$ | $$ |$$ $$/ $$$$$$/ $$$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$/ Gekko v0.6.8 I'm gonna make you rich, Bud Fox. ERROR: Cannot find the specified config file.

該当のソースコード

// GitHub https://github.com/askmike/gekko より抜粋 /**********************gekko.js****************************/ console.log(` ______ ________ __ __ __ __ ______ / \\ / |/ | / |/ | / | / \\ /$$$$$$ |$$$$$$$$/ $$ | /$$/ $$ | /$$/ /$$$$$$ | $$ | _$$/ $$ |__ $$ |/$$/ $$ |/$$/ $$ | $$ | $$ |/ |$$ | $$ $$< $$ $$< $$ | $$ | $$ |$$$$ |$$$$$/ $$$$$ \\ $$$$$ \\ $$ | $$ | $$ \\__$$ |$$ |_____ $$ |$$ \\ $$ |$$ \\ $$ \\__$$ | $$ $$/ $$ |$$ | $$ |$$ | $$ |$$ $$/ $$$$$$/ $$$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$/ `); const util = require(__dirname + '/core/util'); console.log('\tGekko v' + util.getVersion()); console.log('\tI\'m gonna make you rich, Bud Fox.', '\n\n'); const dirs = util.dirs(); if(util.launchUI()) { return require(util.dirs().web + 'server'); } const pipeline = require(dirs.core + 'pipeline'); const config = util.getConfig(); const mode = util.gekkoMode(); if( config.trader && config.trader.enabled && !config['I understand that Gekko only automates MY OWN trading strategies'] ) util.die('Do you understand what Gekko will do with your money? Read this first:\n\nhttps://github.com/askmike/gekko/issues/201'); // > Ever wonder why fund managers can't beat the S&P 500? // > 'Cause they're sheep, and sheep get slaughtered. pipeline({ config: config, mode: mode }); /**********************gekko.js****************************/ var moment = require('moment'); var _ = require('lodash'); var path = require('path'); var fs = require('fs'); var semver = require('semver'); var program = require('commander'); var startTime = moment(); var _config = false; var _package = false; var _nodeVersion = false; var _gekkoMode = false; var _gekkoEnv = false; var _args = false; // helper functions var util = { getConfig: function() { // cache if(_config) return _config; if(!program.config) util.die('Please specify a config file.', true); if(!fs.existsSync(util.dirs().gekko + program.config)) util.die('Cannot find the specified config file.', true); _config = require(util.dirs().gekko + program.config); return _config; }, // overwrite the whole config setConfig: function(config) { _config = config; }, setConfigProperty: function(parent, key, value) { if(parent) _config[parent][key] = value; else _config[key] = value; }, getVersion: function() { return util.getPackage().version; }, getPackage: function() { if(_package) return _package; _package = JSON.parse( fs.readFileSync(__dirname + '/../package.json', 'utf8') ); return _package; }, getRequiredNodeVersion: function() { return util.getPackage().engines.node; }, recentNode: function() { var required = util.getRequiredNodeVersion(); return semver.satisfies(process.version, required); }, // check if two moments are corresponding // to the same time equals: function(a, b) { return !(a < b || a > b) }, minToMs: function(min) { return min * 60 * 1000; }, defer: function(fn) { return function(args) { var args = _.toArray(arguments); return _.defer(function() { fn.apply(this, args) }); } }, logVersion: function() { return `Gekko version: v${util.getVersion()}` + `\nNodejs version: ${process.version}`; }, die: function(m, soft) { if(_gekkoEnv === 'child-process') { return process.send({type: 'error', error: '\n ERROR: ' + m + '\n'}); } var log = console.log.bind(console); if(m) { if(soft) { log('\n ERROR: ' + m + '\n\n'); } else { log(`\nGekko encountered an error and can\'t continue`); log('\nError:\n'); log(m, '\n\n'); log('\nMeta debug info:\n'); log(util.logVersion()); log(''); } } process.exit(1); }, dirs: function() { var ROOT = __dirname + '/../'; return { gekko: ROOT, core: ROOT + 'core/', markets: ROOT + 'core/markets/', exchanges: ROOT + 'exchange/wrappers/', plugins: ROOT + 'plugins/', methods: ROOT + 'strategies/', indicators: ROOT + 'strategies/indicators/', budfox: ROOT + 'core/budfox/', importers: ROOT + 'importers/exchanges/', tools: ROOT + 'core/tools/', workers: ROOT + 'core/workers/', web: ROOT + 'web/', config: ROOT + 'config/', broker: ROOT + 'exchange/' } }, inherit: function(dest, source) { require('util').inherits( dest, source ); }, makeEventEmitter: function(dest) { util.inherit(dest, require('events').EventEmitter); }, setGekkoMode: function(mode) { _gekkoMode = mode; }, gekkoMode: function() { if(_gekkoMode) return _gekkoMode; if(program['import']) return 'importer'; else if(program.backtest) return 'backtest'; else return 'realtime'; }, gekkoModes: function() { return [ 'importer', 'backtest', 'realtime' ] }, setGekkoEnv: function(env) { _gekkoEnv = env; }, gekkoEnv: function() { return _gekkoEnv || 'standalone'; }, launchUI: function() { if(program['ui']) return true; else return false; }, getStartTime: function() { return startTime; }, } // NOTE: those options are only used // in stand alone mode program .version(util.logVersion()) .option('-c, --config <file>', 'Config file') .option('-b, --backtest', 'backtesting mode') .option('-i, --import', 'importer mode') .option('--ui', 'launch a web UI') .parse(process.argv); // make sure the current node version is recent enough if(!util.recentNode()) util.die([ 'Your local version of Node.js is too old. ', 'You have ', process.version, ' and you need atleast ', util.getRequiredNodeVersion() ].join(''), true); module.exports = util

試したこと

■コマンドプロンプトより下記コマンドを実行
$ node gekko ui -c sample-config.js
$ node gekko ui --config sample-config.js
$ node gekko ui -c C:\Users*\Downloads\gekko-develop\sample-config.js
$ node gekko ui --config C:\Users*
\Downloads\gekko-develop\sample-config.js

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
Node.jsのバージョン:16.14.2
OSのバージョン:Win10 Pro 21H2 64bitOS

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2022/09/12 03:56

> $ node gekko ui --config C:\Users*\Downloads\gekko-develop\sample-config.js このUsersからDownloadsの間の*で省略された箇所、 このユーザー名は日本語等のマルチバイト文字ですか? コマンドプロンプトを使っている場合、利用するのはShift_JIS Node.jsはUTF-8でファイルを呼び出す時にパスの一部が文字化けしていて上手くアクセス出来ていない可能性があります。 WSLで仮想Linuxマシンを立ち上げてその中で実行したり、 マイドキュメントではなく、Cドライブ直下にprojects/gekko-developみたいなフォルダを作成してその中でやってみたりしてみてください。
monolith_91

2022/09/19 01:47

忙しくて返信が遅くなり申し訳ありません。 私のユーザーフォルダは、マルチバイト文字ではありません。 面倒ですが、仰る通り仮想マシン等でも試してみます。 どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問