<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ali Moradi</title>
    <description>The latest articles on Forem by Ali Moradi (@xibalbas).</description>
    <link>https://forem.com/xibalbas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F793779%2F1b3daacf-d2dd-4692-b4e8-2012ce1d5deb.jpeg</url>
      <title>Forem: Ali Moradi</title>
      <link>https://forem.com/xibalbas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/xibalbas"/>
    <language>en</language>
    <item>
      <title>Simplifying Kafka Testing in Python: A Mockafka-py Tutorial</title>
      <dc:creator>Ali Moradi</dc:creator>
      <pubDate>Thu, 30 Nov 2023 18:35:49 +0000</pubDate>
      <link>https://forem.com/xibalbas/simplifying-kafka-testing-in-python-a-mockafka-py-tutorial-2jcb</link>
      <guid>https://forem.com/xibalbas/simplifying-kafka-testing-in-python-a-mockafka-py-tutorial-2jcb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Mockafka-py&lt;/strong&gt; is a versatile and user-friendly Python library designed specifically for simulating Kafka in a testing environment. It streamlines the process of testing applications that are tightly integrated with Kafka, offering a simplified, in-memory mock of Kafka's complex messaging system. This is especially valuable for projects with a strong coupling to Kafka, where testing against a real Kafka cluster can be cumbersome and resource-intensive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing Mockafka-py
&lt;/h3&gt;

&lt;p&gt;Mockafka-py stands out because it replicates Kafka’s functionality in a lightweight, in-memory setup. This eliminates the need for a physical Kafka setup, reducing the overhead and complexity involved in writing and running tests. Its compatibility with confluent-kafka ensures that it can seamlessly integrate with your existing Kafka-based applications.&lt;/p&gt;

&lt;p&gt;git repo : &lt;br&gt;
&lt;a href="https://github.com/alm0ra/mockafka-py"&gt;https://github.com/alm0ra/mockafka-py&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Advantages of Using Mockafka-py:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Testing&lt;/strong&gt;: Eliminates the need for a real Kafka cluster, making it easier to set up and run tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: In-memory simulation speeds up the testing process significantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolation&lt;/strong&gt;: Tests can be run in an isolated environment, leading to more accurate and reliable results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Use&lt;/strong&gt;: Provides decorators and simple interfaces to mimic Kafka's behavior, making it accessible even for those who are not Kafka experts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Scenario: Testing an E-Commerce Consumer for shipping
&lt;/h3&gt;

&lt;p&gt;Imagine an e-commerce platform where various events (like order placement, shipment, and delivery) trigger notifications sent through Kafka. Testing this system can be challenging due to the complexities involved in integrating with Kafka.&lt;/p&gt;
&lt;h4&gt;
  
  
  Using Mockafka-py for Testing:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setting up the Scenario&lt;/strong&gt;: You need to test whether your application correctly produces and consumes messages related to order updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mock Kafka Environment&lt;/strong&gt;: Instead of setting up a Kafka cluster, use Mockafka-py to create a mock Kafka environment. This environment mimics the actual Kafka behavior for your tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Writing the Tests&lt;/strong&gt;:&lt;br&gt;
Certainly! Let's expand on the e-commerce notification system scenario and provide an example of how to write a test using Mockafka-py. This example will illustrate testing both the production and consumption of Kafka messages related to order updates.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Scenario: E-Commerce Order Update Notifications
&lt;/h3&gt;

&lt;p&gt;Suppose your e-commerce application has a consumer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;order_shipped_consumer&lt;/code&gt;: Consume a message and produce it to a kafka topic . &lt;code&gt;here just an example for testing functionallity&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 1: Setting Up Mockafka-py
&lt;/h3&gt;

&lt;p&gt;First, ensure Mockafka-py is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mockafka-py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Writing the Tests
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Scenario: A Consumer in E-Commerce System
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mockafka&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FakeConsumer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FakeProducer&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;order_shipped_consumer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Note: Utilize Mockafka's producer and consumer in tests. Depending on your implementation, you can inject FakeProducer and FakeConsumer into your code.
&lt;/span&gt;
    &lt;span class="c1"&gt;# Consuming the message
