<?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>DEV Community: RedSamerai</title>
    <description>The latest articles on DEV Community by RedSamerai (@redsamerai).</description>
    <link>https://dev.to/redsamerai</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4182091%2Fcdaff001-bfbf-4785-a1d7-a01bb02892cc.png</url>
      <title>DEV Community: RedSamerai</title>
      <link>https://dev.to/redsamerai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/redsamerai"/>
    <language>en</language>
    <item>
      <title>I Built a Free In-Browser Tool That Tells You If Your MT5 Data Is Clean</title>
      <dc:creator>RedSamerai</dc:creator>
      <pubDate>Sat, 17 Oct 2026 07:12:08 +0000</pubDate>
      <link>https://dev.to/redsamerai/i-built-a-free-in-browser-tool-that-tells-you-if-your-mt5-data-is-clean-22f4</link>
      <guid>https://dev.to/redsamerai/i-built-a-free-in-browser-tool-that-tells-you-if-your-mt5-data-is-clean-22f4</guid>
      <description>&lt;p&gt;Body&lt;br&gt;
You run a backtest, the curve looks good, and then the uncomfortable question lands: is your data actually clean?&lt;br&gt;
Most MT5 CSV exports are dirty — quietly. The terminal hands you a file that looks complete. It is not.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft3dhmfy6l45tpbjhvwuv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft3dhmfy6l45tpbjhvwuv.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;br&gt;
The five failure modes&lt;br&gt;
Gaps. Connection drops, broker outages, re-export windows that stop mid-hour — missing bars that nobody notices until results drift between platforms.&lt;br&gt;
Duplicates. Re-export the same range twice, merge two files, and the same bar appears twice. Inflated volume counts, broken "first bar of the day" conditions.&lt;br&gt;
Zero-volume / zero-price bars. Exchange halts and feed glitches produce bars with no trades. Indicators computed on them are wrong, and the wrongness does not show up on visual inspection.&lt;br&gt;
Timezone ambiguity. MT5 stores bars in broker-local session time. The same CSV read as UTC moves your strategy to a completely different time of day.&lt;br&gt;
Expected vs actual. A known date range + timeframe should contain a known number of bars. If your file has 9,282 bars where 12,276 are expected, something vanished — and you would not know without doing the arithmetic.&lt;br&gt;
What a clean-data check looks like&lt;br&gt;
A useful report answers five numbers per file, in under a minute:&lt;br&gt;
expected bars vs actual bars&lt;br&gt;
missing bars, and how they cluster (one long gap = broker outage; many short = feed drops)&lt;br&gt;
duplicate bars (exact count, not "there might be some")&lt;br&gt;
zero-volume ratio&lt;br&gt;
timezone/session note — the report states its assumption instead of hiding it&lt;br&gt;
Example: 12,276 expected bars, 9,282 present → 2,994 missing, clustered in 2 gaps (2,970 + 16), gap-free ratio 75.6%. That is a file you should not backtest without first understanding why two days vanished.&lt;br&gt;
Healthy baseline: gap-free ≥ 99%, zero duplicates, zero-volume &amp;lt; 1%. If your file fails that, the results above it are an estimate, not a measurement.&lt;br&gt;
Try it — free, no signup&lt;br&gt;
I built a small tool that runs this check in your browser: &lt;a href="https://mt5-cleaner.streamlit.app" rel="noopener noreferrer"&gt;https://mt5-cleaner.streamlit.app&lt;/a&gt;&lt;br&gt;
Drag a CSV in → it detects broker format, timeframe, and range → you get the quality report plus a cleaned CSV. Files never leave your browser and are gone when you close the tab. No account, no API key, free up to 200 MB.&lt;br&gt;
The workflow I use before any backtest:&lt;br&gt;
Export history from MT5 (CSV)&lt;br&gt;
Run it through the checker — read the 5 numbers&lt;br&gt;
If gap-free &amp;lt; 99%, re-export with a wider range or a different session before touching the strategy code&lt;br&gt;
Sixty seconds of checking saves hours of debugging a strategy that was never wrong — the data was.&lt;br&gt;
Source: &lt;a href="https://github.com/RedSamerai/quantclean" rel="noopener noreferrer"&gt;https://github.com/RedSamerai/quantclean&lt;/a&gt;&lt;br&gt;
Questions or weird report shapes — post them in the comments, the clustering heuristics are the fun part.&lt;/p&gt;

</description>
      <category>metatrader</category>
      <category>backtesting</category>
    </item>
    <item>
      <title>Stop Copy-Pasting Conventional Commits Rules: Auto-Fix Your Commits in CI</title>
      <dc:creator>RedSamerai</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:57:30 +0000</pubDate>
      <link>https://dev.to/redsamerai/stop-copy-pasting-conventional-commits-rules-auto-fix-your-commits-in-ci-1n7a</link>
      <guid>https://dev.to/redsamerai/stop-copy-pasting-conventional-commits-rules-auto-fix-your-commits-in-ci-1n7a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fars8h830xzh7h8qvilh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fars8h830xzh7h8qvilh5.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this exists
