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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1303閲覧

Python 戻り値について

songyong

総合スコア21

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/04/23 02:16

編集2018/04/23 02:25

Python 初心者です。

先物自動売買ツールの作成に挑戦しています。

以下のメソッドは売買ロジックのうちの一つです。

あるポジションを持っている状態で、そのポジションの取得価格より、X円安い場合、損切を行います。

また、直近過去の最低値を一度下回り、そのあと、直近過去の最高値をy円上回ったときに、利確を行うというロジックなのですが、

直近過去の最低値を一度下回ったことを確認するpassedvallyをTrueにしたあとの戻り値で落ちてしまいます。

解決方法、または有効なロジックをご教示いただきたいです。

宜しくお願いいたします。

以下、エラーメッセージになります。

Traceback (most recent call last):
File "gajumaru3.py", line 513, in <module>
main()
File "gajumaru3.py", line 467, in main
vallypassed)
File "gajumaru3.py", line 188, in c_logic
return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed
UnboundLocalError: local variable 'settlementprice' referenced before assignment

Python

1def c_logic(curposition, curprice, curcoin, mountain, vally, pos_price, vallypassed): 2 if curposition == 'C': 3 if curprice <= pos_price - X: 4 settlementprice = settlement_buy(curprice, curcoin); 5 win_lose_flag = win_lose(curposition, curcoin, settlementprice, pos_price); 6 pl_state = calc_pl_state(curposition, curcoin, pos_price, settlementprice); 7 next_position = ctrl_logic(curposition, win_lose_flag); 8 curposition = next_position 9 nextcoin = ctrl_coin_logic(curcoin, win_lose_flag); 10 curcoin = nextcoin 11 pos_price = curprice 12 vallypassed = False 13 return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed 14 else: 15 pass 16 if vallypassed == False: 17 if curprice <= vally: 18 vallypassed = True 19 settlementprice = 0 20 pl_state = 0 21#ここで落ちる 22 return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed 23 #利確 24 elif vallypassed == True and curprice >= mountain + y: 25 settlementprice = settlement_buy(curcoin, curprice); 26 win_lose_flag = win_lose(curposition, curcoin, settlementprice, pos_price); 27 pl_state = calc_pl_state(curposition, curcoin, pos_price, settlementprice); 28 nextposition = ctrl_logic(curposition, win_lose_flag); 29 curposition = nextposition 30 nextcoin = ctrl_coin_logic(curcoin, win_lose_flag); 31 curcoin = nextcoin 32 pos_price = curprice 33 vallypassed = False 34 return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed 35 else: 36 settlementprice = 0 37 pl_state = 0 38 return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed 39 else: 40 pass

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

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

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

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

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

kazto

2018/04/23 02:21

「落ちる」と称する現象の詳細、スタックトレース、エラーメッセージなど追記できますでしょうか。
songyong

2018/04/23 02:26

失礼しました。エラーメッセージを追記しました。戻り値の不足?が原因という認識で、0を代入してみたのですが、上手くいきませんでした。宜しくお願いいたします。
guest

回答2

0

質問文のロジックに関していえば、if curposition == 'C':直下でsettlementpricepl_stateの初期化すれば、良い気がしますが。

Python

1if curposition == 'C': 2 settlementprice = 0 3 pl_state = 0 4 if curprice <= pos_price - X: 5 settlementprice = settlement_buy(curprice, curcoin); 6 #以下省略

あとif文のelseのpassが多いので、ifの条件を判定させreturnで抜ける形にしたほうifのネストが軽減されます。

投稿2018/04/23 02:47

umyu

総合スコア5846

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

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

0

ベストアンサー

Python

1if vallypassed == False: 2 if curprice <= vally: 3 vallypassed = True 4 settlementprice = 0 5 pl_state = 0
return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed

curprice <= vallyが成立しない際、settlementpriceが初期化されません。
例えば次のように、条件が偽の場合についても考慮する必要があります。

Python

1if vallypassed == False: 2 if curprice <= vally: 3 vallypassed = True 4 settlementprice = 0 5 pl_state = 0 6 else: 7 settlementpriceなどを適切に初期化 8 9 return curposition, curcoin, settlementprice, pos_price, pl_state, vallypassed

投稿2018/04/23 02:30

LouiS0616

総合スコア35660

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

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

songyong

2018/04/23 02:39

いつも迅速な回答、ありがとうございます。 偽の条件が抜けていたのですね。。 ありがとうございます。 今後ともご指導宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問