Compare commits
6 Commits
baaac18b84
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 61a96d490c | |||
| d0fca63be2 | |||
| 0719ecdc4d | |||
| 0d026d5573 | |||
| a766263ec5 | |||
| 53171c3c36 |
@@ -131,6 +131,10 @@ tail -100 ~/mt5-docker/config/.wine/drive_c/Program\ Files/MetaTrader\ 5/MQL5/Lo
|
|||||||
- **Largest Win:** $8,091
|
- **Largest Win:** $8,091
|
||||||
- **Largest Loss:** -$805
|
- **Largest Loss:** -$805
|
||||||
|
|
||||||
|
## DevOps / Infrastructure
|
||||||
|
|
||||||
|
Server infrastructure details saved in: `/home/garfield/devops/INFRASTRUCTURE.md`
|
||||||
|
|
||||||
## Conversation History
|
## Conversation History
|
||||||
|
|
||||||
Before working on this codebase, read:
|
Before working on this codebase, read:
|
||||||
@@ -138,6 +142,7 @@ Before working on this codebase, read:
|
|||||||
conversation-history/2026-03-21-mql-trading-bots.md
|
conversation-history/2026-03-21-mql-trading-bots.md
|
||||||
conversation-history/2026-03-29-session-save.md
|
conversation-history/2026-03-29-session-save.md
|
||||||
conversation-history/2026-03-30-weekend-gap-short-signal-fix.md
|
conversation-history/2026-03-30-weekend-gap-short-signal-fix.md
|
||||||
|
conversation-history/2026-03-30-dns-whitelist.md
|
||||||
```
|
```
|
||||||
|
|
||||||
## Notes for AI Agents
|
## Notes for AI Agents
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
#property copyright "Copyright 2025, Abbey Road Tech"
|
#property copyright "Copyright 2025, Abbey Road Tech"
|
||||||
#property link "https://www.abbeyroadtech.com"
|
#property link "https://www.abbeyroadtech.com"
|
||||||
#property version "1.14"
|
#property version "1.16"
|
||||||
#property strict
|
#property strict
|
||||||
|
|
||||||
#include <Trade\Trade.mqh>
|
#include <Trade\Trade.mqh>
|
||||||
@@ -23,6 +23,9 @@ input double InpRiskPercent = 1.0; // Risk % per trade (1.0 = 1% of a
|
|||||||
input int InpStopLoss = 100; // Stop Loss in points
|
input int InpStopLoss = 100; // Stop Loss in points
|
||||||
input int InpTakeProfit = 200; // Take Profit in points
|
input int InpTakeProfit = 200; // Take Profit in points
|
||||||
input bool InpUseTrailingStop = true; // Use trailing stop
|
input bool InpUseTrailingStop = true; // Use trailing stop
|
||||||
|
input int InpTrailingStart = 50; // Points of profit before trailing begins
|
||||||
|
input int InpTrailingStop = 30; // Trailing stop distance in points
|
||||||
|
input int InpTrailingStep = 10; // Minimum step to move SL
|
||||||
input int InpMaxPositions = 3; // Max concurrent positions per symbol
|
input int InpMaxPositions = 3; // Max concurrent positions per symbol
|
||||||
|
|
||||||
input group "=== Filters ==="
|
input group "=== Filters ==="
|
||||||
@@ -45,6 +48,10 @@ input bool InpDebugMode = true; // Print debug info
|
|||||||
input group "=== Equity Protection ==="
|
input group "=== Equity Protection ==="
|
||||||
input double InpMaxDailyDrawdown = 3.0; // Max daily drawdown % (0=disable)
|
input double InpMaxDailyDrawdown = 3.0; // Max daily drawdown % (0=disable)
|
||||||
|
|
||||||
|
input group "=== Weekend Protection ==="
|
||||||
|
input bool InpCloseBeforeWeekend = true; // Close positions Friday before market close
|
||||||
|
input int InpWeekendCloseHour = 17; // Hour to close (17 = 5 PM broker time)
|
||||||
|
|
||||||
//--- Global Variables
|
//--- Global Variables
|
||||||
CTrade Trade;
|
CTrade Trade;
|
||||||
int TrendMAHandle;
|
int TrendMAHandle;
|
||||||
@@ -59,6 +66,9 @@ int totalSellPositions = 0;
|
|||||||
double dailyStartEquity = 0;
|
double dailyStartEquity = 0;
|
||||||
datetime lastEquityReset = 0;
|
datetime lastEquityReset = 0;
|
||||||
|
|
||||||
|
//--- Weekend Protection
|
||||||
|
bool weekendCloseExecuted = false;
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
//| Expert initialization function |
|
//| Expert initialization function |
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
@@ -82,14 +92,23 @@ int OnInit()
|
|||||||
|
|
||||||
lastBarTime = iTime(_Symbol, _Period, 0);
|
lastBarTime = iTime(_Symbol, _Period, 0);
|
||||||
|
|
||||||
Print("=== MultiSignal Confluence EA v1.12 Initialized ===");
|
Print("=== MultiSignal Confluence EA v1.16 Initialized ===");
|
||||||
Print("Symbol: ", _Symbol);
|
Print("Symbol: ", _Symbol);
|
||||||
Print("Magic: ", InpMagicNumber);
|
Print("Magic: ", InpMagicNumber);
|
||||||
Print("Min Confluence: ", InpMinConfluence);
|
Print("Min Confluence: ", InpMinConfluence);
|
||||||
Print("Min Strength: ", InpMinStrength);
|
Print("Min Strength: ", InpMinStrength);
|
||||||
Print("Volatility Filter: ", InpUseVolatilityFilter ? "ON" : "OFF");
|
Print("Volatility Filter: ", InpUseVolatilityFilter ? "ON" : "OFF");
|
||||||
Print("ADX Filter: ", InpUseADXFilter ? "ON" : "OFF");
|
Print("ADX Filter: ", InpUseADXFilter ? "ON" : "OFF");
|
||||||
Print("This EA trades DIRECTLY - no external indicator needed!");
|
Print("Trailing Stop: ", InpUseTrailingStop ? "ON" : "OFF");
|
||||||
|
if(InpUseTrailingStop)
|
||||||
|
{
|
||||||
|
Print(" Trailing Start: ", InpTrailingStart, " pts");
|
||||||
|
Print(" Trailing Stop: ", InpTrailingStop, " pts");
|
||||||
|
Print(" Trailing Step: ", InpTrailingStep, " pts");
|
||||||
|
}
|
||||||
|
Print("Weekend Protection: ", InpCloseBeforeWeekend ? "ON" : "OFF");
|
||||||
|
if(InpCloseBeforeWeekend)
|
||||||
|
Print(" Close Hour: ", InpWeekendCloseHour, ":00 broker time");
|
||||||
|
|
||||||
return(INIT_SUCCEEDED);
|
return(INIT_SUCCEEDED);
|
||||||
}
|
}
|
||||||
@@ -680,14 +699,20 @@ void OnTick()
|
|||||||
return; // Don't trade if daily limit reached
|
return; // Don't trade if daily limit reached
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check weekend protection
|
||||||
|
if(!CheckWeekendProtection())
|
||||||
|
{
|
||||||
|
return; // Don't trade, weekend close executed
|
||||||
|
}
|
||||||
|
|
||||||
// Check for new bar
|
// Check for new bar
|
||||||
datetime currentBarTime = iTime(_Symbol, _Period, 0);
|
datetime currentBarTime = iTime(_Symbol, _Period, 0);
|
||||||
bool isNewBar = (currentBarTime != lastBarTime);
|
bool isNewBar = (currentBarTime != lastBarTime);
|
||||||
|
|
||||||
// Update trailing stops on every tick
|
// Update trailing stops on every tick
|
||||||
if(InpUseTrailingStop && !isNewBar)
|
if(InpUseTrailingStop)
|
||||||
{
|
{
|
||||||
// Simple trailing stop logic can be added here
|
UpdateTrailingStops();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only process on new bar
|
// Only process on new bar
|
||||||
@@ -770,4 +795,163 @@ void OnTick()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Update trailing stops for all open positions |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void UpdateTrailingStops()
|
||||||
|
{
|
||||||
|
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
|
||||||
|
double trailingStart = InpTrailingStart * point;
|
||||||
|
double trailingDist = InpTrailingStop * point;
|
||||||
|
double trailingStep = InpTrailingStep * point;
|
||||||
|
|
||||||
|
for(int i = PositionsTotal() - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
ulong ticket = PositionGetTicket(i);
|
||||||
|
if(ticket == 0) continue;
|
||||||
|
|
||||||
|
// Only process positions for this EA
|
||||||
|
if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
|
||||||
|
if(PositionGetInteger(POSITION_MAGIC) != InpMagicNumber) continue;
|
||||||
|
|
||||||
|
long posType = PositionGetInteger(POSITION_TYPE);
|
||||||
|
double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
|
||||||
|
double currentSL = PositionGetDouble(POSITION_SL);
|
||||||
|
double currentTP = PositionGetDouble(POSITION_TP);
|
||||||
|
|
||||||
|
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
||||||
|
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
|
||||||
|
|
||||||
|
bool modify = false;
|
||||||
|
double newSL = 0;
|
||||||
|
|
||||||
|
if(posType == POSITION_TYPE_BUY)
|
||||||
|
{
|
||||||
|
// For BUY: trailing stop below price
|
||||||
|
double profit = bid - openPrice;
|
||||||
|
if(profit >= trailingStart)
|
||||||
|
{
|
||||||
|
newSL = NormalizeDouble(bid - trailingDist, _Digits);
|
||||||
|
// Only move if new SL is better and meets step requirement
|
||||||
|
if(newSL > currentSL + trailingStep || currentSL == 0)
|
||||||
|
{
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(posType == POSITION_TYPE_SELL)
|
||||||
|
{
|
||||||
|
// For SELL: trailing stop above price
|
||||||
|
double profit = openPrice - ask;
|
||||||
|
if(profit >= trailingStart)
|
||||||
|
{
|
||||||
|
newSL = NormalizeDouble(ask + trailingDist, _Digits);
|
||||||
|
// Only move if new SL is better and meets step requirement
|
||||||
|
if(currentSL == 0 || newSL < currentSL - trailingStep)
|
||||||
|
{
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(modify)
|
||||||
|
{
|
||||||
|
// Ensure SL is valid (not too close to current price)
|
||||||
|
double minDist = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * point;
|
||||||
|
|
||||||
|
if(posType == POSITION_TYPE_BUY)
|
||||||
|
{
|
||||||
|
if(bid - newSL < minDist)
|
||||||
|
newSL = NormalizeDouble(bid - minDist, _Digits);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(newSL - ask < minDist)
|
||||||
|
newSL = NormalizeDouble(ask + minDist, _Digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Trade.PositionModify(ticket, newSL, currentTP))
|
||||||
|
{
|
||||||
|
Print("✅ Trailing stop updated for #", ticket, " New SL: ", DoubleToString(newSL, _Digits));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Print("❌ Failed to update trailing stop for #", ticket, ": ", Trade.ResultRetcodeDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Close all positions for this EA |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void CloseAllPositions(string reason)
|
||||||
|
{
|
||||||
|
int total = PositionsTotal();
|
||||||
|
int closed = 0;
|
||||||
|
|
||||||
|
for(int i = total - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
ulong ticket = PositionGetTicket(i);
|
||||||
|
if(ticket == 0) continue;
|
||||||
|
|
||||||
|
// Only close positions for this EA and symbol
|
||||||
|
if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
|
||||||
|
if(PositionGetInteger(POSITION_MAGIC) != InpMagicNumber) continue;
|
||||||
|
|
||||||
|
long posType = PositionGetInteger(POSITION_TYPE);
|
||||||
|
|
||||||
|
if(posType == POSITION_TYPE_BUY)
|
||||||
|
{
|
||||||
|
if(Trade.PositionClose(ticket))
|
||||||
|
closed++;
|
||||||
|
}
|
||||||
|
else if(posType == POSITION_TYPE_SELL)
|
||||||
|
{
|
||||||
|
if(Trade.PositionClose(ticket))
|
||||||
|
closed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Print("📊 Closed ", closed, " positions for weekend protection. Reason: ", reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Check Weekend Protection |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CheckWeekendProtection()
|
||||||
|
{
|
||||||
|
if(!InpCloseBeforeWeekend) return true;
|
||||||
|
|
||||||
|
MqlDateTime dt;
|
||||||
|
TimeToStruct(TimeCurrent(), dt);
|
||||||
|
|
||||||
|
// Only check on Friday
|
||||||
|
if(dt.day_of_week != FRIDAY)
|
||||||
|
{
|
||||||
|
// Reset flag on other days
|
||||||
|
if(weekendCloseExecuted)
|
||||||
|
weekendCloseExecuted = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Already executed this Friday
|
||||||
|
if(weekendCloseExecuted) return true;
|
||||||
|
|
||||||
|
// Check if it's close to weekend close time
|
||||||
|
if(dt.hour >= InpWeekendCloseHour)
|
||||||
|
{
|
||||||
|
Print("⚠️ WEEKEND CLOSE: It's Friday ", dt.hour, ":00 - Closing all positions!");
|
||||||
|
SendNotification("WEEKEND CLOSE: Closing all positions before weekend");
|
||||||
|
|
||||||
|
// Close all open positions
|
||||||
|
CloseAllPositions("Weekend protection - Friday close");
|
||||||
|
|
||||||
|
weekendCloseExecuted = true;
|
||||||
|
return false; // Block new trades
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
|
|||||||
152
N8N_WORKFLOW_SETUP.md
Normal file
152
N8N_WORKFLOW_SETUP.md
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# N8N Workflow for MQL Settings Monitoring
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This n8n workflow monitors your `.set` files every 6 hours and alerts you if there are issues like:
|
||||||
|
- Invalid variable names (typos)
|
||||||
|
- Missing critical parameters
|
||||||
|
- Overly restrictive settings blocking trades
|
||||||
|
- Weekend protection disabled
|
||||||
|
- Files not tracked in git
|
||||||
|
|
||||||
|
## Files Included
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
|------|---------|
|
||||||
|
| `n8n-workflow-simple.json` | Simple workflow (recommended) |
|
||||||
|
| `n8n-workflow-check-sets.json` | Advanced workflow with Discord |
|
||||||
|
| `scripts/validate-settings.sh` | Validation script |
|
||||||
|
|
||||||
|
## Quick Setup (Simple Workflow)
|
||||||
|
|
||||||
|
### 1. Install N8N
|
||||||
|
```bash
|
||||||
|
# Using Docker
|
||||||
|
docker run -it --rm \
|
||||||
|
--name n8n \
|
||||||
|
-p 5678:5678 \
|
||||||
|
-v ~/.n8n:/home/node/.n8n \
|
||||||
|
n8nio/n8n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Import Workflow
|
||||||
|
1. Open N8N: http://localhost:5678
|
||||||
|
2. Click **"Add Workflow"**
|
||||||
|
3. Click **"Import from File"**
|
||||||
|
4. Select `n8n-workflow-simple.json`
|
||||||
|
|
||||||
|
### 3. Configure Environment Variables
|
||||||
|
|
||||||
|
Add these to your n8n credentials or `.env`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Telegram Notifications (recommended)
|
||||||
|
TELEGRAM_BOT_TOKEN=your_bot_token
|
||||||
|
TELEGRAM_CHAT_ID=your_chat_id
|
||||||
|
|
||||||
|
# Optional: Email Notifications
|
||||||
|
ALERT_EMAIL=garfield@fetcherpay.com
|
||||||
|
|
||||||
|
# Optional: Discord Notifications
|
||||||
|
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Get Telegram Chat ID
|
||||||
|
|
||||||
|
1. Message @userinfobot on Telegram - it will give you your ID
|
||||||
|
2. Or use @getidsbot
|
||||||
|
|
||||||
|
### 5. Activate Workflow
|
||||||
|
|
||||||
|
1. Open the imported workflow
|
||||||
|
2. Click **"Active"** toggle (top right)
|
||||||
|
3. Click **"Save"**
|
||||||
|
|
||||||
|
## Validation Script
|
||||||
|
|
||||||
|
You can also run the validation manually:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run validation
|
||||||
|
./scripts/validate-settings.sh
|
||||||
|
|
||||||
|
# Run from anywhere
|
||||||
|
/home/garfield/mql-trading-bots/scripts/validate-settings.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## What It Checks
|
||||||
|
|
||||||
|
| Check | Description | Alert Level |
|
||||||
|
|-------|-------------|-------------|
|
||||||
|
| File count | Ensures .set files exist | Error |
|
||||||
|
| Invalid variables | Finds typos like `InpMinConfluenceStrength` | Error |
|
||||||
|
| Missing parameters | Checks critical params exist | Error |
|
||||||
|
| High strength | Warns if `InpMinStrength` > 0.8 | Warning |
|
||||||
|
| Debug mode | Warns if debug disabled | Warning |
|
||||||
|
| Weekend protection | Ensures `InpCloseBeforeWeekend=true` | Error |
|
||||||
|
| Git status | Warns about untracked files | Warning |
|
||||||
|
|
||||||
|
## Sample Telegram Alert
|
||||||
|
|
||||||
|
```
|
||||||
|
🚨 MQL Settings Issues Found:
|
||||||
|
|
||||||
|
ISSUE: confluence-eurusd.set missing: InpCloseBeforeWeekend
|
||||||
|
ISSUE: confluence-usdjpy.set missing: InpCloseBeforeWeekend
|
||||||
|
WARNING: High strength thresholds (may block trades):
|
||||||
|
- confluence-gbpusd.set: InpMinStrength=0.80
|
||||||
|
|
||||||
|
⏰ 2026-03-30 14:30
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sample Success Message
|
||||||
|
|
||||||
|
```
|
||||||
|
✅ Settings check passed
|
||||||
|
|
||||||
|
Confluence settings: 13 files
|
||||||
|
Grid settings: 13 files
|
||||||
|
✓ No invalid variable names found
|
||||||
|
✓ All files have weekend protection enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scheduling Options
|
||||||
|
|
||||||
|
Edit the Schedule Trigger node to change frequency:
|
||||||
|
|
||||||
|
| Frequency | Settings |
|
||||||
|
|-----------|----------|
|
||||||
|
| Every 15 minutes | `interval: 15 minutes` |
|
||||||
|
| Every hour | `interval: 1 hour` |
|
||||||
|
| Every 6 hours | `interval: 6 hours` (default) |
|
||||||
|
| Daily at 9am | `cron: 0 9 * * *` |
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### No alerts received
|
||||||
|
- Check Telegram bot token is valid
|
||||||
|
- Verify chat ID is correct
|
||||||
|
- Check n8n execution log
|
||||||
|
|
||||||
|
### Script fails with permission denied
|
||||||
|
```bash
|
||||||
|
chmod +x /home/garfield/mql-trading-bots/scripts/validate-settings.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Workflow shows error
|
||||||
|
- Ensure n8n can access `/home/garfield/mql-trading-bots`
|
||||||
|
- Check that script exists and is executable
|
||||||
|
|
||||||
|
## Advanced: Custom Checks
|
||||||
|
|
||||||
|
Edit `scripts/validate-settings.sh` to add your own checks:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example: Check for specific EA version
|
||||||
|
grep -q "EA_Version=1.16" *.set || echo "ISSUE: Files not updated to v1.16"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [AGENTS.md](AGENTS.md) - Project context
|
||||||
|
- [SETTINGS_GUIDE.md](SETTINGS_GUIDE.md) - Settings documentation
|
||||||
41
confluence-aggressive.set
Normal file
41
confluence-aggressive.set
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
; === MultiSignal Confluence EA - AGGRESSIVE Settings ===
|
||||||
|
; Maximum trades, higher risk per trade
|
||||||
|
; WARNING: Only use with small accounts or demo!
|
||||||
|
; Timeframe: H1
|
||||||
|
|
||||||
|
; === Confluence Settings ===
|
||||||
|
InpMinConfluence=1 ; Single signal enough
|
||||||
|
InpMinStrength=0.50 ; Very low threshold
|
||||||
|
InpRequireAllAgree=false ; Take any dominant signal
|
||||||
|
|
||||||
|
; === Risk Management ===
|
||||||
|
InpLotSize=0.01
|
||||||
|
InpUseRiskPercent=true
|
||||||
|
InpRiskPercent=1.5 ; Higher risk per trade
|
||||||
|
InpStopLoss=80 ; Tighter stops
|
||||||
|
InpTakeProfit=160 ; 1:2 R:R
|
||||||
|
InpUseTrailingStop=true
|
||||||
|
InpTrailingStart=40
|
||||||
|
InpTrailingStop=25
|
||||||
|
InpTrailingStep=5
|
||||||
|
InpMaxPositions=5 ; More concurrent positions
|
||||||
|
InpMaxDailyDrawdown=5.0 ; Allow more daily risk
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|
||||||
|
; === Filters (MINIMAL) ===
|
||||||
|
InpUseTrendFilter=false
|
||||||
|
InpTrendMAPeriod=50
|
||||||
|
InpUseVolatilityFilter=false
|
||||||
|
InpATRPeriod=14
|
||||||
|
InpMinATRPercent=0.2
|
||||||
|
InpUseADXFilter=false
|
||||||
|
InpADXPeriod=14
|
||||||
|
InpMinADX=15.0
|
||||||
|
|
||||||
|
; === EA Settings ===
|
||||||
|
InpMagicNumber=777777
|
||||||
|
InpSlippage=5 ; Allow more slippage
|
||||||
|
InpDebugMode=true
|
||||||
@@ -39,3 +39,7 @@ InpMinADX=20.0 ; Standard trend strength
|
|||||||
InpMagicNumber=777777
|
InpMagicNumber=777777
|
||||||
InpSlippage=3
|
InpSlippage=3
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -39,3 +39,7 @@ InpMinADX=23.0 ; Moderate trend strength
|
|||||||
InpMagicNumber=777775
|
InpMagicNumber=777775
|
||||||
InpSlippage=4
|
InpSlippage=4
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
; === MultiSignal Confluence EA - EURUSD Settings ===
|
; === MultiSignal Confluence EA - EURUSD Settings ===
|
||||||
; Balanced settings for major pair
|
; Balanced settings for most liquid pair
|
||||||
; Timeframe: H1
|
; Timeframe: H1
|
||||||
|
|
||||||
; === Confluence Settings ===
|
; === Confluence Settings ===
|
||||||
InpMinConfluence=2
|
InpMinConfluence=2
|
||||||
InpMinStrength=0.70
|
InpMinStrength=0.70 ; MODERATE: Not too strict
|
||||||
InpRequireAllAgree=true
|
InpRequireAllAgree=false ; CHANGED: Allow if buy signals dominate
|
||||||
|
|
||||||
; === Risk Management ===
|
; === Risk Management ===
|
||||||
InpLotSize=0.01
|
InpLotSize=0.01
|
||||||
@@ -15,22 +15,26 @@ InpStopLoss=100 ; Standard 10 pips
|
|||||||
InpTakeProfit=200 ; 1:2 R:R
|
InpTakeProfit=200 ; 1:2 R:R
|
||||||
InpUseTrailingStop=true
|
InpUseTrailingStop=true
|
||||||
InpTrailingStart=50
|
InpTrailingStart=50
|
||||||
InpTrailingStep=50
|
InpTrailingStop=30
|
||||||
InpTrailingStop=50
|
InpTrailingStep=10
|
||||||
InpMaxPositions=3
|
InpMaxPositions=3
|
||||||
InpMaxDailyDrawdown=3.0
|
InpMaxDailyDrawdown=3.0
|
||||||
|
|
||||||
; === Filters ===
|
; === Weekend Protection ===
|
||||||
InpUseTrendFilter=true ; Enable trend filter for major pair
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|
||||||
|
; === Filters (MODERATE) ===
|
||||||
|
InpUseTrendFilter=false ; CHANGED: Let confluence work, not MA
|
||||||
InpTrendMAPeriod=50
|
InpTrendMAPeriod=50
|
||||||
InpUseVolatilityFilter=true
|
InpUseVolatilityFilter=true
|
||||||
InpATRPeriod=14
|
InpATRPeriod=14
|
||||||
InpMinATRPercent=0.3
|
InpMinATRPercent=0.25 ; RELAXED: Was 0.3
|
||||||
InpUseADXFilter=true
|
InpUseADXFilter=true
|
||||||
InpADXPeriod=14
|
InpADXPeriod=14
|
||||||
InpMinADX=20.0
|
InpMinADX=18.0 ; RELAXED: Was 20
|
||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
InpMagicNumber=777772
|
InpMagicNumber=777772
|
||||||
InpSlippage=3
|
InpSlippage=3
|
||||||
InpDebugMode=false
|
InpDebugMode=true ; CHANGED: See what's happening!
|
||||||
|
|||||||
@@ -1,50 +1,40 @@
|
|||||||
; === MultiSignal Confluence EA - GBPJPY Settings ===
|
; === MultiSignal Confluence EA - GBPJPY Settings ===
|
||||||
; GBPJPY (The Beast) - EXTREME VOLATILITY WARNING
|
; Volatile pair - still selective but not too restrictive
|
||||||
; Timeframe: H1
|
; Timeframe: H1
|
||||||
; Characteristics: Most volatile major pair, 200+ pip moves possible
|
|
||||||
; WARNING: Use with extreme caution - not for beginners
|
|
||||||
|
|
||||||
; === Confluence Settings ===
|
; === Confluence Settings ===
|
||||||
InpMinConfluence=2
|
InpMinConfluence=2
|
||||||
InpMinStrength=0.85 ; VERY HIGH threshold - only strongest signals
|
InpMinStrength=0.75 ; RELAXED: Was 0.85 (too high!)
|
||||||
InpRequireAllAgree=true
|
InpRequireAllAgree=false ; CHANGED: Allow dominant signals
|
||||||
|
|
||||||
; === Risk Management ===
|
; === Risk Management ===
|
||||||
InpLotSize=0.01
|
InpLotSize=0.01
|
||||||
InpUseRiskPercent=true
|
InpUseRiskPercent=true
|
||||||
InpRiskPercent=0.5 ; HALF normal risk - extreme volatility
|
InpRiskPercent=0.8 ; LOWER risk for volatile pair
|
||||||
InpStopLoss=200 ; 20 pips - wide but can be blown through
|
InpStopLoss=200 ; Wider stops for volatility (200 points = ~14 pips)
|
||||||
InpTakeProfit=400 ; 1:2 R:R
|
InpTakeProfit=400 ; 1:2 R:R
|
||||||
InpUseTrailingStop=true
|
InpUseTrailingStop=true
|
||||||
InpTrailingStart=100
|
InpTrailingStart=100 ; Wider trailing start
|
||||||
InpTrailingStep=50
|
InpTrailingStop=50 ; Wider trailing distance
|
||||||
InpTrailingStop=80
|
InpTrailingStep=20
|
||||||
InpMaxPositions=2 ; MAX 2 positions only
|
InpMaxPositions=2 ; Fewer positions for volatile pair
|
||||||
InpMaxDailyDrawdown=2.0 ; Conservative daily limit
|
InpMaxDailyDrawdown=3.0
|
||||||
|
|
||||||
; === Filters - STRICT ===
|
; === Weekend Protection ===
|
||||||
InpUseTrendFilter=true ; ENABLE to help avoid chop
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|
||||||
|
; === Filters (IMPORTANT for volatile pair) ===
|
||||||
|
InpUseTrendFilter=false ; CHANGED: Was true
|
||||||
InpTrendMAPeriod=50
|
InpTrendMAPeriod=50
|
||||||
InpUseVolatilityFilter=true
|
InpUseVolatilityFilter=true
|
||||||
InpATRPeriod=14
|
InpATRPeriod=14
|
||||||
InpMinATRPercent=1.2 ; VERY HIGH - only high volatility
|
InpMinATRPercent=0.4 ; Higher minimum for volatility
|
||||||
InpUseADXFilter=true
|
InpUseADXFilter=true ; Keep ADX for trend confirmation
|
||||||
InpADXPeriod=14
|
InpADXPeriod=14
|
||||||
InpMinADX=28.0 ; Strong trend required
|
InpMinADX=20.0 ; RELAXED: Was 28
|
||||||
|
|
||||||
; === CRITICAL WARNINGS ===
|
|
||||||
; GBPJPY can gap 100+ pips on weekend open
|
|
||||||
; Can move 200-500 pips in minutes during news
|
|
||||||
; Known as "The Beast" or "The Dragon"
|
|
||||||
; Requires constant monitoring
|
|
||||||
; NOT RECOMMENDED for accounts under $10,000
|
|
||||||
|
|
||||||
; === News to AVOID ===
|
|
||||||
; UK: GDP, Employment, Inflation, BOE meetings, Brexit news
|
|
||||||
; Japan: BOJ meetings, Tankan, GDP, intervention threats
|
|
||||||
; Global: Risk-off events (massive JPY appreciation)
|
|
||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
InpMagicNumber=777780
|
InpMagicNumber=777780
|
||||||
InpSlippage=10 ; High slippage tolerance
|
InpSlippage=5 ; Higher slippage tolerance
|
||||||
InpDebugMode=true ; Keep debug on for monitoring
|
InpDebugMode=true ; CHANGED: Monitor this volatile pair
|
||||||
|
|||||||
@@ -34,3 +34,7 @@ InpMinADX=22.0
|
|||||||
InpMagicNumber=777773
|
InpMagicNumber=777773
|
||||||
InpSlippage=5 ; Higher slippage tolerance
|
InpSlippage=5 ; Higher slippage tolerance
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -35,3 +35,7 @@ InpMinADX=21.0
|
|||||||
InpMagicNumber=777778
|
InpMagicNumber=777778
|
||||||
InpSlippage=4
|
InpSlippage=4
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -1,38 +1,40 @@
|
|||||||
; === Confluence Trading Settings (RELAXED for Low Volatility Market) ===
|
; === MultiSignal Confluence EA - RELAXED Settings ===
|
||||||
InpMinConfluence=2
|
; For maximum trade frequency - use when markets are active
|
||||||
InpMinConfluenceStrength=0.65
|
; Timeframe: H1
|
||||||
InpRequireAllAgree=true
|
|
||||||
InpMaxSignalAge=3
|
; === Confluence Settings ===
|
||||||
|
InpMinConfluence=1 ; REDUCED: Only 1 signal needed (was 2)
|
||||||
|
InpMinStrength=0.60 ; RELAXED: Lower threshold for more trades
|
||||||
|
InpRequireAllAgree=false ; CHANGED: Allow conflicting signals if one side dominates
|
||||||
|
|
||||||
; === Risk Management ===
|
; === Risk Management ===
|
||||||
InpLotSize=0.01
|
InpLotSize=0.01
|
||||||
InpRiskPercent=1.0
|
InpUseRiskPercent=true
|
||||||
|
InpRiskPercent=0.8 ; Slightly lower risk for more frequent trades
|
||||||
InpStopLoss=100
|
InpStopLoss=100
|
||||||
InpTakeProfit=200
|
InpTakeProfit=200
|
||||||
InpUseTrailingStop=true
|
InpUseTrailingStop=true
|
||||||
InpTrailingStart=50
|
InpTrailingStart=50
|
||||||
InpTrailingStep=75
|
|
||||||
InpTrailingStop=30
|
InpTrailingStop=30
|
||||||
|
InpTrailingStep=10
|
||||||
InpMaxPositions=3
|
InpMaxPositions=3
|
||||||
InpMaxDailyTrades=5
|
InpMaxDailyDrawdown=3.0
|
||||||
|
|
||||||
; === Confluence Indicator ===
|
; === Weekend Protection ===
|
||||||
InpIndicatorName=MultiSignal_Confluence
|
InpCloseBeforeWeekend=true
|
||||||
InpConfluenceBuffer=5
|
InpWeekendCloseHour=17
|
||||||
|
|
||||||
; === Filters (RELAXED) ===
|
; === Filters (RELAXED) ===
|
||||||
InpUseTrendFilter=false
|
InpUseTrendFilter=false ; DISABLED: Don't filter by trend
|
||||||
InpTrendMAPeriod=50
|
InpTrendMAPeriod=50
|
||||||
InpUseATRFilter=true
|
InpUseVolatilityFilter=false ; DISABLED: Trade all volatility conditions
|
||||||
InpATRPeriod=14
|
InpATRPeriod=14
|
||||||
InpMinATR=0.0002
|
InpMinATRPercent=0.3
|
||||||
InpAvoidWeekends=true
|
InpUseADXFilter=false ; DISABLED: Don't require ADX confirmation
|
||||||
|
InpADXPeriod=14
|
||||||
; === Alerts ===
|
InpMinADX=20.0
|
||||||
InpUseAlerts=true
|
|
||||||
InpUsePushNotifications=false
|
|
||||||
InpEmailAlerts=false
|
|
||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
InpMagicNumber=777777
|
InpMagicNumber=777777
|
||||||
InpSlippage=3
|
InpSlippage=3
|
||||||
|
InpDebugMode=true ; ENABLED: See why trades fire or don't fire
|
||||||
|
|||||||
40
confluence-standard.set
Normal file
40
confluence-standard.set
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
; === MultiSignal Confluence EA - STANDARD Settings ===
|
||||||
|
; Balanced for regular market conditions
|
||||||
|
; Timeframe: H1
|
||||||
|
|
||||||
|
; === Confluence Settings ===
|
||||||
|
InpMinConfluence=2 ; Need 2 signals to confirm
|
||||||
|
InpMinStrength=0.75 ; Moderate threshold
|
||||||
|
InpRequireAllAgree=false ; Allow if one side dominates by 2+ signals
|
||||||
|
|
||||||
|
; === Risk Management ===
|
||||||
|
InpLotSize=0.01
|
||||||
|
InpUseRiskPercent=true
|
||||||
|
InpRiskPercent=1.0
|
||||||
|
InpStopLoss=100
|
||||||
|
InpTakeProfit=200
|
||||||
|
InpUseTrailingStop=true
|
||||||
|
InpTrailingStart=50
|
||||||
|
InpTrailingStop=30
|
||||||
|
InpTrailingStep=10
|
||||||
|
InpMaxPositions=3
|
||||||
|
InpMaxDailyDrawdown=3.0
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|
||||||
|
; === Filters (MODERATE) ===
|
||||||
|
InpUseTrendFilter=false ; Let confluence determine direction
|
||||||
|
InpTrendMAPeriod=50
|
||||||
|
InpUseVolatilityFilter=true ; Filter very low volatility
|
||||||
|
InpATRPeriod=14
|
||||||
|
InpMinATRPercent=0.3
|
||||||
|
InpUseADXFilter=true ; Require some trend strength
|
||||||
|
InpADXPeriod=14
|
||||||
|
InpMinADX=18.0 ; RELAXED: Lower ADX threshold (was 20+)
|
||||||
|
|
||||||
|
; === EA Settings ===
|
||||||
|
InpMagicNumber=777777
|
||||||
|
InpSlippage=3
|
||||||
|
InpDebugMode=true ; See trade decisions in Experts tab
|
||||||
@@ -35,3 +35,7 @@ InpMinADX=22.0 ; Moderate trend strength
|
|||||||
InpMagicNumber=777776
|
InpMagicNumber=777776
|
||||||
InpSlippage=4
|
InpSlippage=4
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -39,3 +39,7 @@ InpMinADX=25.0 ; Higher - need strong trend
|
|||||||
InpMagicNumber=777779
|
InpMagicNumber=777779
|
||||||
InpSlippage=3
|
InpSlippage=3
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -1,36 +1,40 @@
|
|||||||
; === MultiSignal Confluence EA - USDJPY Settings ===
|
; === MultiSignal Confluence EA - USDJPY Settings ===
|
||||||
; Optimized for trending JPY pairs
|
; Trending pair - moderate settings
|
||||||
; Timeframe: H1
|
; Timeframe: H1
|
||||||
|
|
||||||
; === Confluence Settings ===
|
; === Confluence Settings ===
|
||||||
InpMinConfluence=2
|
InpMinConfluence=2
|
||||||
InpMinStrength=0.75 ; Higher threshold for quality signals
|
InpMinStrength=0.70 ; RELAXED: Was 0.75
|
||||||
InpRequireAllAgree=true
|
InpRequireAllAgree=false ; CHANGED: Allow dominant signals
|
||||||
|
|
||||||
; === Risk Management ===
|
; === Risk Management ===
|
||||||
InpLotSize=0.01
|
InpLotSize=0.01
|
||||||
InpUseRiskPercent=true
|
InpUseRiskPercent=true
|
||||||
InpRiskPercent=1.0 ; 1% risk per trade
|
InpRiskPercent=1.0
|
||||||
InpStopLoss=80 ; Tighter SL for JPY (8 pips)
|
InpStopLoss=80 ; Tighter for JPY pairs (80 points = ~7 pips)
|
||||||
InpTakeProfit=240 ; 1:3 R:R for trending pairs
|
InpTakeProfit=240 ; 1:3 R:R for trending pair
|
||||||
InpUseTrailingStop=true
|
InpUseTrailingStop=true
|
||||||
InpTrailingStart=50
|
InpTrailingStart=50
|
||||||
InpTrailingStep=30
|
InpTrailingStop=30
|
||||||
InpTrailingStop=40
|
InpTrailingStep=10
|
||||||
InpMaxPositions=3
|
InpMaxPositions=3
|
||||||
InpMaxDailyDrawdown=3.0 ; Stop after 3% daily loss
|
InpMaxDailyDrawdown=3.0
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|
||||||
; === Filters ===
|
; === Filters ===
|
||||||
InpUseTrendFilter=false ; Let confluence determine direction
|
InpUseTrendFilter=false ; CHANGED: Was true
|
||||||
InpTrendMAPeriod=50
|
InpTrendMAPeriod=50
|
||||||
InpUseVolatilityFilter=true
|
InpUseVolatilityFilter=true
|
||||||
InpATRPeriod=14
|
InpATRPeriod=14
|
||||||
InpMinATRPercent=0.4
|
InpMinATRPercent=0.25
|
||||||
InpUseADXFilter=true
|
InpUseADXFilter=true
|
||||||
InpADXPeriod=14
|
InpADXPeriod=14
|
||||||
InpMinADX=25.0 ; Stronger trend required for JPY
|
InpMinADX=18.0 ; RELAXED: Was 25
|
||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
InpMagicNumber=777771
|
InpMagicNumber=777771
|
||||||
InpSlippage=3
|
InpSlippage=3
|
||||||
InpDebugMode=false
|
InpDebugMode=true ; CHANGED: See trade decisions
|
||||||
|
|||||||
@@ -34,3 +34,7 @@ InpMinADX=20.0
|
|||||||
InpMagicNumber=777774
|
InpMagicNumber=777774
|
||||||
InpSlippage=10 ; High slippage tolerance for gold
|
InpSlippage=10 ; High slippage tolerance for gold
|
||||||
InpDebugMode=false
|
InpDebugMode=false
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -47,3 +47,7 @@ InpMaxDailyDrawdown=2.5
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333007
|
MagicNum=333007
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -43,3 +43,7 @@ InpMaxDailyDrawdown=2.5
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333005
|
MagicNum=333005
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -48,3 +48,7 @@ InpMaxDailyDrawdown=3.0 ; Standard for major pair
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333011
|
MagicNum=333011
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -52,3 +52,7 @@ InpMaxDailyDrawdown=1.5 ; VERY conservative
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333014
|
MagicNum=333014
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -50,3 +50,7 @@ InpMaxDailyDrawdown=2.0 ; Conservative (volatile)
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333013
|
MagicNum=333013
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -43,3 +43,7 @@ InpMaxDailyDrawdown=3.0
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333003
|
MagicNum=333003
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -47,3 +47,7 @@ InpMaxDailyDrawdown=2.5
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333008
|
MagicNum=333008
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -43,3 +43,7 @@ InpMaxDailyDrawdown=2.0 ; Conservative daily limit
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333001
|
MagicNum=333001
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -47,3 +47,7 @@ InpMaxDailyDrawdown=2.5
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333006
|
MagicNum=333006
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -48,3 +48,7 @@ InpMaxDailyDrawdown=2.0 ; Conservative (SNB risk)
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333009
|
MagicNum=333009
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -49,3 +49,7 @@ InpMaxDailyDrawdown=2.5 ; Conservative (trending pair)
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333012
|
MagicNum=333012
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -43,3 +43,7 @@ InpMaxDailyDrawdown=2.0 ; Conservative limit for volatile pairs
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333002
|
MagicNum=333002
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
@@ -49,3 +49,7 @@ InpMaxDailyDrawdown=1.5 ; VERY conservative
|
|||||||
|
|
||||||
; === EA Settings ===
|
; === EA Settings ===
|
||||||
MagicNum=333010
|
MagicNum=333010
|
||||||
|
|
||||||
|
; === Weekend Protection ===
|
||||||
|
InpCloseBeforeWeekend=true
|
||||||
|
InpWeekendCloseHour=17
|
||||||
|
|||||||
411
n8n-workflow-check-sets.json
Normal file
411
n8n-workflow-check-sets.json
Normal file
@@ -0,0 +1,411 @@
|
|||||||
|
{
|
||||||
|
"name": "MQL Trading Bots - Settings Validator",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"rule": {
|
||||||
|
"interval": [
|
||||||
|
{
|
||||||
|
"field": "hours",
|
||||||
|
"hoursInterval": 6
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Schedule Trigger",
|
||||||
|
"type": "n8n-nodes-base.scheduleTrigger",
|
||||||
|
"typeVersion": 1.1,
|
||||||
|
"position": [
|
||||||
|
250,
|
||||||
|
300
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && ls -la *.set 2>/dev/null | wc -l"
|
||||||
|
},
|
||||||
|
"name": "Count Set Files",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
450,
|
||||||
|
300
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"conditions": {
|
||||||
|
"options": {
|
||||||
|
"caseSensitive": true,
|
||||||
|
"leftValue": "",
|
||||||
|
"typeValidation": "strict"
|
||||||
|
},
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"id": "8ef4b80d-8c5a-4ea3-9a5a-b8be7355f4a7",
|
||||||
|
"leftValue": "={{ $json.stdout }}",
|
||||||
|
"rightValue": "0",
|
||||||
|
"operator": {
|
||||||
|
"type": "number",
|
||||||
|
"operation": "notEquals"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Files Exist?",
|
||||||
|
"type": "n8n-nodes-base.if",
|
||||||
|
"typeVersion": 2,
|
||||||
|
"position": [
|
||||||
|
650,
|
||||||
|
300
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && for f in confluence-*.set; do echo \"=== $f ===\"; grep -E 'InpMinStrength|InpMinConfluence|InpRequireAllAgree|InpDebugMode' \"$f\" | grep -v '^;'; done"
|
||||||
|
},
|
||||||
|
"name": "Check Confluence Sets",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
850,
|
||||||
|
200
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && for f in grid-*.set; do echo \"=== $f ===\"; grep -E 'MaxLevels|InpMaxDailyDrawdown|InpCloseBeforeWeekend' \"$f\" | grep -v '^;'; done"
|
||||||
|
},
|
||||||
|
"name": "Check Grid Sets",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
850,
|
||||||
|
400
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && grep -l 'InpMinConfluenceStrength' confluence-*.set 2>/dev/null || echo 'No invalid variables found'"
|
||||||
|
},
|
||||||
|
"name": "Check Invalid Variables",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
1050,
|
||||||
|
200
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && grep 'InpDebugMode=false' confluence-*.set grid-*.set 2>/dev/null | wc -l"
|
||||||
|
},
|
||||||
|
"name": "Count Debug Off",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
1050,
|
||||||
|
400
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"conditions": {
|
||||||
|
"options": {
|
||||||
|
"caseSensitive": true,
|
||||||
|
"leftValue": "",
|
||||||
|
"typeValidation": "strict"
|
||||||
|
},
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"id": "e6b7c7d1-6d61-413f-90a4-5ce2e8b7dc2e",
|
||||||
|
"leftValue": "={{ $json.stdout }}",
|
||||||
|
"rightValue": "No invalid",
|
||||||
|
"operator": {
|
||||||
|
"type": "string",
|
||||||
|
"operation": "notContains"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Invalid Vars Found?",
|
||||||
|
"type": "n8n-nodes-base.if",
|
||||||
|
"typeVersion": 2,
|
||||||
|
"position": [
|
||||||
|
1250,
|
||||||
|
200
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"conditions": {
|
||||||
|
"options": {
|
||||||
|
"caseSensitive": true,
|
||||||
|
"leftValue": "",
|
||||||
|
"typeValidation": "strict"
|
||||||
|
},
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"id": "b7c8d9e0-f1a2-4b3c-5d6e-7f8a9b0c1d2e",
|
||||||
|
"leftValue": "={{ $json.stdout }}",
|
||||||
|
"rightValue": "0",
|
||||||
|
"operator": {
|
||||||
|
"type": "number",
|
||||||
|
"operation": "notEquals"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Debug Disabled?",
|
||||||
|
"type": "n8n-nodes-base.if",
|
||||||
|
"typeVersion": 2,
|
||||||
|
"position": [
|
||||||
|
1250,
|
||||||
|
400
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"name": "Merge Issues",
|
||||||
|
"type": "n8n-nodes-base.merge",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [
|
||||||
|
1450,
|
||||||
|
300
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"to": "={{ $env.ALERT_EMAIL }}",
|
||||||
|
"subject": "🚨 MQL Settings Issues Detected",
|
||||||
|
"text": "=Issues found in MQL Trading Bots settings:
|
||||||
|
|
||||||
|
Invalid Variables Found:
|
||||||
|
{{ $('Check Invalid Variables').item.json.stdout }}
|
||||||
|
|
||||||
|
Files with Debug Disabled: {{ $('Count Debug Off').item.json.stdout }}
|
||||||
|
|
||||||
|
Confluence Settings:
|
||||||
|
{{ $('Check Confluence Sets').item.json.stdout }}
|
||||||
|
|
||||||
|
Grid Settings:
|
||||||
|
{{ $('Check Grid Sets').item.json.stdout }}
|
||||||
|
|
||||||
|
Please review and fix ASAP.
|
||||||
|
|
||||||
|
Server: {{ $env.HOSTNAME }}
|
||||||
|
Time: {{ $now }}"
|
||||||
|
},
|
||||||
|
"name": "Send Alert Email",
|
||||||
|
"type": "n8n-nodes-base.emailSend",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [
|
||||||
|
1650,
|
||||||
|
200
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"content": "={{$json}}",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"name": "No Action Needed",
|
||||||
|
"type": "n8n-nodes-base.noOp",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
1650,
|
||||||
|
500
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && git diff --name-only HEAD~1 2>/dev/null | grep '\.set$' || echo 'No recent set file changes'"
|
||||||
|
},
|
||||||
|
"name": "Check Recent Changes",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [
|
||||||
|
850,
|
||||||
|
600
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"webhookUri": "={{ $env.DISCORD_WEBHOOK_URL }}",
|
||||||
|
"text": "={ '🚨 **MQL Settings Alert**' if $json.stdout != 'No recent set file changes' and $json.stdout != '' else '✅ **MQL Settings Check** - All OK' }",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"name": "Discord Notification",
|
||||||
|
"type": "n8n-nodes-base.discord",
|
||||||
|
"typeVersion": 2,
|
||||||
|
"position": [
|
||||||
|
1250,
|
||||||
|
600
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pinData": {},
|
||||||
|
"settings": {
|
||||||
|
"executionOrder": "v1"
|
||||||
|
},
|
||||||
|
"staticData": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "trading",
|
||||||
|
"id": "trading-tag",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-01T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mql5",
|
||||||
|
"id": "mql5-tag",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": {
|
||||||
|
"Schedule Trigger": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Count Set Files",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Count Set Files": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Files Exist?",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Files Exist?": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Check Confluence Sets",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Check Grid Sets",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Check Recent Changes",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "No Action Needed",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Check Confluence Sets": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Check Invalid Variables",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Check Grid Sets": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Count Debug Off",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Check Invalid Variables": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Invalid Vars Found?",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Count Debug Off": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Debug Disabled?",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Invalid Vars Found?": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Merge Issues",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Debug Disabled?": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Merge Issues",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Merge Issues": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Send Alert Email",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Check Recent Changes": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Discord Notification",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
89
n8n-workflow-http.json
Normal file
89
n8n-workflow-http.json
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
{
|
||||||
|
"name": "MQL Settings Monitor - HTTP Version",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"rule": {
|
||||||
|
"interval": [
|
||||||
|
{
|
||||||
|
"field": "hours",
|
||||||
|
"hoursInterval": 6
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Every 6 Hours",
|
||||||
|
"type": "n8n-nodes-base.scheduleTrigger",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [250, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"requestMethod": "POST",
|
||||||
|
"url": "http://localhost:8080/validate",
|
||||||
|
"options": {
|
||||||
|
"timeout": 30000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Call Validation API",
|
||||||
|
"type": "n8n-nodes-base.httpRequest",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [450, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"conditions": {
|
||||||
|
"string": [
|
||||||
|
{
|
||||||
|
"value1": "={{ $json.status }}",
|
||||||
|
"operation": "equal",
|
||||||
|
"value2": "error"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Has Issues?",
|
||||||
|
"type": "n8n-nodes-base.if",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [650, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"chatId": "={{ $env.TELEGRAM_CHAT_ID }}",
|
||||||
|
"text": "=🚨 MQL Settings Alert:\n\n{{ $json.message }}\n\nIssues: {{ $json.issues }}\n\n⏰ {{ new Date().toISOString() }}"
|
||||||
|
},
|
||||||
|
"name": "Send Telegram",
|
||||||
|
"type": "n8n-nodes-base.telegram",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [850, 200]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {},
|
||||||
|
"name": "No Action",
|
||||||
|
"type": "n8n-nodes-base.noOp",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [850, 400]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": {
|
||||||
|
"Every 6 Hours": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Call Validation API", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Call Validation API": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Has Issues?", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Has Issues?": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Send Telegram", "type": "main", "index": 0 }],
|
||||||
|
[{ "node": "No Action", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"settings": {},
|
||||||
|
"staticData": null,
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
88
n8n-workflow-simple.json
Normal file
88
n8n-workflow-simple.json
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"name": "MQL Settings Monitor - Simple",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"rule": {
|
||||||
|
"interval": [
|
||||||
|
{
|
||||||
|
"field": "hours",
|
||||||
|
"hoursInterval": 6
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Every 6 Hours",
|
||||||
|
"type": "n8n-nodes-base.scheduleTrigger",
|
||||||
|
"typeVersion": 1.1,
|
||||||
|
"position": [250, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "cd /home/garfield/mql-trading-bots && ./scripts/validate-settings.sh"
|
||||||
|
},
|
||||||
|
"name": "Run Validation Script",
|
||||||
|
"type": "n8n-nodes-base.executeCommand",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [450, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"conditions": {
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"leftValue": "={{ $json.stdout }}",
|
||||||
|
"operator": "contains",
|
||||||
|
"rightValue": "ISSUE"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Issues Found?",
|
||||||
|
"type": "n8n-nodes-base.if",
|
||||||
|
"typeVersion": 2,
|
||||||
|
"position": [650, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"chatId": "={{ $env.TELEGRAM_CHAT_ID }}",
|
||||||
|
"text": "=🚨 MQL Settings Issues Found:\n\n{{ $json.stdout }}\n\n⏰ {{ $now.format('YYYY-MM-DD HH:mm') }}"
|
||||||
|
},
|
||||||
|
"name": "Send Telegram Alert",
|
||||||
|
"type": "n8n-nodes-base.telegram",
|
||||||
|
"typeVersion": 1.1,
|
||||||
|
"position": [850, 200]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"content": "=✅ Settings check passed\n\n{{ $json.stdout }}",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"name": "Success - No Action",
|
||||||
|
"type": "n8n-nodes-base.noOp",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [850, 400]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": {
|
||||||
|
"Every 6 Hours": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Run Validation Script", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Run Validation Script": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Issues Found?", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Issues Found?": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Send Telegram Alert", "type": "main", "index": 0 }],
|
||||||
|
[{ "node": "Success - No Action", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"executionOrder": "v1"
|
||||||
|
}
|
||||||
|
}
|
||||||
98
n8n-workflow-ssh.json
Normal file
98
n8n-workflow-ssh.json
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
{
|
||||||
|
"name": "MQL Settings Monitor - SSH Version",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"rule": {
|
||||||
|
"interval": [
|
||||||
|
{
|
||||||
|
"field": "hours",
|
||||||
|
"hoursInterval": 6
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Every 6 Hours",
|
||||||
|
"type": "n8n-nodes-base.scheduleTrigger",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [250, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"command": "/home/garfield/mql-trading-bots/scripts/validate-settings.sh",
|
||||||
|
"cwd": "/home/garfield/mql-trading-bots"
|
||||||
|
},
|
||||||
|
"name": "Run Validation Script",
|
||||||
|
"type": "n8n-nodes-base.ssh",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [450, 300],
|
||||||
|
"credentials": {
|
||||||
|
"sshPassword": {
|
||||||
|
"id": "local-ssh",
|
||||||
|
"name": "Local SSH"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"conditions": {
|
||||||
|
"number": [
|
||||||
|
{
|
||||||
|
"value1": "={{ $json.code }}",
|
||||||
|
"operation": "notEqual",
|
||||||
|
"value2": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Issues Found?",
|
||||||
|
"type": "n8n-nodes-base.if",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [650, 300]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"chatId": "={{ $env.TELEGRAM_CHAT_ID }}",
|
||||||
|
"text": "=🚨 MQL Settings Issues:\n\n{{ $json.stdout }}\n\n⏰ {{ new Date().toISOString() }}"
|
||||||
|
},
|
||||||
|
"name": "Send Telegram Alert",
|
||||||
|
"type": "n8n-nodes-base.telegram",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [850, 200],
|
||||||
|
"credentials": {
|
||||||
|
"telegramApi": {
|
||||||
|
"id": "telegram-bot",
|
||||||
|
"name": "Telegram Bot"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {},
|
||||||
|
"name": "No Issues",
|
||||||
|
"type": "n8n-nodes-base.noOp",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [850, 400]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": {
|
||||||
|
"Every 6 Hours": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Run Validation Script", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Run Validation Script": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Issues Found?", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Issues Found?": {
|
||||||
|
"main": [
|
||||||
|
[{ "node": "Send Telegram Alert", "type": "main", "index": 0 }],
|
||||||
|
[{ "node": "No Issues", "type": "main", "index": 0 }]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"settings": {},
|
||||||
|
"staticData": null,
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
27
scripts/setup-cron.sh
Executable file
27
scripts/setup-cron.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Setup cron job for MQL settings monitoring
|
||||||
|
|
||||||
|
echo "Setting up cron job for MQL settings monitoring..."
|
||||||
|
|
||||||
|
# Check if python3 is available
|
||||||
|
if ! command -v python3 &> /dev/null; then
|
||||||
|
echo "ERROR: python3 not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create cron entry
|
||||||
|
CRON_CMD="0 */6 * * * cd /home/garfield/mql-trading-bots && python3 scripts/validate-and-notify.py >> /tmp/mql-validate.log 2>&1"
|
||||||
|
|
||||||
|
# Add to crontab
|
||||||
|
(crontab -l 2>/dev/null; echo "$CRON_CMD") | crontab -
|
||||||
|
|
||||||
|
echo "Cron job added: Runs every 6 hours"
|
||||||
|
echo "Logs: /tmp/mql-validate.log"
|
||||||
|
echo ""
|
||||||
|
echo "To configure Telegram notifications, set these environment variables:"
|
||||||
|
echo " export TELEGRAM_BOT_TOKEN='your_bot_token'"
|
||||||
|
echo " export TELEGRAM_CHAT_ID='your_chat_id'"
|
||||||
|
echo ""
|
||||||
|
echo "Add these to your ~/.bashrc to persist:"
|
||||||
|
echo " echo 'export TELEGRAM_BOT_TOKEN=\"your_token\"' >> ~/.bashrc"
|
||||||
|
echo " echo 'export TELEGRAM_CHAT_ID=\"your_id\"' >> ~/.bashrc"
|
||||||
157
scripts/validate-and-notify.py
Executable file
157
scripts/validate-and-notify.py
Executable file
@@ -0,0 +1,157 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
MQL Settings Validator with Telegram Notifications
|
||||||
|
Run via cron: python3 validate-and-notify.py
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
try:
|
||||||
|
import requests
|
||||||
|
except ImportError:
|
||||||
|
print("Installing requests...")
|
||||||
|
subprocess.run([sys.executable, "-m", "pip", "install", "requests", "-q"])
|
||||||
|
import requests
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
|
||||||
|
TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")
|
||||||
|
REPO_DIR = "/home/garfield/mql-trading-bots"
|
||||||
|
|
||||||
|
def send_telegram(message):
|
||||||
|
"""Send message to Telegram"""
|
||||||
|
if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID:
|
||||||
|
print("Telegram not configured. Message:")
|
||||||
|
print(message)
|
||||||
|
return False
|
||||||
|
|
||||||
|
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
|
||||||
|
payload = {
|
||||||
|
"chat_id": TELEGRAM_CHAT_ID,
|
||||||
|
"text": message,
|
||||||
|
"parse_mode": "HTML"
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(url, json=payload, timeout=10)
|
||||||
|
return response.status_code == 200
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Failed to send Telegram: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_set_files():
|
||||||
|
"""Validate all .set files"""
|
||||||
|
issues = []
|
||||||
|
warnings = []
|
||||||
|
|
||||||
|
os.chdir(REPO_DIR)
|
||||||
|
|
||||||
|
# Check confluence files
|
||||||
|
confluence_files = [f for f in os.listdir(".") if f.startswith("confluence-") and f.endswith(".set")]
|
||||||
|
grid_files = [f for f in os.listdir(".") if f.startswith("grid-") and f.endswith(".set")]
|
||||||
|
|
||||||
|
print(f"Found {len(confluence_files)} confluence files, {len(grid_files)} grid files")
|
||||||
|
|
||||||
|
# Check for invalid variable names
|
||||||
|
invalid_pattern = re.compile(r'InpMinConfluenceStrength|MinConfluenceStrength', re.IGNORECASE)
|
||||||
|
for f in confluence_files:
|
||||||
|
with open(f, 'r') as file:
|
||||||
|
content = file.read()
|
||||||
|
if invalid_pattern.search(content):
|
||||||
|
issues.append(f"❌ <b>Invalid variable</b> in {f}: InpMinConfluenceStrength (should be InpMinStrength)")
|
||||||
|
|
||||||
|
# Check for missing critical parameters
|
||||||
|
critical_params_conf = ['InpMinConfluence', 'InpMinStrength', 'InpMagicNumber', 'InpCloseBeforeWeekend']
|
||||||
|
critical_params_grid = ['InpCloseBeforeWeekend', 'InpMaxDailyDrawdown']
|
||||||
|
|
||||||
|
for f in confluence_files:
|
||||||
|
with open(f, 'r') as file:
|
||||||
|
content = file.read()
|
||||||
|
for param in critical_params_conf:
|
||||||
|
if param not in content:
|
||||||
|
issues.append(f"❌ <b>Missing {param}</b> in {f}")
|
||||||
|
|
||||||
|
for f in grid_files:
|
||||||
|
with open(f, 'r') as file:
|
||||||
|
content = file.read()
|
||||||
|
for param in critical_params_grid:
|
||||||
|
if param not in content:
|
||||||
|
issues.append(f"❌ <b>Missing {param}</b> in {f}")
|
||||||
|
|
||||||
|
# Check for high strength thresholds (warnings)
|
||||||
|
for f in confluence_files:
|
||||||
|
with open(f, 'r') as file:
|
||||||
|
content = file.read()
|
||||||
|
match = re.search(r'InpMinStrength=(\d+\.?\d*)', content)
|
||||||
|
if match:
|
||||||
|
strength = float(match.group(1))
|
||||||
|
if strength >= 0.80:
|
||||||
|
warnings.append(f"⚠️ <b>High threshold</b> in {f}: {strength} (may block trades)")
|
||||||
|
|
||||||
|
# Check debug mode
|
||||||
|
debug_off = 0
|
||||||
|
for f in confluence_files + grid_files:
|
||||||
|
with open(f, 'r') as file:
|
||||||
|
content = file.read()
|
||||||
|
if 'InpDebugMode=false' in content:
|
||||||
|
debug_off += 1
|
||||||
|
|
||||||
|
if debug_off > 5:
|
||||||
|
warnings.append(f"⚠️ <b>Debug disabled</b> in {debug_off} files - you won't see trade decisions")
|
||||||
|
|
||||||
|
return issues, warnings, len(confluence_files), len(grid_files)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Main function"""
|
||||||
|
print("=" * 50)
|
||||||
|
print("MQL Settings Validator")
|
||||||
|
print(f"Time: {datetime.now().isoformat()}")
|
||||||
|
print("=" * 50)
|
||||||
|
|
||||||
|
issues, warnings, conf_count, grid_count = check_set_files()
|
||||||
|
|
||||||
|
# Build report
|
||||||
|
report_lines = [
|
||||||
|
"<b>📊 MQL Settings Check</b>",
|
||||||
|
f"Confluence files: {conf_count}",
|
||||||
|
f"Grid files: {grid_count}",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
|
||||||
|
if issues:
|
||||||
|
report_lines.append("<b>❌ Issues Found:</b>")
|
||||||
|
report_lines.extend(issues[:10]) # Limit to 10 issues
|
||||||
|
if len(issues) > 10:
|
||||||
|
report_lines.append(f"... and {len(issues) - 10} more issues")
|
||||||
|
report_lines.append("")
|
||||||
|
|
||||||
|
if warnings:
|
||||||
|
report_lines.append("<b>⚠️ Warnings:</b>")
|
||||||
|
report_lines.extend(warnings[:5])
|
||||||
|
report_lines.append("")
|
||||||
|
|
||||||
|
if not issues and not warnings:
|
||||||
|
report_lines.append("✅ <b>All checks passed!</b>")
|
||||||
|
report_lines.append("No issues found.")
|
||||||
|
|
||||||
|
report_lines.append(f"\n⏰ {datetime.now().strftime('%Y-%m-%d %H:%M')}")
|
||||||
|
|
||||||
|
report = "\n".join(report_lines)
|
||||||
|
print("\n" + report.replace('<b>', '').replace('</b>', ''))
|
||||||
|
|
||||||
|
# Send notification if issues found or if it's a scheduled check
|
||||||
|
if issues or warnings:
|
||||||
|
send_telegram(report)
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
# Only send success message on first run of the day
|
||||||
|
if datetime.now().hour == 9:
|
||||||
|
send_telegram(report)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
128
scripts/validate-settings.sh
Executable file
128
scripts/validate-settings.sh
Executable file
@@ -0,0 +1,128 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# MQL Trading Bot Settings Validator
|
||||||
|
# This script validates .set files for common issues
|
||||||
|
|
||||||
|
REPO_DIR="/home/garfield/mql-trading-bots"
|
||||||
|
cd "$REPO_DIR" || exit 1
|
||||||
|
|
||||||
|
ISSUES=0
|
||||||
|
echo "=== MQL Settings Validation Report ==="
|
||||||
|
echo "Date: $(date)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check 1: Count set files
|
||||||
|
echo "[INFO] Checking set files..."
|
||||||
|
CONFLUENCE_COUNT=$(ls -1 confluence-*.set 2>/dev/null | wc -l)
|
||||||
|
GRID_COUNT=$(ls -1 grid-*.set 2>/dev/null | wc -l)
|
||||||
|
echo " Confluence settings: $CONFLUENCE_COUNT files"
|
||||||
|
echo " Grid settings: $GRID_COUNT files"
|
||||||
|
|
||||||
|
if [ $CONFLUENCE_COUNT -eq 0 ] && [ $GRID_COUNT -eq 0 ]; then
|
||||||
|
echo "ISSUE: No .set files found!"
|
||||||
|
ISSUES=$((ISSUES + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 2: Invalid variable names (typos)
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Checking for invalid variable names..."
|
||||||
|
INVALID=$(grep -l "InpMinConfluenceStrength\|MinConfluenceStrength\|ConfluenceStrength" confluence-*.set 2>/dev/null)
|
||||||
|
if [ -n "$INVALID" ]; then
|
||||||
|
echo "ISSUE: Invalid variable names found:"
|
||||||
|
echo "$INVALID" | while read -r file; do
|
||||||
|
echo " - $file"
|
||||||
|
done
|
||||||
|
ISSUES=$((ISSUES + 1))
|
||||||
|
else
|
||||||
|
echo " ✓ No invalid variable names found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 3: Missing critical parameters in Confluence sets
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Checking Confluence settings completeness..."
|
||||||
|
for file in confluence-*.set; do
|
||||||
|
[ -f "$file" ] || continue
|
||||||
|
|
||||||
|
MISSING=""
|
||||||
|
grep -q "^InpMinConfluence=" "$file" || MISSING="$MISSING InpMinConfluence"
|
||||||
|
grep -q "^InpMinStrength=" "$file" || MISSING="$MISSING InpMinStrength"
|
||||||
|
grep -q "^InpRequireAllAgree=" "$file" || MISSING="$MISSING InpRequireAllAgree"
|
||||||
|
grep -q "^InpMagicNumber=" "$file" || MISSING="$MISSING InpMagicNumber"
|
||||||
|
grep -q "^InpMaxDailyDrawdown=" "$file" || MISSING="$MISSING InpMaxDailyDrawdown"
|
||||||
|
grep -q "^InpCloseBeforeWeekend=" "$file" || MISSING="$MISSING InpCloseBeforeWeekend"
|
||||||
|
|
||||||
|
if [ -n "$MISSING" ]; then
|
||||||
|
echo "ISSUE: $file missing:$MISSING"
|
||||||
|
ISSUES=$((ISSUES + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check 4: Missing critical parameters in Grid sets
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Checking Grid settings completeness..."
|
||||||
|
for file in grid-*.set; do
|
||||||
|
[ -f "$file" ] || continue
|
||||||
|
|
||||||
|
MISSING=""
|
||||||
|
grep -q "^InpMaxDailyDrawdown=" "$file" || MISSING="$MISSING InpMaxDailyDrawdown"
|
||||||
|
grep -q "^InpCloseBeforeWeekend=" "$file" || MISSING="$MISSING InpCloseBeforeWeekend"
|
||||||
|
|
||||||
|
if [ -n "$MISSING" ]; then
|
||||||
|
echo "ISSUE: $file missing:$MISSING"
|
||||||
|
ISSUES=$((ISSUES + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check 5: Very restrictive settings (may explain no trades)
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Checking for overly restrictive settings..."
|
||||||
|
HIGH_STRENGTH=$(grep "InpMinStrength=0.8" confluence-*.set 2>/dev/null | cut -d: -f1)
|
||||||
|
if [ -n "$HIGH_STRENGTH" ]; then
|
||||||
|
echo "WARNING: High strength thresholds (may block trades):"
|
||||||
|
echo "$HIGH_STRENGTH" | while read -r file; do
|
||||||
|
strength=$(grep "InpMinStrength=" "$file" | head -1)
|
||||||
|
echo " - $file: $strength"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 6: Debug mode status
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Debug mode status..."
|
||||||
|
DEBUG_OFF=$(grep "InpDebugMode=false" confluence-*.set grid-*.set 2>/dev/null | wc -l)
|
||||||
|
DEBUG_ON=$(grep "InpDebugMode=true" confluence-*.set grid-*.set 2>/dev/null | wc -l)
|
||||||
|
echo " Debug ON: $DEBUG_ON files"
|
||||||
|
echo " Debug OFF: $DEBUG_OFF files"
|
||||||
|
|
||||||
|
if [ $DEBUG_OFF -gt 5 ]; then
|
||||||
|
echo "WARNING: Many files have debug disabled - you won't see trade decisions"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 7: Weekend protection status
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Weekend protection status..."
|
||||||
|
WEEKEND_OFF=$(grep "InpCloseBeforeWeekend=false" confluence-*.set grid-*.set 2>/dev/null | wc -l)
|
||||||
|
if [ $WEEKEND_OFF -gt 0 ]; then
|
||||||
|
echo "WARNING: $WEEKEND_OFF files have weekend protection DISABLED"
|
||||||
|
ISSUES=$((ISSUES + 1))
|
||||||
|
else
|
||||||
|
echo " ✓ All files have weekend protection enabled"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check 8: Git status
|
||||||
|
echo ""
|
||||||
|
echo "[INFO] Checking git status..."
|
||||||
|
UNTRACKED=$(git ls-files --others --exclude-standard *.set 2>/dev/null | wc -l)
|
||||||
|
if [ $UNTRACKED -gt 0 ]; then
|
||||||
|
echo "WARNING: $UNTRACKED untracked .set files:"
|
||||||
|
git ls-files --others --exclude-standard *.set 2>/dev/null | head -5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo ""
|
||||||
|
echo "=== Summary ==="
|
||||||
|
if [ $ISSUES -eq 0 ]; then
|
||||||
|
echo "✅ All checks passed!"
|
||||||
|
else
|
||||||
|
echo "❌ Found $ISSUES issue(s)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $ISSUES
|
||||||
Reference in New Issue
Block a user