&lt;/h2&gt;

&lt;p&gt;I keep hitting the same wall: my Conventional Commits check fails in CI, I push a fix commit, and that fix commit is itself in the wrong format. Then the PR title is 200 chars, the body is missing the Testing section, and in a monorepo my frontend package allows &lt;code&gt;chore:&lt;/code&gt; but the backend doesn't — so I've been copy-pasting commitlint config into every repo.&lt;/p&gt;

&lt;p&gt;Most linters stop at "tell you it's wrong." I wanted one that actually fixes it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/RedSamerai/pr-conventional" rel="noopener noreferrer"&gt;pr-conventional&lt;/a&gt;&lt;/strong&gt; — a GitHub Action that enforces AND &lt;strong&gt;auto-fixes&lt;/strong&gt; Conventional Commits, PR titles, and PR descriptions. It checks &lt;strong&gt;every new commit in the push&lt;/strong&gt; (&lt;code&gt;before..after&lt;/code&gt;, up to 20), the PR title, and the PR body.&lt;/p&gt;

&lt;h3&gt;
  
  
  What "auto-fix" means here
&lt;/h3&gt;

&lt;p&gt;It's not "tell you it's wrong". On every push/PR it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Amends&lt;/strong&gt; commit messages — fixes the type, adds a missing scope&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Appends&lt;/strong&gt; missing PR-body sections (What / Why / Testing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Truncates&lt;/strong&gt; over-long PR titles to your max&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-validates&lt;/strong&gt; — only exits 0 when it's genuinely clean&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the core of the tool, and &lt;strong&gt;it's in the FREE tier&lt;/strong&gt; — no key needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monorepo routing (the part that saves hours)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;monorepo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;packages/frontend"&lt;/span&gt;
      &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;feat&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;fix&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;docs&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;chore&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;scopeRegex&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^frontend[a-z0-9-]*$'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;packages/backend"&lt;/span&gt;
      &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;feat&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;fix&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;refactor&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A commit touching &lt;code&gt;packages/frontend/a.ts&lt;/code&gt; is validated against the frontend rules. Touching both? It's checked against &lt;strong&gt;each&lt;/strong&gt; rule set (strictest semantics, no intersection). Root-level / merge / shallow-clone files fall back to the root config. No copy-pasting five configs.&lt;/p&gt;

&lt;h3&gt;
  
  
  FREE vs PRO
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;FREE (no key)&lt;/th&gt;
&lt;th&gt;PRO ($29 one-time)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Commit / PR validation + auto-fix + SARIF&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whole-push check (before..after, not just HEAD)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monorepo per-package routing&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extends / remote rule packs&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The FREE tier (MIT, no key) already gives you full validation, auto-fix, and SARIF using your repo's root config. &lt;strong&gt;PRO adds two things that scale to teams&lt;/strong&gt;: per-package rule routing and remote rule-pack distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  SARIF out of the box
&lt;/h3&gt;

&lt;p&gt;Every run writes &lt;code&gt;pr-conventional.sarif&lt;/code&gt;. Pipe it into &lt;code&gt;upload-sarif&lt;/code&gt; and findings land in the &lt;strong&gt;GitHub Security&lt;/strong&gt; tab. No extra setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install (30 seconds)
&lt;/h2&gt;

&lt;p&gt;Drop a config into your repo, then call the action from any workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/pr-check.yml&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pr-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
&lt;span class="kt"&gt;![Uploading&lt;/span&gt; &lt;span class="s"&gt;image](...)&lt;/span&gt;
      &lt;span class="s"&gt;- uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RedSamerai/pr-conventional@v0.3.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grab a starting point from the &lt;a href="https://github.com/RedSamerai/pr-conventional/tree/master/examples" rel="noopener noreferrer"&gt;examples folder&lt;/a&gt;: &lt;code&gt;strict.yml&lt;/code&gt; (zero-tolerance), &lt;code&gt;relaxed.yml&lt;/code&gt; (personal repos, commit-only), &lt;code&gt;monorepo.yml&lt;/code&gt; (per-package routing), &lt;code&gt;chinese-team.yml&lt;/code&gt; (CN subjects, CN body sections).&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the Pro license
&lt;/h2&gt;

&lt;p&gt;PRO is a &lt;strong&gt;one-time $29 purchase, lifetime key&lt;/strong&gt; — no subscription, no renewal. It unlocks monorepo routing and extends/remote rule packs. &lt;a href="https://www.creem.io/payment/prod_6oA2Fa3K1ufiv72366lv0J" rel="noopener noreferrer"&gt;Get the Pro license →&lt;/a&gt; (delivered instantly).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RedSamerai/pr-conventional" rel="noopener noreferrer"&gt;Full docs&lt;/a&gt; · &lt;a href="https://github.com/marketplace/actions/pr-conventional" rel="noopener noreferrer"&gt;Marketplace listing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>devops</category>
      <category>opensource</category>
      <category>conventional</category>
    </item>
  </channel>
</rss>