&lt;/span&gt;    &lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FakeConsumer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;orders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;order_shipped&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="c1"&gt;# Processing the message, which could entail various operations. Here, as an example, we're producing another message post-consumption.
&lt;/span&gt;    &lt;span class="n"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FakeProducer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;produce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;order_finished&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;orders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Test for Producing Messages (order_shipped_consumer):
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mockafka&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;produce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setup_kafka&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;my_ecommerce_app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;order_consumer&lt;/span&gt;

&lt;span class="nd"&gt;@setup_kafka&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;topic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;partition&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}])&lt;/span&gt;
&lt;span class="nd"&gt;@produce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;orders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;order_shipped&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;customer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sample-1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_order_shipped_consumer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Simulating the behavior of the order shipped consumer.
&lt;/span&gt;    &lt;span class="nf"&gt;order_consumer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Based on the logic, we expect another message to be produced. Here, we can verify any related outcomes of the consumer's actions.
&lt;/span&gt;    &lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FakeConsumer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;orders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;order_finished&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;customer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sample-1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Mockafka-py is highly beneficial for projects heavily reliant on Kafka. It simplifies the testing process, making it more efficient and less resource-intensive. Whether you’re developing a small service or a large-scale application, Mockafka-py ensures that your Kafka interactions are thoroughly and efficiently tested, leading to more robust and reliable applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/alm0ra/mockafka-py"&gt;https://github.com/alm0ra/mockafka-py&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>unittest</category>
      <category>mockafka</category>
      <category>mock</category>
    </item>
    <item>
      <title>Backtesting is A piece of Cake(signal backtester Guide)</title>
      <dc:creator>Ali Moradi</dc:creator>
      <pubDate>Sat, 05 Mar 2022 08:25:16 +0000</pubDate>
      <link>https://forem.com/xibalbas/backtesting-is-a-piece-of-cakesignal-backtester-guide-1lfm</link>
      <guid>https://forem.com/xibalbas/backtesting-is-a-piece-of-cakesignal-backtester-guide-1lfm</guid>
      <description>&lt;p&gt;some time is hard to back test your strategy with back test library i made easy . with 3 lines of code you can back test and see result of your strategy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/xibalbas/signal_backtester/"&gt;https://github.com/xibalbas/signal_backtester/&lt;/a&gt;&lt;br&gt;
support the project with your stars :))&lt;/p&gt;
&lt;h2&gt;
  
  
  what is &lt;a href="https://github.com/xibalbas/signal_backtester/"&gt;Signal Backtester&lt;/a&gt;?
&lt;/h2&gt;

&lt;p&gt;it is a tiny backtester Based on Backtesting Lib .&lt;br&gt;
easiest way to backtest your generated signal. just need a csv file contain candleStick informations. OHLCV + signal &lt;/p&gt;
&lt;h2&gt;
  
  
  why??
&lt;/h2&gt;

&lt;p&gt;some time writing good backtest for a strategy is not too easy . and you may have some challenge with backtest libraries.&lt;/p&gt;

&lt;p&gt;so i decided to make a seprate repo for backtesting in easiest way.&lt;br&gt;
what you need is a csv file contain &lt;code&gt;signal&lt;/code&gt; column . for buy signal you should put &lt;code&gt;2&lt;/code&gt;, and for sell signal you put &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;and good news is you did not need to write strategy for how trade we wrote it before you just choose yours and finish you did it :))&lt;br&gt;
see &lt;a href="https://github.com/xibalbas/signal_backtester#strategy"&gt;Strategy&lt;/a&gt; guide.&lt;/p&gt;
&lt;h2&gt;
  
  
  First
&lt;/h2&gt;

&lt;p&gt;prepare your data and prepare your signal .&lt;br&gt;
you can write your strategy and generate signal like this &lt;/p&gt;

