| Conditions | 15 |
| Total Lines | 226 |
| Lines | 0 |
| Ratio | 0 % |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like tests.finance.SlippageTestCase.test_orders_stop_limit() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
| 1 | # |
||
| 509 | def test_orders_stop_limit(self): |
||
| 510 | slippage_model = VolumeShareSlippage() |
||
| 511 | slippage_model.data_portal = self.data_portal |
||
| 512 | |||
| 513 | # long, does not trade |
||
| 514 | open_orders = [ |
||
| 515 | Order(**{ |
||
| 516 | 'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc), |
||
| 517 | 'amount': 100, |
||
| 518 | 'filled': 0, |
||
| 519 | 'sid': 133, |
||
| 520 | 'stop': 4.0, |
||
| 521 | 'limit': 3.0}) |
||
| 522 | ] |
||
| 523 | |||
| 524 | bar_data = BarData(self.data_portal, |
||
| 525 | lambda: self.minutes[2], |
||
| 526 | self.sim_params.data_frequency) |
||
| 527 | |||
| 528 | orders_txns = list(slippage_model.simulate( |
||
| 529 | bar_data[133], |
||
| 530 | open_orders, |
||
| 531 | )) |
||
| 532 | |||
| 533 | self.assertEquals(len(orders_txns), 0) |
||
| 534 | |||
| 535 | bar_data = BarData(self.data_portal, |
||
| 536 | lambda: self.minutes[3], |
||
| 537 | self.sim_params.data_frequency) |
||
| 538 | |||
| 539 | orders_txns = list(slippage_model.simulate( |
||
| 540 | bar_data[133], |
||
| 541 | open_orders, |
||
| 542 | )) |
||
| 543 | |||
| 544 | self.assertEquals(len(orders_txns), 0) |
||
| 545 | |||
| 546 | # long, does not trade - impacted price worse than limit price |
||
| 547 | open_orders = [ |
||
| 548 | Order(**{ |
||
| 549 | 'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc), |
||
| 550 | 'amount': 100, |
||
| 551 | 'filled': 0, |
||
| 552 | 'sid': 133, |
||
| 553 | 'stop': 4.0, |
||
| 554 | 'limit': 3.5}) |
||
| 555 | ] |
||
| 556 | |||
| 557 | bar_data = BarData(self.data_portal, |
||
| 558 | lambda: self.minutes[2], |
||
| 559 | self.sim_params.data_frequency) |
||
| 560 | |||
| 561 | orders_txns = list(slippage_model.simulate( |
||
| 562 | bar_data[133], |
||
| 563 | open_orders, |
||
| 564 | )) |
||
| 565 | |||
| 566 | self.assertEquals(len(orders_txns), 0) |
||
| 567 | |||
| 568 | bar_data = BarData(self.data_portal, |
||
| 569 | lambda: self.minutes[3], |
||
| 570 | self.sim_params.data_frequency) |
||
| 571 | |||
| 572 | orders_txns = list(slippage_model.simulate( |
||
| 573 | bar_data[133], |
||
| 574 | open_orders, |
||
| 575 | )) |
||
| 576 | |||
| 577 | self.assertEquals(len(orders_txns), 0) |
||
| 578 | |||
| 579 | # long, does trade |
||
| 580 | open_orders = [ |
||
| 581 | Order(**{ |
||
| 582 | 'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc), |
||
| 583 | 'amount': 100, |
||
| 584 | 'filled': 0, |
||
| 585 | 'sid': 133, |
||
| 586 | 'stop': 4.0, |
||
| 587 | 'limit': 3.6}) |
||
| 588 | ] |
||
| 589 | |||
| 590 | bar_data = BarData(self.data_portal, |
||
| 591 | lambda: self.minutes[2], |
||
| 592 | self.sim_params.data_frequency) |
||
| 593 | |||
| 594 | orders_txns = list(slippage_model.simulate( |
||
| 595 | bar_data[133], |
||
| 596 | open_orders, |
||
| 597 | )) |
||
| 598 | |||
| 599 | self.assertEquals(len(orders_txns), 0) |
||
| 600 | |||
| 601 | bar_data = BarData(self.data_portal, |
||
| 602 | lambda: self.minutes[3], |
||
| 603 | self.sim_params.data_frequency) |
||
| 604 | |||
| 605 | orders_txns = list(slippage_model.simulate( |
||
| 606 | bar_data[133], |
||
| 607 | open_orders, |
||
| 608 | )) |
||
| 609 | |||
| 610 | self.assertEquals(len(orders_txns), 1) |
||
| 611 | _, txn = orders_txns[0] |
||
| 612 | |||
| 613 | expected_txn = { |
||
| 614 | 'price': float(3.50021875), |
||
| 615 | 'dt': datetime.datetime( |
||
| 616 | 2006, 1, 5, 14, 34, tzinfo=pytz.utc), |
||
| 617 | 'amount': int(50), |
||
| 618 | 'sid': int(133) |
||
| 619 | } |
||
| 620 | |||
| 621 | for key, value in expected_txn.items(): |
||
| 622 | self.assertEquals(value, txn[key]) |
||
| 623 | |||
| 624 | # short, does not trade |
||
| 625 | |||
| 626 | open_orders = [ |
||
| 627 | Order(**{ |
||
| 628 | 'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc), |
||
| 629 | 'amount': -100, |
||
| 630 | 'filled': 0, |
||
| 631 | 'sid': 133, |
||
| 632 | 'stop': 3.0, |
||
| 633 | 'limit': 4.0}) |
||
| 634 | ] |
||
| 635 | |||
| 636 | bar_data = BarData(self.data_portal, |
||
| 637 | lambda: self.minutes[0], |
||
| 638 | self.sim_params.data_frequency) |
||
| 639 | |||
| 640 | orders_txns = list(slippage_model.simulate( |
||
| 641 | bar_data[133], |
||
| 642 | open_orders, |
||
| 643 | )) |
||
| 644 | |||
| 645 | self.assertEquals(len(orders_txns), 0) |
||
| 646 | |||
| 647 | bar_data = BarData(self.data_portal, |
||
| 648 | lambda: self.minutes[1], |
||
| 649 | self.sim_params.data_frequency) |
||
| 650 | |||
| 651 | orders_txns = list(slippage_model.simulate( |
||
| 652 | bar_data[133], |
||
| 653 | open_orders, |
||
| 654 | )) |
||
| 655 | |||
| 656 | self.assertEquals(len(orders_txns), 0) |
||
| 657 | |||
| 658 | # short, does not trade - impacted price worse than limit price |
||
| 659 | open_orders = [ |
||
| 660 | Order(**{ |
||
| 661 | 'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc), |
||
| 662 | 'amount': -100, |
||
| 663 | 'filled': 0, |
||
| 664 | 'sid': 133, |
||
| 665 | 'stop': 3.0, |
||
| 666 | 'limit': 3.5}) |
||
| 667 | ] |
||
| 668 | |||
| 669 | bar_data = BarData(self.data_portal, |
||
| 670 | lambda: self.minutes[0], |
||
| 671 | self.sim_params.data_frequency) |
||
| 672 | |||
| 673 | orders_txns = list(slippage_model.simulate( |
||
| 674 | bar_data[133], |
||
| 675 | open_orders, |
||
| 676 | )) |
||
| 677 | |||
| 678 | self.assertEquals(len(orders_txns), 0) |
||
| 679 | |||
| 680 | bar_data = BarData(self.data_portal, |
||
| 681 | lambda: self.minutes[1], |
||
| 682 | self.sim_params.data_frequency) |
||
| 683 | |||
| 684 | orders_txns = list(slippage_model.simulate( |
||
| 685 | bar_data[133], |
||
| 686 | open_orders, |
||
| 687 | )) |
||
| 688 | |||
| 689 | self.assertEquals(len(orders_txns), 0) |
||
| 690 | |||
| 691 | # short, does trade |
||
| 692 | open_orders = [ |
||
| 693 | Order(**{ |
||
| 694 | 'dt': datetime.datetime(2006, 1, 5, 14, 30, tzinfo=pytz.utc), |
||
| 695 | 'amount': -100, |
||
| 696 | 'filled': 0, |
||
| 697 | 'sid': 133, |
||
| 698 | 'stop': 3.0, |
||
| 699 | 'limit': 3.4}) |
||
| 700 | ] |
||
| 701 | |||
| 702 | bar_data = BarData(self.data_portal, |
||
| 703 | lambda: self.minutes[0], |
||
| 704 | self.sim_params.data_frequency) |
||
| 705 | |||
| 706 | orders_txns = list(slippage_model.simulate( |
||
| 707 | bar_data[133], |
||
| 708 | open_orders, |
||
| 709 | )) |
||
| 710 | |||
| 711 | self.assertEquals(len(orders_txns), 0) |
||
| 712 | |||
| 713 | bar_data = BarData(self.data_portal, |
||
| 714 | lambda: self.minutes[1], |
||
| 715 | self.sim_params.data_frequency) |
||
| 716 | |||
| 717 | orders_txns = list(slippage_model.simulate( |
||
| 718 | bar_data[133], |
||
| 719 | open_orders, |
||
| 720 | )) |
||
| 721 | |||
| 722 | self.assertEquals(len(orders_txns), 1) |
||
| 723 | _, txn = orders_txns[0] |
||
| 724 | |||
| 725 | expected_txn = { |
||
| 726 | 'price': float(3.49978125), |
||
| 727 | 'dt': datetime.datetime( |
||
| 728 | 2006, 1, 5, 14, 32, tzinfo=pytz.utc), |
||
| 729 | 'amount': int(-50), |
||
| 730 | 'sid': int(133) |
||
| 731 | } |
||
| 732 | |||
| 733 | for key, value in expected_txn.items(): |
||
| 734 | self.assertEquals(value, txn[key]) |
||
| 735 |