&lt;p&gt;here is an example of generating signal for EMA cross strategy and show you how generate your signal .&lt;br&gt;
our signal generate as new column &lt;code&gt;signal&lt;/code&gt; in our data frame .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;notice:&lt;/strong&gt; your data set column should contain &lt;code&gt;Date&lt;/code&gt;,&lt;code&gt;Open&lt;/code&gt;, &lt;code&gt;High&lt;/code&gt;, &lt;code&gt;Low&lt;/code&gt;, &lt;code&gt;Close&lt;/code&gt;, &lt;code&gt;Volume&lt;/code&gt;,&lt;code&gt;signal&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;talib&lt;/span&gt;  &lt;span class="c1"&gt;# notice you can install talib manually
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cross_EMA_signals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fast_period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slow_period&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""_summary_

    Args:
        df (_type_): _description_
        fast_period (_type_): _description_
        slow_period (_type_): _description_
    """&lt;/span&gt;
    &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"fast"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;talib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EMA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeperiod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fast_period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"slow"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;talib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EMA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeperiod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;slow_period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;slow_period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;slow&lt;/span&gt;
                &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;slow&lt;/span&gt;
            &lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="c1"&gt;# buy signal
&lt;/span&gt;                &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;slow&lt;/span&gt;
                &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;slow&lt;/span&gt;
            &lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="c1"&gt;# sell signal
&lt;/span&gt;                &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"signal"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./final_dataset.csv"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./data.csv"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cross_EMA_signals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  second (Backtest in 3 line)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;signal-backtester
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  make a backtest
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;signal_backtester&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SignalBacktester&lt;/span&gt;


&lt;span class="n"&gt;dataset_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"./final_dataset.csv"&lt;/span&gt;

&lt;span class="n"&gt;backtest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SignalBacktester&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"two_side_sl_tp_reversed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;commission&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;percent_of_portfolio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stop_loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;take_profit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;trailing_stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"./result"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# path of result files
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;backtest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and simply get result of &lt;a href="https://pypi.org/project/Backtesting/"&gt;Backtesting&lt;/a&gt; lib:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;final_report.html&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YRWtuKBi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/356789k31998v5xgj7zt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YRWtuKBi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/356789k31998v5xgj7zt.png" alt="Image description" width="880" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;final_report.csv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JiYmDSGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hb55mx1xb55rgmvudigt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JiYmDSGZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hb55mx1xb55rgmvudigt.png" alt="Image description" width="880" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;order_report.csv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8iqp_JvQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2b4q7agaed7ewt0otm0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8iqp_JvQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2b4q7agaed7ewt0otm0u.png" alt="Image description" width="880" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>backtest</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>how become an expert trader with backtest your skill(strategies) in the past on trading view?(introducing PTV)</title>
      <dc:creator>Ali Moradi</dc:creator>
      <pubDate>Fri, 14 Jan 2022 12:36:29 +0000</pubDate>
      <link>https://forem.com/xibalbas/how-become-an-expert-trader-with-backtest-your-skillstrategies-in-the-past-on-trading-viewintroducing-ptv-3397</link>
      <guid>https://forem.com/xibalbas/how-become-an-expert-trader-with-backtest-your-skillstrategies-in-the-past-on-trading-viewintroducing-ptv-3397</guid>
      <description>&lt;p&gt;Demo accounts became widespread in the twenty-first century, along with online trading. They are marketed to customers as a way for a customer to test a platform’s user experience and features before committing their own money to these investments or paying the platform trading commissions. &lt;/p&gt;

&lt;h1&gt;
  
  
  Learn before trade
&lt;/h1&gt;

&lt;p&gt;if you want backtest your skills in stock market what do you do? &lt;/p&gt;

&lt;p&gt;if you were in the past what did you do ? what position did you enter? &lt;br&gt;
you need to repeat the candles untill you can do a good trade.&lt;/p&gt;

&lt;h1&gt;
  
  
  introduce PTV (a trading view widget)
&lt;/h1&gt;

&lt;p&gt;if you are familiar with trading view platform , you must know it has a feature call Bar Reply , &lt;br&gt;
&lt;a href="https://www.tradingview.com/support/solutions/43000474024-how-do-i-turn-bar-replay-on/"&gt;what is bar reply?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for simulate demo trading in the past you can use PTV &lt;br&gt;
trading view does not have this feature and i decided to implement this feature by my self . &lt;br&gt;
for more information please checkout github repository of PTV&lt;br&gt;
it's free and open source&lt;br&gt;
check out this link:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/xibalbas/paper_trading_view.git"&gt;https://github.com/xibalbas/paper_trading_view.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;don't forget to star the repo :))&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x6Sw-Df8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r7jrhsc0q7ctqtaal8o0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x6Sw-Df8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r7jrhsc0q7ctqtaal8o0.gif" alt="Image description" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>githunt</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>How practice and improve trade skills with demo trading on trading view with bar reply mode feature? (open source project)</title>
      <dc:creator>Ali Moradi</dc:creator>
      <pubDate>Fri, 14 Jan 2022 12:00:50 +0000</pubDate>
      <link>https://forem.com/xibalbas/how-practice-and-improve-trade-skills-with-demo-trading-on-trading-view-with-bar-reply-mode-feature-open-source-project-3gjk</link>
      <guid>https://forem.com/xibalbas/how-practice-and-improve-trade-skills-with-demo-trading-on-trading-view-with-bar-reply-mode-feature-open-source-project-3gjk</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/xibalbas/paper_trading_view.git"&gt;paper trading view repo on github&lt;/a&gt;&lt;br&gt;
a few weeks ago when i was practicing price action method in MT4 i found out Trading View has a feature call Bar reply , you can cut the candlestick chart to the back , so i decided to buy a pro account .&lt;/p&gt;

&lt;p&gt;but after a while i find out this feature does not prepare paper test . if you want to practice with Bar reply mode you should write your trade on paper and this was not a good idea.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_S9HbnuB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hvf8q6uak3s8crx2jh2i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_S9HbnuB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hvf8q6uak3s8crx2jh2i.gif" alt="Image description" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=zW962uAD4TU&amp;amp;t=28s"&gt;Quick installation tutorial video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;so i decided to search i found another package on Git hub they call tradingview-trainer but this did not help me because it was not complete .&lt;/p&gt;

&lt;p&gt;it’s simple work with Selenium , tkinter&lt;/p&gt;

&lt;h2&gt;
  
  
  paper-trading-view Features
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;work with TradingView: For bar reply and getting price we use trading view.

&lt;p&gt;Limit/Market orders: you can place a Limit or Market order in 2 side "long", "Short" .&lt;/p&gt;

&lt;p&gt;SL/TP set: you can set stop loss and take profit for your market or limit order .&lt;/p&gt;

&lt;p&gt;see Open orders: you can see list of open orders.&lt;/p&gt;

&lt;p&gt;see Open positions: you can see list of open positions.&lt;/p&gt;

&lt;p&gt;see trade history: you can see list of trade history.&lt;/p&gt;

&lt;p&gt;Next/Play/Pause in bar reply: you can use this items in PTV and when price is changing open positions and open orders will be check.&lt;/p&gt;

&lt;p&gt;initial setting: you can set your initial money / commission.&lt;/p&gt;

&lt;p&gt;profit/loss of account: your total profit / loss calculate when your position close.&lt;/p&gt;

&lt;p&gt;save report: you can save your trade history in a csv file.&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  paper-trading-view Github Source&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kjv0Dfwg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3i93trlgc2kkpbgxkgr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kjv0Dfwg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3i93trlgc2kkpbgxkgr.png" alt="Image description" width="880" height="511"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/xibalbas/paper_trading_view.git"&gt;https://github.com/xibalbas/paper_trading_view.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The installation instructions can be found on project page! If you have any questions or comments, feel free to leave them down below! Good luck on your practice trading, hope this tool helps!&lt;/p&gt;

&lt;p&gt;if you like it give a start :)))&lt;/p&gt;

&lt;p&gt;designed with love&lt;/p&gt;

</description>
      <category>python</category>
      <category>github</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
